From fa7b8a564b3815d4145ccfca2fbe589748032b24 Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Fri, 12 Jan 2024 14:38:58 -0500 Subject: [PATCH 01/57] Bumps Batch Explorer development to version 2.21.0 --- desktop/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desktop/package.json b/desktop/package.json index f0d4ef0cc..67c4b7fc9 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -16,7 +16,7 @@ "name": "Microsoft Corporation", "email": "batchexplorer@microsoft.com" }, - "version": "2.20.0", + "version": "2.21.0", "main": "build/client/main.prod.js", "scripts": { "ts": "ts-node --project tsconfig.node.json --files", From a7a1e45086b9f5857c0208b083abd2447a91af92 Mon Sep 17 00:00:00 2001 From: CSIGS Date: Wed, 10 Jan 2024 01:07:37 +0000 Subject: [PATCH 02/57] Juno: check in to users/loc/juno/hb_b5190a78-9093-45f2-826d-2cc1e04cb56a_20240110010736227. --- Localize/loc/ja/desktop/i18n/resources.resjson.lcl | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Localize/loc/ja/desktop/i18n/resources.resjson.lcl b/Localize/loc/ja/desktop/i18n/resources.resjson.lcl index 3c392fdca..2641e9799 100644 --- a/Localize/loc/ja/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/ja/desktop/i18n/resources.resjson.lcl @@ -325,6 +325,15 @@ + + + + + + + + + From 1fafbc66ab7e312441436d762b2d7d4c9a9cee5c Mon Sep 17 00:00:00 2001 From: Haopeng Wang Date: Wed, 24 Jan 2024 14:15:45 +0800 Subject: [PATCH 03/57] Add Batch RLC to service package & Add node service (#2853) --- .gitignore | 1 + .vsts/linux/distribution.yml | 5 - desktop/config/webpack.config.base.js | 3 + desktop/package-lock.json | 1 + desktop/package.json | 4 +- .../core/batch-explorer-http-client.spec.ts | 11 +- .../core/batch-explorer-http-client.ts | 27 +- .../app/environment/desktop-environment.ts | 4 +- eng/emitter-package-lock.json | 1199 +++++ eng/emitter-package.json | 14 + .../arm-batch-rest/config/tsconfig.build.json | 7 - .../arm-batch-rest/config/tsconfig.cjs.json | 9 - .../config/tsconfig.common.json | 9 - packages/arm-batch-rest/jest.config.js | 9 - packages/arm-batch-rest/package-lock.json | 4020 ---------------- packages/arm-batch-rest/package.json | 92 - .../src/__tests__/setup-tests.ts | 10 - packages/arm-batch-rest/tsconfig.json | 6 - packages/bonito-core/package.json | 3 +- packages/bonito-ui/package.json | 3 +- packages/playground/package.json | 3 +- packages/react/package.json | 3 +- .../src/pool/update-node-comms-action.tsx | 1 + packages/service/generate-client.ps1 | 14 + packages/service/package-lock.json | 972 +++- packages/service/package.json | 16 +- packages/service/readme.md | 45 + .../src/__tests__/service-utils.spec.ts | 83 + .../service/src/account/account-models.ts | 2 +- packages/service/src/arm-batch-models.ts | 1 + packages/service/src/batch-models.ts | 1 + packages/service/src/constants.ts | 4 +- .../src/environment/batch-dependencies.ts | 3 + packages/service/src/index.ts | 1 + .../src/internal}/arm-batch-rest/README.md | 0 .../__tests__/arm-batch-rest.spec.ts} | 6 +- .../arm-batch-rest}/__tests__/utils/client.ts | 0 .../src/internal/arm-batch-rest}/client.ts | 7 +- .../generated/batchManagementClient.ts | 0 .../generated/clientDefinitions.ts | 0 .../arm-batch-rest}/generated/index.ts | 0 .../arm-batch-rest}/generated/isUnexpected.ts | 0 .../arm-batch-rest}/generated/models.ts | 2 +- .../arm-batch-rest}/generated/outputModels.ts | 44 +- .../generated/paginateHelper.ts | 0 .../arm-batch-rest}/generated/parameters.ts | 0 .../generated/pollingHelper.ts | 0 .../arm-batch-rest}/generated/responses.ts | 0 .../src/internal/arm-batch-rest}/index.ts | 1 - .../batch-rest/__tests__/batch-rest.spec.ts | 231 + .../service/src/internal/batch-rest/client.ts | 28 + .../batch-rest/generated/src/batchClient.ts | 50 + .../generated/src/clientDefinitions.ts | 1297 ++++++ .../batch-rest/generated/src/index.ts | 15 + .../batch-rest/generated/src/isUnexpected.ts | 821 ++++ .../batch-rest/generated/src/logger.ts | 5 + .../batch-rest/generated/src/models.ts | 1744 +++++++ .../batch-rest/generated/src/outputModels.ts | 2509 ++++++++++ .../generated/src/paginateHelper.ts | 200 + .../batch-rest/generated/src/parameters.ts | 4027 +++++++++++++++++ .../batch-rest/generated/src/responses.ts | 1833 ++++++++ .../batch-rest/generated/tsp-location.yaml | 4 + .../service/src/internal/batch-rest/index.ts | 3 + .../__tests__/pipeline-http-headers.spec.ts | 2 +- .../client-http}/batch-http-client.ts | 0 .../client-http}/pipeline-http-headers.ts | 0 .../src/internal/client-http}/rest-error.ts | 0 .../node/__tests__/fake-node-service.spec.ts | 34 + .../service/src/node/fake-node-service.ts | 29 + packages/service/src/node/index.ts | 4 + .../service/src/node/live-node-service.ts | 58 + packages/service/src/node/node-models.ts | 4 + packages/service/src/node/node-service.ts | 17 + .../pool/__tests__/fake-pool-service.spec.ts | 13 +- .../pool/__tests__/live-pool-service.spec.ts | 36 +- .../service/src/pool/fake-pool-service.ts | 8 +- .../service/src/pool/live-pool-service.ts | 197 +- packages/service/src/pool/pool-models.ts | 2 +- packages/service/src/pool/pool-service.ts | 18 +- packages/service/src/test-util/fakes.ts | 106 +- packages/service/src/utils.ts | 127 + .../swagger/README.md | 4 +- web/src/index.tsx | 2 + 83 files changed, 15724 insertions(+), 4350 deletions(-) create mode 100644 eng/emitter-package-lock.json create mode 100644 eng/emitter-package.json delete mode 100644 packages/arm-batch-rest/config/tsconfig.build.json delete mode 100644 packages/arm-batch-rest/config/tsconfig.cjs.json delete mode 100644 packages/arm-batch-rest/config/tsconfig.common.json delete mode 100644 packages/arm-batch-rest/jest.config.js delete mode 100644 packages/arm-batch-rest/package-lock.json delete mode 100644 packages/arm-batch-rest/package.json delete mode 100644 packages/arm-batch-rest/src/__tests__/setup-tests.ts delete mode 100644 packages/arm-batch-rest/tsconfig.json create mode 100644 packages/service/generate-client.ps1 create mode 100644 packages/service/readme.md create mode 100644 packages/service/src/__tests__/service-utils.spec.ts create mode 100644 packages/service/src/arm-batch-models.ts create mode 100644 packages/service/src/batch-models.ts rename packages/{ => service/src/internal}/arm-batch-rest/README.md (100%) rename packages/{arm-batch-rest/src/__tests__/batch-management-client.spec.ts => service/src/internal/arm-batch-rest/__tests__/arm-batch-rest.spec.ts} (98%) rename packages/{arm-batch-rest/src => service/src/internal/arm-batch-rest}/__tests__/utils/client.ts (100%) rename packages/{arm-batch-rest/src => service/src/internal/arm-batch-rest}/client.ts (79%) rename packages/{arm-batch-rest/src => service/src/internal/arm-batch-rest}/generated/batchManagementClient.ts (100%) rename packages/{arm-batch-rest/src => service/src/internal/arm-batch-rest}/generated/clientDefinitions.ts (100%) rename packages/{arm-batch-rest/src => service/src/internal/arm-batch-rest}/generated/index.ts (100%) rename packages/{arm-batch-rest/src => service/src/internal/arm-batch-rest}/generated/isUnexpected.ts (100%) rename packages/{arm-batch-rest/src => service/src/internal/arm-batch-rest}/generated/models.ts (99%) rename packages/{arm-batch-rest/src => service/src/internal/arm-batch-rest}/generated/outputModels.ts (97%) rename packages/{arm-batch-rest/src => service/src/internal/arm-batch-rest}/generated/paginateHelper.ts (100%) rename packages/{arm-batch-rest/src => service/src/internal/arm-batch-rest}/generated/parameters.ts (100%) rename packages/{arm-batch-rest/src => service/src/internal/arm-batch-rest}/generated/pollingHelper.ts (100%) rename packages/{arm-batch-rest/src => service/src/internal/arm-batch-rest}/generated/responses.ts (100%) rename packages/{arm-batch-rest/src => service/src/internal/arm-batch-rest}/index.ts (90%) create mode 100644 packages/service/src/internal/batch-rest/__tests__/batch-rest.spec.ts create mode 100644 packages/service/src/internal/batch-rest/client.ts create mode 100644 packages/service/src/internal/batch-rest/generated/src/batchClient.ts create mode 100644 packages/service/src/internal/batch-rest/generated/src/clientDefinitions.ts create mode 100644 packages/service/src/internal/batch-rest/generated/src/index.ts create mode 100644 packages/service/src/internal/batch-rest/generated/src/isUnexpected.ts create mode 100644 packages/service/src/internal/batch-rest/generated/src/logger.ts create mode 100644 packages/service/src/internal/batch-rest/generated/src/models.ts create mode 100644 packages/service/src/internal/batch-rest/generated/src/outputModels.ts create mode 100644 packages/service/src/internal/batch-rest/generated/src/paginateHelper.ts create mode 100644 packages/service/src/internal/batch-rest/generated/src/parameters.ts create mode 100644 packages/service/src/internal/batch-rest/generated/src/responses.ts create mode 100644 packages/service/src/internal/batch-rest/generated/tsp-location.yaml create mode 100644 packages/service/src/internal/batch-rest/index.ts rename packages/{arm-batch-rest/src => service/src/internal/client-http}/__tests__/pipeline-http-headers.spec.ts (97%) rename packages/{arm-batch-rest/src/http => service/src/internal/client-http}/batch-http-client.ts (100%) rename packages/{arm-batch-rest/src/http => service/src/internal/client-http}/pipeline-http-headers.ts (100%) rename packages/{arm-batch-rest/src/http => service/src/internal/client-http}/rest-error.ts (100%) create mode 100644 packages/service/src/node/__tests__/fake-node-service.spec.ts create mode 100644 packages/service/src/node/fake-node-service.ts create mode 100644 packages/service/src/node/index.ts create mode 100644 packages/service/src/node/live-node-service.ts create mode 100644 packages/service/src/node/node-models.ts create mode 100644 packages/service/src/node/node-service.ts create mode 100644 packages/service/src/utils.ts rename packages/{arm-batch-rest => service}/swagger/README.md (94%) diff --git a/.gitignore b/.gitignore index 31cf5ea12..904a6a2b1 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,4 @@ Localize/out/ /packages/*/src/generated/* /util/bux/__tests__/loc-source/generated /web/src/generated/* +TempTypeSpecFiles diff --git a/.vsts/linux/distribution.yml b/.vsts/linux/distribution.yml index 94a51d31a..eb518a5bf 100644 --- a/.vsts/linux/distribution.yml +++ b/.vsts/linux/distribution.yml @@ -23,11 +23,6 @@ steps: packagePath: ./packages/bonito-ui packageName: "@azure/bonito-ui" - - template: ./publish-npm-package.yml - parameters: - packagePath: ./packages/arm-batch-rest - packageName: "@batch/arm-batch-rest" - - template: ./publish-npm-package.yml parameters: packagePath: ./packages/service diff --git a/desktop/config/webpack.config.base.js b/desktop/config/webpack.config.base.js index 8946c1e31..ae51396d2 100644 --- a/desktop/config/webpack.config.base.js +++ b/desktop/config/webpack.config.base.js @@ -29,6 +29,9 @@ const baseConfig = { // (See https://github.com/facebook/react/issues/13991) react: path.resolve("../node_modules/react"), "react-dom": path.resolve('../node_modules/react-dom'), + // Since we are patching the core-util module' isNode variable, + // we need to make sure that the patched version is used by all + "@azure/core-util": path.resolve('./node_modules/@azure/core-util'), }, }, diff --git a/desktop/package-lock.json b/desktop/package-lock.json index 34ea568ac..3fac644bf 100644 --- a/desktop/package-lock.json +++ b/desktop/package-lock.json @@ -20,6 +20,7 @@ "@angular/platform-browser-dynamic": "^11.0.0", "@angular/platform-server": "^11.0.0", "@angular/router": "^11.0.0", + "@azure/core-util": "1.4.0", "@azure/msal-node": "^1.14.6", "@azure/storage-blob": "^12.11.0", "@electron/remote": "^2.0.10", diff --git a/desktop/package.json b/desktop/package.json index 67c4b7fc9..39e42b104 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -187,6 +187,7 @@ "yesno": "^0.0.1" }, "dependencies": { + "@azure/core-util": "1.4.0", "@angular/animations": "^11.0.0", "@angular/cdk": "^11.0.0", "@angular/common": "^11.0.0", @@ -247,6 +248,7 @@ }, "overrides": { "json5": "^2.2.3", - "ajv": "^6.12.6" + "ajv": "^6.12.6", + "@azure/core-util": "1.4.0" } } diff --git a/desktop/src/@batch-flask/core/batch-explorer-http-client.spec.ts b/desktop/src/@batch-flask/core/batch-explorer-http-client.spec.ts index 8baa3e133..8c72c6139 100644 --- a/desktop/src/@batch-flask/core/batch-explorer-http-client.spec.ts +++ b/desktop/src/@batch-flask/core/batch-explorer-http-client.spec.ts @@ -30,14 +30,9 @@ describe("BatchExplorerHttpClient", () => { expect(fakeAuthService.getAccessToken).toHaveBeenCalledWith( TenantPlaceholders.common); - expect(fakeFetchHttpClient.fetch).toHaveBeenCalledWith( - "/subscriptions", - { - headers: { - Authorization: "Token1Type token1" - } - } - ); + const [subscriptionUrl, requestProps] = fakeFetchHttpClient.fetch.calls.argsFor(0); + expect(subscriptionUrl).toEqual("/subscriptions"); + expect(requestProps.headers.get('authorization')).toEqual("Token1Type token1"); }); it("uses the common tenant regardless of subscription in URL", async () => { diff --git a/desktop/src/@batch-flask/core/batch-explorer-http-client.ts b/desktop/src/@batch-flask/core/batch-explorer-http-client.ts index ca9fb16d6..44b96ab54 100644 --- a/desktop/src/@batch-flask/core/batch-explorer-http-client.ts +++ b/desktop/src/@batch-flask/core/batch-explorer-http-client.ts @@ -25,12 +25,27 @@ export default class BatchExplorerHttpClient extends AbstractHttpClient { const accessToken: AccessToken = await this.authService.getAccessToken(tenantId); - const authRequestProps = {...requestProps}; - if (!authRequestProps.headers) { - authRequestProps.headers = {}; + + + const headers: Headers = new Headers(); + if (requestProps?.headers) { + if (typeof requestProps.headers.forEach === "function") { + // Headers object + requestProps.headers.forEach((value, key) => { + headers.set(key, value); + }); + } else { + // Map of headers + const headerMap = requestProps.headers as Record; + for (const [k, v] of Object.entries(headerMap)) { + headers.set(k, v); + } + } } - authRequestProps.headers["Authorization"] = - `${accessToken.tokenType} ${accessToken.accessToken}`; - return this._delegate.fetch(urlOrRequest, authRequestProps); + headers.set("Authorization", `${accessToken.tokenType} ${accessToken.accessToken}`); + return this._delegate.fetch(urlOrRequest, { + ...requestProps, + headers, + }); } } diff --git a/desktop/src/app/environment/desktop-environment.ts b/desktop/src/app/environment/desktop-environment.ts index 32856d2fe..9b0bb3bad 100644 --- a/desktop/src/app/environment/desktop-environment.ts +++ b/desktop/src/app/environment/desktop-environment.ts @@ -14,7 +14,7 @@ import { DefaultFormLayoutProvider } from "@azure/bonito-ui/lib/components/form" import { BrowserDependencyName, BrowserEnvironmentConfig, DefaultBrowserEnvironment } from "@azure/bonito-ui/lib/environment"; import BatchExplorerHttpClient from "@batch-flask/core/batch-explorer-http-client"; import { BatchBrowserDependencyFactories, BatchFormControlResolver } from "@batch/ui-react"; -import { LivePoolService } from "@batch/ui-service"; +import { LiveNodeService, LivePoolService } from "@batch/ui-service"; import { BatchDependencyName } from "@batch/ui-service/lib/environment"; import { DesktopLocalizer } from "app/localizer/desktop-localizer"; import { AppTranslationsLoaderService, AuthService, BatchExplorerService } from "app/services"; @@ -44,6 +44,8 @@ export function initDesktopEnvironment( new LiveLocationService(), [BatchDependencyName.PoolService]: () => new LivePoolService(), + [BatchDependencyName.NodeService]: () => + new LiveNodeService(), [DependencyName.Notifier]: () => new AlertNotifier(), // TODO: update with real notification implementation [DependencyName.ResourceGroupService]: () => diff --git a/eng/emitter-package-lock.json b/eng/emitter-package-lock.json new file mode 100644 index 000000000..d35b93521 --- /dev/null +++ b/eng/emitter-package-lock.json @@ -0,0 +1,1199 @@ +{ + "name": "typescript-emitter-package", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "typescript-emitter-package", + "dependencies": { + "@azure-tools/typespec-autorest": "0.35.0", + "@azure-tools/typespec-azure-core": "0.35.0", + "@azure-tools/typespec-client-generator-core": "0.35.0", + "@azure-tools/typespec-ts": "0.19.0", + "@typespec/compiler": "0.49.0", + "@typespec/http": "0.49.0", + "@typespec/rest": "0.49.0", + "@typespec/versioning": "0.49.0" + } + }, + "node_modules/@azure-tools/rlc-common": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@azure-tools/rlc-common/-/rlc-common-0.19.0.tgz", + "integrity": "sha512-ljfmTt0aCLhCeyamIptBEt1OFg7r4LydMqWqK2esHio2wWzW9JmndiGvnz+hXVi2uXyPlUX4A93tKuHAQq52ug==", + "dependencies": { + "handlebars": "^4.7.7", + "lodash": "^4.17.21", + "ts-morph": "^15.1.0" + } + }, + "node_modules/@azure-tools/typespec-autorest": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@azure-tools/typespec-autorest/-/typespec-autorest-0.35.0.tgz", + "integrity": "sha512-UGiRhgyBc3WWEUgIsSaT44Jgbw6KD2DwYNDr6Oxl2Ig/8ZIInpIB5Eix7mgdqKoN6ifra1wLn0GDAltwVx+idQ==", + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@azure-tools/typespec-azure-core": "~0.35.0", + "@typespec/compiler": "~0.49.0", + "@typespec/http": "~0.49.0", + "@typespec/openapi": "~0.49.0", + "@typespec/rest": "~0.49.0", + "@typespec/versioning": "~0.49.0" + } + }, + "node_modules/@azure-tools/typespec-azure-core": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@azure-tools/typespec-azure-core/-/typespec-azure-core-0.35.0.tgz", + "integrity": "sha512-BOzR58O6ZeMcvDD9D1gd9/kZvmJUlyXUiF0BSQUouNVWTlOL9yIMVKZE+zgTiaYm8a3z2uIU9Us6y8CULoWiyw==", + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@typespec/compiler": "~0.49.0", + "@typespec/http": "~0.49.0", + "@typespec/rest": "~0.49.0" + } + }, + "node_modules/@azure-tools/typespec-client-generator-core": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@azure-tools/typespec-client-generator-core/-/typespec-client-generator-core-0.35.0.tgz", + "integrity": "sha512-3uItmYVhZVmPKCe+s8UZKAubUsjtTbgqVQI4wNayLuAovB9OrWmq09Wq1XEWFHPboGf+4Irehe/feTDnSHA+UA==", + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@typespec/compiler": "~0.49.0", + "@typespec/http": "~0.49.0", + "@typespec/rest": "~0.49.0", + "@typespec/versioning": "~0.49.0" + } + }, + "node_modules/@azure-tools/typespec-ts": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@azure-tools/typespec-ts/-/typespec-ts-0.19.0.tgz", + "integrity": "sha512-kqMYC/69Hrcj0pNs7oVl4hczJ4ewzn89l8Jwh79++zzbDnML/27wZv1Cd5PLqfVxprDOQjZBhPH+eVkHne/ATQ==", + "dependencies": { + "@azure-tools/rlc-common": "^0.19.0", + "fs-extra": "^11.1.0", + "prettier": "^2.6.1", + "ts-morph": "^15.1.0", + "tslib": "^2.3.1" + }, + "peerDependencies": { + "@azure-tools/typespec-azure-core": ">=0.35.0 <1.0.0", + "@azure-tools/typespec-client-generator-core": ">=0.35.0 <1.0.0", + "@typespec/compiler": ">=0.49.0 <1.0.0", + "@typespec/http": ">=0.49.0 <1.0.0", + "@typespec/rest": ">=0.49.0 <1.0.0", + "@typespec/versioning": ">=0.49.0 <1.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@ts-morph/common": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.16.0.tgz", + "integrity": "sha512-SgJpzkTgZKLKqQniCjLaE3c2L2sdL7UShvmTmPBejAKd2OKV/yfMpQ2IWpAuA+VY5wy7PkSUaEObIqEK6afFuw==", + "dependencies": { + "fast-glob": "^3.2.11", + "minimatch": "^5.1.0", + "mkdirp": "^1.0.4", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@typespec/compiler": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/@typespec/compiler/-/compiler-0.49.0.tgz", + "integrity": "sha512-wu0BzCnG6K8GArO1Mo0UIAVvsGnip+Dce3uBuPcW6mGSAv6Y0NljWBHp8dAJNs+uv45wFWpdkZFQvjr3SNUDJw==", + "dependencies": { + "@babel/code-frame": "~7.22.13", + "ajv": "~8.12.0", + "change-case": "~4.1.2", + "globby": "~13.2.2", + "mustache": "~4.2.0", + "picocolors": "~1.0.0", + "prettier": "~3.0.3", + "prompts": "~2.4.2", + "semver": "^7.5.4", + "vscode-languageserver": "~9.0.0", + "vscode-languageserver-textdocument": "~1.0.8", + "yaml": "~2.3.2", + "yargs": "~17.7.2" + }, + "bin": { + "tsp": "cmd/tsp.js", + "tsp-server": "cmd/tsp-server.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@typespec/compiler/node_modules/prettier": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", + "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/@typespec/http": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/@typespec/http/-/http-0.49.0.tgz", + "integrity": "sha512-MvDJ0s7CjeA/nmutQ4PSTYOj0Gy+78PNd/xe4W5II5w4Kb32Q1vT/oWI2bVZ9G5MkTugKK9P6jmfzwY7EiHksg==", + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@typespec/compiler": "~0.49.0" + } + }, + "node_modules/@typespec/openapi": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/@typespec/openapi/-/openapi-0.49.0.tgz", + "integrity": "sha512-2TQfnGKtiiKYD1eMiRAcEwDByaBf5WgvcIlLWpWJk/nmcKr6ZeOzUDj5V1fGiiY+/1sI0C0qGCz8PIxcvLa9kw==", + "peer": true, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@typespec/compiler": "~0.49.0", + "@typespec/http": "~0.49.0" + } + }, + "node_modules/@typespec/rest": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/@typespec/rest/-/rest-0.49.0.tgz", + "integrity": "sha512-C5Ym3Dal5MzDkDIAzTekLsGtPDzRSC9cbiagq4LQfFtzfUPA8tJlJOnD8txTw/XIaFg0hvAPNgTZSa+xtiXskQ==", + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@typespec/compiler": "~0.49.0", + "@typespec/http": "~0.49.0" + } + }, + "node_modules/@typespec/versioning": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/@typespec/versioning/-/versioning-0.49.0.tgz", + "integrity": "sha512-SuRcEB0yaD/wPwaXweIRr+lNDB4hgZwFxHi84y7De1xlntutRl+NeRgWd+K4yVS6tpyNHzcqK6Z7bBD30yQK/w==", + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@typespec/compiler": "~0.49.0" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "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==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/change-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", + "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", + "dependencies": { + "camel-case": "^4.1.2", + "capital-case": "^1.0.4", + "constant-case": "^3.0.4", + "dot-case": "^3.0.4", + "header-case": "^2.0.4", + "no-case": "^3.0.4", + "param-case": "^3.0.4", + "pascal-case": "^3.1.2", + "path-case": "^3.0.4", + "sentence-case": "^3.0.4", + "snake-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/code-block-writer": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-11.0.3.tgz", + "integrity": "sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==" + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/constant-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", + "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case": "^2.0.2" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/header-case": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", + "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", + "dependencies": { + "capital-case": "^1.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + }, + "node_modules/path-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", + "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sentence-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", + "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-morph": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-15.1.0.tgz", + "integrity": "sha512-RBsGE2sDzUXFTnv8Ba22QfeuKbgvAGJFuTN7HfmIRUkgT/NaVLfDM/8OFm2NlFkGlWEXdpW5OaFIp1jvqdDuOg==", + "dependencies": { + "@ts-morph/common": "~0.16.0", + "code-block-writer": "^11.0.0" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", + "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/upper-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz", + "integrity": "sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==" + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + } + } +} diff --git a/eng/emitter-package.json b/eng/emitter-package.json new file mode 100644 index 000000000..11221c28b --- /dev/null +++ b/eng/emitter-package.json @@ -0,0 +1,14 @@ +{ + "name": "typescript-emitter-package", + "main": "dist/src/index.js", + "dependencies": { + "@azure-tools/typespec-ts": "0.19.0", + "@azure-tools/typespec-azure-core": "0.35.0", + "@azure-tools/typespec-autorest": "0.35.0", + "@azure-tools/typespec-client-generator-core": "0.35.0", + "@typespec/compiler": "0.49.0", + "@typespec/http": "0.49.0", + "@typespec/rest": "0.49.0", + "@typespec/versioning": "0.49.0" + } +} diff --git a/packages/arm-batch-rest/config/tsconfig.build.json b/packages/arm-batch-rest/config/tsconfig.build.json deleted file mode 100644 index 79f9467c1..000000000 --- a/packages/arm-batch-rest/config/tsconfig.build.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "./tsconfig.common.json", - "compilerOptions": { - "tsBuildInfoFile": "../build/cache/ts.build.buildinfo" - }, - "exclude": ["../**/__mocks__/**/*"] -} diff --git a/packages/arm-batch-rest/config/tsconfig.cjs.json b/packages/arm-batch-rest/config/tsconfig.cjs.json deleted file mode 100644 index 286d1ef8b..000000000 --- a/packages/arm-batch-rest/config/tsconfig.cjs.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "./tsconfig.common.json", - "compilerOptions": { - "module": "CommonJS", - "outDir": "../lib-cjs", - "tsBuildInfoFile": "../build/cache/ts.cjs.buildinfo" - }, - "exclude": ["../**/__mocks__/**/*"] -} diff --git a/packages/arm-batch-rest/config/tsconfig.common.json b/packages/arm-batch-rest/config/tsconfig.common.json deleted file mode 100644 index 52f016dd8..000000000 --- a/packages/arm-batch-rest/config/tsconfig.common.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../../util/common-config/tsconfig-base.json", - "compilerOptions": { - "outDir": "../lib", - "rootDir": "../src/", - "typeRoots": ["../node_modules/@types"] - }, - "include": ["../src/"] -} diff --git a/packages/arm-batch-rest/jest.config.js b/packages/arm-batch-rest/jest.config.js deleted file mode 100644 index 3f0101851..000000000 --- a/packages/arm-batch-rest/jest.config.js +++ /dev/null @@ -1,9 +0,0 @@ -/* eslint-env node */ -/* eslint-disable @typescript-eslint/no-var-requires */ -module.exports = require("@batch/common-config/jest-common").createConfig( - "arm-batch-rest", - require("./tsconfig.json"), - { - setupFilesAfterEnv: ["/src/__tests__/setup-tests.ts"], - } -); diff --git a/packages/arm-batch-rest/package-lock.json b/packages/arm-batch-rest/package-lock.json deleted file mode 100644 index bb82eb2ea..000000000 --- a/packages/arm-batch-rest/package-lock.json +++ /dev/null @@ -1,4020 +0,0 @@ -{ - "name": "@batch/arm-batch-rest", - "version": "1.0.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@batch/arm-batch-rest", - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "@azure-rest/core-client": "1.0.0-beta.10", - "@azure/core-auth": "^1.3.0", - "@azure/core-lro": "^2.2.0", - "@azure/core-paging": "^1.2.0", - "@azure/core-rest-pipeline": "^1.8.0" - }, - "devDependencies": { - "@types/jest": "^29.2.4", - "@types/node": "20.5.4", - "autorest": "3.6.3", - "jest": "^29.3.1", - "jest-junit": "^12.2.0", - "ts-jest": "^29.0.3" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@azure-rest/core-client": { - "version": "1.0.0-beta.10", - "resolved": "https://registry.npmjs.org/@azure-rest/core-client/-/core-client-1.0.0-beta.10.tgz", - "integrity": "sha512-qsiepIEskvu+J815SFZ+u0wh0pPHtQVGtyT+yKbLN1YCIFtfM0L5XdaegfwMBWDG/NIXwF2fmqjM75Sqz8dAwA==", - "dependencies": { - "@azure/core-auth": "^1.3.0", - "@azure/core-rest-pipeline": "^1.5.0", - "@azure/core-util": "^1.0.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@azure/abort-controller": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", - "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", - "dependencies": { - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@azure/core-auth": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.5.0.tgz", - "integrity": "sha512-udzoBuYG1VBoHVohDTrvKjyzel34zt77Bhp7dQntVGGD0ehVq48owENbBG8fIgkHRNUBQH5k1r0hpoMu5L8+kw==", - "dependencies": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-util": "^1.1.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@azure/core-lro": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.5.4.tgz", - "integrity": "sha512-3GJiMVH7/10bulzOKGrrLeG/uCBH/9VtxqaMcB9lIqAeamI/xYQSHJL/KcsLDuH+yTjYpro/u6D/MuRe4dN70Q==", - "dependencies": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-util": "^1.2.0", - "@azure/logger": "^1.0.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@azure/core-paging": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.5.0.tgz", - "integrity": "sha512-zqWdVIt+2Z+3wqxEOGzR5hXFZ8MGKK52x4vFLw8n58pR6ZfKRx3EXYTxTaYxYHc/PexPUTyimcTWFJbji9Z6Iw==", - "dependencies": { - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@azure/core-rest-pipeline": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.12.0.tgz", - "integrity": "sha512-+MnSB0vGZjszSzr5AW8z93/9fkDu2RLtWmAN8gskURq7EW2sSwqy8jZa0V26rjuBVkwhdA3Hw8z3VWoeBUOw+A==", - "dependencies": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.4.0", - "@azure/core-tracing": "^1.0.1", - "@azure/core-util": "^1.3.0", - "@azure/logger": "^1.0.0", - "form-data": "^4.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@azure/core-tracing": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", - "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==", - "dependencies": { - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@azure/core-util": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.4.0.tgz", - "integrity": "sha512-eGAyJpm3skVQoLiRqm/xPa+SXi/NPDdSHMxbRAz2lSprd+Zs+qrpQGQQ2VQ3Nttu+nSZR4XoYQC71LbEI7jsig==", - "dependencies": { - "@azure/abort-controller": "^1.0.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@azure/logger": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.4.tgz", - "integrity": "sha512-ustrPY8MryhloQj7OWGe+HrYx+aoiOxzbXTtgblbV3xwCqpzUK36phH3XNHQKj3EPonyFUuDTfR3qFhTEAuZEg==", - "dependencies": { - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.11.tgz", - "integrity": "sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-compilation-targets": "^7.22.10", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.11", - "@babel/parser": "^7.22.11", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.11", - "@babel/types": "^7.22.11", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/@babel/generator": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz", - "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", - "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", - "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.11.tgz", - "integrity": "sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.11", - "@babel/types": "^7.22.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", - "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.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-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "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.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", - "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "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-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "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.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", - "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.4.tgz", - "integrity": "sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.4", - "@babel/generator": "^7.23.4", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.4", - "@babel/types": "^7.23.4", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", - "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", - "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", - "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", - "dev": true, - "dependencies": { - "@jest/console": "^29.6.4", - "@jest/reporters": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.6.3", - "jest-config": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-resolve-dependencies": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "jest-watcher": "^29.6.4", - "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/environment": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", - "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.6.4", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", - "dev": true, - "dependencies": { - "expect": "^29.6.4", - "jest-snapshot": "^29.6.4" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", - "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", - "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", - "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", - "@jest/types": "^29.6.3", - "jest-mock": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", - "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", - "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", - "dev": true, - "dependencies": { - "@jest/console": "^29.6.4", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", - "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.6.4", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", - "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", - "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "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/jest": { - "version": "29.5.4", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.4.tgz", - "integrity": "sha512-PhglGmhWeD46FYOVLt3X7TiWjzwuVGW9wG/4qocPevXMjCmrIc5b6db9WjeGE4QYVpUAWMDv3v0IiBwObY289A==", - "dev": true, - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/node": { - "version": "20.5.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.4.tgz", - "integrity": "sha512-Y9vbIAoM31djQZrPYjpTLo0XlaSwOIsrlfE3LpulZeRblttsLQRFRlBAppW0LOxyT3ALj2M5vU1ucQQayQH3jA==", - "dev": true - }, - "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/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "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/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/autorest": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/autorest/-/autorest-3.6.3.tgz", - "integrity": "sha512-j/Axwk9bniifTNtBLYVxfQZGQIGPKljFaCQCBWOiybVar2j3tkHP1btiC4a/t9pAJXY6IaFgWctoPM3G/Puhyg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "autorest": "entrypoints/app.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/babel-jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", - "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", - "dev": true, - "dependencies": { - "@jest/transform": "^29.6.4", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001522", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001522.tgz", - "integrity": "sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "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/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, - "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/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", - "dev": true, - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.500", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.500.tgz", - "integrity": "sha512-P38NO8eOuWOKY1sQk5yE0crNtrjgjJj6r3NrbIKtG18KzCHmHE2Bt+aQA7/y0w3uYsHWxDa6icOohzjLJ4vJ4A==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", - "dev": true, - "dependencies": { - "@jest/expect-utils": "^29.6.4", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "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/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz", - "integrity": "sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.4.tgz", - "integrity": "sha512-tEFhVQFF/bzoYV1YuGyzLPZ6vlPrdfvDmmAxudA1dLEuiztqg2Rkx20vkKY32xiDROcD2KXlgZ7Cu8RPeEHRKw==", - "dev": true, - "dependencies": { - "@jest/core": "^29.6.4", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.6.4" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", - "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", - "dev": true, - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.6.3", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", - "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "p-limit": "^3.1.0", - "pretty-format": "^29.6.3", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", - "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", - "dev": true, - "dependencies": { - "@jest/core": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "prompts": "^2.0.1", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", - "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.4", - "@jest/types": "^29.6.3", - "babel-jest": "^29.6.4", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.4", - "jest-environment-node": "^29.6.4", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.6.3", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", - "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", - "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", - "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.6.3", - "pretty-format": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", - "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-junit": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-12.3.0.tgz", - "integrity": "sha512-+NmE5ogsEjFppEl90GChrk7xgz8xzvF0f+ZT5AnhW6suJC93gvQtmQjfyjDnE0Z2nXJqEkxF0WXlvjG/J+wn/g==", - "dev": true, - "dependencies": { - "mkdirp": "^1.0.4", - "strip-ansi": "^5.2.0", - "uuid": "^8.3.2", - "xml": "^1.0.1" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/jest-junit/node_modules/ansi-regex": { - "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" - } - }, - "node_modules/jest-junit/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", - "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", - "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.6.4", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", - "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", - "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", - "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", - "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", - "dev": true, - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.6.4" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", - "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", - "dev": true, - "dependencies": { - "@jest/console": "^29.6.4", - "@jest/environment": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.6.3", - "jest-environment-node": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-leak-detector": "^29.6.3", - "jest-message-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-util": "^29.6.3", - "jest-watcher": "^29.6.4", - "jest-worker": "^29.6.4", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", - "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/globals": "^29.6.4", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", - "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.4", - "@jest/transform": "^29.6.4", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.6.4", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.4", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "natural-compare": "^1.4.0", - "pretty-format": "^29.6.3", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", - "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.6.4", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.6.3", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", - "dev": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.6.3", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.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/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pure-rand": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", - "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-jest": { - "version": "29.1.1", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", - "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", - "dev": true, - "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/ts-jest/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-jest/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-jest/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-to-istanbul": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", - "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", - "dev": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/packages/arm-batch-rest/package.json b/packages/arm-batch-rest/package.json deleted file mode 100644 index c1593bdd0..000000000 --- a/packages/arm-batch-rest/package.json +++ /dev/null @@ -1,92 +0,0 @@ -{ - "name": "@batch/arm-batch-rest", - "sdk-type": "mgmt", - "author": "Microsoft Corporation", - "version": "1.0.1", - "description": "A generated Rest Level Client SDK for the Batch Management Plane.", - "keywords": [ - "node", - "azure", - "cloud", - "typescript", - "browser", - "isomorphic" - ], - "license": "MIT", - "main": "./lib-cjs/index.js", - "module": "./lib/index.js", - "types": "./lib/index.d.ts", - "repository": { - "type": "git", - "url": "https://github.com/Azure/BatchExplorer" - }, - "files": [ - "lib", - "lib-cjs" - ], - "engines": { - "node": ">=18.0.0" - }, - "test": "jest", - "scripts": { - "build": "npm run compile", - "build:clean": "run-s clean compile", - "build:test": "run-s build test", - "compile": "run-p compile:*", - "compile:esm": "tsc -b ./config/tsconfig.build.json", - "compile:cjs": "tsc -b ./config/tsconfig.cjs.json", - "clean": "run-p clean:*", - "clean:build": "bux rmrf ./build", - "clean:esm": "bux rmrf ./lib", - "clean:cjs": "bux rmrf ./lib-cjs", - "generate:client": "autorest --typescript swagger/README.md", - "lint": "eslint . --max-warnings 0", - "test": "jest", - "test:all": "npm run test:coverage", - "test:coverage": "jest --collect-coverage", - "test:watch": "jest --watch", - "watch": "run-p \"compile:* -- --watch --preserveWatchOutput\"", - "workspace:build": "npm run build", - "workspace:build:clean": "npm run build:clean", - "workspace:build:desktop": "npm run build", - "workspace:build:lib": "npm run build", - "workspace:build:web": "npm run build", - "workspace:build:package": "npm run build:clean", - "workspace:build:prod": "npm run build:clean", - "workspace:build:test": "npm run build:test", - "workspace:clean": "npm run clean", - "workspace:launch:desktop": "npm run watch", - "workspace:launch:web": "npm run watch", - "workspace:lint": "npm run lint", - "workspace:lint:fix": "npm run lint -- --fix", - "workspace:start:desktop": "npm run watch", - "workspace:start:web": "npm run watch", - "workspace:test": "npm run test", - "workspace:test:all": "npm run test:all", - "workspace:test:desktop": "npm run test", - "workspace:test:lib": "npm run test", - "workspace:test:lib:all": "npm run test:all", - "workspace:test:web": "npm run test", - "workspace:test:web:all": "npm run test:all", - "workspace:watch:lib": "npm run watch" - }, - "sideEffects": false, - "autoPublish": false, - "dependencies": { - "@azure/bonito-core": "^1.0.0", - "@azure-rest/core-client": "1.0.0-beta.10", - "@azure/core-auth": "^1.3.0", - "@azure/core-lro": "^2.2.0", - "@azure/core-paging": "^1.2.0", - "@azure/core-rest-pipeline": "^1.8.0" - }, - "devDependencies": { - "@batch/common-config": "^1.0.0", - "@types/jest": "^29.2.4", - "@types/node": "20.5.4", - "autorest": "3.6.3", - "jest": "^29.3.1", - "jest-junit": "^12.2.0", - "ts-jest": "^29.0.3" - } -} diff --git a/packages/arm-batch-rest/src/__tests__/setup-tests.ts b/packages/arm-batch-rest/src/__tests__/setup-tests.ts deleted file mode 100644 index bc83c8673..000000000 --- a/packages/arm-batch-rest/src/__tests__/setup-tests.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { destroyEnvironment } from "@azure/bonito-core"; - -afterEach(() => { - jest.resetAllMocks(); - destroyEnvironment(); -}); - -afterAll(() => { - jest.restoreAllMocks(); -}); diff --git a/packages/arm-batch-rest/tsconfig.json b/packages/arm-batch-rest/tsconfig.json deleted file mode 100644 index 1aeee9b82..000000000 --- a/packages/arm-batch-rest/tsconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "./config/tsconfig.common.json", - "compilerOptions": { - "tsBuildInfoFile": "./build/cache/ts.buildinfo" - } -} diff --git a/packages/bonito-core/package.json b/packages/bonito-core/package.json index 63606ee74..f43e8ab80 100644 --- a/packages/bonito-core/package.json +++ b/packages/bonito-core/package.json @@ -78,5 +78,6 @@ "lib", "lib-cjs", "resources" - ] + ], + "sideEffects": false } diff --git a/packages/bonito-ui/package.json b/packages/bonito-ui/package.json index 38621dce1..9891d88b9 100644 --- a/packages/bonito-ui/package.json +++ b/packages/bonito-ui/package.json @@ -91,5 +91,6 @@ "lib", "lib-cjs", "resources" - ] + ], + "sideEffects": false } diff --git a/packages/playground/package.json b/packages/playground/package.json index ebd3331a5..3f94de6c1 100644 --- a/packages/playground/package.json +++ b/packages/playground/package.json @@ -89,5 +89,6 @@ "lib", "lib-cjs", "resources" - ] + ], + "sideEffects": false } diff --git a/packages/react/package.json b/packages/react/package.json index 9732c9af6..ba61d6ff6 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -94,5 +94,6 @@ "lib", "lib-cjs", "resources" - ] + ], + "sideEffects": false } diff --git a/packages/react/src/pool/update-node-comms-action.tsx b/packages/react/src/pool/update-node-comms-action.tsx index bfd4c902d..d29b5c264 100644 --- a/packages/react/src/pool/update-node-comms-action.tsx +++ b/packages/react/src/pool/update-node-comms-action.tsx @@ -136,6 +136,7 @@ export class UpdateNodeCommsAction extends AbstractAction { await this._poolService.patch( + this._poolArmId, { id: this._poolArmId, properties: { diff --git a/packages/service/generate-client.ps1 b/packages/service/generate-client.ps1 new file mode 100644 index 000000000..52849c9c1 --- /dev/null +++ b/packages/service/generate-client.ps1 @@ -0,0 +1,14 @@ + + +# overrided options for emitter: @azure-tools/typespec-ts +# see details: https://www.npmjs.com/package/@azure-tools/typespec-ts +$options = ( + "generateMetadata=false; " + + "azureSdkForJs=false; " + + "generateTest=false; " +) + +npx tsp-client update ` +--emitter-options $options ` +--output-dir "./src/internal/batch-rest/generated" + diff --git a/packages/service/package-lock.json b/packages/service/package-lock.json index 76ff5a4cd..ad78e1cc6 100644 --- a/packages/service/package-lock.json +++ b/packages/service/package-lock.json @@ -8,9 +8,20 @@ "name": "@batch/ui-service", "version": "1.0.1", "license": "MIT", + "dependencies": { + "@azure-rest/core-client": "^1.1.4", + "@azure/core-auth": "^1.3.0", + "@azure/core-lro": "^2.2.0", + "@azure/core-paging": "^1.2.0", + "@azure/core-rest-pipeline": "^1.8.0", + "@azure/logger": "^1.0.0" + }, "devDependencies": { + "@azure-tools/typespec-client-generator-cli": "^0.3.0", "@types/jest": "^27.0.1", "@types/node": "20.5.4", + "@typespec/compiler": "^0.50.0", + "autorest": "^3.6.3", "jest": "^27.1.0", "jest-junit": "^12.2.0", "ts-jest": "^27.0.5" @@ -33,6 +44,192 @@ "node": ">=6.0.0" } }, + "node_modules/@azure-rest/core-client": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@azure-rest/core-client/-/core-client-1.1.4.tgz", + "integrity": "sha512-RUIQOA8T0WcbNlddr8hjl2MuC5GVRqmMwPXqBVsgvdKesLy+eg3y/6nf3qe2fvcJMI1gF6VtgU5U4hRaR4w4ag==", + "dependencies": { + "@azure/abort-controller": "^1.1.0", + "@azure/core-auth": "^1.3.0", + "@azure/core-rest-pipeline": "^1.5.0", + "@azure/core-tracing": "^1.0.1", + "@azure/core-util": "^1.0.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure-tools/typespec-client-generator-cli": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@azure-tools/typespec-client-generator-cli/-/typespec-client-generator-cli-0.3.0.tgz", + "integrity": "sha512-8YZVI6U9fWdz4Wgg0VPyIZP1HGPaqPZtGg90IndzUq/6D8qfPrTvYAxht4ty69Yt4eDpE98QKcAdOm9qjkidlg==", + "dev": true, + "dependencies": { + "@azure/core-rest-pipeline": "^1.12.0", + "chalk": "^5.3.0", + "prompt-sync": "^4.2.0", + "simple-git": "^3.20.0", + "yaml": "^2.3.1" + }, + "bin": { + "tsp-client": "cmd/tsp-client.js" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@typespec/compiler": ">=0.48.1 <1.0.0" + } + }, + "node_modules/@azure-tools/typespec-client-generator-cli/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@azure/abort-controller": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", + "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", + "dependencies": { + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@azure/core-auth": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.5.0.tgz", + "integrity": "sha512-udzoBuYG1VBoHVohDTrvKjyzel34zt77Bhp7dQntVGGD0ehVq48owENbBG8fIgkHRNUBQH5k1r0hpoMu5L8+kw==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-util": "^1.1.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure/core-lro": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.5.4.tgz", + "integrity": "sha512-3GJiMVH7/10bulzOKGrrLeG/uCBH/9VtxqaMcB9lIqAeamI/xYQSHJL/KcsLDuH+yTjYpro/u6D/MuRe4dN70Q==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-util": "^1.2.0", + "@azure/logger": "^1.0.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure/core-paging": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.5.0.tgz", + "integrity": "sha512-zqWdVIt+2Z+3wqxEOGzR5hXFZ8MGKK52x4vFLw8n58pR6ZfKRx3EXYTxTaYxYHc/PexPUTyimcTWFJbji9Z6Iw==", + "dependencies": { + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure/core-rest-pipeline": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.12.2.tgz", + "integrity": "sha512-wLLJQdL4v1yoqYtEtjKNjf8pJ/G/BqVomAWxcKOR1KbZJyCEnCv04yks7Y1NhJ3JzxbDs307W67uX0JzklFdCg==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.4.0", + "@azure/core-tracing": "^1.0.1", + "@azure/core-util": "^1.3.0", + "@azure/logger": "^1.0.0", + "form-data": "^4.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@azure/core-rest-pipeline/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@azure/core-rest-pipeline/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@azure/core-rest-pipeline/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@azure/core-tracing": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", + "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==", + "dependencies": { + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@azure/core-util": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.6.1.tgz", + "integrity": "sha512-h5taHeySlsV9qxuK64KZxy4iln1BtMYlNt5jbuEFN3UFSAd1EwKg/Gjl5a6tZ/W8t6li3xPnutOx7zbDyXnPmQ==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@azure/logger": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.4.tgz", + "integrity": "sha512-ustrPY8MryhloQj7OWGe+HrYx+aoiOxzbXTtgblbV3xwCqpzUK36phH3XNHQKj3EPonyFUuDTfR3qFhTEAuZEg==", + "dependencies": { + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", @@ -953,6 +1150,56 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@sinonjs/commons": { "version": "1.8.6", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", @@ -1097,6 +1344,192 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, + "node_modules/@typespec/compiler": { + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@typespec/compiler/-/compiler-0.50.0.tgz", + "integrity": "sha512-CLNPxyGahfdxPPvtHdexwFXCPzfjeN7qjCiRjJmUeJV2Qd+nf8Sps+mwyqflw1v7q1GTpgB9kURMsWV/+NgTdw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "~7.22.13", + "ajv": "~8.12.0", + "change-case": "~4.1.2", + "globby": "~13.2.2", + "mustache": "~4.2.0", + "picocolors": "~1.0.0", + "prettier": "~3.0.3", + "prompts": "~2.4.2", + "semver": "^7.5.4", + "vscode-languageserver": "~9.0.0", + "vscode-languageserver-textdocument": "~1.0.8", + "yaml": "~2.3.2", + "yargs": "~17.7.2" + }, + "bin": { + "tsp": "cmd/tsp.js", + "tsp-server": "cmd/tsp-server.js" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@typespec/compiler/node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@typespec/compiler/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@typespec/compiler/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@typespec/compiler/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@typespec/compiler/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@typespec/compiler/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@typespec/compiler/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@typespec/compiler/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@typespec/compiler/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typespec/compiler/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typespec/compiler/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@typespec/compiler/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@typespec/compiler/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@typespec/compiler/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", @@ -1150,7 +1583,6 @@ "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" }, @@ -1158,6 +1590,22 @@ "node": ">= 6.0.0" } }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -1222,8 +1670,20 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/autorest": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/autorest/-/autorest-3.6.3.tgz", + "integrity": "sha512-j/Axwk9bniifTNtBLYVxfQZGQIGPKljFaCQCBWOiybVar2j3tkHP1btiC4a/t9pAJXY6IaFgWctoPM3G/Puhyg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "autorest": "entrypoints/app.js" + }, + "engines": { + "node": ">=12.0.0" + } }, "node_modules/babel-jest": { "version": "27.5.1", @@ -1419,6 +1879,16 @@ "node": ">=6" } }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -1448,6 +1918,17 @@ } ] }, + "node_modules/capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1464,6 +1945,26 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/change-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", + "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.2", + "capital-case": "^1.0.4", + "constant-case": "^3.0.4", + "dot-case": "^3.0.4", + "header-case": "^2.0.4", + "no-case": "^3.0.4", + "param-case": "^3.0.4", + "pascal-case": "^3.1.2", + "path-case": "^3.0.4", + "sentence-case": "^3.0.4", + "snake-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -1543,7 +2044,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -1557,6 +2057,17 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/constant-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", + "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case": "^2.0.2" + } + }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -1619,7 +2130,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -1657,7 +2167,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, "engines": { "node": ">=0.4.0" } @@ -1680,6 +2189,18 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/domexception": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", @@ -1701,6 +2222,16 @@ "node": ">=8" } }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/electron-to-chromium": { "version": "1.4.500", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.500.tgz", @@ -1851,12 +2382,43 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "node_modules/fastq": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", @@ -1990,6 +2552,18 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -1999,6 +2573,37 @@ "node": ">=4" } }, + "node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -2026,6 +2631,16 @@ "node": ">=8" } }, + "node_modules/header-case": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", + "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", + "dev": true, + "dependencies": { + "capital-case": "^1.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/html-encoding-sniffer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", @@ -2062,7 +2677,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -2092,6 +2706,15 @@ "node": ">=0.10.0" } }, + "node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -2154,6 +2777,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -2172,6 +2804,18 @@ "node": ">=6" } }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -3042,6 +3686,12 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -3102,6 +3752,15 @@ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -3180,6 +3839,15 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -3197,7 +3865,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -3206,7 +3873,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -3250,8 +3916,16 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "dev": true, + "bin": { + "mustache": "bin/mustache" + } }, "node_modules/natural-compare": { "version": "1.4.0", @@ -3259,6 +3933,16 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -3358,6 +4042,16 @@ "node": ">=6" } }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -3382,6 +4076,26 @@ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", + "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -3415,6 +4129,15 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -3454,6 +4177,21 @@ "node": ">=8" } }, + "node_modules/prettier": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", + "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/pretty-format": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", @@ -3480,6 +4218,36 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/prompt-sync": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/prompt-sync/-/prompt-sync-4.2.0.tgz", + "integrity": "sha512-BuEzzc5zptP5LsgV5MZETjDaKSWfchl5U9Luiu8SKp7iZWD5tZalOxvNcZRwv+d2phNFr8xlbxmFNcRKfJOzJw==", + "dev": true, + "dependencies": { + "strip-ansi": "^5.0.0" + } + }, + "node_modules/prompt-sync/node_modules/ansi-regex": { + "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" + } + }, + "node_modules/prompt-sync/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -3514,6 +4282,26 @@ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "dev": true }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -3529,6 +4317,15 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -3582,6 +4379,16 @@ "node": ">=10" } }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -3597,6 +4404,29 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -3624,6 +4454,17 @@ "semver": "bin/semver.js" } }, + "node_modules/sentence-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", + "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -3651,6 +4492,21 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "node_modules/simple-git": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.22.0.tgz", + "integrity": "sha512-6JujwSs0ac82jkGjMHiCnTifvf1crOiY/+tfs/Pqih6iow7VrpNKRRNdWm6RtaXpvvv/JGNYhlUtLhGFqHF+Yw==", + "dev": true, + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.3.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" + } + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -3666,6 +4522,16 @@ "node": ">=8" } }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -3981,6 +4847,11 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -4050,6 +4921,33 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", + "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/upper-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/url-parse": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", @@ -4092,6 +4990,49 @@ "node": ">= 8" } }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "dev": true, + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "dev": true, + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz", + "integrity": "sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==", + "dev": true + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "dev": true + }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -4265,6 +5206,15 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, + "node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", diff --git a/packages/service/package.json b/packages/service/package.json index 52dce861d..270957c61 100644 --- a/packages/service/package.json +++ b/packages/service/package.json @@ -25,7 +25,8 @@ "clean:build": "bux rmrf ./build", "clean:esm": "bux rmrf ./lib", "clean:cjs": "bux rmrf ./lib-cjs", - "clean:generated": "bux rmrf ./src/ui-service/generated", + "generate:arm-client": "autorest --typescript swagger/README.md", + "generate:client": "powershell -ExecutionPolicy Bypass -File ./generate-client.ps1", "test": "jest", "test:coverage": "jest --collect-coverage", "test:all": "npm run test:coverage", @@ -63,13 +64,21 @@ "tslib": "~2.3.1" }, "dependencies": { + "@azure-rest/core-client": "^1.1.4", "@azure/bonito-core": "^1.0.0", - "@batch/arm-batch-rest": "^1.0.0" + "@azure/core-auth": "^1.3.0", + "@azure/core-lro": "^2.2.0", + "@azure/core-paging": "^1.2.0", + "@azure/core-rest-pipeline": "^1.8.0", + "@azure/logger": "^1.0.0" }, "devDependencies": { + "@azure-tools/typespec-client-generator-cli": "^0.3.0", "@batch/common-config": "^1.0.0", "@types/jest": "^27.0.1", "@types/node": "20.5.4", + "@typespec/compiler": "^0.50.0", + "autorest": "^3.6.3", "jest": "^27.1.0", "jest-junit": "^12.2.0", "ts-jest": "^27.0.5" @@ -78,5 +87,6 @@ "lib", "lib-cjs", "resources" - ] + ], + "sideEffects": false } diff --git a/packages/service/readme.md b/packages/service/readme.md new file mode 100644 index 000000000..825da26c1 --- /dev/null +++ b/packages/service/readme.md @@ -0,0 +1,45 @@ +# Batch Service Libaray + +This package intended to act as a decoupled data access & business logic layer for the Batch service, which also including two Rest Level Client (RLC) for the Batch Data plane and Batch Management plane. + +RLC (Rest Level Client) is an Azure specific SDK flavor that emphasizes seamless developer experience by acting as a layer above raw HTTP calls. One of the major benefits of this SDK type is that they provide a compact, browser friendly bundle size footprint by relying on an abstract REST client and contains Batch specific Typescript type definitions as oppose to exportable classes. More information about RLCs can be found [here](https://devblogs.microsoft.com/azure-sdk/azure-rest-libraries-for-javascript/). + +## Development Prerequisites + +Before developing against this library, please consult the __Developer Prerequisites__ section of `/packages/README.md`. + +## Package Layout + +- `src/internal/batch-rest` contains the Batch Data plane RLC + +- `src/internal/arm-batch-rest` contains the Batch Management plane RLC + +- `src/internal/client-http` contains the HTTP client code that is shared between the Batch Data plane and Batch Management plane RLCs + +- `swagger` - This subdirectory contains the swagger configuration file containing documented autorest command options to make the __Batch Management RLC__ code regeneration process easier to invoke in case there is a need to refresh the rest api input file or other changes. The associated README.md configuration file contains autorest command options such as: package name and version, swagger input file, source code folder path, client authentication customization, etc. One of the command options within the file is the __input-file__ option which is a link to the openAPI Batch swagger file under the public [Azure Rest API Spec repo](https://github.com/Azure/azure-rest-api-specs). In order to regenerate the SDK to pick up the latest API swagger definitions, you will need to change the input-file path to point to the file denoted under the latest API version. + +- `/eng/emitter-package.json` - This file is used by `tsp-client` to install the required dependencies to setup the local TypeSpec project for generating the Batch Data plane RLC, see more details in [Azure JS SDK RLC quickstart](https://github.com/Azure/azure-sdk-for-js/blob/main/documentation/RLC-quickstart.md) and [tsp-client npm readme](https://www.npmjs.com/package/@azure-tools/typespec-client-generator-cli) + +## Generating the Batch Data Plane RLC + +Batch Data Plane RLC is generated based on our TypeSpec files. First make sure `src\internal\batch-rest\generated\tsp-location.yaml` is updated with the __github__ repo and the commit hash which has the targeted `tspconfig.yml` and `*.tsp` files. Then then run the following from the root of the `service` package: + +```shell +npm run generate:client +``` + +This will execute `generate-client.ps1` which runs `tsp-client` command to fetch the remote `tspconfig.yml` and `*.tsp` files and install the required dependencies for a local TypeSpec project in `src/internal/arm-batch-rest/generated/TempTypeSpecFiles`, which shouldn't be checked in as it's a temporaty project. Then, the `tsp-client` will generate the Batch Data plane RLC code based on this local TypeSpec project, see more details in the [tsp-client npm readme](https://www.npmjs.com/package/@azure-tools/typespec-client-generator-cli) + +- `src/internal/batch-rest/generated/src` - This holds the autogenerated code such as obtaining the client and Batch specific modeless interfaces. These files should generally not be modified manually. + +## Generating the Batch Management RLC + +Batch Management RLC is generated based on swagger files by autorest. First make sure `input-file` in `swagger/README.md` is pointing to the latest API version. Then then run the following from the root of the `service` package: + +```shell +npm run generate:arm-client +``` + +This will parse the command options from the README and regenerate the SDK code + +- `src/internal/arm-batch-rest/generated` - This holds the swagger autogenerated code such as obtaining the client and Batch specific modeless interfaces. These files should generally not be modified manually. diff --git a/packages/service/src/__tests__/service-utils.spec.ts b/packages/service/src/__tests__/service-utils.spec.ts new file mode 100644 index 000000000..248b19c60 --- /dev/null +++ b/packages/service/src/__tests__/service-utils.spec.ts @@ -0,0 +1,83 @@ +import { parseBatchAccountIdInfo, parsePoolArmIdInfo } from "../utils"; + +describe("parse arm id", () => { + it("should parse a valid arm id", () => { + const batchAccountId = + "/subscriptions/123/resourceGroups/rg/providers/Microsoft.Batch/batchAccounts/ba"; + + const poolArmId = + "/subscriptions/123/resourceGroups/rg/providers/Microsoft.Batch/batchAccounts/ba/pools/pool"; + + const result1 = parseBatchAccountIdInfo(batchAccountId); + expect(result1).toEqual({ + subscriptionId: "123", + resourceGroupName: "rg", + batchAccountName: "ba", + }); + + const result2 = parsePoolArmIdInfo(poolArmId); + expect(result2).toEqual({ + subscriptionId: "123", + resourceGroupName: "rg", + batchAccountName: "ba", + poolName: "pool", + }); + }); + + it("should parse a valid absolute url", () => { + const batchAccountId = + "https://example.com/subscriptions/123/resourceGroups/rg/providers/Microsoft.Batch/batchAccounts/ba"; + + const poolArmId = + "https://example.com/subscriptions/123/resourceGroups/rg/providers/Microsoft.Batch/batchAccounts/ba/pools/pool"; + + const result1 = parseBatchAccountIdInfo(batchAccountId); + expect(result1).toEqual({ + subscriptionId: "123", + resourceGroupName: "rg", + batchAccountName: "ba", + }); + + const result2 = parsePoolArmIdInfo(poolArmId); + expect(result2).toEqual({ + subscriptionId: "123", + resourceGroupName: "rg", + batchAccountName: "ba", + poolName: "pool", + }); + }); + + it("should parse with case-insensitive", () => { + const batchAccountId = + "/SuBscriptions/123/resourceGroups/rg/providers/Microsoft.Batch/batchAccounts/ba"; + + const poolArmId = + "/SuBscriptions/123/resourceGroups/rg/providers/Microsoft.Batch/batchAccounts/ba/pools/pool"; + const result1 = parseBatchAccountIdInfo(batchAccountId); + expect(result1).toEqual({ + subscriptionId: "123", + resourceGroupName: "rg", + batchAccountName: "ba", + }); + + const result2 = parsePoolArmIdInfo(poolArmId); + expect(result2).toEqual({ + subscriptionId: "123", + resourceGroupName: "rg", + batchAccountName: "ba", + poolName: "pool", + }); + }); + + it("should throw an error for an invalid batch account id", () => { + const batchAccountId = "/invalid/batch/account/id"; + expect(() => parseBatchAccountIdInfo(batchAccountId)).toThrowError( + "Unable to parse batch account id: /invalid/batch/account/id" + ); + + const poolArmId = "/invalid/pool/arm/id"; + expect(() => parsePoolArmIdInfo(poolArmId)).toThrowError( + "Unable to parse pool ARM id: /invalid/pool/arm/id" + ); + }); +}); diff --git a/packages/service/src/account/account-models.ts b/packages/service/src/account/account-models.ts index 3a0795cff..9879e1172 100644 --- a/packages/service/src/account/account-models.ts +++ b/packages/service/src/account/account-models.ts @@ -1 +1 @@ -export { BatchAccountOutput } from "@batch/arm-batch-rest"; +export { BatchAccountOutput } from "../internal/arm-batch-rest"; diff --git a/packages/service/src/arm-batch-models.ts b/packages/service/src/arm-batch-models.ts new file mode 100644 index 000000000..bae0d6077 --- /dev/null +++ b/packages/service/src/arm-batch-models.ts @@ -0,0 +1 @@ +export * from "./internal/arm-batch-rest/generated/outputModels"; diff --git a/packages/service/src/batch-models.ts b/packages/service/src/batch-models.ts new file mode 100644 index 000000000..989730a1a --- /dev/null +++ b/packages/service/src/batch-models.ts @@ -0,0 +1 @@ +export * from "./internal/batch-rest/generated/src/outputModels"; diff --git a/packages/service/src/constants.ts b/packages/service/src/constants.ts index 569301433..3e2a4086d 100644 --- a/packages/service/src/constants.ts +++ b/packages/service/src/constants.ts @@ -1,4 +1,4 @@ export const BatchApiVersion = { - arm: `2022-10-01`, - data: `2022-10-01.16.0`, + arm: `2023-05-01`, + data: `2023-05-01.17.0`, }; diff --git a/packages/service/src/environment/batch-dependencies.ts b/packages/service/src/environment/batch-dependencies.ts index 14809ece4..94d334127 100644 --- a/packages/service/src/environment/batch-dependencies.ts +++ b/packages/service/src/environment/batch-dependencies.ts @@ -1,10 +1,13 @@ import { DependencyFactories } from "@azure/bonito-core/lib/environment"; +import { NodeService } from "../node"; import { PoolService } from "../pool"; export enum BatchDependencyName { PoolService = "poolService", + NodeService = "nodeService", } export interface BatchDependencyFactories extends DependencyFactories { [BatchDependencyName.PoolService]: () => PoolService; + [BatchDependencyName.NodeService]: () => NodeService; } diff --git a/packages/service/src/index.ts b/packages/service/src/index.ts index 6dc874586..9147f198a 100644 --- a/packages/service/src/index.ts +++ b/packages/service/src/index.ts @@ -2,4 +2,5 @@ export * from "./view"; export * from "./account"; export * from "./certificate"; export * from "./pool"; +export * from "./node"; export * from "./constants"; diff --git a/packages/arm-batch-rest/README.md b/packages/service/src/internal/arm-batch-rest/README.md similarity index 100% rename from packages/arm-batch-rest/README.md rename to packages/service/src/internal/arm-batch-rest/README.md diff --git a/packages/arm-batch-rest/src/__tests__/batch-management-client.spec.ts b/packages/service/src/internal/arm-batch-rest/__tests__/arm-batch-rest.spec.ts similarity index 98% rename from packages/arm-batch-rest/src/__tests__/batch-management-client.spec.ts rename to packages/service/src/internal/arm-batch-rest/__tests__/arm-batch-rest.spec.ts index f75a4d56c..54f6826f3 100644 --- a/packages/arm-batch-rest/src/__tests__/batch-management-client.spec.ts +++ b/packages/service/src/internal/arm-batch-rest/__tests__/arm-batch-rest.spec.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ -import generateBatchManagementClient from "../client"; +import { createARMBatchClient } from "../client"; import { BatchAccountListResultOutput, BatchManagementClient, @@ -15,7 +15,7 @@ import { BATCH_API_VERSION, getUrlBatchAccountPath, getUrlPoolPath, -} from "./utils/client"; +} from "../__tests__/utils/client"; import { DependencyName, getMockEnvironment, @@ -68,7 +68,7 @@ describe("Batch Management Client With Mock Http Client Test", () => { DependencyName.HttpClient ); - batchClient = generateBatchManagementClient(); + batchClient = createARMBatchClient(); }); describe("Basic Pool operations", () => { diff --git a/packages/arm-batch-rest/src/__tests__/utils/client.ts b/packages/service/src/internal/arm-batch-rest/__tests__/utils/client.ts similarity index 100% rename from packages/arm-batch-rest/src/__tests__/utils/client.ts rename to packages/service/src/internal/arm-batch-rest/__tests__/utils/client.ts diff --git a/packages/arm-batch-rest/src/client.ts b/packages/service/src/internal/arm-batch-rest/client.ts similarity index 79% rename from packages/arm-batch-rest/src/client.ts rename to packages/service/src/internal/arm-batch-rest/client.ts index 9b0a71e3e..d1b23c963 100644 --- a/packages/arm-batch-rest/src/client.ts +++ b/packages/service/src/internal/arm-batch-rest/client.ts @@ -8,9 +8,9 @@ import { TokenCredential } from "@azure/core-auth"; import { ClientOptions } from "@azure-rest/core-client"; import { BatchManagementClient } from "./generated"; import createClient from "./generated/batchManagementClient"; -import { BatchHttpClient } from "./http/batch-http-client"; +import { BatchHttpClient } from "../client-http/batch-http-client"; -export default function generateBatchManagementClient( +export function createARMBatchClient( options: ClientOptions = {}, credential?: TokenCredential ): BatchManagementClient { @@ -18,6 +18,9 @@ export default function generateBatchManagementClient( options = { ...options, httpClient: new BatchHttpClient(), + retryOptions: { + maxRetries: 0, + }, }; } // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/packages/arm-batch-rest/src/generated/batchManagementClient.ts b/packages/service/src/internal/arm-batch-rest/generated/batchManagementClient.ts similarity index 100% rename from packages/arm-batch-rest/src/generated/batchManagementClient.ts rename to packages/service/src/internal/arm-batch-rest/generated/batchManagementClient.ts diff --git a/packages/arm-batch-rest/src/generated/clientDefinitions.ts b/packages/service/src/internal/arm-batch-rest/generated/clientDefinitions.ts similarity index 100% rename from packages/arm-batch-rest/src/generated/clientDefinitions.ts rename to packages/service/src/internal/arm-batch-rest/generated/clientDefinitions.ts diff --git a/packages/arm-batch-rest/src/generated/index.ts b/packages/service/src/internal/arm-batch-rest/generated/index.ts similarity index 100% rename from packages/arm-batch-rest/src/generated/index.ts rename to packages/service/src/internal/arm-batch-rest/generated/index.ts diff --git a/packages/arm-batch-rest/src/generated/isUnexpected.ts b/packages/service/src/internal/arm-batch-rest/generated/isUnexpected.ts similarity index 100% rename from packages/arm-batch-rest/src/generated/isUnexpected.ts rename to packages/service/src/internal/arm-batch-rest/generated/isUnexpected.ts diff --git a/packages/arm-batch-rest/src/generated/models.ts b/packages/service/src/internal/arm-batch-rest/generated/models.ts similarity index 99% rename from packages/arm-batch-rest/src/generated/models.ts rename to packages/service/src/internal/arm-batch-rest/generated/models.ts index 38fefd360..a5997d427 100644 --- a/packages/arm-batch-rest/src/generated/models.ts +++ b/packages/service/src/internal/arm-batch-rest/generated/models.ts @@ -738,7 +738,7 @@ export interface StartTask { environmentSettings?: Array; /** If omitted, the task runs as a non-administrative user unique to the task. */ userIdentity?: UserIdentity; - /** The Batch service retries a task if its exit code is nonzero. Note that this value specifically controls the number of retries. The Batch service will try the task once, and may then retry up to this limit. For example, if the maximum retry count is 3, Batch tries the task up to 4 times (one initial try and 3 retries). If the maximum retry count is 0, the Batch service does not retry the task. If the maximum retry count is -1, the Batch service retries the task without limit. */ + /** The Batch service retries a task if its exit code is nonzero. Note that this value specifically controls the number of retries. The Batch service will try the task once, and may then retry up to this limit. For example, if the maximum retry count is 3, Batch tries the task up to 4 times (one initial try and 3 retries). If the maximum retry count is 0, the Batch service does not retry the task. If the maximum retry count is -1, the Batch service retries the task without limit. Default is 0. */ maxTaskRetryCount?: number; /** If true and the start task fails on a compute node, the Batch service retries the start task up to its maximum retry count (maxTaskRetryCount). If the task has still not completed successfully after all retries, then the Batch service marks the compute node unusable, and will not schedule tasks to it. This condition can be detected via the node state and scheduling error detail. If false, the Batch service will not wait for the start task to complete. In this case, other tasks can start executing on the compute node while the start task is still running; and even if the start task fails, new tasks will continue to be scheduled on the node. The default is true. */ waitForSuccess?: boolean; diff --git a/packages/arm-batch-rest/src/generated/outputModels.ts b/packages/service/src/internal/arm-batch-rest/generated/outputModels.ts similarity index 97% rename from packages/arm-batch-rest/src/generated/outputModels.ts rename to packages/service/src/internal/arm-batch-rest/generated/outputModels.ts index 98b2229cf..c3e6d5033 100644 --- a/packages/arm-batch-rest/src/generated/outputModels.ts +++ b/packages/service/src/internal/arm-batch-rest/generated/outputModels.ts @@ -185,16 +185,14 @@ export interface PrivateLinkServiceConnectionStateOutput { /** A definition of an Azure resource. */ export interface ProxyResourceOutput { - // KLUDGE (dawatrou): Manually fixed up 'id', 'name' and 'type' to be non-nullable. - // Need to follow up with the JS SDK team about this. - /** The ID of the resource. */ - id: string; - /** The name of the resource. */ - name: string; - /** The type of the resource. */ - type: string; - /** The ETag of the resource, used for concurrency statements. */ - etag?: string; + /** The ID of the resource. */ + id?: string; + /** The name of the resource. */ + name?: string; + /** The type of the resource. */ + type?: string; + /** The ETag of the resource, used for concurrency statements. */ + etag?: string; } /** Contains information about the auto-storage account associated with a Batch account. */ @@ -863,20 +861,16 @@ export interface TaskSchedulingPolicyOutput { /** Properties used to create a user on an Azure Batch node. */ export interface UserAccountOutput { - /** The name of the user account. Names can contain any Unicode characters up to a maximum length of 20. */ - name: string; - /** - * KLUDGE (dawatrou): Manually removed incorred "password" property. This is a secret and isn't returned by the service. - * This should be fixed in the Swagger so x-ms-secret is true. - * The password for the user account. - * */ - // password: string; - /** nonAdmin - The auto user is a standard user without elevated access. admin - The auto user is a user with elevated access and operates with full Administrator permissions. The default value is nonAdmin. */ - elevationLevel?: "NonAdmin" | "Admin"; - /** This property is ignored if specified on a Windows pool. If not specified, the user is created with the default options. */ - linuxUserConfiguration?: LinuxUserConfigurationOutput; - /** This property can only be specified if the user is on a Windows pool. If not specified and on a Windows pool, the user is created with the default options. */ - windowsUserConfiguration?: WindowsUserConfigurationOutput; + /** The name of the user account. Names can contain any Unicode characters up to a maximum length of 20. */ + name: string; + /** The password for the user account. */ + password: string; + /** nonAdmin - The auto user is a standard user without elevated access. admin - The auto user is a user with elevated access and operates with full Administrator permissions. The default value is nonAdmin. */ + elevationLevel?: "NonAdmin" | "Admin"; + /** This property is ignored if specified on a Windows pool. If not specified, the user is created with the default options. */ + linuxUserConfiguration?: LinuxUserConfigurationOutput; + /** This property can only be specified if the user is on a Windows pool. If not specified and on a Windows pool, the user is created with the default options. */ + windowsUserConfiguration?: WindowsUserConfigurationOutput; } /** Properties used to create a user account on a Linux node. */ @@ -913,7 +907,7 @@ export interface StartTaskOutput { environmentSettings?: Array; /** If omitted, the task runs as a non-administrative user unique to the task. */ userIdentity?: UserIdentityOutput; - /** The Batch service retries a task if its exit code is nonzero. Note that this value specifically controls the number of retries. The Batch service will try the task once, and may then retry up to this limit. For example, if the maximum retry count is 3, Batch tries the task up to 4 times (one initial try and 3 retries). If the maximum retry count is 0, the Batch service does not retry the task. If the maximum retry count is -1, the Batch service retries the task without limit. */ + /** The Batch service retries a task if its exit code is nonzero. Note that this value specifically controls the number of retries. The Batch service will try the task once, and may then retry up to this limit. For example, if the maximum retry count is 3, Batch tries the task up to 4 times (one initial try and 3 retries). If the maximum retry count is 0, the Batch service does not retry the task. If the maximum retry count is -1, the Batch service retries the task without limit. Default is 0. */ maxTaskRetryCount?: number; /** If true and the start task fails on a compute node, the Batch service retries the start task up to its maximum retry count (maxTaskRetryCount). If the task has still not completed successfully after all retries, then the Batch service marks the compute node unusable, and will not schedule tasks to it. This condition can be detected via the node state and scheduling error detail. If false, the Batch service will not wait for the start task to complete. In this case, other tasks can start executing on the compute node while the start task is still running; and even if the start task fails, new tasks will continue to be scheduled on the node. The default is true. */ waitForSuccess?: boolean; diff --git a/packages/arm-batch-rest/src/generated/paginateHelper.ts b/packages/service/src/internal/arm-batch-rest/generated/paginateHelper.ts similarity index 100% rename from packages/arm-batch-rest/src/generated/paginateHelper.ts rename to packages/service/src/internal/arm-batch-rest/generated/paginateHelper.ts diff --git a/packages/arm-batch-rest/src/generated/parameters.ts b/packages/service/src/internal/arm-batch-rest/generated/parameters.ts similarity index 100% rename from packages/arm-batch-rest/src/generated/parameters.ts rename to packages/service/src/internal/arm-batch-rest/generated/parameters.ts diff --git a/packages/arm-batch-rest/src/generated/pollingHelper.ts b/packages/service/src/internal/arm-batch-rest/generated/pollingHelper.ts similarity index 100% rename from packages/arm-batch-rest/src/generated/pollingHelper.ts rename to packages/service/src/internal/arm-batch-rest/generated/pollingHelper.ts diff --git a/packages/arm-batch-rest/src/generated/responses.ts b/packages/service/src/internal/arm-batch-rest/generated/responses.ts similarity index 100% rename from packages/arm-batch-rest/src/generated/responses.ts rename to packages/service/src/internal/arm-batch-rest/generated/responses.ts diff --git a/packages/arm-batch-rest/src/index.ts b/packages/service/src/internal/arm-batch-rest/index.ts similarity index 90% rename from packages/arm-batch-rest/src/index.ts rename to packages/service/src/internal/arm-batch-rest/index.ts index edae6cbbf..e3a91da3f 100644 --- a/packages/arm-batch-rest/src/index.ts +++ b/packages/service/src/internal/arm-batch-rest/index.ts @@ -7,5 +7,4 @@ export * from "./generated/isUnexpected"; export * from "./generated/models"; export * from "./generated/outputModels"; export * from "./generated/paginateHelper"; -export * from "./generated/pollingHelper"; export * from "./client"; diff --git a/packages/service/src/internal/batch-rest/__tests__/batch-rest.spec.ts b/packages/service/src/internal/batch-rest/__tests__/batch-rest.spec.ts new file mode 100644 index 000000000..f744d0f77 --- /dev/null +++ b/packages/service/src/internal/batch-rest/__tests__/batch-rest.spec.ts @@ -0,0 +1,231 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import { createBatchClient } from "../client"; +import { + DependencyName, + getMockEnvironment, + initMockEnvironment, +} from "@azure/bonito-core/lib/environment"; +import { MockHttpClient, MockHttpResponse } from "@azure/bonito-core/lib/http"; +import { + BatchClient, + BatchJobListResultOutput, + BatchJobOutput, + BatchNodeListResultOutput, + BatchNodeVMExtensionListResultOutput, + CreateJobParameters, +} from "../generated/src"; + +const batchAccountEndpoint = "https://batchaccount.eastus2.batch.azure.com"; +const BATCH_API_VERSION = "2023-05-01.17.0"; + +describe("Batch Client With Mock Http Client Test", () => { + let batchClient: BatchClient; + let mockClient: MockHttpClient; + + beforeEach(() => { + initMockEnvironment(); + mockClient = getMockEnvironment().getInjectable( + DependencyName.HttpClient + ); + + batchClient = createBatchClient(batchAccountEndpoint); + }); + + describe("Basic Job operations", () => { + test("Create Batch Job", async () => { + const jobPath = "/jobs"; + const requestUrlJobPath = `${batchAccountEndpoint}${jobPath}?api-version=${BATCH_API_VERSION}`; + const mockResponse = new MockHttpResponse(requestUrlJobPath, { + status: 201, + headers: { + "Content-Type": "application/json", + }, + }); + const jobParams: CreateJobParameters = { + contentType: "application/json; odata=minimalmetadata", + body: { + id: "test-job-id", + poolInfo: { poolId: "test-pool-id" }, + }, + }; + + mockClient.addExpected(mockResponse, { + method: "POST", + body: JSON.stringify(jobParams.body), + }); + + const response = await batchClient.path("/jobs").post(jobParams); + + expect(response.status).toEqual("201"); + }); + + test("Get Batch Job", async () => { + const jobId = "test-job-id"; + const jobPath = "/jobs/{jobId}"; + const requestUrlJobPath = `${batchAccountEndpoint}${jobPath.replace( + "{jobId}", + jobId + )}?api-version=${BATCH_API_VERSION}`; + const mockResponse = new MockHttpResponse(requestUrlJobPath, { + status: 200, + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + id: jobId, + poolInfo: { poolId: "test-pool-id" }, + }), + }); + + mockClient.addExpected(mockResponse, { + method: "GET", + }); + + const response = await batchClient.path(jobPath, jobId).get(); + + expect(response.status).toEqual("200"); + const body = response.body as BatchJobOutput; + expect(body.id).toEqual(jobId); + expect(body?.poolInfo.poolId).toEqual("test-pool-id"); + }); + + test("list job", async () => { + const jobPath = "/jobs"; + const requestUrlJobPath = `${batchAccountEndpoint}${jobPath}?api-version=${BATCH_API_VERSION}`; + const mockResponse = new MockHttpResponse(requestUrlJobPath, { + status: 200, + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + value: [ + { + id: "test-job-id", + poolInfo: { poolId: "test-pool-id" }, + }, + ], + }), + }); + + mockClient.addExpected(mockResponse, { + method: "GET", + }); + + const response = await batchClient.path(jobPath).get(); + + expect(response.status).toEqual("200"); + const body = response.body as BatchJobListResultOutput; + expect(body?.value?.length).toEqual(1); + expect(body?.value?.[0].id).toEqual("test-job-id"); + expect(body?.value?.[0]?.poolInfo.poolId).toEqual("test-pool-id"); + }); + + test("delete job", async () => { + const jobId = "test-job-id"; + const jobPath = "/jobs/{jobId}"; + const requestUrlJobPath = `${batchAccountEndpoint}${jobPath.replace( + "{jobId}", + jobId + )}?api-version=${BATCH_API_VERSION}`; + const mockResponse = new MockHttpResponse(requestUrlJobPath, { + status: 204, + headers: { + "Content-Type": "application/json", + }, + }); + + mockClient.addExpected(mockResponse, { + method: "DELETE", + }); + + const response = await batchClient.path(jobPath, jobId).delete(); + + expect(response.status).toEqual("204"); + }); + }); + describe("Basic Node operations", () => { + test("list compute nodes", async () => { + const poolId = "test-pool-id"; + const nodePath = "/pools/{poolId}/nodes"; + const requestUrlNodePath = `${batchAccountEndpoint}${nodePath.replace( + "{poolId}", + poolId + )}?api-version=${BATCH_API_VERSION}`; + const mockResponse = new MockHttpResponse(requestUrlNodePath, { + status: 200, + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + value: [ + { + id: "test-node-id", + state: "idle", + }, + ], + }), + }); + + mockClient.addExpected(mockResponse, { + method: "GET", + }); + + const response = await batchClient.path(nodePath, poolId).get(); + + expect(response.status).toEqual("200"); + const body = response.body as BatchNodeListResultOutput; + expect(body?.value?.length).toEqual(1); + expect(body?.value?.[0]?.id).toEqual("test-node-id"); + expect(body.value?.[0]?.state).toEqual("idle"); + }); + }); + + test("list compute node extensions", async () => { + const poolId = "test-pool-id"; + const nodeId = "test-node-id"; + const nodeExtensionPath = "/pools/{poolId}/nodes/{nodeId}/extensions"; + const requestUrlNodeExtensionPath = `${batchAccountEndpoint}${nodeExtensionPath + .replace("{poolId}", poolId) + .replace("{nodeId}", nodeId)}?api-version=${BATCH_API_VERSION}`; + const mockResponse = new MockHttpResponse(requestUrlNodeExtensionPath, { + status: 200, + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + value: [ + { + vmExtension: { + name: "extension-name", + type: "extension-type", + publisher: "extension-publisher", + typeHandlerVersion: "1.0", + }, + provisioningState: "success", + }, + ], + }), + }); + + mockClient.addExpected(mockResponse, { + method: "GET", + }); + + const response = await batchClient + .path(nodeExtensionPath, poolId, nodeId) + .get(); + + expect(response.status).toEqual("200"); + const body = response.body as BatchNodeVMExtensionListResultOutput; + expect(body?.value?.length).toEqual(1); + expect(body?.value?.[0]?.vmExtension?.name).toEqual("extension-name"); + expect(body?.value?.[0]?.vmExtension?.type).toEqual("extension-type"); + expect(body?.value?.[0]?.vmExtension?.publisher).toEqual( + "extension-publisher" + ); + expect(body?.value?.[0]?.vmExtension?.typeHandlerVersion).toEqual( + "1.0" + ); + expect(body?.value?.[0]?.provisioningState).toEqual("success"); + }); +}); diff --git a/packages/service/src/internal/batch-rest/client.ts b/packages/service/src/internal/batch-rest/client.ts new file mode 100644 index 000000000..5718657a6 --- /dev/null +++ b/packages/service/src/internal/batch-rest/client.ts @@ -0,0 +1,28 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + */ + +import { TokenCredential } from "@azure/core-auth"; +import { ClientOptions } from "@azure-rest/core-client"; +import { BatchClient } from "./generated/src"; +import createClient from "./generated/src/batchClient"; +import { BatchHttpClient } from "../client-http/batch-http-client"; + +export function createBatchClient( + endpoint: string, + options: ClientOptions = {}, + credential?: TokenCredential +): BatchClient { + if (!options.httpClient) { + options = { + ...options, + httpClient: new BatchHttpClient(), + apiVersion: "2023-05-01.17.0", + }; + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const credentials = credential ?? (undefined as any); + return createClient(endpoint, credentials, options); +} diff --git a/packages/service/src/internal/batch-rest/generated/src/batchClient.ts b/packages/service/src/internal/batch-rest/generated/src/batchClient.ts new file mode 100644 index 000000000..c2c1b54d9 --- /dev/null +++ b/packages/service/src/internal/batch-rest/generated/src/batchClient.ts @@ -0,0 +1,50 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { getClient, ClientOptions } from "@azure-rest/core-client"; +import { logger } from "./logger"; +import { TokenCredential } from "@azure/core-auth"; +import { BatchClient } from "./clientDefinitions"; + +/** + * Initialize a new instance of `BatchClient` + * @param endpoint - Batch account endpoint (for example: https://batchaccount.eastus2.batch.azure.com). + * @param credentials - uniquely identify client credential + * @param options - the parameter for all optional parameters + */ +export default function createClient( + endpoint: string, + credentials: TokenCredential, + options: ClientOptions = {} +): BatchClient { + const baseUrl = options.baseUrl ?? `${endpoint}`; + options.apiVersion = options.apiVersion ?? "2023-11-01.18.0"; + const userAgentInfo = `azsdk-js-batch-rest/1.0.0-beta.1`; + const userAgentPrefix = + options.userAgentOptions && options.userAgentOptions.userAgentPrefix + ? `${options.userAgentOptions.userAgentPrefix} ${userAgentInfo}` + : `${userAgentInfo}`; + options = { + ...options, + userAgentOptions: { + userAgentPrefix, + }, + loggingOptions: { + logger: options.loggingOptions?.logger ?? logger.info, + }, + telemetryOptions: { + clientRequestIdHeaderName: + options.telemetryOptions?.clientRequestIdHeaderName ?? + "client-request-id", + }, + credentials: { + scopes: options.credentials?.scopes ?? [ + "https://batch.core.windows.net//.default", + ], + }, + }; + + const client = getClient(baseUrl, credentials, options) as BatchClient; + + return client; +} diff --git a/packages/service/src/internal/batch-rest/generated/src/clientDefinitions.ts b/packages/service/src/internal/batch-rest/generated/src/clientDefinitions.ts new file mode 100644 index 000000000..a8a57f786 --- /dev/null +++ b/packages/service/src/internal/batch-rest/generated/src/clientDefinitions.ts @@ -0,0 +1,1297 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { + ListApplicationsParameters, + GetApplicationParameters, + ListPoolUsageMetricsParameters, + CreatePoolParameters, + ListPoolsParameters, + DeletePoolParameters, + PoolExistsParameters, + GetPoolParameters, + UpdatePoolParameters, + DisablePoolAutoScaleParameters, + EnablePoolAutoScaleParameters, + EvaluatePoolAutoScaleParameters, + ResizePoolParameters, + StopPoolResizeParameters, + ReplacePoolPropertiesParameters, + RemoveNodesParameters, + ListSupportedImagesParameters, + ListPoolNodeCountsParameters, + DeleteJobParameters, + GetJobParameters, + UpdateJobParameters, + ReplaceJobParameters, + DisableJobParameters, + EnableJobParameters, + TerminateJobParameters, + CreateJobParameters, + ListJobsParameters, + ListJobsFromScheduleParameters, + ListJobPreparationAndReleaseTaskStatusParameters, + GetJobTaskCountsParameters, + CreateCertificateParameters, + ListCertificatesParameters, + CancelCertificateDeletionParameters, + DeleteCertificateParameters, + GetCertificateParameters, + JobScheduleExistsParameters, + DeleteJobScheduleParameters, + GetJobScheduleParameters, + UpdateJobScheduleParameters, + ReplaceJobScheduleParameters, + DisableJobScheduleParameters, + EnableJobScheduleParameters, + TerminateJobScheduleParameters, + CreateJobScheduleParameters, + ListJobSchedulesParameters, + CreateTaskParameters, + ListTasksParameters, + CreateTaskCollectionParameters, + DeleteTaskParameters, + GetTaskParameters, + ReplaceTaskParameters, + ListSubTasksParameters, + TerminateTaskParameters, + ReactivateTaskParameters, + DeleteTaskFileParameters, + GetTaskFileParameters, + GetTaskFilePropertiesParameters, + ListTaskFilesParameters, + CreateNodeUserParameters, + DeleteNodeUserParameters, + ReplaceNodeUserParameters, + GetNodeParameters, + RebootNodeParameters, + ReimageNodeParameters, + DisableNodeSchedulingParameters, + EnableNodeSchedulingParameters, + GetNodeRemoteLoginSettingsParameters, + GetNodeRemoteDesktopFileParameters, + UploadNodeLogsParameters, + ListNodesParameters, + GetNodeExtensionParameters, + ListNodeExtensionsParameters, + DeleteNodeFileParameters, + GetNodeFileParameters, + GetNodeFilePropertiesParameters, + ListNodeFilesParameters, +} from "./parameters"; +import { + ListApplications200Response, + ListApplicationsDefaultResponse, + GetApplication200Response, + GetApplicationDefaultResponse, + ListPoolUsageMetrics200Response, + ListPoolUsageMetricsDefaultResponse, + CreatePool201Response, + CreatePoolDefaultResponse, + ListPools200Response, + ListPoolsDefaultResponse, + DeletePool202Response, + DeletePoolDefaultResponse, + PoolExists200Response, + PoolExists404Response, + PoolExistsDefaultResponse, + GetPool200Response, + GetPoolDefaultResponse, + UpdatePool200Response, + UpdatePoolDefaultResponse, + DisablePoolAutoScale200Response, + DisablePoolAutoScaleDefaultResponse, + EnablePoolAutoScale200Response, + EnablePoolAutoScaleDefaultResponse, + EvaluatePoolAutoScale200Response, + EvaluatePoolAutoScaleDefaultResponse, + ResizePool202Response, + ResizePoolDefaultResponse, + StopPoolResize202Response, + StopPoolResizeDefaultResponse, + ReplacePoolProperties204Response, + ReplacePoolPropertiesDefaultResponse, + RemoveNodes202Response, + RemoveNodesDefaultResponse, + ListSupportedImages200Response, + ListSupportedImagesDefaultResponse, + ListPoolNodeCounts200Response, + ListPoolNodeCountsDefaultResponse, + DeleteJob202Response, + DeleteJobDefaultResponse, + GetJob200Response, + GetJobDefaultResponse, + UpdateJob200Response, + UpdateJobDefaultResponse, + ReplaceJob200Response, + ReplaceJobDefaultResponse, + DisableJob202Response, + DisableJobDefaultResponse, + EnableJob202Response, + EnableJobDefaultResponse, + TerminateJob202Response, + TerminateJobDefaultResponse, + CreateJob201Response, + CreateJobDefaultResponse, + ListJobs200Response, + ListJobsDefaultResponse, + ListJobsFromSchedule200Response, + ListJobsFromScheduleDefaultResponse, + ListJobPreparationAndReleaseTaskStatus200Response, + ListJobPreparationAndReleaseTaskStatusDefaultResponse, + GetJobTaskCounts200Response, + GetJobTaskCountsDefaultResponse, + CreateCertificate201Response, + CreateCertificateDefaultResponse, + ListCertificates200Response, + ListCertificatesDefaultResponse, + CancelCertificateDeletion204Response, + CancelCertificateDeletionDefaultResponse, + DeleteCertificate202Response, + DeleteCertificateDefaultResponse, + GetCertificate200Response, + GetCertificateDefaultResponse, + JobScheduleExists200Response, + JobScheduleExists404Response, + JobScheduleExistsDefaultResponse, + DeleteJobSchedule202Response, + DeleteJobScheduleDefaultResponse, + GetJobSchedule200Response, + GetJobScheduleDefaultResponse, + UpdateJobSchedule200Response, + UpdateJobScheduleDefaultResponse, + ReplaceJobSchedule200Response, + ReplaceJobScheduleDefaultResponse, + DisableJobSchedule204Response, + DisableJobScheduleDefaultResponse, + EnableJobSchedule204Response, + EnableJobScheduleDefaultResponse, + TerminateJobSchedule202Response, + TerminateJobScheduleDefaultResponse, + CreateJobSchedule201Response, + CreateJobScheduleDefaultResponse, + ListJobSchedules200Response, + ListJobSchedulesDefaultResponse, + CreateTask201Response, + CreateTaskDefaultResponse, + ListTasks200Response, + ListTasksDefaultResponse, + CreateTaskCollection200Response, + CreateTaskCollectionDefaultResponse, + DeleteTask200Response, + DeleteTaskDefaultResponse, + GetTask200Response, + GetTaskDefaultResponse, + ReplaceTask200Response, + ReplaceTaskDefaultResponse, + ListSubTasks200Response, + ListSubTasksDefaultResponse, + TerminateTask204Response, + TerminateTaskDefaultResponse, + ReactivateTask204Response, + ReactivateTaskDefaultResponse, + DeleteTaskFile200Response, + DeleteTaskFileDefaultResponse, + GetTaskFile200Response, + GetTaskFileDefaultResponse, + GetTaskFileProperties200Response, + GetTaskFilePropertiesDefaultResponse, + ListTaskFiles200Response, + ListTaskFilesDefaultResponse, + CreateNodeUser201Response, + CreateNodeUserDefaultResponse, + DeleteNodeUser200Response, + DeleteNodeUserDefaultResponse, + ReplaceNodeUser200Response, + ReplaceNodeUserDefaultResponse, + GetNode200Response, + GetNodeDefaultResponse, + RebootNode202Response, + RebootNodeDefaultResponse, + ReimageNode202Response, + ReimageNodeDefaultResponse, + DisableNodeScheduling200Response, + DisableNodeSchedulingDefaultResponse, + EnableNodeScheduling200Response, + EnableNodeSchedulingDefaultResponse, + GetNodeRemoteLoginSettings200Response, + GetNodeRemoteLoginSettingsDefaultResponse, + GetNodeRemoteDesktopFile200Response, + GetNodeRemoteDesktopFileDefaultResponse, + UploadNodeLogs200Response, + UploadNodeLogsDefaultResponse, + ListNodes200Response, + ListNodesDefaultResponse, + GetNodeExtension200Response, + GetNodeExtensionDefaultResponse, + ListNodeExtensions200Response, + ListNodeExtensionsDefaultResponse, + DeleteNodeFile200Response, + DeleteNodeFileDefaultResponse, + GetNodeFile200Response, + GetNodeFileDefaultResponse, + GetNodeFileProperties200Response, + GetNodeFilePropertiesDefaultResponse, + ListNodeFiles200Response, + ListNodeFilesDefaultResponse, +} from "./responses"; +import { Client, StreamableMethod } from "@azure-rest/core-client"; + +export interface ListApplications { + /** + * This operation returns only Applications and versions that are available for + * use on Compute Nodes; that is, that can be used in an Package reference. For + * administrator information about applications and versions that are not yet + * available to Compute Nodes, use the Azure portal or the Azure Resource Manager + * API. + */ + get( + options?: ListApplicationsParameters + ): StreamableMethod< + ListApplications200Response | ListApplicationsDefaultResponse + >; +} + +export interface GetApplication { + /** + * This operation returns only Applications and versions that are available for + * use on Compute Nodes; that is, that can be used in an Package reference. For + * administrator information about Applications and versions that are not yet + * available to Compute Nodes, use the Azure portal or the Azure Resource Manager + * API. + */ + get( + options?: GetApplicationParameters + ): StreamableMethod< + GetApplication200Response | GetApplicationDefaultResponse + >; +} + +export interface ListPoolUsageMetrics { + /** + * If you do not specify a $filter clause including a poolId, the response + * includes all Pools that existed in the Account in the time range of the + * returned aggregation intervals. If you do not specify a $filter clause + * including a startTime or endTime these filters default to the start and end + * times of the last aggregation interval currently available; that is, only the + * last aggregation interval is returned. + */ + get( + options?: ListPoolUsageMetricsParameters + ): StreamableMethod< + ListPoolUsageMetrics200Response | ListPoolUsageMetricsDefaultResponse + >; +} + +export interface CreatePool { + /** + * When naming Pools, avoid including sensitive information such as user names or + * secret project names. This information may appear in telemetry logs accessible + * to Microsoft Support engineers. + */ + post( + options: CreatePoolParameters + ): StreamableMethod; + /** Lists all of the Pools in the specified Account. */ + get( + options?: ListPoolsParameters + ): StreamableMethod; +} + +export interface DeletePool { + /** + * When you request that a Pool be deleted, the following actions occur: the Pool + * state is set to deleting; any ongoing resize operation on the Pool are stopped; + * the Batch service starts resizing the Pool to zero Compute Nodes; any Tasks + * running on existing Compute Nodes are terminated and requeued (as if a resize + * Pool operation had been requested with the default requeue option); finally, + * the Pool is removed from the system. Because running Tasks are requeued, the + * user can rerun these Tasks by updating their Job to target a different Pool. + * The Tasks can then run on the new Pool. If you want to override the requeue + * behavior, then you should call resize Pool explicitly to shrink the Pool to + * zero size before deleting the Pool. If you call an Update, Patch or Delete API + * on a Pool in the deleting state, it will fail with HTTP status code 409 with + * error code PoolBeingDeleted. + */ + delete( + options?: DeletePoolParameters + ): StreamableMethod; + /** Gets basic properties of a Pool. */ + head( + options?: PoolExistsParameters + ): StreamableMethod< + PoolExists200Response | PoolExists404Response | PoolExistsDefaultResponse + >; + /** Gets information about the specified Pool. */ + get( + options?: GetPoolParameters + ): StreamableMethod; + /** + * This only replaces the Pool properties specified in the request. For example, + * if the Pool has a StartTask associated with it, and a request does not specify + * a StartTask element, then the Pool keeps the existing StartTask. + */ + patch( + options: UpdatePoolParameters + ): StreamableMethod; +} + +export interface DisablePoolAutoScale { + /** Disables automatic scaling for a Pool. */ + post( + options?: DisablePoolAutoScaleParameters + ): StreamableMethod< + DisablePoolAutoScale200Response | DisablePoolAutoScaleDefaultResponse + >; +} + +export interface EnablePoolAutoScale { + /** + * You cannot enable automatic scaling on a Pool if a resize operation is in + * progress on the Pool. If automatic scaling of the Pool is currently disabled, + * you must specify a valid autoscale formula as part of the request. If automatic + * scaling of the Pool is already enabled, you may specify a new autoscale formula + * and/or a new evaluation interval. You cannot call this API for the same Pool + * more than once every 30 seconds. + */ + post( + options: EnablePoolAutoScaleParameters + ): StreamableMethod< + EnablePoolAutoScale200Response | EnablePoolAutoScaleDefaultResponse + >; +} + +export interface EvaluatePoolAutoScale { + /** + * This API is primarily for validating an autoscale formula, as it simply returns + * the result without applying the formula to the Pool. The Pool must have auto + * scaling enabled in order to evaluate a formula. + */ + post( + options: EvaluatePoolAutoScaleParameters + ): StreamableMethod< + EvaluatePoolAutoScale200Response | EvaluatePoolAutoScaleDefaultResponse + >; +} + +export interface ResizePool { + /** + * You can only resize a Pool when its allocation state is steady. If the Pool is + * already resizing, the request fails with status code 409. When you resize a + * Pool, the Pool's allocation state changes from steady to resizing. You cannot + * resize Pools which are configured for automatic scaling. If you try to do this, + * the Batch service returns an error 409. If you resize a Pool downwards, the + * Batch service chooses which Compute Nodes to remove. To remove specific Compute + * Nodes, use the Pool remove Compute Nodes API instead. + */ + post( + options: ResizePoolParameters + ): StreamableMethod; +} + +export interface StopPoolResize { + /** + * This does not restore the Pool to its previous state before the resize + * operation: it only stops any further changes being made, and the Pool maintains + * its current state. After stopping, the Pool stabilizes at the number of Compute + * Nodes it was at when the stop operation was done. During the stop operation, + * the Pool allocation state changes first to stopping and then to steady. A + * resize operation need not be an explicit resize Pool request; this API can also + * be used to halt the initial sizing of the Pool when it is created. + */ + post( + options?: StopPoolResizeParameters + ): StreamableMethod< + StopPoolResize202Response | StopPoolResizeDefaultResponse + >; +} + +export interface ReplacePoolProperties { + /** + * This fully replaces all the updatable properties of the Pool. For example, if + * the Pool has a StartTask associated with it and if StartTask is not specified + * with this request, then the Batch service will remove the existing StartTask. + */ + post( + options: ReplacePoolPropertiesParameters + ): StreamableMethod< + ReplacePoolProperties204Response | ReplacePoolPropertiesDefaultResponse + >; +} + +export interface RemoveNodes { + /** + * This operation can only run when the allocation state of the Pool is steady. + * When this operation runs, the allocation state changes from steady to resizing. + * Each request may remove up to 100 nodes. + */ + post( + options: RemoveNodesParameters + ): StreamableMethod; +} + +export interface ListSupportedImages { + /** Lists all Virtual Machine Images supported by the Azure Batch service. */ + get( + options?: ListSupportedImagesParameters + ): StreamableMethod< + ListSupportedImages200Response | ListSupportedImagesDefaultResponse + >; +} + +export interface ListPoolNodeCounts { + /** + * Gets the number of Compute Nodes in each state, grouped by Pool. Note that the + * numbers returned may not always be up to date. If you need exact node counts, + * use a list query. + */ + get( + options?: ListPoolNodeCountsParameters + ): StreamableMethod< + ListPoolNodeCounts200Response | ListPoolNodeCountsDefaultResponse + >; +} + +export interface DeleteJob { + /** + * Deleting a Job also deletes all Tasks that are part of that Job, and all Job + * statistics. This also overrides the retention period for Task data; that is, if + * the Job contains Tasks which are still retained on Compute Nodes, the Batch + * services deletes those Tasks' working directories and all their contents. When + * a Delete Job request is received, the Batch service sets the Job to the + * deleting state. All update operations on a Job that is in deleting state will + * fail with status code 409 (Conflict), with additional information indicating + * that the Job is being deleted. + */ + delete( + options?: DeleteJobParameters + ): StreamableMethod; + /** Gets information about the specified Job. */ + get( + options?: GetJobParameters + ): StreamableMethod; + /** + * This replaces only the Job properties specified in the request. For example, if + * the Job has constraints, and a request does not specify the constraints + * element, then the Job keeps the existing constraints. + */ + patch( + options: UpdateJobParameters + ): StreamableMethod; + /** + * This fully replaces all the updatable properties of the Job. For example, if + * the Job has constraints associated with it and if constraints is not specified + * with this request, then the Batch service will remove the existing constraints. + */ + put( + options: ReplaceJobParameters + ): StreamableMethod; +} + +export interface DisableJob { + /** + * The Batch Service immediately moves the Job to the disabling state. Batch then + * uses the disableTasks parameter to determine what to do with the currently + * running Tasks of the Job. The Job remains in the disabling state until the + * disable operation is completed and all Tasks have been dealt with according to + * the disableTasks option; the Job then moves to the disabled state. No new Tasks + * are started under the Job until it moves back to active state. If you try to + * disable a Job that is in any state other than active, disabling, or disabled, + * the request fails with status code 409. + */ + post( + options: DisableJobParameters + ): StreamableMethod; +} + +export interface EnableJob { + /** + * When you call this API, the Batch service sets a disabled Job to the enabling + * state. After the this operation is completed, the Job moves to the active + * state, and scheduling of new Tasks under the Job resumes. The Batch service + * does not allow a Task to remain in the active state for more than 180 days. + * Therefore, if you enable a Job containing active Tasks which were added more + * than 180 days ago, those Tasks will not run. + */ + post( + options?: EnableJobParameters + ): StreamableMethod; +} + +export interface TerminateJob { + /** + * When a Terminate Job request is received, the Batch service sets the Job to the + * terminating state. The Batch service then terminates any running Tasks + * associated with the Job and runs any required Job release Tasks. Then the Job + * moves into the completed state. If there are any Tasks in the Job in the active + * state, they will remain in the active state. Once a Job is terminated, new + * Tasks cannot be added and any remaining active Tasks will not be scheduled. + */ + post( + options: TerminateJobParameters + ): StreamableMethod; +} + +export interface CreateJob { + /** + * The Batch service supports two ways to control the work done as part of a Job. + * In the first approach, the user specifies a Job Manager Task. The Batch service + * launches this Task when it is ready to start the Job. The Job Manager Task + * controls all other Tasks that run under this Job, by using the Task APIs. In + * the second approach, the user directly controls the execution of Tasks under an + * active Job, by using the Task APIs. Also note: when naming Jobs, avoid + * including sensitive information such as user names or secret project names. + * This information may appear in telemetry logs accessible to Microsoft Support + * engineers. + */ + post( + options: CreateJobParameters + ): StreamableMethod; + /** Lists all of the Jobs in the specified Account. */ + get( + options?: ListJobsParameters + ): StreamableMethod; +} + +export interface ListJobsFromSchedule { + /** Lists the Jobs that have been created under the specified Job Schedule. */ + get( + options?: ListJobsFromScheduleParameters + ): StreamableMethod< + ListJobsFromSchedule200Response | ListJobsFromScheduleDefaultResponse + >; +} + +export interface ListJobPreparationAndReleaseTaskStatus { + /** + * This API returns the Job Preparation and Job Release Task status on all Compute + * Nodes that have run the Job Preparation or Job Release Task. This includes + * Compute Nodes which have since been removed from the Pool. If this API is + * invoked on a Job which has no Job Preparation or Job Release Task, the Batch + * service returns HTTP status code 409 (Conflict) with an error code of + * JobPreparationTaskNotSpecified. + */ + get( + options?: ListJobPreparationAndReleaseTaskStatusParameters + ): StreamableMethod< + | ListJobPreparationAndReleaseTaskStatus200Response + | ListJobPreparationAndReleaseTaskStatusDefaultResponse + >; +} + +export interface GetJobTaskCounts { + /** + * Task counts provide a count of the Tasks by active, running or completed Task + * state, and a count of Tasks which succeeded or failed. Tasks in the preparing + * state are counted as running. Note that the numbers returned may not always be + * up to date. If you need exact task counts, use a list query. + */ + get( + options?: GetJobTaskCountsParameters + ): StreamableMethod< + GetJobTaskCounts200Response | GetJobTaskCountsDefaultResponse + >; +} + +export interface CreateCertificate { + /** Creates a Certificate to the specified Account. */ + post( + options: CreateCertificateParameters + ): StreamableMethod< + CreateCertificate201Response | CreateCertificateDefaultResponse + >; + /** Lists all of the Certificates that have been added to the specified Account. */ + get( + options?: ListCertificatesParameters + ): StreamableMethod< + ListCertificates200Response | ListCertificatesDefaultResponse + >; +} + +export interface CancelCertificateDeletion { + /** + * If you try to delete a Certificate that is being used by a Pool or Compute + * Node, the status of the Certificate changes to deleteFailed. If you decide that + * you want to continue using the Certificate, you can use this operation to set + * the status of the Certificate back to active. If you intend to delete the + * Certificate, you do not need to run this operation after the deletion failed. + * You must make sure that the Certificate is not being used by any resources, and + * then you can try again to delete the Certificate. + */ + post( + options?: CancelCertificateDeletionParameters + ): StreamableMethod< + | CancelCertificateDeletion204Response + | CancelCertificateDeletionDefaultResponse + >; +} + +export interface DeleteCertificate { + /** + * You cannot delete a Certificate if a resource (Pool or Compute Node) is using + * it. Before you can delete a Certificate, you must therefore make sure that the + * Certificate is not associated with any existing Pools, the Certificate is not + * installed on any Nodes (even if you remove a Certificate from a Pool, it is not + * removed from existing Compute Nodes in that Pool until they restart), and no + * running Tasks depend on the Certificate. If you try to delete a Certificate + * that is in use, the deletion fails. The Certificate status changes to + * deleteFailed. You can use Cancel Delete Certificate to set the status back to + * active if you decide that you want to continue using the Certificate. + */ + delete( + options?: DeleteCertificateParameters + ): StreamableMethod< + DeleteCertificate202Response | DeleteCertificateDefaultResponse + >; + /** Gets information about the specified Certificate. */ + get( + options?: GetCertificateParameters + ): StreamableMethod< + GetCertificate200Response | GetCertificateDefaultResponse + >; +} + +export interface JobScheduleExists { + /** Checks the specified Job Schedule exists. */ + head( + options?: JobScheduleExistsParameters + ): StreamableMethod< + | JobScheduleExists200Response + | JobScheduleExists404Response + | JobScheduleExistsDefaultResponse + >; + /** + * When you delete a Job Schedule, this also deletes all Jobs and Tasks under that + * schedule. When Tasks are deleted, all the files in their working directories on + * the Compute Nodes are also deleted (the retention period is ignored). The Job + * Schedule statistics are no longer accessible once the Job Schedule is deleted, + * though they are still counted towards Account lifetime statistics. + */ + delete( + options?: DeleteJobScheduleParameters + ): StreamableMethod< + DeleteJobSchedule202Response | DeleteJobScheduleDefaultResponse + >; + /** Gets information about the specified Job Schedule. */ + get( + options?: GetJobScheduleParameters + ): StreamableMethod< + GetJobSchedule200Response | GetJobScheduleDefaultResponse + >; + /** + * This replaces only the Job Schedule properties specified in the request. For + * example, if the schedule property is not specified with this request, then the + * Batch service will keep the existing schedule. Changes to a Job Schedule only + * impact Jobs created by the schedule after the update has taken place; currently + * running Jobs are unaffected. + */ + patch( + options: UpdateJobScheduleParameters + ): StreamableMethod< + UpdateJobSchedule200Response | UpdateJobScheduleDefaultResponse + >; + /** + * This fully replaces all the updatable properties of the Job Schedule. For + * example, if the schedule property is not specified with this request, then the + * Batch service will remove the existing schedule. Changes to a Job Schedule only + * impact Jobs created by the schedule after the update has taken place; currently + * running Jobs are unaffected. + */ + put( + options: ReplaceJobScheduleParameters + ): StreamableMethod< + ReplaceJobSchedule200Response | ReplaceJobScheduleDefaultResponse + >; +} + +export interface DisableJobSchedule { + /** No new Jobs will be created until the Job Schedule is enabled again. */ + post( + options?: DisableJobScheduleParameters + ): StreamableMethod< + DisableJobSchedule204Response | DisableJobScheduleDefaultResponse + >; +} + +export interface EnableJobSchedule { + /** Enables a Job Schedule. */ + post( + options?: EnableJobScheduleParameters + ): StreamableMethod< + EnableJobSchedule204Response | EnableJobScheduleDefaultResponse + >; +} + +export interface TerminateJobSchedule { + /** Terminates a Job Schedule. */ + post( + options?: TerminateJobScheduleParameters + ): StreamableMethod< + TerminateJobSchedule202Response | TerminateJobScheduleDefaultResponse + >; +} + +export interface CreateJobSchedule { + /** Creates a Job Schedule to the specified Account. */ + post( + options: CreateJobScheduleParameters + ): StreamableMethod< + CreateJobSchedule201Response | CreateJobScheduleDefaultResponse + >; + /** Lists all of the Job Schedules in the specified Account. */ + get( + options?: ListJobSchedulesParameters + ): StreamableMethod< + ListJobSchedules200Response | ListJobSchedulesDefaultResponse + >; +} + +export interface CreateTask { + /** + * The maximum lifetime of a Task from addition to completion is 180 days. If a + * Task has not completed within 180 days of being added it will be terminated by + * the Batch service and left in whatever state it was in at that time. + */ + post( + options: CreateTaskParameters + ): StreamableMethod; + /** + * For multi-instance Tasks, information such as affinityId, executionInfo and + * nodeInfo refer to the primary Task. Use the list subtasks API to retrieve + * information about subtasks. + */ + get( + options?: ListTasksParameters + ): StreamableMethod; +} + +export interface CreateTaskCollection { + /** + * Note that each Task must have a unique ID. The Batch service may not return the + * results for each Task in the same order the Tasks were submitted in this + * request. If the server times out or the connection is closed during the + * request, the request may have been partially or fully processed, or not at all. + * In such cases, the user should re-issue the request. Note that it is up to the + * user to correctly handle failures when re-issuing a request. For example, you + * should use the same Task IDs during a retry so that if the prior operation + * succeeded, the retry will not create extra Tasks unexpectedly. If the response + * contains any Tasks which failed to add, a client can retry the request. In a + * retry, it is most efficient to resubmit only Tasks that failed to add, and to + * omit Tasks that were successfully added on the first attempt. The maximum + * lifetime of a Task from addition to completion is 180 days. If a Task has not + * completed within 180 days of being added it will be terminated by the Batch + * service and left in whatever state it was in at that time. + */ + post( + options: CreateTaskCollectionParameters + ): StreamableMethod< + CreateTaskCollection200Response | CreateTaskCollectionDefaultResponse + >; +} + +export interface DeleteTask { + /** + * When a Task is deleted, all of the files in its directory on the Compute Node + * where it ran are also deleted (regardless of the retention time). For + * multi-instance Tasks, the delete Task operation applies synchronously to the + * primary task; subtasks and their files are then deleted asynchronously in the + * background. + */ + delete( + options?: DeleteTaskParameters + ): StreamableMethod; + /** + * For multi-instance Tasks, information such as affinityId, executionInfo and + * nodeInfo refer to the primary Task. Use the list subtasks API to retrieve + * information about subtasks. + */ + get( + options?: GetTaskParameters + ): StreamableMethod; + /** Updates the properties of the specified Task. */ + put( + options: ReplaceTaskParameters + ): StreamableMethod; +} + +export interface ListSubTasks { + /** If the Task is not a multi-instance Task then this returns an empty collection. */ + get( + options?: ListSubTasksParameters + ): StreamableMethod; +} + +export interface TerminateTask { + /** + * When the Task has been terminated, it moves to the completed state. For + * multi-instance Tasks, the terminate Task operation applies synchronously to the + * primary task; subtasks are then terminated asynchronously in the background. + */ + post( + options?: TerminateTaskParameters + ): StreamableMethod; +} + +export interface ReactivateTask { + /** + * Reactivation makes a Task eligible to be retried again up to its maximum retry + * count. The Task's state is changed to active. As the Task is no longer in the + * completed state, any previous exit code or failure information is no longer + * available after reactivation. Each time a Task is reactivated, its retry count + * is reset to 0. Reactivation will fail for Tasks that are not completed or that + * previously completed successfully (with an exit code of 0). Additionally, it + * will fail if the Job has completed (or is terminating or deleting). + */ + post( + options?: ReactivateTaskParameters + ): StreamableMethod< + ReactivateTask204Response | ReactivateTaskDefaultResponse + >; +} + +export interface DeleteTaskFile { + /** Deletes the specified Task file from the Compute Node where the Task ran. */ + delete( + options?: DeleteTaskFileParameters + ): StreamableMethod< + DeleteTaskFile200Response | DeleteTaskFileDefaultResponse + >; + /** Returns the content of the specified Task file. */ + get( + options?: GetTaskFileParameters + ): StreamableMethod; + /** Gets the properties of the specified Task file. */ + head( + options?: GetTaskFilePropertiesParameters + ): StreamableMethod< + GetTaskFileProperties200Response | GetTaskFilePropertiesDefaultResponse + >; +} + +export interface ListTaskFiles { + /** Lists the files in a Task's directory on its Compute Node. */ + get( + options?: ListTaskFilesParameters + ): StreamableMethod; +} + +export interface CreateNodeUser { + /** + * You can add a user Account to a Compute Node only when it is in the idle or + * running state. + */ + post( + options: CreateNodeUserParameters + ): StreamableMethod< + CreateNodeUser201Response | CreateNodeUserDefaultResponse + >; +} + +export interface DeleteNodeUser { + /** + * You can delete a user Account to a Compute Node only when it is in the idle or + * running state. + */ + delete( + options?: DeleteNodeUserParameters + ): StreamableMethod< + DeleteNodeUser200Response | DeleteNodeUserDefaultResponse + >; + /** + * This operation replaces of all the updatable properties of the Account. For + * example, if the expiryTime element is not specified, the current value is + * replaced with the default value, not left unmodified. You can update a user + * Account on a Compute Node only when it is in the idle or running state. + */ + put( + options: ReplaceNodeUserParameters + ): StreamableMethod< + ReplaceNodeUser200Response | ReplaceNodeUserDefaultResponse + >; +} + +export interface GetNode { + /** Gets information about the specified Compute Node. */ + get( + options?: GetNodeParameters + ): StreamableMethod; +} + +export interface RebootNode { + /** You can restart a Compute Node only if it is in an idle or running state. */ + post( + options: RebootNodeParameters + ): StreamableMethod; +} + +export interface ReimageNode { + /** + * You can reinstall the operating system on a Compute Node only if it is in an + * idle or running state. This API can be invoked only on Pools created with the + * cloud service configuration property. + */ + post( + options: ReimageNodeParameters + ): StreamableMethod; +} + +export interface DisableNodeScheduling { + /** + * You can disable Task scheduling on a Compute Node only if its current + * scheduling state is enabled. + */ + post( + options: DisableNodeSchedulingParameters + ): StreamableMethod< + DisableNodeScheduling200Response | DisableNodeSchedulingDefaultResponse + >; +} + +export interface EnableNodeScheduling { + /** + * You can enable Task scheduling on a Compute Node only if its current scheduling + * state is disabled + */ + post( + options?: EnableNodeSchedulingParameters + ): StreamableMethod< + EnableNodeScheduling200Response | EnableNodeSchedulingDefaultResponse + >; +} + +export interface GetNodeRemoteLoginSettings { + /** + * Before you can remotely login to a Compute Node using the remote login + * settings, you must create a user Account on the Compute Node. This API can be + * invoked only on Pools created with the virtual machine configuration property. + * For Pools created with a cloud service configuration, see the GetRemoteDesktop + * API. + */ + get( + options?: GetNodeRemoteLoginSettingsParameters + ): StreamableMethod< + | GetNodeRemoteLoginSettings200Response + | GetNodeRemoteLoginSettingsDefaultResponse + >; +} + +export interface GetNodeRemoteDesktopFile { + /** + * Before you can access a Compute Node by using the RDP file, you must create a + * user Account on the Compute Node. This API can only be invoked on Pools created + * with a cloud service configuration. For Pools created with a virtual machine + * configuration, see the GetRemoteLoginSettings API. + */ + get( + options?: GetNodeRemoteDesktopFileParameters + ): StreamableMethod< + | GetNodeRemoteDesktopFile200Response + | GetNodeRemoteDesktopFileDefaultResponse + >; +} + +export interface UploadNodeLogs { + /** + * This is for gathering Azure Batch service log files in an automated fashion + * from Compute Nodes if you are experiencing an error and wish to escalate to + * Azure support. The Azure Batch service log files should be shared with Azure + * support to aid in debugging issues with the Batch service. + */ + post( + options: UploadNodeLogsParameters + ): StreamableMethod< + UploadNodeLogs200Response | UploadNodeLogsDefaultResponse + >; +} + +export interface ListNodes { + /** Lists the Compute Nodes in the specified Pool. */ + get( + options?: ListNodesParameters + ): StreamableMethod; +} + +export interface GetNodeExtension { + /** Gets information about the specified Compute Node Extension. */ + get( + options?: GetNodeExtensionParameters + ): StreamableMethod< + GetNodeExtension200Response | GetNodeExtensionDefaultResponse + >; +} + +export interface ListNodeExtensions { + /** Lists the Compute Nodes Extensions in the specified Pool. */ + get( + options?: ListNodeExtensionsParameters + ): StreamableMethod< + ListNodeExtensions200Response | ListNodeExtensionsDefaultResponse + >; +} + +export interface DeleteNodeFile { + /** Deletes the specified file from the Compute Node. */ + delete( + options?: DeleteNodeFileParameters + ): StreamableMethod< + DeleteNodeFile200Response | DeleteNodeFileDefaultResponse + >; + /** Returns the content of the specified Compute Node file. */ + get( + options?: GetNodeFileParameters + ): StreamableMethod; + /** Gets the properties of the specified Compute Node file. */ + head( + options?: GetNodeFilePropertiesParameters + ): StreamableMethod< + GetNodeFileProperties200Response | GetNodeFilePropertiesDefaultResponse + >; +} + +export interface ListNodeFiles { + /** Lists all of the files in Task directories on the specified Compute Node. */ + get( + options?: ListNodeFilesParameters + ): StreamableMethod; +} + +export interface Routes { + /** Resource for '/applications' has methods for the following verbs: get */ + (path: "/applications"): ListApplications; + /** Resource for '/applications/\{applicationId\}' has methods for the following verbs: get */ + ( + path: "/applications/{applicationId}", + applicationId: string + ): GetApplication; + /** Resource for '/poolusagemetrics' has methods for the following verbs: get */ + (path: "/poolusagemetrics"): ListPoolUsageMetrics; + /** Resource for '/pools' has methods for the following verbs: post, get */ + (path: "/pools"): CreatePool; + /** Resource for '/pools/\{poolId\}' has methods for the following verbs: delete, head, get, patch */ + (path: "/pools/{poolId}", poolId: string): DeletePool; + /** Resource for '/pools/\{poolId\}/disableautoscale' has methods for the following verbs: post */ + ( + path: "/pools/{poolId}/disableautoscale", + poolId: string + ): DisablePoolAutoScale; + /** Resource for '/pools/\{poolId\}/enableautoscale' has methods for the following verbs: post */ + ( + path: "/pools/{poolId}/enableautoscale", + poolId: string + ): EnablePoolAutoScale; + /** Resource for '/pools/\{poolId\}/evaluateautoscale' has methods for the following verbs: post */ + ( + path: "/pools/{poolId}/evaluateautoscale", + poolId: string + ): EvaluatePoolAutoScale; + /** Resource for '/pools/\{poolId\}/resize' has methods for the following verbs: post */ + (path: "/pools/{poolId}/resize", poolId: string): ResizePool; + /** Resource for '/pools/\{poolId\}/stopresize' has methods for the following verbs: post */ + (path: "/pools/{poolId}/stopresize", poolId: string): StopPoolResize; + /** Resource for '/pools/\{poolId\}/updateproperties' has methods for the following verbs: post */ + ( + path: "/pools/{poolId}/updateproperties", + poolId: string + ): ReplacePoolProperties; + /** Resource for '/pools/\{poolId\}/removenodes' has methods for the following verbs: post */ + (path: "/pools/{poolId}/removenodes", poolId: string): RemoveNodes; + /** Resource for '/supportedimages' has methods for the following verbs: get */ + (path: "/supportedimages"): ListSupportedImages; + /** Resource for '/nodecounts' has methods for the following verbs: get */ + (path: "/nodecounts"): ListPoolNodeCounts; + /** Resource for '/jobs/\{jobId\}' has methods for the following verbs: delete, get, patch, put */ + (path: "/jobs/{jobId}", jobId: string): DeleteJob; + /** Resource for '/jobs/\{jobId\}/disable' has methods for the following verbs: post */ + (path: "/jobs/{jobId}/disable", jobId: string): DisableJob; + /** Resource for '/jobs/\{jobId\}/enable' has methods for the following verbs: post */ + (path: "/jobs/{jobId}/enable", jobId: string): EnableJob; + /** Resource for '/jobs/\{jobId\}/terminate' has methods for the following verbs: post */ + (path: "/jobs/{jobId}/terminate", jobId: string): TerminateJob; + /** Resource for '/jobs' has methods for the following verbs: post, get */ + (path: "/jobs"): CreateJob; + /** Resource for '/jobschedules/\{jobScheduleId\}/jobs' has methods for the following verbs: get */ + ( + path: "/jobschedules/{jobScheduleId}/jobs", + jobScheduleId: string + ): ListJobsFromSchedule; + /** Resource for '/jobs/\{jobId\}/jobpreparationandreleasetaskstatus' has methods for the following verbs: get */ + ( + path: "/jobs/{jobId}/jobpreparationandreleasetaskstatus", + jobId: string + ): ListJobPreparationAndReleaseTaskStatus; + /** Resource for '/jobs/\{jobId\}/taskcounts' has methods for the following verbs: get */ + (path: "/jobs/{jobId}/taskcounts", jobId: string): GetJobTaskCounts; + /** Resource for '/certificates' has methods for the following verbs: post, get */ + (path: "/certificates"): CreateCertificate; + /** Resource for '/certificates(thumbprintAlgorithm=\{thumbprintAlgorithm\},thumbprint=\{thumbprint\})/canceldelete' has methods for the following verbs: post */ + ( + path: "/certificates(thumbprintAlgorithm={thumbprintAlgorithm},thumbprint={thumbprint})/canceldelete", + thumbprintAlgorithm: string, + thumbprint: string + ): CancelCertificateDeletion; + /** Resource for '/certificates(thumbprintAlgorithm=\{thumbprintAlgorithm\},thumbprint=\{thumbprint\})' has methods for the following verbs: delete, get */ + ( + path: "/certificates(thumbprintAlgorithm={thumbprintAlgorithm},thumbprint={thumbprint})", + thumbprintAlgorithm: string, + thumbprint: string + ): DeleteCertificate; + /** Resource for '/jobschedules/\{jobScheduleId\}' has methods for the following verbs: head, delete, get, patch, put */ + ( + path: "/jobschedules/{jobScheduleId}", + jobScheduleId: string + ): JobScheduleExists; + /** Resource for '/jobschedules/\{jobScheduleId\}/disable' has methods for the following verbs: post */ + ( + path: "/jobschedules/{jobScheduleId}/disable", + jobScheduleId: string + ): DisableJobSchedule; + /** Resource for '/jobschedules/\{jobScheduleId\}/enable' has methods for the following verbs: post */ + ( + path: "/jobschedules/{jobScheduleId}/enable", + jobScheduleId: string + ): EnableJobSchedule; + /** Resource for '/jobschedules/\{jobScheduleId\}/terminate' has methods for the following verbs: post */ + ( + path: "/jobschedules/{jobScheduleId}/terminate", + jobScheduleId: string + ): TerminateJobSchedule; + /** Resource for '/jobschedules' has methods for the following verbs: post, get */ + (path: "/jobschedules"): CreateJobSchedule; + /** Resource for '/jobs/\{jobId\}/tasks' has methods for the following verbs: post, get */ + (path: "/jobs/{jobId}/tasks", jobId: string): CreateTask; + /** Resource for '/jobs/\{jobId\}/addtaskcollection' has methods for the following verbs: post */ + ( + path: "/jobs/{jobId}/addtaskcollection", + jobId: string + ): CreateTaskCollection; + /** Resource for '/jobs/\{jobId\}/tasks/\{taskId\}' has methods for the following verbs: delete, get, put */ + ( + path: "/jobs/{jobId}/tasks/{taskId}", + jobId: string, + taskId: string + ): DeleteTask; + /** Resource for '/jobs/\{jobId\}/tasks/\{taskId\}/subtasksinfo' has methods for the following verbs: get */ + ( + path: "/jobs/{jobId}/tasks/{taskId}/subtasksinfo", + jobId: string, + taskId: string + ): ListSubTasks; + /** Resource for '/jobs/\{jobId\}/tasks/\{taskId\}/terminate' has methods for the following verbs: post */ + ( + path: "/jobs/{jobId}/tasks/{taskId}/terminate", + jobId: string, + taskId: string + ): TerminateTask; + /** Resource for '/jobs/\{jobId\}/tasks/\{taskId\}/reactivate' has methods for the following verbs: post */ + ( + path: "/jobs/{jobId}/tasks/{taskId}/reactivate", + jobId: string, + taskId: string + ): ReactivateTask; + /** Resource for '/jobs/\{jobId\}/tasks/\{taskId\}/files/\{filePath\}' has methods for the following verbs: delete, get, head */ + ( + path: "/jobs/{jobId}/tasks/{taskId}/files/{filePath}", + jobId: string, + taskId: string, + filePath: string + ): DeleteTaskFile; + /** Resource for '/jobs/\{jobId\}/tasks/\{taskId\}/files' has methods for the following verbs: get */ + ( + path: "/jobs/{jobId}/tasks/{taskId}/files", + jobId: string, + taskId: string + ): ListTaskFiles; + /** Resource for '/pools/\{poolId\}/nodes/\{nodeId\}/users' has methods for the following verbs: post */ + ( + path: "/pools/{poolId}/nodes/{nodeId}/users", + poolId: string, + nodeId: string + ): CreateNodeUser; + /** Resource for '/pools/\{poolId\}/nodes/\{nodeId\}/users/\{userName\}' has methods for the following verbs: delete, put */ + ( + path: "/pools/{poolId}/nodes/{nodeId}/users/{userName}", + poolId: string, + nodeId: string, + userName: string + ): DeleteNodeUser; + /** Resource for '/pools/\{poolId\}/nodes/\{nodeId\}' has methods for the following verbs: get */ + ( + path: "/pools/{poolId}/nodes/{nodeId}", + poolId: string, + nodeId: string + ): GetNode; + /** Resource for '/pools/\{poolId\}/nodes/\{nodeId\}/reboot' has methods for the following verbs: post */ + ( + path: "/pools/{poolId}/nodes/{nodeId}/reboot", + poolId: string, + nodeId: string + ): RebootNode; + /** Resource for '/pools/\{poolId\}/nodes/\{nodeId\}/reimage' has methods for the following verbs: post */ + ( + path: "/pools/{poolId}/nodes/{nodeId}/reimage", + poolId: string, + nodeId: string + ): ReimageNode; + /** Resource for '/pools/\{poolId\}/nodes/\{nodeId\}/disablescheduling' has methods for the following verbs: post */ + ( + path: "/pools/{poolId}/nodes/{nodeId}/disablescheduling", + poolId: string, + nodeId: string + ): DisableNodeScheduling; + /** Resource for '/pools/\{poolId\}/nodes/\{nodeId\}/enablescheduling' has methods for the following verbs: post */ + ( + path: "/pools/{poolId}/nodes/{nodeId}/enablescheduling", + poolId: string, + nodeId: string + ): EnableNodeScheduling; + /** Resource for '/pools/\{poolId\}/nodes/\{nodeId\}/remoteloginsettings' has methods for the following verbs: get */ + ( + path: "/pools/{poolId}/nodes/{nodeId}/remoteloginsettings", + poolId: string, + nodeId: string + ): GetNodeRemoteLoginSettings; + /** Resource for '/pools/\{poolId\}/nodes/\{nodeId\}/rdp' has methods for the following verbs: get */ + ( + path: "/pools/{poolId}/nodes/{nodeId}/rdp", + poolId: string, + nodeId: string + ): GetNodeRemoteDesktopFile; + /** Resource for '/pools/\{poolId\}/nodes/\{nodeId\}/uploadbatchservicelogs' has methods for the following verbs: post */ + ( + path: "/pools/{poolId}/nodes/{nodeId}/uploadbatchservicelogs", + poolId: string, + nodeId: string + ): UploadNodeLogs; + /** Resource for '/pools/\{poolId\}/nodes' has methods for the following verbs: get */ + (path: "/pools/{poolId}/nodes", poolId: string): ListNodes; + /** Resource for '/pools/\{poolId\}/nodes/\{nodeId\}/extensions/\{extensionName\}' has methods for the following verbs: get */ + ( + path: "/pools/{poolId}/nodes/{nodeId}/extensions/{extensionName}", + poolId: string, + nodeId: string, + extensionName: string + ): GetNodeExtension; + /** Resource for '/pools/\{poolId\}/nodes/\{nodeId\}/extensions' has methods for the following verbs: get */ + ( + path: "/pools/{poolId}/nodes/{nodeId}/extensions", + poolId: string, + nodeId: string + ): ListNodeExtensions; + /** Resource for '/pools/\{poolId\}/nodes/\{nodeId\}/files/\{filePath\}' has methods for the following verbs: delete, get, head */ + ( + path: "/pools/{poolId}/nodes/{nodeId}/files/{filePath}", + poolId: string, + nodeId: string, + filePath: string + ): DeleteNodeFile; + /** Resource for '/pools/\{poolId\}/nodes/\{nodeId\}/files' has methods for the following verbs: get */ + ( + path: "/pools/{poolId}/nodes/{nodeId}/files", + poolId: string, + nodeId: string + ): ListNodeFiles; +} + +export type BatchClient = Client & { + path: Routes; +}; diff --git a/packages/service/src/internal/batch-rest/generated/src/index.ts b/packages/service/src/internal/batch-rest/generated/src/index.ts new file mode 100644 index 000000000..973b06150 --- /dev/null +++ b/packages/service/src/internal/batch-rest/generated/src/index.ts @@ -0,0 +1,15 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import BatchClient from "./batchClient"; + +export * from "./batchClient"; +export * from "./parameters"; +export * from "./responses"; +export * from "./clientDefinitions"; +export * from "./isUnexpected"; +export * from "./models"; +export * from "./outputModels"; +export * from "./paginateHelper"; + +export default BatchClient; diff --git a/packages/service/src/internal/batch-rest/generated/src/isUnexpected.ts b/packages/service/src/internal/batch-rest/generated/src/isUnexpected.ts new file mode 100644 index 000000000..ea7d6cc06 --- /dev/null +++ b/packages/service/src/internal/batch-rest/generated/src/isUnexpected.ts @@ -0,0 +1,821 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { + ListApplications200Response, + ListApplicationsDefaultResponse, + GetApplication200Response, + GetApplicationDefaultResponse, + ListPoolUsageMetrics200Response, + ListPoolUsageMetricsDefaultResponse, + CreatePool201Response, + CreatePoolDefaultResponse, + ListPools200Response, + ListPoolsDefaultResponse, + DeletePool202Response, + DeletePoolDefaultResponse, + PoolExists200Response, + PoolExists404Response, + PoolExistsDefaultResponse, + GetPool200Response, + GetPoolDefaultResponse, + UpdatePool200Response, + UpdatePoolDefaultResponse, + DisablePoolAutoScale200Response, + DisablePoolAutoScaleDefaultResponse, + EnablePoolAutoScale200Response, + EnablePoolAutoScaleDefaultResponse, + EvaluatePoolAutoScale200Response, + EvaluatePoolAutoScaleDefaultResponse, + ResizePool202Response, + ResizePoolDefaultResponse, + StopPoolResize202Response, + StopPoolResizeDefaultResponse, + ReplacePoolProperties204Response, + ReplacePoolPropertiesDefaultResponse, + RemoveNodes202Response, + RemoveNodesDefaultResponse, + ListSupportedImages200Response, + ListSupportedImagesDefaultResponse, + ListPoolNodeCounts200Response, + ListPoolNodeCountsDefaultResponse, + DeleteJob202Response, + DeleteJobDefaultResponse, + GetJob200Response, + GetJobDefaultResponse, + UpdateJob200Response, + UpdateJobDefaultResponse, + ReplaceJob200Response, + ReplaceJobDefaultResponse, + DisableJob202Response, + DisableJobDefaultResponse, + EnableJob202Response, + EnableJobDefaultResponse, + TerminateJob202Response, + TerminateJobDefaultResponse, + CreateJob201Response, + CreateJobDefaultResponse, + ListJobs200Response, + ListJobsDefaultResponse, + ListJobsFromSchedule200Response, + ListJobsFromScheduleDefaultResponse, + ListJobPreparationAndReleaseTaskStatus200Response, + ListJobPreparationAndReleaseTaskStatusDefaultResponse, + GetJobTaskCounts200Response, + GetJobTaskCountsDefaultResponse, + CreateCertificate201Response, + CreateCertificateDefaultResponse, + ListCertificates200Response, + ListCertificatesDefaultResponse, + CancelCertificateDeletion204Response, + CancelCertificateDeletionDefaultResponse, + DeleteCertificate202Response, + DeleteCertificateDefaultResponse, + GetCertificate200Response, + GetCertificateDefaultResponse, + JobScheduleExists200Response, + JobScheduleExists404Response, + JobScheduleExistsDefaultResponse, + DeleteJobSchedule202Response, + DeleteJobScheduleDefaultResponse, + GetJobSchedule200Response, + GetJobScheduleDefaultResponse, + UpdateJobSchedule200Response, + UpdateJobScheduleDefaultResponse, + ReplaceJobSchedule200Response, + ReplaceJobScheduleDefaultResponse, + DisableJobSchedule204Response, + DisableJobScheduleDefaultResponse, + EnableJobSchedule204Response, + EnableJobScheduleDefaultResponse, + TerminateJobSchedule202Response, + TerminateJobScheduleDefaultResponse, + CreateJobSchedule201Response, + CreateJobScheduleDefaultResponse, + ListJobSchedules200Response, + ListJobSchedulesDefaultResponse, + CreateTask201Response, + CreateTaskDefaultResponse, + ListTasks200Response, + ListTasksDefaultResponse, + CreateTaskCollection200Response, + CreateTaskCollectionDefaultResponse, + DeleteTask200Response, + DeleteTaskDefaultResponse, + GetTask200Response, + GetTaskDefaultResponse, + ReplaceTask200Response, + ReplaceTaskDefaultResponse, + ListSubTasks200Response, + ListSubTasksDefaultResponse, + TerminateTask204Response, + TerminateTaskDefaultResponse, + ReactivateTask204Response, + ReactivateTaskDefaultResponse, + DeleteTaskFile200Response, + DeleteTaskFileDefaultResponse, + GetTaskFile200Response, + GetTaskFileDefaultResponse, + GetTaskFileProperties200Response, + GetTaskFilePropertiesDefaultResponse, + ListTaskFiles200Response, + ListTaskFilesDefaultResponse, + CreateNodeUser201Response, + CreateNodeUserDefaultResponse, + DeleteNodeUser200Response, + DeleteNodeUserDefaultResponse, + ReplaceNodeUser200Response, + ReplaceNodeUserDefaultResponse, + GetNode200Response, + GetNodeDefaultResponse, + RebootNode202Response, + RebootNodeDefaultResponse, + ReimageNode202Response, + ReimageNodeDefaultResponse, + DisableNodeScheduling200Response, + DisableNodeSchedulingDefaultResponse, + EnableNodeScheduling200Response, + EnableNodeSchedulingDefaultResponse, + GetNodeRemoteLoginSettings200Response, + GetNodeRemoteLoginSettingsDefaultResponse, + GetNodeRemoteDesktopFile200Response, + GetNodeRemoteDesktopFileDefaultResponse, + UploadNodeLogs200Response, + UploadNodeLogsDefaultResponse, + ListNodes200Response, + ListNodesDefaultResponse, + GetNodeExtension200Response, + GetNodeExtensionDefaultResponse, + ListNodeExtensions200Response, + ListNodeExtensionsDefaultResponse, + DeleteNodeFile200Response, + DeleteNodeFileDefaultResponse, + GetNodeFile200Response, + GetNodeFileDefaultResponse, + GetNodeFileProperties200Response, + GetNodeFilePropertiesDefaultResponse, + ListNodeFiles200Response, + ListNodeFilesDefaultResponse, +} from "./responses"; + +const responseMap: Record = { + "GET /applications": ["200"], + "GET /applications/{applicationId}": ["200"], + "GET /poolusagemetrics": ["200"], + "POST /pools": ["201"], + "GET /pools": ["200"], + "DELETE /pools/{poolId}": ["202"], + "HEAD /pools/{poolId}": ["200", "404"], + "GET /pools/{poolId}": ["200"], + "PATCH /pools/{poolId}": ["200"], + "POST /pools/{poolId}/disableautoscale": ["200"], + "POST /pools/{poolId}/enableautoscale": ["200"], + "POST /pools/{poolId}/evaluateautoscale": ["200"], + "POST /pools/{poolId}/resize": ["202"], + "POST /pools/{poolId}/stopresize": ["202"], + "POST /pools/{poolId}/updateproperties": ["204"], + "POST /pools/{poolId}/removenodes": ["202"], + "GET /supportedimages": ["200"], + "GET /nodecounts": ["200"], + "DELETE /jobs/{jobId}": ["202"], + "GET /jobs/{jobId}": ["200"], + "PATCH /jobs/{jobId}": ["200"], + "PUT /jobs/{jobId}": ["200"], + "POST /jobs/{jobId}/disable": ["202"], + "POST /jobs/{jobId}/enable": ["202"], + "POST /jobs/{jobId}/terminate": ["202"], + "POST /jobs": ["201"], + "GET /jobs": ["200"], + "GET /jobschedules/{jobScheduleId}/jobs": ["200"], + "GET /jobs/{jobId}/jobpreparationandreleasetaskstatus": ["200"], + "GET /jobs/{jobId}/taskcounts": ["200"], + "POST /certificates": ["201"], + "GET /certificates": ["200"], + "POST /certificates(thumbprintAlgorithm={thumbprintAlgorithm},thumbprint={thumbprint})/canceldelete": + ["204"], + "DELETE /certificates(thumbprintAlgorithm={thumbprintAlgorithm},thumbprint={thumbprint})": + ["202"], + "GET /certificates(thumbprintAlgorithm={thumbprintAlgorithm},thumbprint={thumbprint})": + ["200"], + "HEAD /jobschedules/{jobScheduleId}": ["200", "404"], + "DELETE /jobschedules/{jobScheduleId}": ["202"], + "GET /jobschedules/{jobScheduleId}": ["200"], + "PATCH /jobschedules/{jobScheduleId}": ["200"], + "PUT /jobschedules/{jobScheduleId}": ["200"], + "POST /jobschedules/{jobScheduleId}/disable": ["204"], + "POST /jobschedules/{jobScheduleId}/enable": ["204"], + "POST /jobschedules/{jobScheduleId}/terminate": ["202"], + "POST /jobschedules": ["201"], + "GET /jobschedules": ["200"], + "POST /jobs/{jobId}/tasks": ["201"], + "GET /jobs/{jobId}/tasks": ["200"], + "POST /jobs/{jobId}/addtaskcollection": ["200"], + "DELETE /jobs/{jobId}/tasks/{taskId}": ["200"], + "GET /jobs/{jobId}/tasks/{taskId}": ["200"], + "PUT /jobs/{jobId}/tasks/{taskId}": ["200"], + "GET /jobs/{jobId}/tasks/{taskId}/subtasksinfo": ["200"], + "POST /jobs/{jobId}/tasks/{taskId}/terminate": ["204"], + "POST /jobs/{jobId}/tasks/{taskId}/reactivate": ["204"], + "DELETE /jobs/{jobId}/tasks/{taskId}/files/{filePath}": ["200"], + "GET /jobs/{jobId}/tasks/{taskId}/files/{filePath}": ["200"], + "HEAD /jobs/{jobId}/tasks/{taskId}/files/{filePath}": ["200"], + "GET /jobs/{jobId}/tasks/{taskId}/files": ["200"], + "POST /pools/{poolId}/nodes/{nodeId}/users": ["201"], + "DELETE /pools/{poolId}/nodes/{nodeId}/users/{userName}": ["200"], + "PUT /pools/{poolId}/nodes/{nodeId}/users/{userName}": ["200"], + "GET /pools/{poolId}/nodes/{nodeId}": ["200"], + "POST /pools/{poolId}/nodes/{nodeId}/reboot": ["202"], + "POST /pools/{poolId}/nodes/{nodeId}/reimage": ["202"], + "POST /pools/{poolId}/nodes/{nodeId}/disablescheduling": ["200"], + "POST /pools/{poolId}/nodes/{nodeId}/enablescheduling": ["200"], + "GET /pools/{poolId}/nodes/{nodeId}/remoteloginsettings": ["200"], + "GET /pools/{poolId}/nodes/{nodeId}/rdp": ["200"], + "POST /pools/{poolId}/nodes/{nodeId}/uploadbatchservicelogs": ["200"], + "GET /pools/{poolId}/nodes": ["200"], + "GET /pools/{poolId}/nodes/{nodeId}/extensions/{extensionName}": ["200"], + "GET /pools/{poolId}/nodes/{nodeId}/extensions": ["200"], + "DELETE /pools/{poolId}/nodes/{nodeId}/files/{filePath}": ["200"], + "GET /pools/{poolId}/nodes/{nodeId}/files/{filePath}": ["200"], + "HEAD /pools/{poolId}/nodes/{nodeId}/files/{filePath}": ["200"], + "GET /pools/{poolId}/nodes/{nodeId}/files": ["200"], +}; + +export function isUnexpected( + response: ListApplications200Response | ListApplicationsDefaultResponse +): response is ListApplicationsDefaultResponse; +export function isUnexpected( + response: GetApplication200Response | GetApplicationDefaultResponse +): response is GetApplicationDefaultResponse; +export function isUnexpected( + response: + | ListPoolUsageMetrics200Response + | ListPoolUsageMetricsDefaultResponse +): response is ListPoolUsageMetricsDefaultResponse; +export function isUnexpected( + response: CreatePool201Response | CreatePoolDefaultResponse +): response is CreatePoolDefaultResponse; +export function isUnexpected( + response: ListPools200Response | ListPoolsDefaultResponse +): response is ListPoolsDefaultResponse; +export function isUnexpected( + response: DeletePool202Response | DeletePoolDefaultResponse +): response is DeletePoolDefaultResponse; +export function isUnexpected( + response: + | PoolExists200Response + | PoolExists404Response + | PoolExistsDefaultResponse +): response is PoolExistsDefaultResponse; +export function isUnexpected( + response: GetPool200Response | GetPoolDefaultResponse +): response is GetPoolDefaultResponse; +export function isUnexpected( + response: UpdatePool200Response | UpdatePoolDefaultResponse +): response is UpdatePoolDefaultResponse; +export function isUnexpected( + response: + | DisablePoolAutoScale200Response + | DisablePoolAutoScaleDefaultResponse +): response is DisablePoolAutoScaleDefaultResponse; +export function isUnexpected( + response: EnablePoolAutoScale200Response | EnablePoolAutoScaleDefaultResponse +): response is EnablePoolAutoScaleDefaultResponse; +export function isUnexpected( + response: + | EvaluatePoolAutoScale200Response + | EvaluatePoolAutoScaleDefaultResponse +): response is EvaluatePoolAutoScaleDefaultResponse; +export function isUnexpected( + response: ResizePool202Response | ResizePoolDefaultResponse +): response is ResizePoolDefaultResponse; +export function isUnexpected( + response: StopPoolResize202Response | StopPoolResizeDefaultResponse +): response is StopPoolResizeDefaultResponse; +export function isUnexpected( + response: + | ReplacePoolProperties204Response + | ReplacePoolPropertiesDefaultResponse +): response is ReplacePoolPropertiesDefaultResponse; +export function isUnexpected( + response: RemoveNodes202Response | RemoveNodesDefaultResponse +): response is RemoveNodesDefaultResponse; +export function isUnexpected( + response: ListSupportedImages200Response | ListSupportedImagesDefaultResponse +): response is ListSupportedImagesDefaultResponse; +export function isUnexpected( + response: ListPoolNodeCounts200Response | ListPoolNodeCountsDefaultResponse +): response is ListPoolNodeCountsDefaultResponse; +export function isUnexpected( + response: DeleteJob202Response | DeleteJobDefaultResponse +): response is DeleteJobDefaultResponse; +export function isUnexpected( + response: GetJob200Response | GetJobDefaultResponse +): response is GetJobDefaultResponse; +export function isUnexpected( + response: UpdateJob200Response | UpdateJobDefaultResponse +): response is UpdateJobDefaultResponse; +export function isUnexpected( + response: ReplaceJob200Response | ReplaceJobDefaultResponse +): response is ReplaceJobDefaultResponse; +export function isUnexpected( + response: DisableJob202Response | DisableJobDefaultResponse +): response is DisableJobDefaultResponse; +export function isUnexpected( + response: EnableJob202Response | EnableJobDefaultResponse +): response is EnableJobDefaultResponse; +export function isUnexpected( + response: TerminateJob202Response | TerminateJobDefaultResponse +): response is TerminateJobDefaultResponse; +export function isUnexpected( + response: CreateJob201Response | CreateJobDefaultResponse +): response is CreateJobDefaultResponse; +export function isUnexpected( + response: ListJobs200Response | ListJobsDefaultResponse +): response is ListJobsDefaultResponse; +export function isUnexpected( + response: + | ListJobsFromSchedule200Response + | ListJobsFromScheduleDefaultResponse +): response is ListJobsFromScheduleDefaultResponse; +export function isUnexpected( + response: + | ListJobPreparationAndReleaseTaskStatus200Response + | ListJobPreparationAndReleaseTaskStatusDefaultResponse +): response is ListJobPreparationAndReleaseTaskStatusDefaultResponse; +export function isUnexpected( + response: GetJobTaskCounts200Response | GetJobTaskCountsDefaultResponse +): response is GetJobTaskCountsDefaultResponse; +export function isUnexpected( + response: CreateCertificate201Response | CreateCertificateDefaultResponse +): response is CreateCertificateDefaultResponse; +export function isUnexpected( + response: ListCertificates200Response | ListCertificatesDefaultResponse +): response is ListCertificatesDefaultResponse; +export function isUnexpected( + response: + | CancelCertificateDeletion204Response + | CancelCertificateDeletionDefaultResponse +): response is CancelCertificateDeletionDefaultResponse; +export function isUnexpected( + response: DeleteCertificate202Response | DeleteCertificateDefaultResponse +): response is DeleteCertificateDefaultResponse; +export function isUnexpected( + response: GetCertificate200Response | GetCertificateDefaultResponse +): response is GetCertificateDefaultResponse; +export function isUnexpected( + response: + | JobScheduleExists200Response + | JobScheduleExists404Response + | JobScheduleExistsDefaultResponse +): response is JobScheduleExistsDefaultResponse; +export function isUnexpected( + response: DeleteJobSchedule202Response | DeleteJobScheduleDefaultResponse +): response is DeleteJobScheduleDefaultResponse; +export function isUnexpected( + response: GetJobSchedule200Response | GetJobScheduleDefaultResponse +): response is GetJobScheduleDefaultResponse; +export function isUnexpected( + response: UpdateJobSchedule200Response | UpdateJobScheduleDefaultResponse +): response is UpdateJobScheduleDefaultResponse; +export function isUnexpected( + response: ReplaceJobSchedule200Response | ReplaceJobScheduleDefaultResponse +): response is ReplaceJobScheduleDefaultResponse; +export function isUnexpected( + response: DisableJobSchedule204Response | DisableJobScheduleDefaultResponse +): response is DisableJobScheduleDefaultResponse; +export function isUnexpected( + response: EnableJobSchedule204Response | EnableJobScheduleDefaultResponse +): response is EnableJobScheduleDefaultResponse; +export function isUnexpected( + response: + | TerminateJobSchedule202Response + | TerminateJobScheduleDefaultResponse +): response is TerminateJobScheduleDefaultResponse; +export function isUnexpected( + response: CreateJobSchedule201Response | CreateJobScheduleDefaultResponse +): response is CreateJobScheduleDefaultResponse; +export function isUnexpected( + response: ListJobSchedules200Response | ListJobSchedulesDefaultResponse +): response is ListJobSchedulesDefaultResponse; +export function isUnexpected( + response: CreateTask201Response | CreateTaskDefaultResponse +): response is CreateTaskDefaultResponse; +export function isUnexpected( + response: ListTasks200Response | ListTasksDefaultResponse +): response is ListTasksDefaultResponse; +export function isUnexpected( + response: + | CreateTaskCollection200Response + | CreateTaskCollectionDefaultResponse +): response is CreateTaskCollectionDefaultResponse; +export function isUnexpected( + response: DeleteTask200Response | DeleteTaskDefaultResponse +): response is DeleteTaskDefaultResponse; +export function isUnexpected( + response: GetTask200Response | GetTaskDefaultResponse +): response is GetTaskDefaultResponse; +export function isUnexpected( + response: ReplaceTask200Response | ReplaceTaskDefaultResponse +): response is ReplaceTaskDefaultResponse; +export function isUnexpected( + response: ListSubTasks200Response | ListSubTasksDefaultResponse +): response is ListSubTasksDefaultResponse; +export function isUnexpected( + response: TerminateTask204Response | TerminateTaskDefaultResponse +): response is TerminateTaskDefaultResponse; +export function isUnexpected( + response: ReactivateTask204Response | ReactivateTaskDefaultResponse +): response is ReactivateTaskDefaultResponse; +export function isUnexpected( + response: DeleteTaskFile200Response | DeleteTaskFileDefaultResponse +): response is DeleteTaskFileDefaultResponse; +export function isUnexpected( + response: GetTaskFile200Response | GetTaskFileDefaultResponse +): response is GetTaskFileDefaultResponse; +export function isUnexpected( + response: + | GetTaskFileProperties200Response + | GetTaskFilePropertiesDefaultResponse +): response is GetTaskFilePropertiesDefaultResponse; +export function isUnexpected( + response: ListTaskFiles200Response | ListTaskFilesDefaultResponse +): response is ListTaskFilesDefaultResponse; +export function isUnexpected( + response: CreateNodeUser201Response | CreateNodeUserDefaultResponse +): response is CreateNodeUserDefaultResponse; +export function isUnexpected( + response: DeleteNodeUser200Response | DeleteNodeUserDefaultResponse +): response is DeleteNodeUserDefaultResponse; +export function isUnexpected( + response: ReplaceNodeUser200Response | ReplaceNodeUserDefaultResponse +): response is ReplaceNodeUserDefaultResponse; +export function isUnexpected( + response: GetNode200Response | GetNodeDefaultResponse +): response is GetNodeDefaultResponse; +export function isUnexpected( + response: RebootNode202Response | RebootNodeDefaultResponse +): response is RebootNodeDefaultResponse; +export function isUnexpected( + response: ReimageNode202Response | ReimageNodeDefaultResponse +): response is ReimageNodeDefaultResponse; +export function isUnexpected( + response: + | DisableNodeScheduling200Response + | DisableNodeSchedulingDefaultResponse +): response is DisableNodeSchedulingDefaultResponse; +export function isUnexpected( + response: + | EnableNodeScheduling200Response + | EnableNodeSchedulingDefaultResponse +): response is EnableNodeSchedulingDefaultResponse; +export function isUnexpected( + response: + | GetNodeRemoteLoginSettings200Response + | GetNodeRemoteLoginSettingsDefaultResponse +): response is GetNodeRemoteLoginSettingsDefaultResponse; +export function isUnexpected( + response: + | GetNodeRemoteDesktopFile200Response + | GetNodeRemoteDesktopFileDefaultResponse +): response is GetNodeRemoteDesktopFileDefaultResponse; +export function isUnexpected( + response: UploadNodeLogs200Response | UploadNodeLogsDefaultResponse +): response is UploadNodeLogsDefaultResponse; +export function isUnexpected( + response: ListNodes200Response | ListNodesDefaultResponse +): response is ListNodesDefaultResponse; +export function isUnexpected( + response: GetNodeExtension200Response | GetNodeExtensionDefaultResponse +): response is GetNodeExtensionDefaultResponse; +export function isUnexpected( + response: ListNodeExtensions200Response | ListNodeExtensionsDefaultResponse +): response is ListNodeExtensionsDefaultResponse; +export function isUnexpected( + response: DeleteNodeFile200Response | DeleteNodeFileDefaultResponse +): response is DeleteNodeFileDefaultResponse; +export function isUnexpected( + response: GetNodeFile200Response | GetNodeFileDefaultResponse +): response is GetNodeFileDefaultResponse; +export function isUnexpected( + response: + | GetNodeFileProperties200Response + | GetNodeFilePropertiesDefaultResponse +): response is GetNodeFilePropertiesDefaultResponse; +export function isUnexpected( + response: ListNodeFiles200Response | ListNodeFilesDefaultResponse +): response is ListNodeFilesDefaultResponse; +export function isUnexpected( + response: + | ListApplications200Response + | ListApplicationsDefaultResponse + | GetApplication200Response + | GetApplicationDefaultResponse + | ListPoolUsageMetrics200Response + | ListPoolUsageMetricsDefaultResponse + | CreatePool201Response + | CreatePoolDefaultResponse + | ListPools200Response + | ListPoolsDefaultResponse + | DeletePool202Response + | DeletePoolDefaultResponse + | PoolExists200Response + | PoolExists404Response + | PoolExistsDefaultResponse + | GetPool200Response + | GetPoolDefaultResponse + | UpdatePool200Response + | UpdatePoolDefaultResponse + | DisablePoolAutoScale200Response + | DisablePoolAutoScaleDefaultResponse + | EnablePoolAutoScale200Response + | EnablePoolAutoScaleDefaultResponse + | EvaluatePoolAutoScale200Response + | EvaluatePoolAutoScaleDefaultResponse + | ResizePool202Response + | ResizePoolDefaultResponse + | StopPoolResize202Response + | StopPoolResizeDefaultResponse + | ReplacePoolProperties204Response + | ReplacePoolPropertiesDefaultResponse + | RemoveNodes202Response + | RemoveNodesDefaultResponse + | ListSupportedImages200Response + | ListSupportedImagesDefaultResponse + | ListPoolNodeCounts200Response + | ListPoolNodeCountsDefaultResponse + | DeleteJob202Response + | DeleteJobDefaultResponse + | GetJob200Response + | GetJobDefaultResponse + | UpdateJob200Response + | UpdateJobDefaultResponse + | ReplaceJob200Response + | ReplaceJobDefaultResponse + | DisableJob202Response + | DisableJobDefaultResponse + | EnableJob202Response + | EnableJobDefaultResponse + | TerminateJob202Response + | TerminateJobDefaultResponse + | CreateJob201Response + | CreateJobDefaultResponse + | ListJobs200Response + | ListJobsDefaultResponse + | ListJobsFromSchedule200Response + | ListJobsFromScheduleDefaultResponse + | ListJobPreparationAndReleaseTaskStatus200Response + | ListJobPreparationAndReleaseTaskStatusDefaultResponse + | GetJobTaskCounts200Response + | GetJobTaskCountsDefaultResponse + | CreateCertificate201Response + | CreateCertificateDefaultResponse + | ListCertificates200Response + | ListCertificatesDefaultResponse + | CancelCertificateDeletion204Response + | CancelCertificateDeletionDefaultResponse + | DeleteCertificate202Response + | DeleteCertificateDefaultResponse + | GetCertificate200Response + | GetCertificateDefaultResponse + | JobScheduleExists200Response + | JobScheduleExists404Response + | JobScheduleExistsDefaultResponse + | DeleteJobSchedule202Response + | DeleteJobScheduleDefaultResponse + | GetJobSchedule200Response + | GetJobScheduleDefaultResponse + | UpdateJobSchedule200Response + | UpdateJobScheduleDefaultResponse + | ReplaceJobSchedule200Response + | ReplaceJobScheduleDefaultResponse + | DisableJobSchedule204Response + | DisableJobScheduleDefaultResponse + | EnableJobSchedule204Response + | EnableJobScheduleDefaultResponse + | TerminateJobSchedule202Response + | TerminateJobScheduleDefaultResponse + | CreateJobSchedule201Response + | CreateJobScheduleDefaultResponse + | ListJobSchedules200Response + | ListJobSchedulesDefaultResponse + | CreateTask201Response + | CreateTaskDefaultResponse + | ListTasks200Response + | ListTasksDefaultResponse + | CreateTaskCollection200Response + | CreateTaskCollectionDefaultResponse + | DeleteTask200Response + | DeleteTaskDefaultResponse + | GetTask200Response + | GetTaskDefaultResponse + | ReplaceTask200Response + | ReplaceTaskDefaultResponse + | ListSubTasks200Response + | ListSubTasksDefaultResponse + | TerminateTask204Response + | TerminateTaskDefaultResponse + | ReactivateTask204Response + | ReactivateTaskDefaultResponse + | DeleteTaskFile200Response + | DeleteTaskFileDefaultResponse + | GetTaskFile200Response + | GetTaskFileDefaultResponse + | GetTaskFileProperties200Response + | GetTaskFilePropertiesDefaultResponse + | ListTaskFiles200Response + | ListTaskFilesDefaultResponse + | CreateNodeUser201Response + | CreateNodeUserDefaultResponse + | DeleteNodeUser200Response + | DeleteNodeUserDefaultResponse + | ReplaceNodeUser200Response + | ReplaceNodeUserDefaultResponse + | GetNode200Response + | GetNodeDefaultResponse + | RebootNode202Response + | RebootNodeDefaultResponse + | ReimageNode202Response + | ReimageNodeDefaultResponse + | DisableNodeScheduling200Response + | DisableNodeSchedulingDefaultResponse + | EnableNodeScheduling200Response + | EnableNodeSchedulingDefaultResponse + | GetNodeRemoteLoginSettings200Response + | GetNodeRemoteLoginSettingsDefaultResponse + | GetNodeRemoteDesktopFile200Response + | GetNodeRemoteDesktopFileDefaultResponse + | UploadNodeLogs200Response + | UploadNodeLogsDefaultResponse + | ListNodes200Response + | ListNodesDefaultResponse + | GetNodeExtension200Response + | GetNodeExtensionDefaultResponse + | ListNodeExtensions200Response + | ListNodeExtensionsDefaultResponse + | DeleteNodeFile200Response + | DeleteNodeFileDefaultResponse + | GetNodeFile200Response + | GetNodeFileDefaultResponse + | GetNodeFileProperties200Response + | GetNodeFilePropertiesDefaultResponse + | ListNodeFiles200Response + | ListNodeFilesDefaultResponse +): response is + | ListApplicationsDefaultResponse + | GetApplicationDefaultResponse + | ListPoolUsageMetricsDefaultResponse + | CreatePoolDefaultResponse + | ListPoolsDefaultResponse + | DeletePoolDefaultResponse + | PoolExistsDefaultResponse + | GetPoolDefaultResponse + | UpdatePoolDefaultResponse + | DisablePoolAutoScaleDefaultResponse + | EnablePoolAutoScaleDefaultResponse + | EvaluatePoolAutoScaleDefaultResponse + | ResizePoolDefaultResponse + | StopPoolResizeDefaultResponse + | ReplacePoolPropertiesDefaultResponse + | RemoveNodesDefaultResponse + | ListSupportedImagesDefaultResponse + | ListPoolNodeCountsDefaultResponse + | DeleteJobDefaultResponse + | GetJobDefaultResponse + | UpdateJobDefaultResponse + | ReplaceJobDefaultResponse + | DisableJobDefaultResponse + | EnableJobDefaultResponse + | TerminateJobDefaultResponse + | CreateJobDefaultResponse + | ListJobsDefaultResponse + | ListJobsFromScheduleDefaultResponse + | ListJobPreparationAndReleaseTaskStatusDefaultResponse + | GetJobTaskCountsDefaultResponse + | CreateCertificateDefaultResponse + | ListCertificatesDefaultResponse + | CancelCertificateDeletionDefaultResponse + | DeleteCertificateDefaultResponse + | GetCertificateDefaultResponse + | JobScheduleExistsDefaultResponse + | DeleteJobScheduleDefaultResponse + | GetJobScheduleDefaultResponse + | UpdateJobScheduleDefaultResponse + | ReplaceJobScheduleDefaultResponse + | DisableJobScheduleDefaultResponse + | EnableJobScheduleDefaultResponse + | TerminateJobScheduleDefaultResponse + | CreateJobScheduleDefaultResponse + | ListJobSchedulesDefaultResponse + | CreateTaskDefaultResponse + | ListTasksDefaultResponse + | CreateTaskCollectionDefaultResponse + | DeleteTaskDefaultResponse + | GetTaskDefaultResponse + | ReplaceTaskDefaultResponse + | ListSubTasksDefaultResponse + | TerminateTaskDefaultResponse + | ReactivateTaskDefaultResponse + | DeleteTaskFileDefaultResponse + | GetTaskFileDefaultResponse + | GetTaskFilePropertiesDefaultResponse + | ListTaskFilesDefaultResponse + | CreateNodeUserDefaultResponse + | DeleteNodeUserDefaultResponse + | ReplaceNodeUserDefaultResponse + | GetNodeDefaultResponse + | RebootNodeDefaultResponse + | ReimageNodeDefaultResponse + | DisableNodeSchedulingDefaultResponse + | EnableNodeSchedulingDefaultResponse + | GetNodeRemoteLoginSettingsDefaultResponse + | GetNodeRemoteDesktopFileDefaultResponse + | UploadNodeLogsDefaultResponse + | ListNodesDefaultResponse + | GetNodeExtensionDefaultResponse + | ListNodeExtensionsDefaultResponse + | DeleteNodeFileDefaultResponse + | GetNodeFileDefaultResponse + | GetNodeFilePropertiesDefaultResponse + | ListNodeFilesDefaultResponse { + const lroOriginal = response.headers["x-ms-original-url"]; + const url = new URL(lroOriginal ?? response.request.url); + const method = response.request.method; + let pathDetails = responseMap[`${method} ${url.pathname}`]; + if (!pathDetails) { + pathDetails = getParametrizedPathSuccess(method, url.pathname); + } + return !pathDetails.includes(response.status); +} + +function getParametrizedPathSuccess(method: string, path: string): string[] { + const pathParts = path.split("/"); + + // Traverse list to match the longest candidate + // matchedLen: the length of candidate path + // matchedValue: the matched status code array + let matchedLen = -1, + matchedValue: string[] = []; + + // Iterate the responseMap to find a match + for (const [key, value] of Object.entries(responseMap)) { + // Extracting the path from the map key which is in format + // GET /path/foo + if (!key.startsWith(method)) { + continue; + } + const candidatePath = getPathFromMapKey(key); + // Get each part of the url path + const candidateParts = candidatePath.split("/"); + + // track if we have found a match to return the values found. + let found = true; + for ( + let i = candidateParts.length - 1, j = pathParts.length - 1; + i >= 1 && j >= 1; + i--, j-- + ) { + if ( + candidateParts[i]?.startsWith("{") && + candidateParts[i]?.indexOf("}") !== -1 + ) { + const start = candidateParts[i]!.indexOf("}") + 1, + end = candidateParts[i]?.length; + // If the current part of the candidate is a "template" part + // Try to use the suffix of pattern to match the path + // {guid} ==> $ + // {guid}:export ==> :export$ + const isMatched = new RegExp( + `${candidateParts[i]?.slice(start, end)}` + ).test(pathParts[j] || ""); + + if (!isMatched) { + found = false; + break; + } + continue; + } + + // If the candidate part is not a template and + // the parts don't match mark the candidate as not found + // to move on with the next candidate path. + if (candidateParts[i] !== pathParts[j]) { + found = false; + break; + } + } + + // We finished evaluating the current candidate parts + // Update the matched value if and only if we found the longer pattern + if (found && candidatePath.length > matchedLen) { + matchedLen = candidatePath.length; + matchedValue = value; + } + } + + return matchedValue; +} + +function getPathFromMapKey(mapKey: string): string { + const pathStart = mapKey.indexOf("/"); + return mapKey.slice(pathStart); +} diff --git a/packages/service/src/internal/batch-rest/generated/src/logger.ts b/packages/service/src/internal/batch-rest/generated/src/logger.ts new file mode 100644 index 000000000..fd60a2285 --- /dev/null +++ b/packages/service/src/internal/batch-rest/generated/src/logger.ts @@ -0,0 +1,5 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { createClientLogger } from "@azure/logger"; +export const logger = createClientLogger("batch"); diff --git a/packages/service/src/internal/batch-rest/generated/src/models.ts b/packages/service/src/internal/batch-rest/generated/src/models.ts new file mode 100644 index 000000000..affe1e5bf --- /dev/null +++ b/packages/service/src/internal/batch-rest/generated/src/models.ts @@ -0,0 +1,1744 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +/** Parameters for creating an Azure Batch Pool. */ +export interface BatchPoolCreateParameters { + /** A string that uniquely identifies the Pool within the Account. The ID can contain any combination of alphanumeric characters including hyphens and underscores, and cannot contain more than 64 characters. The ID is case-preserving and case-insensitive (that is, you may not have two Pool IDs within an Account that differ only by case). */ + id: string; + /** The display name for the Pool. The display name need not be unique and can contain any Unicode characters up to a maximum length of 1024. */ + displayName?: string; + /** The size of virtual machines in the Pool. All virtual machines in a Pool are the same size. For information about available sizes of virtual machines for Cloud Services Pools (pools created with cloudServiceConfiguration), see Sizes for Cloud Services (https://azure.microsoft.com/documentation/articles/cloud-services-sizes-specs/). Batch supports all Cloud Services VM sizes except ExtraSmall, A1V2 and A2V2. For information about available VM sizes for Pools using Images from the Virtual Machines Marketplace (pools created with virtualMachineConfiguration) see Sizes for Virtual Machines (Linux) (https://azure.microsoft.com/documentation/articles/virtual-machines-linux-sizes/) or Sizes for Virtual Machines (Windows) (https://azure.microsoft.com/documentation/articles/virtual-machines-windows-sizes/). Batch supports all Azure VM sizes except STANDARD_A0 and those with premium storage (STANDARD_GS, STANDARD_DS, and STANDARD_DSV2 series). */ + vmSize: string; + /** The cloud service configuration for the Pool. This property and virtualMachineConfiguration are mutually exclusive and one of the properties must be specified. This property cannot be specified if the Batch Account was created with its poolAllocationMode property set to 'UserSubscription'. */ + cloudServiceConfiguration?: CloudServiceConfiguration; + /** The virtual machine configuration for the Pool. This property and cloudServiceConfiguration are mutually exclusive and one of the properties must be specified. */ + virtualMachineConfiguration?: VirtualMachineConfiguration; + /** The timeout for allocation of Compute Nodes to the Pool. This timeout applies only to manual scaling; it has no effect when enableAutoScale is set to true. The default value is 15 minutes. The minimum value is 5 minutes. If you specify a value less than 5 minutes, the Batch service returns an error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). */ + resizeTimeout?: string; + /** The user-specified tags associated with the pool. The user-defined tags to be associated with the Azure Batch Pool. When specified, these tags are propagated to the backing Azure resources associated with the pool. This property can only be specified when the Batch account was created with the poolAllocationMode property set to 'UserSubscription'. */ + resourceTags?: Record; + /** The desired number of dedicated Compute Nodes in the Pool. This property must not be specified if enableAutoScale is set to true. If enableAutoScale is set to false, then you must set either targetDedicatedNodes, targetLowPriorityNodes, or both. */ + targetDedicatedNodes?: number; + /** The desired number of Spot/Low-priority Compute Nodes in the Pool. This property must not be specified if enableAutoScale is set to true. If enableAutoScale is set to false, then you must set either targetDedicatedNodes, targetLowPriorityNodes, or both. */ + targetLowPriorityNodes?: number; + /** Whether the Pool size should automatically adjust over time. If false, at least one of targetDedicatedNodes and targetLowPriorityNodes must be specified. If true, the autoScaleFormula property is required and the Pool automatically resizes according to the formula. The default value is false. */ + enableAutoScale?: boolean; + /** A formula for the desired number of Compute Nodes in the Pool. This property must not be specified if enableAutoScale is set to false. It is required if enableAutoScale is set to true. The formula is checked for validity before the Pool is created. If the formula is not valid, the Batch service rejects the request with detailed error information. For more information about specifying this formula, see 'Automatically scale Compute Nodes in an Azure Batch Pool' (https://azure.microsoft.com/documentation/articles/batch-automatic-scaling/). */ + autoScaleFormula?: string; + /** The time interval at which to automatically adjust the Pool size according to the autoscale formula. The default value is 15 minutes. The minimum and maximum value are 5 minutes and 168 hours respectively. If you specify a value less than 5 minutes or greater than 168 hours, the Batch service returns an error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). */ + autoScaleEvaluationInterval?: string; + /** Whether the Pool permits direct communication between Compute Nodes. Enabling inter-node communication limits the maximum size of the Pool due to deployment restrictions on the Compute Nodes of the Pool. This may result in the Pool not reaching its desired size. The default value is false. */ + enableInterNodeCommunication?: boolean; + /** The network configuration for the Pool. */ + networkConfiguration?: NetworkConfiguration; + /** A Task specified to run on each Compute Node as it joins the Pool. The Task runs when the Compute Node is added to the Pool or when the Compute Node is restarted. */ + startTask?: BatchStartTask; + /** + * For Windows Nodes, the Batch service installs the Certificates to the specified Certificate store and location. + * For Linux Compute Nodes, the Certificates are stored in a directory inside the Task working directory and an environment variable AZ_BATCH_CERTIFICATES_DIR is supplied to the Task to query for this location. + * For Certificates with visibility of 'remoteUser', a 'certs' directory is created in the user's home directory (e.g., /home/{user-name}/certs) and Certificates are placed in that directory. + * Warning: This property is deprecated and will be removed after February, 2024. Please use the [Azure KeyVault Extension](https://learn.microsoft.com/azure/batch/batch-certificate-migration-guide) instead. + */ + certificateReferences?: Array; + /** The list of Packages to be installed on each Compute Node in the Pool. When creating a pool, the package's application ID must be fully qualified (/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Batch/batchAccounts/{accountName}/applications/{applicationName}). Changes to Package references affect all new Nodes joining the Pool, but do not affect Compute Nodes that are already in the Pool until they are rebooted or reimaged. There is a maximum of 10 Package references on any given Pool. */ + applicationPackageReferences?: Array; + /** The list of application licenses the Batch service will make available on each Compute Node in the Pool. The list of application licenses must be a subset of available Batch service application licenses. If a license is requested which is not supported, Pool creation will fail. */ + applicationLicenses?: string[]; + /** The number of task slots that can be used to run concurrent tasks on a single compute node in the pool. The default value is 1. The maximum value is the smaller of 4 times the number of cores of the vmSize of the pool or 256. */ + taskSlotsPerNode?: number; + /** How Tasks are distributed across Compute Nodes in a Pool. If not specified, the default is spread. */ + taskSchedulingPolicy?: BatchTaskSchedulingPolicy; + /** The list of user Accounts to be created on each Compute Node in the Pool. */ + userAccounts?: Array; + /** A list of name-value pairs associated with the Pool as metadata. The Batch service does not assign any meaning to metadata; it is solely for the use of user code. */ + metadata?: Array; + /** Mount storage using specified file system for the entire lifetime of the pool. Mount the storage using Azure fileshare, NFS, CIFS or Blobfuse based file system. */ + mountConfiguration?: Array; + /** + * The desired node communication mode for the pool. If omitted, the default value is Default. + * + * Possible values: default, classic, simplified + */ + targetNodeCommunicationMode?: string; +} + +/** + * The configuration for Compute Nodes in a Pool based on the Azure Cloud Services + * platform. + */ +export interface CloudServiceConfiguration { + /** + * Possible values are: + * 2 - OS Family 2, equivalent to Windows Server 2008 R2 + * SP1. + * 3 - OS Family 3, equivalent to Windows Server 2012. + * 4 - OS Family 4, + * equivalent to Windows Server 2012 R2. + * 5 - OS Family 5, equivalent to Windows + * Server 2016. + * 6 - OS Family 6, equivalent to Windows Server 2019. For more + * information, see Azure Guest OS Releases + * (https://azure.microsoft.com/documentation/articles/cloud-services-guestos-update-matrix/#releases). + */ + osFamily: string; + /** The Azure Guest OS version to be installed on the virtual machines in the Pool. The default value is * which specifies the latest operating system version for the specified OS family. */ + osVersion?: string; +} + +/** + * The configuration for Compute Nodes in a Pool based on the Azure Virtual + * Machines infrastructure. + */ +export interface VirtualMachineConfiguration { + /** A reference to the Azure Virtual Machines Marketplace Image or the custom Virtual Machine Image to use. */ + imageReference: ImageReference; + /** The SKU of the Batch Compute Node agent to be provisioned on Compute Nodes in the Pool. The Batch Compute Node agent is a program that runs on each Compute Node in the Pool, and provides the command-and-control interface between the Compute Node and the Batch service. There are different implementations of the Compute Node agent, known as SKUs, for different operating systems. You must specify a Compute Node agent SKU which matches the selected Image reference. To get the list of supported Compute Node agent SKUs along with their list of verified Image references, see the 'List supported Compute Node agent SKUs' operation. */ + nodeAgentSKUId: string; + /** Windows operating system settings on the virtual machine. This property must not be specified if the imageReference property specifies a Linux OS Image. */ + windowsConfiguration?: WindowsConfiguration; + /** The configuration for data disks attached to the Compute Nodes in the Pool. This property must be specified if the Compute Nodes in the Pool need to have empty data disks attached to them. This cannot be updated. Each Compute Node gets its own disk (the disk is not a file share). Existing disks cannot be attached, each attached disk is empty. When the Compute Node is removed from the Pool, the disk and all data associated with it is also deleted. The disk is not formatted after being attached, it must be formatted before use - for more information see https://docs.microsoft.com/en-us/azure/virtual-machines/linux/classic/attach-disk#initialize-a-new-data-disk-in-linux and https://docs.microsoft.com/en-us/azure/virtual-machines/windows/attach-disk-ps#add-an-empty-data-disk-to-a-virtual-machine. */ + dataDisks?: Array; + /** + * This only applies to Images that contain the Windows operating system, and + * should only be used when you hold valid on-premises licenses for the Compute + * Nodes which will be deployed. If omitted, no on-premises licensing discount is + * applied. Values are: + * + * Windows_Server - The on-premises license is for Windows + * Server. + * Windows_Client - The on-premises license is for Windows Client. + * + */ + licenseType?: string; + /** The container configuration for the Pool. If specified, setup is performed on each Compute Node in the Pool to allow Tasks to run in containers. All regular Tasks and Job manager Tasks run on this Pool must specify the containerSettings property, and all other Tasks may specify it. */ + containerConfiguration?: ContainerConfiguration; + /** The disk encryption configuration for the pool. If specified, encryption is performed on each node in the pool during node provisioning. */ + diskEncryptionConfiguration?: DiskEncryptionConfiguration; + /** The node placement configuration for the pool. This configuration will specify rules on how nodes in the pool will be physically allocated. */ + nodePlacementConfiguration?: BatchNodePlacementConfiguration; + /** The virtual machine extension for the pool. If specified, the extensions mentioned in this configuration will be installed on each node. */ + extensions?: Array; + /** Settings for the operating system disk of the Virtual Machine. */ + osDisk?: OSDisk; + /** Specifies the security profile settings for the virtual machine or virtual machine scale set. */ + securityProfile?: SecurityProfile; + /** Specifies the service artifact reference id used to set same image version for all virtual machines in the scale set when using 'latest' image version. The service artifact reference id in the form of /subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Compute/galleries/{galleryName}/serviceArtifacts/{serviceArtifactName}/vmArtifactsProfiles/{vmArtifactsProfilesName} */ + serviceArtifactReference?: ServiceArtifactReference; +} + +/** + * A reference to an Azure Virtual Machines Marketplace Image or a Azure Compute Gallery Image. + * To get the list of all Azure Marketplace Image references verified by Azure Batch, see the + * ' List Supported Images ' operation. + */ +export interface ImageReference { + /** The publisher of the Azure Virtual Machines Marketplace Image. For example, Canonical or MicrosoftWindowsServer. */ + publisher?: string; + /** The offer type of the Azure Virtual Machines Marketplace Image. For example, UbuntuServer or WindowsServer. */ + offer?: string; + /** The SKU of the Azure Virtual Machines Marketplace Image. For example, 18.04-LTS or 2019-Datacenter. */ + sku?: string; + /** The version of the Azure Virtual Machines Marketplace Image. A value of 'latest' can be specified to select the latest version of an Image. If omitted, the default is 'latest'. */ + version?: string; + /** The ARM resource identifier of the Azure Compute Gallery Image. Compute Nodes in the Pool will be created using this Image Id. This is of the form /subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Compute/galleries/{galleryName}/images/{imageDefinitionName}/versions/{VersionId} or /subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Compute/galleries/{galleryName}/images/{imageDefinitionName} for always defaulting to the latest image version. This property is mutually exclusive with other ImageReference properties. The Azure Compute Gallery Image must have replicas in the same region and must be in the same subscription as the Azure Batch account. If the image version is not specified in the imageId, the latest version will be used. For information about the firewall settings for the Batch Compute Node agent to communicate with the Batch service see https://docs.microsoft.com/en-us/azure/batch/batch-api-basics#virtual-network-vnet-and-firewall-configuration. */ + virtualMachineImageId?: string; +} + +/** Windows operating system settings to apply to the virtual machine. */ +export interface WindowsConfiguration { + /** Whether automatic updates are enabled on the virtual machine. If omitted, the default value is true. */ + enableAutomaticUpdates?: boolean; +} + +/** + * Settings which will be used by the data disks associated to Compute Nodes in + * the Pool. When using attached data disks, you need to mount and format the + * disks from within a VM to use them. + */ +export interface DataDisk { + /** The logical unit number. The lun is used to uniquely identify each data disk. If attaching multiple disks, each should have a distinct lun. The value must be between 0 and 63, inclusive. */ + lun: number; + /** + * The type of caching to be enabled for the data disks. The default value for caching is readwrite. For information about the caching options see: https://blogs.msdn.microsoft.com/windowsazurestorage/2012/06/27/exploring-windows-azure-drives-disks-and-images/. + * + * Possible values: none, readonly, readwrite + */ + caching?: string; + /** The initial disk size in gigabytes. */ + diskSizeGB: number; + /** + * The storage Account type to be used for the data disk. If omitted, the default is "standard_lrs". + * + * Possible values: standard_lrs, premium_lrs, standardssd_lrs + */ + storageAccountType?: string; +} + +/** The configuration for container-enabled Pools. */ +export interface ContainerConfiguration { + /** + * The container technology to be used. + * + * Possible values: dockerCompatible, criCompatible + */ + type: string; + /** The collection of container Image names. This is the full Image reference, as would be specified to "docker pull". An Image will be sourced from the default Docker registry unless the Image is fully qualified with an alternative registry. */ + containerImageNames?: string[]; + /** Additional private registries from which containers can be pulled. If any Images must be downloaded from a private registry which requires credentials, then those credentials must be provided here. */ + containerRegistries?: Array; +} + +/** A private container registry. */ +export interface ContainerRegistry { + /** The user name to log into the registry server. */ + username?: string; + /** The password to log into the registry server. */ + password?: string; + /** The registry URL. If omitted, the default is "docker.io". */ + registryServer?: string; + /** The reference to the user assigned identity to use to access an Azure Container Registry instead of username and password. */ + identityReference?: BatchNodeIdentityReference; +} + +/** + * The reference to a user assigned identity associated with the Batch pool which + * a compute node will use. + */ +export interface BatchNodeIdentityReference { + /** The ARM resource id of the user assigned identity. */ + resourceId?: string; +} + +/** + * The disk encryption configuration applied on compute nodes in the pool. + * Disk encryption configuration is not supported on Linux pool created with + * Azure Compute Gallery Image. + */ +export interface DiskEncryptionConfiguration { + /** The list of disk targets Batch Service will encrypt on the compute node. If omitted, no disks on the compute nodes in the pool will be encrypted. On Linux pool, only "TemporaryDisk" is supported; on Windows pool, "OsDisk" and "TemporaryDisk" must be specified. */ + targets?: string[]; +} + +/** + * For regional placement, nodes in the pool will be allocated in the same region. + * For zonal placement, nodes in the pool will be spread across different zones + * with best effort balancing. + */ +export interface BatchNodePlacementConfiguration { + /** + * Node placement Policy type on Batch Pools. Allocation policy used by Batch Service to provision the nodes. If not specified, Batch will use the regional policy. + * + * Possible values: regional, zonal + */ + policy?: string; +} + +/** The configuration for virtual machine extensions. */ +export interface VMExtension { + /** The name of the virtual machine extension. */ + name: string; + /** The name of the extension handler publisher. */ + publisher: string; + /** The type of the extension. */ + type: string; + /** The version of script handler. */ + typeHandlerVersion?: string; + /** Indicates whether the extension should use a newer minor version if one is available at deployment time. Once deployed, however, the extension will not upgrade minor versions unless redeployed, even with this property set to true. */ + autoUpgradeMinorVersion?: boolean; + /** Indicates whether the extension should be automatically upgraded by the platform if there is a newer version of the extension available. */ + enableAutomaticUpgrade?: boolean; + /** JSON formatted public settings for the extension. */ + settings?: Record; + /** The extension can contain either protectedSettings or protectedSettingsFromKeyVault or no protected settings at all. */ + protectedSettings?: Record; + /** The collection of extension names. Collection of extension names after which this extension needs to be provisioned. */ + provisionAfterExtensions?: string[]; +} + +/** Settings for the operating system disk of the compute node (VM). */ +export interface OSDisk { + /** Specifies the ephemeral Disk Settings for the operating system disk used by the compute node (VM). */ + ephemeralOSDiskSettings?: DiffDiskSettings; + /** + * Specifies the caching requirements. Possible values are: None, ReadOnly, ReadWrite. The default values are: None for Standard storage. ReadOnly for Premium storage. + * + * Possible values: none, readonly, readwrite + */ + caching?: string; + /** The initial disk size in GB when creating new OS disk. */ + diskSizeGB?: number; + /** The managed disk parameters. */ + managedDisk?: ManagedDisk; + /** Specifies whether writeAccelerator should be enabled or disabled on the disk. */ + writeAcceleratorEnabled?: boolean; +} + +/** + * Specifies the ephemeral Disk Settings for the operating system disk used by the + * compute node (VM). + */ +export interface DiffDiskSettings { + /** + * Specifies the ephemeral disk placement for operating system disk for all VMs in the pool. This property can be used by user in the request to choose the location e.g., cache disk space for Ephemeral OS disk provisioning. For more information on Ephemeral OS disk size requirements, please refer to Ephemeral OS disk size requirements for Windows VMs at https://docs.microsoft.com/en-us/azure/virtual-machines/windows/ephemeral-os-disks#size-requirements and Linux VMs at https://docs.microsoft.com/en-us/azure/virtual-machines/linux/ephemeral-os-disks#size-requirements. + * + * Possible values: cachedisk + */ + placement?: string; +} + +/** The managed disk parameters. */ +export interface ManagedDisk { + /** + * The storage account type for managed disk. + * + * Possible values: standard_lrs, premium_lrs, standardssd_lrs + */ + storageAccountType: string; +} + +/** Specifies the security profile settings for the virtual machine or virtual machine scale set. */ +export interface SecurityProfile { + /** This property can be used by user in the request to enable or disable the Host Encryption for the virtual machine or virtual machine scale set. This will enable the encryption for all the disks including Resource/Temp disk at host itself. */ + encryptionAtHost: boolean; + /** + * Specifies the SecurityType of the virtual machine. It has to be set to any specified value to enable UefiSettings. + * + * Possible values: trustedLaunch + */ + securityType: string; + /** Specifies the security settings like secure boot and vTPM used while creating the virtual machine. Specifies the security settings like secure boot and vTPM used while creating the virtual machine. */ + uefiSettings: UefiSettings; +} + +/** Specifies the security settings like secure boot and vTPM used while creating the virtual machine. */ +export interface UefiSettings { + /** Specifies whether secure boot should be enabled on the virtual machine. */ + secureBootEnabled?: boolean; + /** Specifies whether vTPM should be enabled on the virtual machine. */ + vTpmEnabled?: boolean; +} + +/** + * Specifies the service artifact reference id used to set same image version + * for all virtual machines in the scale set when using 'latest' image version. + */ +export interface ServiceArtifactReference { + /** The service artifact reference id of ServiceArtifactReference. The service artifact reference id in the form of /subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Compute/galleries/{galleryName}/serviceArtifacts/{serviceArtifactName}/vmArtifactsProfiles/{vmArtifactsProfilesName} */ + id: string; +} + +/** The network configuration for a Pool. */ +export interface NetworkConfiguration { + /** The ARM resource identifier of the virtual network subnet which the Compute Nodes of the Pool will join. This is of the form /subscriptions/{subscription}/resourceGroups/{group}/providers/{provider}/virtualNetworks/{network}/subnets/{subnet}. The virtual network must be in the same region and subscription as the Azure Batch Account. The specified subnet should have enough free IP addresses to accommodate the number of Compute Nodes in the Pool. If the subnet doesn't have enough free IP addresses, the Pool will partially allocate Nodes and a resize error will occur. The 'MicrosoftAzureBatch' service principal must have the 'Classic Virtual Machine Contributor' Role-Based Access Control (RBAC) role for the specified VNet. The specified subnet must allow communication from the Azure Batch service to be able to schedule Tasks on the Nodes. This can be verified by checking if the specified VNet has any associated Network Security Groups (NSG). If communication to the Nodes in the specified subnet is denied by an NSG, then the Batch service will set the state of the Compute Nodes to unusable. For Pools created with virtualMachineConfiguration only ARM virtual networks ('Microsoft.Network/virtualNetworks') are supported, but for Pools created with cloudServiceConfiguration both ARM and classic virtual networks are supported. If the specified VNet has any associated Network Security Groups (NSG), then a few reserved system ports must be enabled for inbound communication. For Pools created with a virtual machine configuration, enable ports 29876 and 29877, as well as port 22 for Linux and port 3389 for Windows. For Pools created with a cloud service configuration, enable ports 10100, 20100, and 30100. Also enable outbound connections to Azure Storage on port 443. For more details see: https://docs.microsoft.com/en-us/azure/batch/batch-api-basics#virtual-network-vnet-and-firewall-configuration. */ + subnetId?: string; + /** + * The scope of dynamic vnet assignment. + * + * Possible values: none, job + */ + dynamicVNetAssignmentScope?: string; + /** The configuration for endpoints on Compute Nodes in the Batch Pool. Pool endpoint configuration is only supported on Pools with the virtualMachineConfiguration property. */ + endpointConfiguration?: BatchPoolEndpointConfiguration; + /** The Public IPAddress configuration for Compute Nodes in the Batch Pool. Public IP configuration property is only supported on Pools with the virtualMachineConfiguration property. */ + publicIPAddressConfiguration?: PublicIPAddressConfiguration; + /** Whether this pool should enable accelerated networking. Accelerated networking enables single root I/O virtualization (SR-IOV) to a VM, which may lead to improved networking performance. For more details, see: https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview. */ + enableAcceleratedNetworking?: boolean; +} + +/** The endpoint configuration for a Pool. */ +export interface BatchPoolEndpointConfiguration { + /** A list of inbound NAT Pools that can be used to address specific ports on an individual Compute Node externally. The maximum number of inbound NAT Pools per Batch Pool is 5. If the maximum number of inbound NAT Pools is exceeded the request fails with HTTP status code 400. This cannot be specified if the IPAddressProvisioningType is NoPublicIPAddresses. */ + inboundNATPools: Array; +} + +/** + * A inbound NAT Pool that can be used to address specific ports on Compute Nodes + * in a Batch Pool externally. + */ +export interface InboundNATPool { + /** The name of the endpoint. The name must be unique within a Batch Pool, can contain letters, numbers, underscores, periods, and hyphens. Names must start with a letter or number, must end with a letter, number, or underscore, and cannot exceed 77 characters. If any invalid values are provided the request fails with HTTP status code 400. */ + name: string; + /** + * The protocol of the endpoint. + * + * Possible values: tcp, udp + */ + protocol: string; + /** The port number on the Compute Node. This must be unique within a Batch Pool. Acceptable values are between 1 and 65535 except for 22, 3389, 29876 and 29877 as these are reserved. If any reserved values are provided the request fails with HTTP status code 400. */ + backendPort: number; + /** The first port number in the range of external ports that will be used to provide inbound access to the backendPort on individual Compute Nodes. Acceptable values range between 1 and 65534 except ports from 50000 to 55000 which are reserved. All ranges within a Pool must be distinct and cannot overlap. Each range must contain at least 40 ports. If any reserved or overlapping values are provided the request fails with HTTP status code 400. */ + frontendPortRangeStart: number; + /** The last port number in the range of external ports that will be used to provide inbound access to the backendPort on individual Compute Nodes. Acceptable values range between 1 and 65534 except ports from 50000 to 55000 which are reserved by the Batch service. All ranges within a Pool must be distinct and cannot overlap. Each range must contain at least 40 ports. If any reserved or overlapping values are provided the request fails with HTTP status code 400. */ + frontendPortRangeEnd: number; + /** A list of network security group rules that will be applied to the endpoint. The maximum number of rules that can be specified across all the endpoints on a Batch Pool is 25. If no network security group rules are specified, a default rule will be created to allow inbound access to the specified backendPort. If the maximum number of network security group rules is exceeded the request fails with HTTP status code 400. */ + networkSecurityGroupRules?: Array; +} + +/** A network security group rule to apply to an inbound endpoint. */ +export interface NetworkSecurityGroupRule { + /** The priority for this rule. Priorities within a Pool must be unique and are evaluated in order of priority. The lower the number the higher the priority. For example, rules could be specified with order numbers of 150, 250, and 350. The rule with the order number of 150 takes precedence over the rule that has an order of 250. Allowed priorities are 150 to 4096. If any reserved or duplicate values are provided the request fails with HTTP status code 400. */ + priority: number; + /** + * The action that should be taken for a specified IP address, subnet range or tag. + * + * Possible values: allow, deny + */ + access: string; + /** The source address prefix or tag to match for the rule. Valid values are a single IP address (i.e. 10.10.10.10), IP subnet (i.e. 192.168.1.0/24), default tag, or * (for all addresses). If any other values are provided the request fails with HTTP status code 400. */ + sourceAddressPrefix: string; + /** The source port ranges to match for the rule. Valid values are '*' (for all ports 0 - 65535), a specific port (i.e. 22), or a port range (i.e. 100-200). The ports must be in the range of 0 to 65535. Each entry in this collection must not overlap any other entry (either a range or an individual port). If any other values are provided the request fails with HTTP status code 400. The default value is '*'. */ + sourcePortRanges?: string[]; +} + +/** The public IP Address configuration of the networking configuration of a Pool. */ +export interface PublicIPAddressConfiguration { + /** + * The provisioning type for Public IP Addresses for the Pool. The default value is BatchManaged. + * + * Possible values: batchmanaged, usermanaged, nopublicipaddresses + */ + provision?: string; + /** The list of public IPs which the Batch service will use when provisioning Compute Nodes. The number of IPs specified here limits the maximum size of the Pool - 100 dedicated nodes or 100 Spot/Low-priority nodes can be allocated for each public IP. For example, a pool needing 250 dedicated VMs would need at least 3 public IPs specified. Each element of this collection is of the form: /subscriptions/{subscription}/resourceGroups/{group}/providers/Microsoft.Network/publicIPAddresses/{ip}. */ + ipAddressIds?: string[]; +} + +/** + * Batch will retry Tasks when a recovery operation is triggered on a Node. + * Examples of recovery operations include (but are not limited to) when an + * unhealthy Node is rebooted or a Compute Node disappeared due to host failure. + * Retries due to recovery operations are independent of and are not counted + * against the maxTaskRetryCount. Even if the maxTaskRetryCount is 0, an internal + * retry due to a recovery operation may occur. Because of this, all Tasks should + * be idempotent. This means Tasks need to tolerate being interrupted and + * restarted without causing any corruption or duplicate data. The best practice + * for long running Tasks is to use some form of checkpointing. In some cases the + * StartTask may be re-run even though the Compute Node was not rebooted. Special + * care should be taken to avoid StartTasks which create breakaway process or + * install/launch services from the StartTask working directory, as this will + * block Batch from being able to re-run the StartTask. + */ +export interface BatchStartTask { + /** The command line of the StartTask. The command line does not run under a shell, and therefore cannot take advantage of shell features such as environment variable expansion. If you want to take advantage of such features, you should invoke the shell in the command line, for example using "cmd /c MyCommand" in Windows or "/bin/sh -c MyCommand" in Linux. If the command line refers to file paths, it should use a relative path (relative to the Task working directory), or use the Batch provided environment variable (https://docs.microsoft.com/en-us/azure/batch/batch-compute-node-environment-variables). */ + commandLine: string; + /** The settings for the container under which the StartTask runs. When this is specified, all directories recursively below the AZ_BATCH_NODE_ROOT_DIR (the root of Azure Batch directories on the node) are mapped into the container, all Task environment variables are mapped into the container, and the Task command line is executed in the container. Files produced in the container outside of AZ_BATCH_NODE_ROOT_DIR might not be reflected to the host disk, meaning that Batch file APIs will not be able to access those files. */ + containerSettings?: BatchTaskContainerSettings; + /** A list of files that the Batch service will download to the Compute Node before running the command line. There is a maximum size for the list of resource files. When the max size is exceeded, the request will fail and the response error code will be RequestEntityTooLarge. If this occurs, the collection of ResourceFiles must be reduced in size. This can be achieved using .zip files, Application Packages, or Docker Containers. Files listed under this element are located in the Task's working directory. */ + resourceFiles?: Array; + /** A list of environment variable settings for the StartTask. */ + environmentSettings?: Array; + /** The user identity under which the StartTask runs. If omitted, the Task runs as a non-administrative user unique to the Task. */ + userIdentity?: UserIdentity; + /** The maximum number of times the Task may be retried. The Batch service retries a Task if its exit code is nonzero. Note that this value specifically controls the number of retries. The Batch service will try the Task once, and may then retry up to this limit. For example, if the maximum retry count is 3, Batch tries the Task up to 4 times (one initial try and 3 retries). If the maximum retry count is 0, the Batch service does not retry the Task. If the maximum retry count is -1, the Batch service retries the Task without limit, however this is not recommended for a start task or any task. The default value is 0 (no retries). */ + maxTaskRetryCount?: number; + /** Whether the Batch service should wait for the StartTask to complete successfully (that is, to exit with exit code 0) before scheduling any Tasks on the Compute Node. If true and the StartTask fails on a Node, the Batch service retries the StartTask up to its maximum retry count (maxTaskRetryCount). If the Task has still not completed successfully after all retries, then the Batch service marks the Node unusable, and will not schedule Tasks to it. This condition can be detected via the Compute Node state and failure info details. If false, the Batch service will not wait for the StartTask to complete. In this case, other Tasks can start executing on the Compute Node while the StartTask is still running; and even if the StartTask fails, new Tasks will continue to be scheduled on the Compute Node. The default is true. */ + waitForSuccess?: boolean; +} + +/** The container settings for a Task. */ +export interface BatchTaskContainerSettings { + /** Additional options to the container create command. These additional options are supplied as arguments to the "docker create" command, in addition to those controlled by the Batch Service. */ + containerRunOptions?: string; + /** The Image to use to create the container in which the Task will run. This is the full Image reference, as would be specified to "docker pull". If no tag is provided as part of the Image name, the tag ":latest" is used as a default. */ + imageName: string; + /** The private registry which contains the container Image. This setting can be omitted if was already provided at Pool creation. */ + registry?: ContainerRegistry; + /** + * The location of the container Task working directory. The default is 'taskWorkingDirectory'. + * + * Possible values: taskWorkingDirectory, containerImageDefault + */ + workingDirectory?: string; +} + +/** A single file or multiple files to be downloaded to a Compute Node. */ +export interface ResourceFile { + /** The storage container name in the auto storage Account. The autoStorageContainerName, storageContainerUrl and httpUrl properties are mutually exclusive and one of them must be specified. */ + autoStorageContainerName?: string; + /** The URL of the blob container within Azure Blob Storage. The autoStorageContainerName, storageContainerUrl and httpUrl properties are mutually exclusive and one of them must be specified. This URL must be readable and listable from compute nodes. There are three ways to get such a URL for a container in Azure storage: include a Shared Access Signature (SAS) granting read and list permissions on the container, use a managed identity with read and list permissions, or set the ACL for the container to allow public access. */ + storageContainerUrl?: string; + /** The URL of the file to download. The autoStorageContainerName, storageContainerUrl and httpUrl properties are mutually exclusive and one of them must be specified. If the URL points to Azure Blob Storage, it must be readable from compute nodes. There are three ways to get such a URL for a blob in Azure storage: include a Shared Access Signature (SAS) granting read permissions on the blob, use a managed identity with read permission, or set the ACL for the blob or its container to allow public access. */ + httpUrl?: string; + /** The blob prefix to use when downloading blobs from an Azure Storage container. Only the blobs whose names begin with the specified prefix will be downloaded. The property is valid only when autoStorageContainerName or storageContainerUrl is used. This prefix can be a partial filename or a subdirectory. If a prefix is not specified, all the files in the container will be downloaded. */ + blobPrefix?: string; + /** The location on the Compute Node to which to download the file(s), relative to the Task's working directory. If the httpUrl property is specified, the filePath is required and describes the path which the file will be downloaded to, including the filename. Otherwise, if the autoStorageContainerName or storageContainerUrl property is specified, filePath is optional and is the directory to download the files to. In the case where filePath is used as a directory, any directory structure already associated with the input data will be retained in full and appended to the specified filePath directory. The specified relative path cannot break out of the Task's working directory (for example by using '..'). */ + filePath?: string; + /** The file permission mode attribute in octal format. This property applies only to files being downloaded to Linux Compute Nodes. It will be ignored if it is specified for a resourceFile which will be downloaded to a Windows Compute Node. If this property is not specified for a Linux Compute Node, then a default value of 0770 is applied to the file. */ + fileMode?: string; + /** The reference to the user assigned identity to use to access Azure Blob Storage specified by storageContainerUrl or httpUrl. */ + identityReference?: BatchNodeIdentityReference; +} + +/** An environment variable to be set on a Task process. */ +export interface EnvironmentSetting { + /** The name of the environment variable. */ + name: string; + /** The value of the environment variable. */ + value?: string; +} + +/** The definition of the user identity under which the Task is run. Specify either the userName or autoUser property, but not both. */ +export interface UserIdentity { + /** The name of the user identity under which the Task is run. The userName and autoUser properties are mutually exclusive; you must specify one but not both. */ + username?: string; + /** The auto user under which the Task is run. The userName and autoUser properties are mutually exclusive; you must specify one but not both. */ + autoUser?: AutoUserSpecification; +} + +/** Specifies the options for the auto user that runs an Azure Batch Task. */ +export interface AutoUserSpecification { + /** + * The scope for the auto user. The default value is pool. If the pool is running Windows a value of Task should be specified if stricter isolation between tasks is required. For example, if the task mutates the registry in a way which could impact other tasks, or if certificates have been specified on the pool which should not be accessible by normal tasks but should be accessible by StartTasks. + * + * Possible values: task, pool + */ + scope?: string; + /** + * The elevation level of the auto user. The default value is nonAdmin. + * + * Possible values: nonadmin, admin + */ + elevationLevel?: string; +} + +/** A reference to a Certificate to be installed on Compute Nodes in a Pool. Warning: This object is deprecated and will be removed after February, 2024. Please use the [Azure KeyVault Extension](https://learn.microsoft.com/azure/batch/batch-certificate-migration-guide) instead. */ +export interface BatchCertificateReference { + /** The thumbprint of the Certificate. */ + thumbprint: string; + /** The algorithm with which the thumbprint is associated. This must be sha1. */ + thumbprintAlgorithm: string; + /** + * The location of the Certificate store on the Compute Node into which to install the Certificate. The default value is currentuser. This property is applicable only for Pools configured with Windows Compute Nodes (that is, created with cloudServiceConfiguration, or with virtualMachineConfiguration using a Windows Image reference). For Linux Compute Nodes, the Certificates are stored in a directory inside the Task working directory and an environment variable AZ_BATCH_CERTIFICATES_DIR is supplied to the Task to query for this location. For Certificates with visibility of 'remoteUser', a 'certs' directory is created in the user's home directory (e.g., /home/{user-name}/certs) and Certificates are placed in that directory. + * + * Possible values: currentuser, localmachine + */ + storeLocation?: string; + /** The name of the Certificate store on the Compute Node into which to install the Certificate. This property is applicable only for Pools configured with Windows Compute Nodes (that is, created with cloudServiceConfiguration, or with virtualMachineConfiguration using a Windows Image reference). Common store names include: My, Root, CA, Trust, Disallowed, TrustedPeople, TrustedPublisher, AuthRoot, AddressBook, but any custom store name can also be used. The default value is My. */ + storeName?: string; + /** Which user Accounts on the Compute Node should have access to the private data of the Certificate. You can specify more than one visibility in this collection. The default is all Accounts. */ + visibility?: string[]; +} + +/** A reference to an Package to be deployed to Compute Nodes. */ +export interface BatchApplicationPackageReference { + /** The ID of the application to deploy. When creating a pool, the package's application ID must be fully qualified (/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Batch/batchAccounts/{accountName}/applications/{applicationName}). */ + applicationId: string; + /** The version of the application to deploy. If omitted, the default version is deployed. If this is omitted on a Pool, and no default version is specified for this application, the request fails with the error code InvalidApplicationPackageReferences and HTTP status code 409. If this is omitted on a Task, and no default version is specified for this application, the Task fails with a pre-processing error. */ + version?: string; +} + +/** Specifies how Tasks should be distributed across Compute Nodes. */ +export interface BatchTaskSchedulingPolicy { + /** + * How Tasks are distributed across Compute Nodes in a Pool. If not specified, the default is spread. + * + * Possible values: spread, pack + */ + nodeFillType: string; +} + +/** + * Properties used to create a user used to execute Tasks on an Azure Batch + * Compute Node. + */ +export interface UserAccount { + /** The name of the user Account. Names can contain any Unicode characters up to a maximum length of 20. */ + name: string; + /** The password for the user Account. */ + password: string; + /** + * The elevation level of the user Account. The default value is nonAdmin. + * + * Possible values: nonadmin, admin + */ + elevationLevel?: string; + /** The Linux-specific user configuration for the user Account. This property is ignored if specified on a Windows Pool. If not specified, the user is created with the default options. */ + linuxUserConfiguration?: LinuxUserConfiguration; + /** The Windows-specific user configuration for the user Account. This property can only be specified if the user is on a Windows Pool. If not specified and on a Windows Pool, the user is created with the default options. */ + windowsUserConfiguration?: WindowsUserConfiguration; +} + +/** Properties used to create a user Account on a Linux Compute Node. */ +export interface LinuxUserConfiguration { + /** The user ID of the user Account. The uid and gid properties must be specified together or not at all. If not specified the underlying operating system picks the uid. */ + uid?: number; + /** The group ID for the user Account. The uid and gid properties must be specified together or not at all. If not specified the underlying operating system picks the gid. */ + gid?: number; + /** The SSH private key for the user Account. The private key must not be password protected. The private key is used to automatically configure asymmetric-key based authentication for SSH between Compute Nodes in a Linux Pool when the Pool's enableInterNodeCommunication property is true (it is ignored if enableInterNodeCommunication is false). It does this by placing the key pair into the user's .ssh directory. If not specified, password-less SSH is not configured between Compute Nodes (no modification of the user's .ssh directory is done). */ + sshPrivateKey?: string; +} + +/** Properties used to create a user Account on a Windows Compute Node. */ +export interface WindowsUserConfiguration { + /** + * The login mode for the user. The default value for VirtualMachineConfiguration Pools is 'batch' and for CloudServiceConfiguration Pools is 'interactive'. + * + * Possible values: batch, interactive + */ + loginMode?: string; +} + +/** + * The Batch service does not assign any meaning to this metadata; it is solely + * for the use of user code. + */ +export interface MetadataItem { + /** The name of the metadata item. */ + name: string; + /** The value of the metadata item. */ + value: string; +} + +/** The file system to mount on each node. */ +export interface MountConfiguration { + /** The Azure Storage Container to mount using blob FUSE on each node. This property is mutually exclusive with all other properties. */ + azureBlobFileSystemConfiguration?: AzureBlobFileSystemConfiguration; + /** The NFS file system to mount on each node. This property is mutually exclusive with all other properties. */ + nfsMountConfiguration?: NFSMountConfiguration; + /** The CIFS/SMB file system to mount on each node. This property is mutually exclusive with all other properties. */ + cifsMountConfiguration?: CifsMountConfiguration; + /** The Azure File Share to mount on each node. This property is mutually exclusive with all other properties. */ + azureFileShareConfiguration?: AzureFileShareConfiguration; +} + +/** Information used to connect to an Azure Storage Container using Blobfuse. */ +export interface AzureBlobFileSystemConfiguration { + /** The Azure Storage Account name. */ + accountName: string; + /** The Azure Blob Storage Container name. */ + containerName: string; + /** The Azure Storage Account key. This property is mutually exclusive with both sasKey and identity; exactly one must be specified. */ + accountKey?: string; + /** The Azure Storage SAS token. This property is mutually exclusive with both accountKey and identity; exactly one must be specified. */ + sasKey?: string; + /** Additional command line options to pass to the mount command. These are 'net use' options in Windows and 'mount' options in Linux. */ + blobfuseOptions?: string; + /** The relative path on the compute node where the file system will be mounted. All file systems are mounted relative to the Batch mounts directory, accessible via the AZ_BATCH_NODE_MOUNTS_DIR environment variable. */ + relativeMountPath: string; + /** The reference to the user assigned identity to use to access containerName. This property is mutually exclusive with both accountKey and sasKey; exactly one must be specified. */ + identityReference?: BatchNodeIdentityReference; +} + +/** Information used to connect to an NFS file system. */ +export interface NFSMountConfiguration { + /** The URI of the file system to mount. */ + source: string; + /** The relative path on the compute node where the file system will be mounted. All file systems are mounted relative to the Batch mounts directory, accessible via the AZ_BATCH_NODE_MOUNTS_DIR environment variable. */ + relativeMountPath: string; + /** Additional command line options to pass to the mount command. These are 'net use' options in Windows and 'mount' options in Linux. */ + mountOptions?: string; +} + +/** Information used to connect to a CIFS file system. */ +export interface CifsMountConfiguration { + /** The user to use for authentication against the CIFS file system. */ + username: string; + /** The URI of the file system to mount. */ + source: string; + /** The relative path on the compute node where the file system will be mounted. All file systems are mounted relative to the Batch mounts directory, accessible via the AZ_BATCH_NODE_MOUNTS_DIR environment variable. */ + relativeMountPath: string; + /** Additional command line options to pass to the mount command. These are 'net use' options in Windows and 'mount' options in Linux. */ + mountOptions?: string; + /** The password to use for authentication against the CIFS file system. */ + password: string; +} + +/** Information used to connect to an Azure Fileshare. */ +export interface AzureFileShareConfiguration { + /** The Azure Storage account name. */ + accountName: string; + /** The Azure Files URL. This is of the form 'https://{account}.file.core.windows.net/'. */ + azureFileUrl: string; + /** The Azure Storage account key. */ + accountKey: string; + /** The relative path on the compute node where the file system will be mounted. All file systems are mounted relative to the Batch mounts directory, accessible via the AZ_BATCH_NODE_MOUNTS_DIR environment variable. */ + relativeMountPath: string; + /** Additional command line options to pass to the mount command. These are 'net use' options in Windows and 'mount' options in Linux. */ + mountOptions?: string; +} + +/** Represents a name-value pair. */ +export interface NameValuePair { + /** The name in the name-value pair. */ + name?: string; + /** The value in the name-value pair. */ + value?: string; +} + +/** Parameters for updating an Azure Batch Pool. */ +export interface BatchPoolUpdateParameters { + /** A Task to run on each Compute Node as it joins the Pool. The Task runs when the Compute Node is added to the Pool or when the Compute Node is restarted. If this element is present, it overwrites any existing StartTask. If omitted, any existing StartTask is left unchanged. */ + startTask?: BatchStartTask; + /** + * If this element is present, it replaces any existing Certificate references configured on the Pool. + * If omitted, any existing Certificate references are left unchanged. + * For Windows Nodes, the Batch service installs the Certificates to the specified Certificate store and location. + * For Linux Compute Nodes, the Certificates are stored in a directory inside the Task working directory and an environment variable AZ_BATCH_CERTIFICATES_DIR is supplied to the Task to query for this location. + * For Certificates with visibility of 'remoteUser', a 'certs' directory is created in the user's home directory (e.g., /home/{user-name}/certs) and Certificates are placed in that directory. + * Warning: This property is deprecated and will be removed after February, 2024. Please use the [Azure KeyVault Extension](https://learn.microsoft.com/azure/batch/batch-certificate-migration-guide) instead. + */ + certificateReferences?: Array; + /** A list of Packages to be installed on each Compute Node in the Pool. Changes to Package references affect all new Nodes joining the Pool, but do not affect Compute Nodes that are already in the Pool until they are rebooted or reimaged. If this element is present, it replaces any existing Package references. If you specify an empty collection, then all Package references are removed from the Pool. If omitted, any existing Package references are left unchanged. */ + applicationPackageReferences?: Array; + /** A list of name-value pairs associated with the Pool as metadata. If this element is present, it replaces any existing metadata configured on the Pool. If you specify an empty collection, any metadata is removed from the Pool. If omitted, any existing metadata is left unchanged. */ + metadata?: Array; + /** + * The desired node communication mode for the pool. If this element is present, it replaces the existing targetNodeCommunicationMode configured on the Pool. If omitted, any existing metadata is left unchanged. + * + * Possible values: default, classic, simplified + */ + targetNodeCommunicationMode?: string; +} + +/** Parameters for enabling automatic scaling on an Azure Batch Pool. */ +export interface BatchPoolEnableAutoScaleParameters { + /** The formula for the desired number of Compute Nodes in the Pool. The formula is checked for validity before it is applied to the Pool. If the formula is not valid, the Batch service rejects the request with detailed error information. For more information about specifying this formula, see Automatically scale Compute Nodes in an Azure Batch Pool (https://azure.microsoft.com/en-us/documentation/articles/batch-automatic-scaling). */ + autoScaleFormula?: string; + /** The time interval at which to automatically adjust the Pool size according to the autoscale formula. The default value is 15 minutes. The minimum and maximum value are 5 minutes and 168 hours respectively. If you specify a value less than 5 minutes or greater than 168 hours, the Batch service rejects the request with an invalid property value error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). If you specify a new interval, then the existing autoscale evaluation schedule will be stopped and a new autoscale evaluation schedule will be started, with its starting time being the time when this request was issued. */ + autoScaleEvaluationInterval?: string; +} + +/** Parameters for evaluating an automatic scaling formula on an Azure Batch Pool. */ +export interface BatchPoolEvaluateAutoScaleParameters { + /** The formula for the desired number of Compute Nodes in the Pool. The formula is validated and its results calculated, but it is not applied to the Pool. To apply the formula to the Pool, 'Enable automatic scaling on a Pool'. For more information about specifying this formula, see Automatically scale Compute Nodes in an Azure Batch Pool (https://azure.microsoft.com/en-us/documentation/articles/batch-automatic-scaling). */ + autoScaleFormula: string; +} + +/** Parameters for changing the size of an Azure Batch Pool. */ +export interface BatchPoolResizeParameters { + /** The desired number of dedicated Compute Nodes in the Pool. */ + targetDedicatedNodes?: number; + /** The desired number of Spot/Low-priority Compute Nodes in the Pool. */ + targetLowPriorityNodes?: number; + /** The timeout for allocation of Nodes to the Pool or removal of Compute Nodes from the Pool. The default value is 15 minutes. The minimum value is 5 minutes. If you specify a value less than 5 minutes, the Batch service returns an error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). */ + resizeTimeout?: string; + /** + * Determines what to do with a Compute Node and its running task(s) if the Pool size is decreasing. The default value is requeue. + * + * Possible values: requeue, terminate, taskcompletion, retaineddata + */ + nodeDeallocationOption?: string; +} + +/** Parameters for replacing properties on an Azure Batch Pool. */ +export interface BatchPoolReplaceParameters { + /** A Task to run on each Compute Node as it joins the Pool. The Task runs when the Compute Node is added to the Pool or when the Compute Node is restarted. If this element is present, it overwrites any existing StartTask. If omitted, any existing StartTask is removed from the Pool. */ + startTask?: BatchStartTask; + /** + * This list replaces any existing Certificate references configured on the Pool. + * If you specify an empty collection, any existing Certificate references are removed from the Pool. + * For Windows Nodes, the Batch service installs the Certificates to the specified Certificate store and location. + * For Linux Compute Nodes, the Certificates are stored in a directory inside the Task working directory and an environment variable AZ_BATCH_CERTIFICATES_DIR is supplied to the Task to query for this location. + * For Certificates with visibility of 'remoteUser', a 'certs' directory is created in the user's home directory (e.g., /home/{user-name}/certs) and Certificates are placed in that directory. + * Warning: This property is deprecated and will be removed after February, 2024. Please use the [Azure KeyVault Extension](https://learn.microsoft.com/azure/batch/batch-certificate-migration-guide) instead. + */ + certificateReferences: Array; + /** The list of Application Packages to be installed on each Compute Node in the Pool. The list replaces any existing Application Package references on the Pool. Changes to Application Package references affect all new Compute Nodes joining the Pool, but do not affect Compute Nodes that are already in the Pool until they are rebooted or reimaged. There is a maximum of 10 Application Package references on any given Pool. If omitted, or if you specify an empty collection, any existing Application Packages references are removed from the Pool. A maximum of 10 references may be specified on a given Pool. */ + applicationPackageReferences: Array; + /** A list of name-value pairs associated with the Pool as metadata. This list replaces any existing metadata configured on the Pool. If omitted, or if you specify an empty collection, any existing metadata is removed from the Pool. */ + metadata: Array; + /** + * The desired node communication mode for the pool. This setting replaces any existing targetNodeCommunication setting on the Pool. If omitted, the existing setting is default. + * + * Possible values: default, classic, simplified + */ + targetNodeCommunicationMode?: string; +} + +/** Parameters for removing nodes from an Azure Batch Pool. */ +export interface BatchNodeRemoveParameters { + /** A list containing the IDs of the Compute Nodes to be removed from the specified Pool. A maximum of 100 nodes may be removed per request. */ + nodeList: string[]; + /** The timeout for removal of Compute Nodes to the Pool. The default value is 15 minutes. The minimum value is 5 minutes. If you specify a value less than 5 minutes, the Batch service returns an error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). */ + resizeTimeout?: string; + /** + * Determines what to do with a Compute Node and its running task(s) after it has been selected for deallocation. The default value is requeue. + * + * Possible values: requeue, terminate, taskcompletion, retaineddata + */ + nodeDeallocationOption?: string; +} + +/** An Azure Batch Job. */ +export interface BatchJob { + /** The priority of the Job. Priority values can range from -1000 to 1000, with -1000 being the lowest priority and 1000 being the highest priority. The default value is 0. */ + priority?: number; + /** Whether Tasks in this job can be preempted by other high priority jobs. If the value is set to True, other high priority jobs submitted to the system will take precedence and will be able requeue tasks from this job. You can update a job's allowTaskPreemption after it has been created using the update job API. */ + allowTaskPreemption?: boolean; + /** The maximum number of tasks that can be executed in parallel for the job. The value of maxParallelTasks must be -1 or greater than 0 if specified. If not specified, the default value is -1, which means there's no limit to the number of tasks that can be run at once. You can update a job's maxParallelTasks after it has been created using the update job API. */ + maxParallelTasks?: number; + /** The execution constraints for the Job. */ + constraints?: BatchJobConstraints; + /** The Pool settings associated with the Job. */ + poolInfo: BatchPoolInfo; + /** + * The action the Batch service should take when all Tasks in the Job are in the completed state. The default is noaction. + * + * Possible values: noaction, terminatejob + */ + onAllTasksComplete?: string; + /** A list of name-value pairs associated with the Job as metadata. The Batch service does not assign any meaning to metadata; it is solely for the use of user code. */ + metadata?: Array; +} + +/** The execution constraints for a Job. */ +export interface BatchJobConstraints { + /** The maximum elapsed time that the Job may run, measured from the time the Job is created. If the Job does not complete within the time limit, the Batch service terminates it and any Tasks that are still running. In this case, the termination reason will be MaxWallClockTimeExpiry. If this property is not specified, there is no time limit on how long the Job may run. */ + maxWallClockTime?: string; + /** The maximum number of times each Task may be retried. The Batch service retries a Task if its exit code is nonzero. Note that this value specifically controls the number of retries. The Batch service will try each Task once, and may then retry up to this limit. For example, if the maximum retry count is 3, Batch tries a Task up to 4 times (one initial try and 3 retries). If the maximum retry count is 0, the Batch service does not retry Tasks. If the maximum retry count is -1, the Batch service retries Tasks without limit. The default value is 0 (no retries). */ + maxTaskRetryCount?: number; +} + +/** + * Specifies details of a Job Manager Task. + * The Job Manager Task is automatically started when the Job is created. The + * Batch service tries to schedule the Job Manager Task before any other Tasks in + * the Job. When shrinking a Pool, the Batch service tries to preserve Nodes where + * Job Manager Tasks are running for as long as possible (that is, Compute Nodes + * running 'normal' Tasks are removed before Compute Nodes running Job Manager + * Tasks). When a Job Manager Task fails and needs to be restarted, the system + * tries to schedule it at the highest priority. If there are no idle Compute + * Nodes available, the system may terminate one of the running Tasks in the Pool + * and return it to the queue in order to make room for the Job Manager Task to + * restart. Note that a Job Manager Task in one Job does not have priority over + * Tasks in other Jobs. Across Jobs, only Job level priorities are observed. For + * example, if a Job Manager in a priority 0 Job needs to be restarted, it will + * not displace Tasks of a priority 1 Job. Batch will retry Tasks when a recovery + * operation is triggered on a Node. Examples of recovery operations include (but + * are not limited to) when an unhealthy Node is rebooted or a Compute Node + * disappeared due to host failure. Retries due to recovery operations are + * independent of and are not counted against the maxTaskRetryCount. Even if the + * maxTaskRetryCount is 0, an internal retry due to a recovery operation may + * occur. Because of this, all Tasks should be idempotent. This means Tasks need + * to tolerate being interrupted and restarted without causing any corruption or + * duplicate data. The best practice for long running Tasks is to use some form of + * checkpointing. + */ +export interface BatchJobManagerTask { + /** A string that uniquely identifies the Job Manager Task within the Job. The ID can contain any combination of alphanumeric characters including hyphens and underscores and cannot contain more than 64 characters. */ + id: string; + /** The display name of the Job Manager Task. It need not be unique and can contain any Unicode characters up to a maximum length of 1024. */ + displayName?: string; + /** The command line of the Job Manager Task. The command line does not run under a shell, and therefore cannot take advantage of shell features such as environment variable expansion. If you want to take advantage of such features, you should invoke the shell in the command line, for example using "cmd /c MyCommand" in Windows or "/bin/sh -c MyCommand" in Linux. If the command line refers to file paths, it should use a relative path (relative to the Task working directory), or use the Batch provided environment variable (https://docs.microsoft.com/en-us/azure/batch/batch-compute-node-environment-variables). */ + commandLine: string; + /** The settings for the container under which the Job Manager Task runs. If the Pool that will run this Task has containerConfiguration set, this must be set as well. If the Pool that will run this Task doesn't have containerConfiguration set, this must not be set. When this is specified, all directories recursively below the AZ_BATCH_NODE_ROOT_DIR (the root of Azure Batch directories on the node) are mapped into the container, all Task environment variables are mapped into the container, and the Task command line is executed in the container. Files produced in the container outside of AZ_BATCH_NODE_ROOT_DIR might not be reflected to the host disk, meaning that Batch file APIs will not be able to access those files. */ + containerSettings?: BatchTaskContainerSettings; + /** A list of files that the Batch service will download to the Compute Node before running the command line. Files listed under this element are located in the Task's working directory. There is a maximum size for the list of resource files. When the max size is exceeded, the request will fail and the response error code will be RequestEntityTooLarge. If this occurs, the collection of ResourceFiles must be reduced in size. This can be achieved using .zip files, Application Packages, or Docker Containers. */ + resourceFiles?: Array; + /** A list of files that the Batch service will upload from the Compute Node after running the command line. For multi-instance Tasks, the files will only be uploaded from the Compute Node on which the primary Task is executed. */ + outputFiles?: Array; + /** A list of environment variable settings for the Job Manager Task. */ + environmentSettings?: Array; + /** Constraints that apply to the Job Manager Task. */ + constraints?: BatchTaskConstraints; + /** The number of scheduling slots that the Task requires to run. The default is 1. A Task can only be scheduled to run on a compute node if the node has enough free scheduling slots available. For multi-instance Tasks, this property is not supported and must not be specified. */ + requiredSlots?: number; + /** Whether completion of the Job Manager Task signifies completion of the entire Job. If true, when the Job Manager Task completes, the Batch service marks the Job as complete. If any Tasks are still running at this time (other than Job Release), those Tasks are terminated. If false, the completion of the Job Manager Task does not affect the Job status. In this case, you should either use the onAllTasksComplete attribute to terminate the Job, or have a client or user terminate the Job explicitly. An example of this is if the Job Manager creates a set of Tasks but then takes no further role in their execution. The default value is true. If you are using the onAllTasksComplete and onTaskFailure attributes to control Job lifetime, and using the Job Manager Task only to create the Tasks for the Job (not to monitor progress), then it is important to set killJobOnCompletion to false. */ + killJobOnCompletion?: boolean; + /** The user identity under which the Job Manager Task runs. If omitted, the Task runs as a non-administrative user unique to the Task. */ + userIdentity?: UserIdentity; + /** Whether the Job Manager Task requires exclusive use of the Compute Node where it runs. If true, no other Tasks will run on the same Node for as long as the Job Manager is running. If false, other Tasks can run simultaneously with the Job Manager on a Compute Node. The Job Manager Task counts normally against the Compute Node's concurrent Task limit, so this is only relevant if the Compute Node allows multiple concurrent Tasks. The default value is true. */ + runExclusive?: boolean; + /** + * A list of Application Packages that the Batch service will deploy to the + * Compute Node before running the command line.Application Packages are + * downloaded and deployed to a shared directory, not the Task working + * directory. Therefore, if a referenced Application Package is already + * on the Compute Node, and is up to date, then it is not re-downloaded; + * the existing copy on the Compute Node is used. If a referenced Application + * Package cannot be installed, for example because the package has been deleted + * or because download failed, the Task fails. + */ + applicationPackageReferences?: Array; + /** The settings for an authentication token that the Task can use to perform Batch service operations. If this property is set, the Batch service provides the Task with an authentication token which can be used to authenticate Batch service operations without requiring an Account access key. The token is provided via the AZ_BATCH_AUTHENTICATION_TOKEN environment variable. The operations that the Task can carry out using the token depend on the settings. For example, a Task can request Job permissions in order to add other Tasks to the Job, or check the status of the Job or of other Tasks under the Job. */ + authenticationTokenSettings?: AuthenticationTokenSettings; + /** Whether the Job Manager Task may run on a Spot/Low-priority Compute Node. The default value is true. */ + allowLowPriorityNode?: boolean; +} + +/** On every file uploads, Batch service writes two log files to the compute node, 'fileuploadout.txt' and 'fileuploaderr.txt'. These log files are used to learn more about a specific failure. */ +export interface OutputFile { + /** A pattern indicating which file(s) to upload. Both relative and absolute paths are supported. Relative paths are relative to the Task working directory. The following wildcards are supported: * matches 0 or more characters (for example pattern abc* would match abc or abcdef), ** matches any directory, ? matches any single character, [abc] matches one character in the brackets, and [a-c] matches one character in the range. Brackets can include a negation to match any character not specified (for example [!abc] matches any character but a, b, or c). If a file name starts with "." it is ignored by default but may be matched by specifying it explicitly (for example *.gif will not match .a.gif, but .*.gif will). A simple example: **\*.txt matches any file that does not start in '.' and ends with .txt in the Task working directory or any subdirectory. If the filename contains a wildcard character it can be escaped using brackets (for example abc[*] would match a file named abc*). Note that both \ and / are treated as directory separators on Windows, but only / is on Linux. Environment variables (%var% on Windows or $var on Linux) are expanded prior to the pattern being applied. */ + filePattern: string; + /** The destination for the output file(s). */ + destination: OutputFileDestination; + /** Additional options for the upload operation, including under what conditions to perform the upload. */ + uploadOptions: OutputFileUploadOptions; +} + +/** The destination to which a file should be uploaded. */ +export interface OutputFileDestination { + /** A location in Azure blob storage to which files are uploaded. */ + container?: OutputFileBlobContainerDestination; +} + +/** Specifies a file upload destination within an Azure blob storage container. */ +export interface OutputFileBlobContainerDestination { + /** The destination blob or virtual directory within the Azure Storage container. If filePattern refers to a specific file (i.e. contains no wildcards), then path is the name of the blob to which to upload that file. If filePattern contains one or more wildcards (and therefore may match multiple files), then path is the name of the blob virtual directory (which is prepended to each blob name) to which to upload the file(s). If omitted, file(s) are uploaded to the root of the container with a blob name matching their file name. */ + path?: string; + /** The URL of the container within Azure Blob Storage to which to upload the file(s). If not using a managed identity, the URL must include a Shared Access Signature (SAS) granting write permissions to the container. */ + containerUrl: string; + /** The reference to the user assigned identity to use to access Azure Blob Storage specified by containerUrl. The identity must have write access to the Azure Blob Storage container. */ + identityReference?: BatchNodeIdentityReference; + /** A list of name-value pairs for headers to be used in uploading output files. These headers will be specified when uploading files to Azure Storage. Official document on allowed headers when uploading blobs: https://docs.microsoft.com/en-us/rest/api/storageservices/put-blob#request-headers-all-blob-types. */ + uploadHeaders?: Array; +} + +/** An HTTP header name-value pair */ +export interface HttpHeader { + /** The case-insensitive name of the header to be used while uploading output files. */ + name: string; + /** The value of the header to be used while uploading output files. */ + value?: string; +} + +/** + * Options for an output file upload operation, including under what conditions + * to perform the upload. + */ +export interface OutputFileUploadOptions { + /** + * The conditions under which the Task output file or set of files should be uploaded. The default is taskcompletion. + * + * Possible values: tasksuccess, taskfailure, taskcompletion + */ + uploadCondition: string; +} + +/** Execution constraints to apply to a Task. */ +export interface BatchTaskConstraints { + /** The maximum elapsed time that the Task may run, measured from the time the Task starts. If the Task does not complete within the time limit, the Batch service terminates it. If this is not specified, there is no time limit on how long the Task may run. */ + maxWallClockTime?: string; + /** The minimum time to retain the Task directory on the Compute Node where it ran, from the time it completes execution. After this time, the Batch service may delete the Task directory and all its contents. The default is 7 days, i.e. the Task directory will be retained for 7 days unless the Compute Node is removed or the Job is deleted. */ + retentionTime?: string; + /** The maximum number of times the Task may be retried. The Batch service retries a Task if its exit code is nonzero. Note that this value specifically controls the number of retries for the Task executable due to a nonzero exit code. The Batch service will try the Task once, and may then retry up to this limit. For example, if the maximum retry count is 3, Batch tries the Task up to 4 times (one initial try and 3 retries). If the maximum retry count is 0, the Batch service does not retry the Task after the first attempt. If the maximum retry count is -1, the Batch service retries the Task without limit, however this is not recommended for a start task or any task. The default value is 0 (no retries). */ + maxTaskRetryCount?: number; +} + +/** + * The settings for an authentication token that the Task can use to perform Batch + * service operations. + */ +export interface AuthenticationTokenSettings { + /** The Batch resources to which the token grants access. The authentication token grants access to a limited set of Batch service operations. Currently the only supported value for the access property is 'job', which grants access to all operations related to the Job which contains the Task. */ + access?: string[]; +} + +/** + * A Job Preparation Task to run before any Tasks of the Job on any given Compute Node. + * You can use Job Preparation to prepare a Node to run Tasks for the Job. + * Activities commonly performed in Job Preparation include: Downloading common + * resource files used by all the Tasks in the Job. The Job Preparation Task can + * download these common resource files to the shared location on the Node. + * (AZ_BATCH_NODE_ROOT_DIR\shared), or starting a local service on the Node so + * that all Tasks of that Job can communicate with it. If the Job Preparation Task + * fails (that is, exhausts its retry count before exiting with exit code 0), + * Batch will not run Tasks of this Job on the Node. The Compute Node remains + * ineligible to run Tasks of this Job until it is reimaged. The Compute Node + * remains active and can be used for other Jobs. The Job Preparation Task can run + * multiple times on the same Node. Therefore, you should write the Job + * Preparation Task to handle re-execution. If the Node is rebooted, the Job + * Preparation Task is run again on the Compute Node before scheduling any other + * Task of the Job, if rerunOnNodeRebootAfterSuccess is true or if the Job + * Preparation Task did not previously complete. If the Node is reimaged, the Job + * Preparation Task is run again before scheduling any Task of the Job. Batch will + * retry Tasks when a recovery operation is triggered on a Node. Examples of + * recovery operations include (but are not limited to) when an unhealthy Node is + * rebooted or a Compute Node disappeared due to host failure. Retries due to + * recovery operations are independent of and are not counted against the + * maxTaskRetryCount. Even if the maxTaskRetryCount is 0, an internal retry due to + * a recovery operation may occur. Because of this, all Tasks should be + * idempotent. This means Tasks need to tolerate being interrupted and restarted + * without causing any corruption or duplicate data. The best practice for long + * running Tasks is to use some form of checkpointing. + */ +export interface BatchJobPreparationTask { + /** A string that uniquely identifies the Job Preparation Task within the Job. The ID can contain any combination of alphanumeric characters including hyphens and underscores and cannot contain more than 64 characters. If you do not specify this property, the Batch service assigns a default value of 'jobpreparation'. No other Task in the Job can have the same ID as the Job Preparation Task. If you try to submit a Task with the same id, the Batch service rejects the request with error code TaskIdSameAsJobPreparationTask; if you are calling the REST API directly, the HTTP status code is 409 (Conflict). */ + id?: string; + /** The command line of the Job Preparation Task. The command line does not run under a shell, and therefore cannot take advantage of shell features such as environment variable expansion. If you want to take advantage of such features, you should invoke the shell in the command line, for example using "cmd /c MyCommand" in Windows or "/bin/sh -c MyCommand" in Linux. If the command line refers to file paths, it should use a relative path (relative to the Task working directory), or use the Batch provided environment variable (https://docs.microsoft.com/en-us/azure/batch/batch-compute-node-environment-variables). */ + commandLine: string; + /** The settings for the container under which the Job Preparation Task runs. When this is specified, all directories recursively below the AZ_BATCH_NODE_ROOT_DIR (the root of Azure Batch directories on the node) are mapped into the container, all Task environment variables are mapped into the container, and the Task command line is executed in the container. Files produced in the container outside of AZ_BATCH_NODE_ROOT_DIR might not be reflected to the host disk, meaning that Batch file APIs will not be able to access those files. */ + containerSettings?: BatchTaskContainerSettings; + /** A list of files that the Batch service will download to the Compute Node before running the command line. Files listed under this element are located in the Task's working directory. There is a maximum size for the list of resource files. When the max size is exceeded, the request will fail and the response error code will be RequestEntityTooLarge. If this occurs, the collection of ResourceFiles must be reduced in size. This can be achieved using .zip files, Application Packages, or Docker Containers. */ + resourceFiles?: Array; + /** A list of environment variable settings for the Job Preparation Task. */ + environmentSettings?: Array; + /** Constraints that apply to the Job Preparation Task. */ + constraints?: BatchTaskConstraints; + /** Whether the Batch service should wait for the Job Preparation Task to complete successfully before scheduling any other Tasks of the Job on the Compute Node. A Job Preparation Task has completed successfully if it exits with exit code 0. If true and the Job Preparation Task fails on a Node, the Batch service retries the Job Preparation Task up to its maximum retry count (as specified in the constraints element). If the Task has still not completed successfully after all retries, then the Batch service will not schedule Tasks of the Job to the Node. The Node remains active and eligible to run Tasks of other Jobs. If false, the Batch service will not wait for the Job Preparation Task to complete. In this case, other Tasks of the Job can start executing on the Compute Node while the Job Preparation Task is still running; and even if the Job Preparation Task fails, new Tasks will continue to be scheduled on the Compute Node. The default value is true. */ + waitForSuccess?: boolean; + /** The user identity under which the Job Preparation Task runs. If omitted, the Task runs as a non-administrative user unique to the Task on Windows Compute Nodes, or a non-administrative user unique to the Pool on Linux Compute Nodes. */ + userIdentity?: UserIdentity; + /** Whether the Batch service should rerun the Job Preparation Task after a Compute Node reboots. The Job Preparation Task is always rerun if a Compute Node is reimaged, or if the Job Preparation Task did not complete (e.g. because the reboot occurred while the Task was running). Therefore, you should always write a Job Preparation Task to be idempotent and to behave correctly if run multiple times. The default value is true. */ + rerunOnNodeRebootAfterSuccess?: boolean; +} + +/** + * A Job Release Task to run on Job completion on any Compute Node where the Job has run. + * The Job Release Task runs when the Job ends, because of one of the following: + * The user calls the Terminate Job API, or the Delete Job API while the Job is + * still active, the Job's maximum wall clock time constraint is reached, and the + * Job is still active, or the Job's Job Manager Task completed, and the Job is + * configured to terminate when the Job Manager completes. The Job Release Task + * runs on each Node where Tasks of the Job have run and the Job Preparation Task + * ran and completed. If you reimage a Node after it has run the Job Preparation + * Task, and the Job ends without any further Tasks of the Job running on that + * Node (and hence the Job Preparation Task does not re-run), then the Job Release + * Task does not run on that Compute Node. If a Node reboots while the Job Release + * Task is still running, the Job Release Task runs again when the Compute Node + * starts up. The Job is not marked as complete until all Job Release Tasks have + * completed. The Job Release Task runs in the background. It does not occupy a + * scheduling slot; that is, it does not count towards the taskSlotsPerNode limit + * specified on the Pool. + */ +export interface BatchJobReleaseTask { + /** A string that uniquely identifies the Job Release Task within the Job. The ID can contain any combination of alphanumeric characters including hyphens and underscores and cannot contain more than 64 characters. If you do not specify this property, the Batch service assigns a default value of 'jobrelease'. No other Task in the Job can have the same ID as the Job Release Task. If you try to submit a Task with the same id, the Batch service rejects the request with error code TaskIdSameAsJobReleaseTask; if you are calling the REST API directly, the HTTP status code is 409 (Conflict). */ + id?: string; + /** The command line of the Job Release Task. The command line does not run under a shell, and therefore cannot take advantage of shell features such as environment variable expansion. If you want to take advantage of such features, you should invoke the shell in the command line, for example using "cmd /c MyCommand" in Windows or "/bin/sh -c MyCommand" in Linux. If the command line refers to file paths, it should use a relative path (relative to the Task working directory), or use the Batch provided environment variable (https://docs.microsoft.com/en-us/azure/batch/batch-compute-node-environment-variables). */ + commandLine: string; + /** The settings for the container under which the Job Release Task runs. When this is specified, all directories recursively below the AZ_BATCH_NODE_ROOT_DIR (the root of Azure Batch directories on the node) are mapped into the container, all Task environment variables are mapped into the container, and the Task command line is executed in the container. Files produced in the container outside of AZ_BATCH_NODE_ROOT_DIR might not be reflected to the host disk, meaning that Batch file APIs will not be able to access those files. */ + containerSettings?: BatchTaskContainerSettings; + /** A list of files that the Batch service will download to the Compute Node before running the command line. There is a maximum size for the list of resource files. When the max size is exceeded, the request will fail and the response error code will be RequestEntityTooLarge. If this occurs, the collection of ResourceFiles must be reduced in size. This can be achieved using .zip files, Application Packages, or Docker Containers. Files listed under this element are located in the Task's working directory. */ + resourceFiles?: Array; + /** A list of environment variable settings for the Job Release Task. */ + environmentSettings?: Array; + /** The maximum elapsed time that the Job Release Task may run on a given Compute Node, measured from the time the Task starts. If the Task does not complete within the time limit, the Batch service terminates it. The default value is 15 minutes. You may not specify a timeout longer than 15 minutes. If you do, the Batch service rejects it with an error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). */ + maxWallClockTime?: string; + /** The minimum time to retain the Task directory for the Job Release Task on the Compute Node. After this time, the Batch service may delete the Task directory and all its contents. The default is 7 days, i.e. the Task directory will be retained for 7 days unless the Compute Node is removed or the Job is deleted. */ + retentionTime?: string; + /** The user identity under which the Job Release Task runs. If omitted, the Task runs as a non-administrative user unique to the Task. */ + userIdentity?: UserIdentity; +} + +/** Specifies how a Job should be assigned to a Pool. */ +export interface BatchPoolInfo { + /** The ID of an existing Pool. All the Tasks of the Job will run on the specified Pool. You must ensure that the Pool referenced by this property exists. If the Pool does not exist at the time the Batch service tries to schedule a Job, no Tasks for the Job will run until you create a Pool with that id. Note that the Batch service will not reject the Job request; it will simply not run Tasks until the Pool exists. You must specify either the Pool ID or the auto Pool specification, but not both. */ + poolId?: string; + /** Characteristics for a temporary 'auto pool'. The Batch service will create this auto Pool when the Job is submitted. If auto Pool creation fails, the Batch service moves the Job to a completed state, and the Pool creation error is set in the Job's scheduling error property. The Batch service manages the lifetime (both creation and, unless keepAlive is specified, deletion) of the auto Pool. Any user actions that affect the lifetime of the auto Pool while the Job is active will result in unexpected behavior. You must specify either the Pool ID or the auto Pool specification, but not both. */ + autoPoolSpecification?: BatchAutoPoolSpecification; +} + +/** + * Specifies characteristics for a temporary 'auto pool'. The Batch service will + * create this auto Pool when the Job is submitted. + */ +export interface BatchAutoPoolSpecification { + /** A prefix to be added to the unique identifier when a Pool is automatically created. The Batch service assigns each auto Pool a unique identifier on creation. To distinguish between Pools created for different purposes, you can specify this element to add a prefix to the ID that is assigned. The prefix can be up to 20 characters long. */ + autoPoolIdPrefix?: string; + /** + * The minimum lifetime of created auto Pools, and how multiple Jobs on a schedule are assigned to Pools. + * + * Possible values: jobschedule, job + */ + poolLifetimeOption: string; + /** Whether to keep an auto Pool alive after its lifetime expires. If false, the Batch service deletes the Pool once its lifetime (as determined by the poolLifetimeOption setting) expires; that is, when the Job or Job Schedule completes. If true, the Batch service does not delete the Pool automatically. It is up to the user to delete auto Pools created with this option. */ + keepAlive?: boolean; + /** The Pool specification for the auto Pool. */ + pool?: BatchPoolSpecification; +} + +/** Specification for creating a new Pool. */ +export interface BatchPoolSpecification { + /** The display name for the Pool. The display name need not be unique and can contain any Unicode characters up to a maximum length of 1024. */ + displayName?: string; + /** The size of the virtual machines in the Pool. All virtual machines in a Pool are the same size. For information about available sizes of virtual machines in Pools, see Choose a VM size for Compute Nodes in an Azure Batch Pool (https://docs.microsoft.com/azure/batch/batch-pool-vm-sizes). */ + vmSize: string; + /** The cloud service configuration for the Pool. This property must be specified if the Pool needs to be created with Azure PaaS VMs. This property and virtualMachineConfiguration are mutually exclusive and one of the properties must be specified. If neither is specified then the Batch service returns an error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). This property cannot be specified if the Batch Account was created with its poolAllocationMode property set to 'UserSubscription'. */ + cloudServiceConfiguration?: CloudServiceConfiguration; + /** The virtual machine configuration for the Pool. This property must be specified if the Pool needs to be created with Azure IaaS VMs. This property and cloudServiceConfiguration are mutually exclusive and one of the properties must be specified. If neither is specified then the Batch service returns an error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). */ + virtualMachineConfiguration?: VirtualMachineConfiguration; + /** The number of task slots that can be used to run concurrent tasks on a single compute node in the pool. The default value is 1. The maximum value is the smaller of 4 times the number of cores of the vmSize of the pool or 256. */ + taskSlotsPerNode?: number; + /** How Tasks are distributed across Compute Nodes in a Pool. If not specified, the default is spread. */ + taskSchedulingPolicy?: BatchTaskSchedulingPolicy; + /** The timeout for allocation of Compute Nodes to the Pool. This timeout applies only to manual scaling; it has no effect when enableAutoScale is set to true. The default value is 15 minutes. The minimum value is 5 minutes. If you specify a value less than 5 minutes, the Batch service rejects the request with an error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). */ + resizeTimeout?: string; + /** The user-specified tags associated with the pool.The user-defined tags to be associated with the Azure Batch Pool. When specified, these tags are propagated to the backing Azure resources associated with the pool. This property can only be specified when the Batch account was created with the poolAllocationMode property set to 'UserSubscription'. */ + resourceTags?: string; + /** The desired number of dedicated Compute Nodes in the Pool. This property must not be specified if enableAutoScale is set to true. If enableAutoScale is set to false, then you must set either targetDedicatedNodes, targetLowPriorityNodes, or both. */ + targetDedicatedNodes?: number; + /** The desired number of Spot/Low-priority Compute Nodes in the Pool. This property must not be specified if enableAutoScale is set to true. If enableAutoScale is set to false, then you must set either targetDedicatedNodes, targetLowPriorityNodes, or both. */ + targetLowPriorityNodes?: number; + /** Whether the Pool size should automatically adjust over time. If false, at least one of targetDedicatedNodes and targetLowPriorityNodes must be specified. If true, the autoScaleFormula element is required. The Pool automatically resizes according to the formula. The default value is false. */ + enableAutoScale?: boolean; + /** The formula for the desired number of Compute Nodes in the Pool. This property must not be specified if enableAutoScale is set to false. It is required if enableAutoScale is set to true. The formula is checked for validity before the Pool is created. If the formula is not valid, the Batch service rejects the request with detailed error information. */ + autoScaleFormula?: string; + /** The time interval at which to automatically adjust the Pool size according to the autoscale formula. The default value is 15 minutes. The minimum and maximum value are 5 minutes and 168 hours respectively. If you specify a value less than 5 minutes or greater than 168 hours, the Batch service rejects the request with an invalid property value error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). */ + autoScaleEvaluationInterval?: string; + /** Whether the Pool permits direct communication between Compute Nodes. Enabling inter-node communication limits the maximum size of the Pool due to deployment restrictions on the Compute Nodes of the Pool. This may result in the Pool not reaching its desired size. The default value is false. */ + enableInterNodeCommunication?: boolean; + /** The network configuration for the Pool. */ + networkConfiguration?: NetworkConfiguration; + /** A Task to run on each Compute Node as it joins the Pool. The Task runs when the Compute Node is added to the Pool or when the Compute Node is restarted. */ + startTask?: BatchStartTask; + /** + * For Windows Nodes, the Batch service installs the Certificates to the specified Certificate store and location. For Linux Compute Nodes, the Certificates are stored in a directory inside the Task working directory and an environment variable AZ_BATCH_CERTIFICATES_DIR is supplied to the Task to query for this location. For Certificates with visibility of 'remoteUser', a 'certs' directory is created in the user's home directory (e.g., /home/{user-name}/certs) and Certificates are placed in that directory. + * Warning: This property is deprecated and will be removed after February, 2024. + * Please use the [Azure KeyVault Extension](https://learn.microsoft.com/azure/batch/batch-certificate-migration-guide) instead. + */ + certificateReferences?: Array; + /** The list of Packages to be installed on each Compute Node in the Pool. When creating a pool, the package's application ID must be fully qualified (/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Batch/batchAccounts/{accountName}/applications/{applicationName}). Changes to Package references affect all new Nodes joining the Pool, but do not affect Compute Nodes that are already in the Pool until they are rebooted or reimaged. There is a maximum of 10 Package references on any given Pool. */ + applicationPackageReferences?: Array; + /** The list of application licenses the Batch service will make available on each Compute Node in the Pool. The list of application licenses must be a subset of available Batch service application licenses. If a license is requested which is not supported, Pool creation will fail. The permitted licenses available on the Pool are 'maya', 'vray', '3dsmax', 'arnold'. An additional charge applies for each application license added to the Pool. */ + applicationLicenses?: string[]; + /** The list of user Accounts to be created on each Compute Node in the Pool. */ + userAccounts?: Array; + /** A list of name-value pairs associated with the Pool as metadata. The Batch service does not assign any meaning to metadata; it is solely for the use of user code. */ + metadata?: Array; + /** A list of file systems to mount on each node in the pool. This supports Azure Files, NFS, CIFS/SMB, and Blobfuse. */ + mountConfiguration?: Array; + /** + * The desired node communication mode for the pool. If omitted, the default value is Default. + * + * Possible values: default, classic, simplified + */ + targetNodeCommunicationMode?: string; +} + +/** The network configuration for the Job. */ +export interface BatchJobNetworkConfiguration { + /** The ARM resource identifier of the virtual network subnet which Compute Nodes running Tasks from the Job will join for the duration of the Task. This will only work with a VirtualMachineConfiguration Pool. The virtual network must be in the same region and subscription as the Azure Batch Account. The specified subnet should have enough free IP addresses to accommodate the number of Compute Nodes which will run Tasks from the Job. This can be up to the number of Compute Nodes in the Pool. The 'MicrosoftAzureBatch' service principal must have the 'Classic Virtual Machine Contributor' Role-Based Access Control (RBAC) role for the specified VNet so that Azure Batch service can schedule Tasks on the Nodes. This can be verified by checking if the specified VNet has any associated Network Security Groups (NSG). If communication to the Nodes in the specified subnet is denied by an NSG, then the Batch service will set the state of the Compute Nodes to unusable. This is of the form /subscriptions/{subscription}/resourceGroups/{group}/providers/{provider}/virtualNetworks/{network}/subnets/{subnet}. If the specified VNet has any associated Network Security Groups (NSG), then a few reserved system ports must be enabled for inbound communication from the Azure Batch service. For Pools created with a Virtual Machine configuration, enable ports 29876 and 29877, as well as port 22 for Linux and port 3389 for Windows. Port 443 is also required to be open for outbound connections for communications to Azure Storage. For more details see: https://docs.microsoft.com/en-us/azure/batch/batch-api-basics#virtual-network-vnet-and-firewall-configuration. */ + subnetId: string; +} + +/** Contains information about the execution of a Job in the Azure Batch service. */ +export interface BatchJobExecutionInfo { + /** The start time of the Job. This is the time at which the Job was created. */ + startTime: Date | string; + /** The completion time of the Job. This property is set only if the Job is in the completed state. */ + endTime?: Date | string; + /** The ID of the Pool to which this Job is assigned. This element contains the actual Pool where the Job is assigned. When you get Job details from the service, they also contain a poolInfo element, which contains the Pool configuration data from when the Job was added or updated. That poolInfo element may also contain a poolId element. If it does, the two IDs are the same. If it does not, it means the Job ran on an auto Pool, and this property contains the ID of that auto Pool. */ + poolId?: string; + /** Details of any error encountered by the service in starting the Job. This property is not set if there was no error starting the Job. */ + schedulingError?: BatchJobSchedulingError; + /** A string describing the reason the Job ended. This property is set only if the Job is in the completed state. If the Batch service terminates the Job, it sets the reason as follows: JMComplete - the Job Manager Task completed, and killJobOnCompletion was set to true. MaxWallClockTimeExpiry - the Job reached its maxWallClockTime constraint. TerminateJobSchedule - the Job ran as part of a schedule, and the schedule terminated. AllTasksComplete - the Job's onAllTasksComplete attribute is set to terminatejob, and all Tasks in the Job are complete. TaskFailed - the Job's onTaskFailure attribute is set to performExitOptionsJobAction, and a Task in the Job failed with an exit condition that specified a jobAction of terminatejob. Any other string is a user-defined reason specified in a call to the 'Terminate a Job' operation. */ + terminateReason?: string; +} + +/** An error encountered by the Batch service when scheduling a Job. */ +export interface BatchJobSchedulingError { + /** + * The category of the Job scheduling error. + * + * Possible values: usererror, servererror + */ + category: string; + /** An identifier for the Job scheduling error. Codes are invariant and are intended to be consumed programmatically. */ + code?: string; + /** A message describing the Job scheduling error, intended to be suitable for display in a user interface. */ + message?: string; + /** A list of additional error details related to the scheduling error. */ + details?: Array; +} + +/** Resource usage statistics for a Job. */ +export interface BatchJobStatistics { + /** The URL of the statistics. */ + url: string; + /** The start time of the time range covered by the statistics. */ + startTime: Date | string; + /** The time at which the statistics were last updated. All statistics are limited to the range between startTime and lastUpdateTime. */ + lastUpdateTime: Date | string; + /** The total user mode CPU time (summed across all cores and all Compute Nodes) consumed by all Tasks in the Job. */ + userCPUTime: string; + /** The total kernel mode CPU time (summed across all cores and all Compute Nodes) consumed by all Tasks in the Job. */ + kernelCPUTime: string; + /** The total wall clock time of all Tasks in the Job. The wall clock time is the elapsed time from when the Task started running on a Compute Node to when it finished (or to the last time the statistics were updated, if the Task had not finished by then). If a Task was retried, this includes the wall clock time of all the Task retries. */ + wallClockTime: string; + /** The total number of disk read operations made by all Tasks in the Job. */ + readIOps: number; + /** The total number of disk write operations made by all Tasks in the Job. */ + writeIOps: number; + /** The total amount of data in GiB read from disk by all Tasks in the Job. */ + readIOGiB: number; + /** The total amount of data in GiB written to disk by all Tasks in the Job. */ + writeIOGiB: number; + /** The total number of Tasks successfully completed in the Job during the given time range. A Task completes successfully if it returns exit code 0. */ + numSucceededTasks: number; + /** The total number of Tasks in the Job that failed during the given time range. A Task fails if it exhausts its maximum retry count without returning exit code 0. */ + numFailedTasks: number; + /** The total number of retries on all the Tasks in the Job during the given time range. */ + numTaskRetries: number; + /** The total wait time of all Tasks in the Job. The wait time for a Task is defined as the elapsed time between the creation of the Task and the start of Task execution. (If the Task is retried due to failures, the wait time is the time to the most recent Task execution.) This value is only reported in the Account lifetime statistics; it is not included in the Job statistics. */ + waitTime: string; +} + +/** Parameters for updating an Azure Batch Job. */ +export interface BatchJobUpdateParameters { + /** The priority of the Job. Priority values can range from -1000 to 1000, with -1000 being the lowest priority and 1000 being the highest priority. If omitted, the priority of the Job is left unchanged. */ + priority?: number; + /** Whether Tasks in this job can be preempted by other high priority jobs. If the value is set to True, other high priority jobs submitted to the system will take precedence and will be able requeue tasks from this job. You can update a job's allowTaskPreemption after it has been created using the update job API. */ + allowTaskPreemption?: boolean; + /** The maximum number of tasks that can be executed in parallel for the job. The value of maxParallelTasks must be -1 or greater than 0 if specified. If not specified, the default value is -1, which means there's no limit to the number of tasks that can be run at once. You can update a job's maxParallelTasks after it has been created using the update job API. */ + maxParallelTasks?: number; + /** The execution constraints for the Job. If omitted, the existing execution constraints are left unchanged. */ + constraints?: BatchJobConstraints; + /** The Pool on which the Batch service runs the Job's Tasks. You may change the Pool for a Job only when the Job is disabled. The Patch Job call will fail if you include the poolInfo element and the Job is not disabled. If you specify an autoPoolSpecification in the poolInfo, only the keepAlive property of the autoPoolSpecification can be updated, and then only if the autoPoolSpecification has a poolLifetimeOption of Job (other job properties can be updated as normal). If omitted, the Job continues to run on its current Pool. */ + poolInfo?: BatchPoolInfo; + /** + * The action the Batch service should take when all Tasks in the Job are in the completed state. If omitted, the completion behavior is left unchanged. You may not change the value from terminatejob to noaction - that is, once you have engaged automatic Job termination, you cannot turn it off again. If you try to do this, the request fails with an 'invalid property value' error response; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). + * + * Possible values: noaction, terminatejob + */ + onAllTasksComplete?: string; + /** A list of name-value pairs associated with the Job as metadata. If omitted, the existing Job metadata is left unchanged. */ + metadata?: Array; +} + +/** Parameters for disabling an Azure Batch Job. */ +export interface BatchJobDisableParameters { + /** + * What to do with active Tasks associated with the Job. + * + * Possible values: requeue, terminate, wait + */ + disableTasks: string; +} + +/** Parameters for terminating an Azure Batch Job. */ +export interface BatchJobTerminateParameters { + /** The text you want to appear as the Job's TerminateReason. The default is 'UserTerminate'. */ + terminateReason?: string; +} + +/** Parameters for creating an Azure Batch Job. */ +export interface BatchJobCreateParameters { + /** A string that uniquely identifies the Job within the Account. The ID can contain any combination of alphanumeric characters including hyphens and underscores, and cannot contain more than 64 characters. The ID is case-preserving and case-insensitive (that is, you may not have two IDs within an Account that differ only by case). */ + id: string; + /** The display name for the Job. The display name need not be unique and can contain any Unicode characters up to a maximum length of 1024. */ + displayName?: string; + /** Whether Tasks in the Job can define dependencies on each other. The default is false. */ + usesTaskDependencies?: boolean; + /** The priority of the Job. Priority values can range from -1000 to 1000, with -1000 being the lowest priority and 1000 being the highest priority. The default value is 0. */ + priority?: number; + /** Whether Tasks in this job can be preempted by other high priority jobs. If the value is set to True, other high priority jobs submitted to the system will take precedence and will be able requeue tasks from this job. You can update a job's allowTaskPreemption after it has been created using the update job API. */ + allowTaskPreemption?: boolean; + /** The maximum number of tasks that can be executed in parallel for the job. The value of maxParallelTasks must be -1 or greater than 0 if specified. If not specified, the default value is -1, which means there's no limit to the number of tasks that can be run at once. You can update a job's maxParallelTasks after it has been created using the update job API. */ + maxParallelTasks?: number; + /** The execution constraints for the Job. */ + constraints?: BatchJobConstraints; + /** Details of a Job Manager Task to be launched when the Job is started. If the Job does not specify a Job Manager Task, the user must explicitly add Tasks to the Job. If the Job does specify a Job Manager Task, the Batch service creates the Job Manager Task when the Job is created, and will try to schedule the Job Manager Task before scheduling other Tasks in the Job. The Job Manager Task's typical purpose is to control and/or monitor Job execution, for example by deciding what additional Tasks to run, determining when the work is complete, etc. (However, a Job Manager Task is not restricted to these activities - it is a fully-fledged Task in the system and perform whatever actions are required for the Job.) For example, a Job Manager Task might download a file specified as a parameter, analyze the contents of that file and submit additional Tasks based on those contents. */ + jobManagerTask?: BatchJobManagerTask; + /** The Job Preparation Task. If a Job has a Job Preparation Task, the Batch service will run the Job Preparation Task on a Node before starting any Tasks of that Job on that Compute Node. */ + jobPreparationTask?: BatchJobPreparationTask; + /** The Job Release Task. A Job Release Task cannot be specified without also specifying a Job Preparation Task for the Job. The Batch service runs the Job Release Task on the Nodes that have run the Job Preparation Task. The primary purpose of the Job Release Task is to undo changes to Compute Nodes made by the Job Preparation Task. Example activities include deleting local files, or shutting down services that were started as part of Job preparation. */ + jobReleaseTask?: BatchJobReleaseTask; + /** The list of common environment variable settings. These environment variables are set for all Tasks in the Job (including the Job Manager, Job Preparation and Job Release Tasks). Individual Tasks can override an environment setting specified here by specifying the same setting name with a different value. */ + commonEnvironmentSettings?: Array; + /** The Pool on which the Batch service runs the Job's Tasks. */ + poolInfo: BatchPoolInfo; + /** + * The action the Batch service should take when all Tasks in the Job are in the completed state. Note that if a Job contains no Tasks, then all Tasks are considered complete. This option is therefore most commonly used with a Job Manager task; if you want to use automatic Job termination without a Job Manager, you should initially set onAllTasksComplete to noaction and update the Job properties to set onAllTasksComplete to terminatejob once you have finished adding Tasks. The default is noaction. + * + * Possible values: noaction, terminatejob + */ + onAllTasksComplete?: string; + /** + * The action the Batch service should take when any Task in the Job fails. A Task is considered to have failed if has a failureInfo. A failureInfo is set if the Task completes with a non-zero exit code after exhausting its retry count, or if there was an error starting the Task, for example due to a resource file download error. The default is noaction. + * + * Possible values: noaction, performexitoptionsjobaction + */ + onTaskFailure?: string; + /** The network configuration for the Job. */ + networkConfiguration?: BatchJobNetworkConfiguration; + /** A list of name-value pairs associated with the Job as metadata. The Batch service does not assign any meaning to metadata; it is solely for the use of user code. */ + metadata?: Array; +} + +/** Contains information about the container which a Task is executing. */ +export interface BatchTaskContainerExecutionInfo { + /** The ID of the container. */ + containerId?: string; + /** The state of the container. This is the state of the container according to the Docker service. It is equivalent to the status field returned by "docker inspect". */ + state?: string; + /** Detailed error information about the container. This is the detailed error string from the Docker service, if available. It is equivalent to the error field returned by "docker inspect". */ + error?: string; +} + +/** Information about a Task failure. */ +export interface BatchTaskFailureInfo { + /** + * The category of the Task error. + * + * Possible values: usererror, servererror + */ + category: string; + /** An identifier for the Task error. Codes are invariant and are intended to be consumed programmatically. */ + code?: string; + /** A message describing the Task error, intended to be suitable for display in a user interface. */ + message?: string; + /** A list of additional details related to the error. */ + details?: Array; +} + +/** + * A Certificate that can be installed on Compute Nodes and can be used to + * authenticate operations on the machine. + */ +export interface BatchCertificate { + /** The X.509 thumbprint of the Certificate. This is a sequence of up to 40 hex digits (it may include spaces but these are removed). */ + thumbprint: string; + /** The algorithm used to derive the thumbprint. This must be sha1. */ + thumbprintAlgorithm: string; + /** The base64-encoded contents of the Certificate. The maximum size is 10KB. */ + data: string; + /** + * The format of the Certificate data. + * + * Possible values: pfx, cer + */ + certificateFormat?: string; + /** The password to access the Certificate's private key. This must be omitted if the Certificate format is cer. */ + password?: string; +} + +/** An error encountered by the Batch service when deleting a Certificate. */ +export interface DeleteBatchCertificateError { + /** An identifier for the Certificate deletion error. Codes are invariant and are intended to be consumed programmatically. */ + code?: string; + /** A message describing the Certificate deletion error, intended to be suitable for display in a user interface. */ + message?: string; + /** A list of additional error details related to the Certificate deletion error. This list includes details such as the active Pools and Compute Nodes referencing this Certificate. However, if a large number of resources reference the Certificate, the list contains only about the first hundred. */ + values?: Array; +} + +/** + * A Job Schedule that allows recurring Jobs by specifying when to run Jobs and a + * specification used to create each Job. + */ +export interface BatchJobSchedule { + /** The schedule according to which Jobs will be created. All times are fixed respective to UTC and are not impacted by daylight saving time. */ + schedule?: Schedule; + /** The details of the Jobs to be created on this schedule. */ + jobSpecification: BatchJobSpecification; + /** A list of name-value pairs associated with the schedule as metadata. The Batch service does not assign any meaning to metadata; it is solely for the use of user code. */ + metadata?: Array; +} + +/** + * The schedule according to which Jobs will be created. All times are fixed + * respective to UTC and are not impacted by daylight saving time. + */ +export interface Schedule { + /** The earliest time at which any Job may be created under this Job Schedule. If you do not specify a doNotRunUntil time, the schedule becomes ready to create Jobs immediately. */ + doNotRunUntil?: Date | string; + /** A time after which no Job will be created under this Job Schedule. The schedule will move to the completed state as soon as this deadline is past and there is no active Job under this Job Schedule. If you do not specify a doNotRunAfter time, and you are creating a recurring Job Schedule, the Job Schedule will remain active until you explicitly terminate it. */ + doNotRunAfter?: Date | string; + /** The time interval, starting from the time at which the schedule indicates a Job should be created, within which a Job must be created. If a Job is not created within the startWindow interval, then the 'opportunity' is lost; no Job will be created until the next recurrence of the schedule. If the schedule is recurring, and the startWindow is longer than the recurrence interval, then this is equivalent to an infinite startWindow, because the Job that is 'due' in one recurrenceInterval is not carried forward into the next recurrence interval. The default is infinite. The minimum value is 1 minute. If you specify a lower value, the Batch service rejects the schedule with an error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). */ + startWindow?: string; + /** The time interval between the start times of two successive Jobs under the Job Schedule. A Job Schedule can have at most one active Job under it at any given time. Because a Job Schedule can have at most one active Job under it at any given time, if it is time to create a new Job under a Job Schedule, but the previous Job is still running, the Batch service will not create the new Job until the previous Job finishes. If the previous Job does not finish within the startWindow period of the new recurrenceInterval, then no new Job will be scheduled for that interval. For recurring Jobs, you should normally specify a jobManagerTask in the jobSpecification. If you do not use jobManagerTask, you will need an external process to monitor when Jobs are created, add Tasks to the Jobs and terminate the Jobs ready for the next recurrence. The default is that the schedule does not recur: one Job is created, within the startWindow after the doNotRunUntil time, and the schedule is complete as soon as that Job finishes. The minimum value is 1 minute. If you specify a lower value, the Batch service rejects the schedule with an error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). */ + recurrenceInterval?: string; +} + +/** Specifies details of the Jobs to be created on a schedule. */ +export interface BatchJobSpecification { + /** The priority of Jobs created under this schedule. Priority values can range from -1000 to 1000, with -1000 being the lowest priority and 1000 being the highest priority. The default value is 0. This priority is used as the default for all Jobs under the Job Schedule. You can update a Job's priority after it has been created using by using the update Job API. */ + priority?: number; + /** Whether Tasks in this job can be preempted by other high priority jobs. If the value is set to True, other high priority jobs submitted to the system will take precedence and will be able requeue tasks from this job. You can update a job's allowTaskPreemption after it has been created using the update job API. */ + allowTaskPreemption?: boolean; + /** The maximum number of tasks that can be executed in parallel for the job. The value of maxParallelTasks must be -1 or greater than 0 if specified. If not specified, the default value is -1, which means there's no limit to the number of tasks that can be run at once. You can update a job's maxParallelTasks after it has been created using the update job API. */ + maxParallelTasks?: number; + /** The display name for Jobs created under this schedule. The name need not be unique and can contain any Unicode characters up to a maximum length of 1024. */ + displayName?: string; + /** Whether Tasks in the Job can define dependencies on each other. The default is false. */ + usesTaskDependencies?: boolean; + /** + * The action the Batch service should take when all Tasks in a Job created under this schedule are in the completed state. Note that if a Job contains no Tasks, then all Tasks are considered complete. This option is therefore most commonly used with a Job Manager task; if you want to use automatic Job termination without a Job Manager, you should initially set onAllTasksComplete to noaction and update the Job properties to set onAllTasksComplete to terminatejob once you have finished adding Tasks. The default is noaction. + * + * Possible values: noaction, terminatejob + */ + onAllTasksComplete?: string; + /** + * The action the Batch service should take when any Task fails in a Job created under this schedule. A Task is considered to have failed if it have failed if has a failureInfo. A failureInfo is set if the Task completes with a non-zero exit code after exhausting its retry count, or if there was an error starting the Task, for example due to a resource file download error. The default is noaction. + * + * Possible values: noaction, performexitoptionsjobaction + */ + onTaskFailure?: string; + /** The network configuration for the Job. */ + networkConfiguration?: BatchJobNetworkConfiguration; + /** The execution constraints for Jobs created under this schedule. */ + constraints?: BatchJobConstraints; + /** The details of a Job Manager Task to be launched when a Job is started under this schedule. If the Job does not specify a Job Manager Task, the user must explicitly add Tasks to the Job using the Task API. If the Job does specify a Job Manager Task, the Batch service creates the Job Manager Task when the Job is created, and will try to schedule the Job Manager Task before scheduling other Tasks in the Job. */ + jobManagerTask?: BatchJobManagerTask; + /** The Job Preparation Task for Jobs created under this schedule. If a Job has a Job Preparation Task, the Batch service will run the Job Preparation Task on a Node before starting any Tasks of that Job on that Compute Node. */ + jobPreparationTask?: BatchJobPreparationTask; + /** The Job Release Task for Jobs created under this schedule. The primary purpose of the Job Release Task is to undo changes to Nodes made by the Job Preparation Task. Example activities include deleting local files, or shutting down services that were started as part of Job preparation. A Job Release Task cannot be specified without also specifying a Job Preparation Task for the Job. The Batch service runs the Job Release Task on the Compute Nodes that have run the Job Preparation Task. */ + jobReleaseTask?: BatchJobReleaseTask; + /** A list of common environment variable settings. These environment variables are set for all Tasks in Jobs created under this schedule (including the Job Manager, Job Preparation and Job Release Tasks). Individual Tasks can override an environment setting specified here by specifying the same setting name with a different value. */ + commonEnvironmentSettings?: Array; + /** The Pool on which the Batch service runs the Tasks of Jobs created under this schedule. */ + poolInfo: BatchPoolInfo; + /** A list of name-value pairs associated with each Job created under this schedule as metadata. The Batch service does not assign any meaning to metadata; it is solely for the use of user code. */ + metadata?: Array; +} + +/** + * Contains information about Jobs that have been and will be run under a Job + * Schedule. + */ +export interface BatchJobScheduleExecutionInfo { + /** The next time at which a Job will be created under this schedule. This property is meaningful only if the schedule is in the active state when the time comes around. For example, if the schedule is disabled, no Job will be created at nextRunTime unless the Job is enabled before then. */ + nextRunTime?: Date | string; + /** Information about the most recent Job under the Job Schedule. This property is present only if the at least one Job has run under the schedule. */ + recentJob?: RecentBatchJob; + /** The time at which the schedule ended. This property is set only if the Job Schedule is in the completed state. */ + endTime?: Date | string; +} + +/** Information about the most recent Job to run under the Job Schedule. */ +export interface RecentBatchJob { + /** The ID of the Job. */ + id?: string; + /** The URL of the Job. */ + url?: string; +} + +/** Resource usage statistics for a Job Schedule. */ +export interface BatchJobScheduleStatistics { + /** The URL of the statistics. */ + url: string; + /** The start time of the time range covered by the statistics. */ + startTime: Date | string; + /** The time at which the statistics were last updated. All statistics are limited to the range between startTime and lastUpdateTime. */ + lastUpdateTime: Date | string; + /** The total user mode CPU time (summed across all cores and all Compute Nodes) consumed by all Tasks in all Jobs created under the schedule. */ + userCPUTime: string; + /** The total kernel mode CPU time (summed across all cores and all Compute Nodes) consumed by all Tasks in all Jobs created under the schedule. */ + kernelCPUTime: string; + /** The total wall clock time of all the Tasks in all the Jobs created under the schedule. The wall clock time is the elapsed time from when the Task started running on a Compute Node to when it finished (or to the last time the statistics were updated, if the Task had not finished by then). If a Task was retried, this includes the wall clock time of all the Task retries. */ + wallClockTime: string; + /** The total number of disk read operations made by all Tasks in all Jobs created under the schedule. */ + readIOps: number; + /** The total number of disk write operations made by all Tasks in all Jobs created under the schedule. */ + writeIOps: number; + /** The total gibibytes read from disk by all Tasks in all Jobs created under the schedule. */ + readIOGiB: number; + /** The total gibibytes written to disk by all Tasks in all Jobs created under the schedule. */ + writeIOGiB: number; + /** The total number of Tasks successfully completed during the given time range in Jobs created under the schedule. A Task completes successfully if it returns exit code 0. */ + numSucceededTasks: number; + /** The total number of Tasks that failed during the given time range in Jobs created under the schedule. A Task fails if it exhausts its maximum retry count without returning exit code 0. */ + numFailedTasks: number; + /** The total number of retries during the given time range on all Tasks in all Jobs created under the schedule. */ + numTaskRetries: number; + /** The total wait time of all Tasks in all Jobs created under the schedule. The wait time for a Task is defined as the elapsed time between the creation of the Task and the start of Task execution. (If the Task is retried due to failures, the wait time is the time to the most recent Task execution.). This value is only reported in the Account lifetime statistics; it is not included in the Job statistics. */ + waitTime: string; +} + +/** Parameters for updating an Azure Batch Job Schedule. */ +export interface BatchJobScheduleUpdateParameters { + /** The schedule according to which Jobs will be created. All times are fixed respective to UTC and are not impacted by daylight saving time. If you do not specify this element, the existing schedule is left unchanged. */ + schedule?: Schedule; + /** The details of the Jobs to be created on this schedule. Updates affect only Jobs that are started after the update has taken place. Any currently active Job continues with the older specification. */ + jobSpecification?: BatchJobSpecification; + /** A list of name-value pairs associated with the Job Schedule as metadata. If you do not specify this element, existing metadata is left unchanged. */ + metadata?: Array; +} + +/** Parameters for creating an Azure Batch Job Schedule */ +export interface BatchJobScheduleCreateParameters { + /** A string that uniquely identifies the schedule within the Account. The ID can contain any combination of alphanumeric characters including hyphens and underscores, and cannot contain more than 64 characters. The ID is case-preserving and case-insensitive (that is, you may not have two IDs within an Account that differ only by case). */ + id: string; + /** The display name for the schedule. The display name need not be unique and can contain any Unicode characters up to a maximum length of 1024. */ + displayName?: string; + /** The schedule according to which Jobs will be created. All times are fixed respective to UTC and are not impacted by daylight saving time. */ + schedule: Schedule; + /** The details of the Jobs to be created on this schedule. */ + jobSpecification: BatchJobSpecification; + /** A list of name-value pairs associated with the schedule as metadata. The Batch service does not assign any meaning to metadata; it is solely for the use of user code. */ + metadata?: Array; +} + +/** Parameters for creating an Azure Batch Task. */ +export interface BatchTaskCreateParameters { + /** A string that uniquely identifies the Task within the Job. The ID can contain any combination of alphanumeric characters including hyphens and underscores, and cannot contain more than 64 characters. The ID is case-preserving and case-insensitive (that is, you may not have two IDs within a Job that differ only by case). */ + id: string; + /** A display name for the Task. The display name need not be unique and can contain any Unicode characters up to a maximum length of 1024. */ + displayName?: string; + /** How the Batch service should respond when the Task completes. */ + exitConditions?: ExitConditions; + /** The command line of the Task. For multi-instance Tasks, the command line is executed as the primary Task, after the primary Task and all subtasks have finished executing the coordination command line. The command line does not run under a shell, and therefore cannot take advantage of shell features such as environment variable expansion. If you want to take advantage of such features, you should invoke the shell in the command line, for example using "cmd /c MyCommand" in Windows or "/bin/sh -c MyCommand" in Linux. If the command line refers to file paths, it should use a relative path (relative to the Task working directory), or use the Batch provided environment variable (https://docs.microsoft.com/en-us/azure/batch/batch-compute-node-environment-variables). */ + commandLine: string; + /** The settings for the container under which the Task runs. If the Pool that will run this Task has containerConfiguration set, this must be set as well. If the Pool that will run this Task doesn't have containerConfiguration set, this must not be set. When this is specified, all directories recursively below the AZ_BATCH_NODE_ROOT_DIR (the root of Azure Batch directories on the node) are mapped into the container, all Task environment variables are mapped into the container, and the Task command line is executed in the container. Files produced in the container outside of AZ_BATCH_NODE_ROOT_DIR might not be reflected to the host disk, meaning that Batch file APIs will not be able to access those files. */ + containerSettings?: BatchTaskContainerSettings; + /** A list of files that the Batch service will download to the Compute Node before running the command line. For multi-instance Tasks, the resource files will only be downloaded to the Compute Node on which the primary Task is executed. There is a maximum size for the list of resource files. When the max size is exceeded, the request will fail and the response error code will be RequestEntityTooLarge. If this occurs, the collection of ResourceFiles must be reduced in size. This can be achieved using .zip files, Application Packages, or Docker Containers. */ + resourceFiles?: Array; + /** A list of files that the Batch service will upload from the Compute Node after running the command line. For multi-instance Tasks, the files will only be uploaded from the Compute Node on which the primary Task is executed. */ + outputFiles?: Array; + /** A list of environment variable settings for the Task. */ + environmentSettings?: Array; + /** A locality hint that can be used by the Batch service to select a Compute Node on which to start the new Task. */ + affinityInfo?: AffinityInfo; + /** The execution constraints that apply to this Task. If you do not specify constraints, the maxTaskRetryCount is the maxTaskRetryCount specified for the Job, the maxWallClockTime is infinite, and the retentionTime is 7 days. */ + constraints?: BatchTaskConstraints; + /** The number of scheduling slots that the Task required to run. The default is 1. A Task can only be scheduled to run on a compute node if the node has enough free scheduling slots available. For multi-instance Tasks, this must be 1. */ + requiredSlots?: number; + /** The user identity under which the Task runs. If omitted, the Task runs as a non-administrative user unique to the Task. */ + userIdentity?: UserIdentity; + /** An object that indicates that the Task is a multi-instance Task, and contains information about how to run the multi-instance Task. */ + multiInstanceSettings?: MultiInstanceSettings; + /** The Tasks that this Task depends on. This Task will not be scheduled until all Tasks that it depends on have completed successfully. If any of those Tasks fail and exhaust their retry counts, this Task will never be scheduled. If the Job does not have usesTaskDependencies set to true, and this element is present, the request fails with error code TaskDependenciesNotSpecifiedOnJob. */ + dependsOn?: BatchTaskDependencies; + /** A list of Packages that the Batch service will deploy to the Compute Node before running the command line. Application packages are downloaded and deployed to a shared directory, not the Task working directory. Therefore, if a referenced package is already on the Node, and is up to date, then it is not re-downloaded; the existing copy on the Compute Node is used. If a referenced Package cannot be installed, for example because the package has been deleted or because download failed, the Task fails. */ + applicationPackageReferences?: Array; + /** The settings for an authentication token that the Task can use to perform Batch service operations. If this property is set, the Batch service provides the Task with an authentication token which can be used to authenticate Batch service operations without requiring an Account access key. The token is provided via the AZ_BATCH_AUTHENTICATION_TOKEN environment variable. The operations that the Task can carry out using the token depend on the settings. For example, a Task can request Job permissions in order to add other Tasks to the Job, or check the status of the Job or of other Tasks under the Job. */ + authenticationTokenSettings?: AuthenticationTokenSettings; +} + +/** Specifies how the Batch service should respond when the Task completes. */ +export interface ExitConditions { + /** A list of individual Task exit codes and how the Batch service should respond to them. */ + exitCodes?: Array; + /** A list of Task exit code ranges and how the Batch service should respond to them. */ + exitCodeRanges?: Array; + /** How the Batch service should respond if the Task fails to start due to an error. */ + preProcessingError?: ExitOptions; + /** How the Batch service should respond if a file upload error occurs. If the Task exited with an exit code that was specified via exitCodes or exitCodeRanges, and then encountered a file upload error, then the action specified by the exit code takes precedence. */ + fileUploadError?: ExitOptions; + /** How the Batch service should respond if the Task fails with an exit condition not covered by any of the other properties. This value is used if the Task exits with any nonzero exit code not listed in the exitCodes or exitCodeRanges collection, with a pre-processing error if the preProcessingError property is not present, or with a file upload error if the fileUploadError property is not present. If you want non-default behavior on exit code 0, you must list it explicitly using the exitCodes or exitCodeRanges collection. */ + default?: ExitOptions; +} + +/** + * How the Batch service should respond if a Task exits with a particular exit + * code. + */ +export interface ExitCodeMapping { + /** A process exit code. */ + code: number; + /** How the Batch service should respond if the Task exits with this exit code. */ + exitOptions: ExitOptions; +} + +/** Specifies how the Batch service responds to a particular exit condition. */ +export interface ExitOptions { + /** + * An action to take on the Job containing the Task, if the Task completes with the given exit condition and the Job's onTaskFailed property is 'performExitOptionsJobAction'. The default is none for exit code 0 and terminate for all other exit conditions. If the Job's onTaskFailed property is noaction, then specifying this property returns an error and the add Task request fails with an invalid property value error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). + * + * Possible values: none, disable, terminate + */ + jobAction?: string; + /** + * An action that the Batch service performs on Tasks that depend on this Task. Possible values are 'satisfy' (allowing dependent tasks to progress) and 'block' (dependent tasks continue to wait). Batch does not yet support cancellation of dependent tasks. + * + * Possible values: satisfy, block + */ + dependencyAction?: string; +} + +/** + * A range of exit codes and how the Batch service should respond to exit codes + * within that range. + */ +export interface ExitCodeRangeMapping { + /** The first exit code in the range. */ + start: number; + /** The last exit code in the range. */ + end: number; + /** How the Batch service should respond if the Task exits with an exit code in the range start to end (inclusive). */ + exitOptions: ExitOptions; +} + +/** + * A locality hint that can be used by the Batch service to select a Compute Node + * on which to start a Task. + */ +export interface AffinityInfo { + /** An opaque string representing the location of a Compute Node or a Task that has run previously. You can pass the affinityId of a Node to indicate that this Task needs to run on that Compute Node. Note that this is just a soft affinity. If the target Compute Node is busy or unavailable at the time the Task is scheduled, then the Task will be scheduled elsewhere. */ + affinityId: string; +} + +/** + * Multi-instance Tasks are commonly used to support MPI Tasks. In the MPI case, + * if any of the subtasks fail (for example due to exiting with a non-zero exit + * code) the entire multi-instance Task fails. The multi-instance Task is then + * terminated and retried, up to its retry limit. + */ +export interface MultiInstanceSettings { + /** The number of Compute Nodes required by the Task. If omitted, the default is 1. */ + numberOfInstances?: number; + /** The command line to run on all the Compute Nodes to enable them to coordinate when the primary runs the main Task command. A typical coordination command line launches a background service and verifies that the service is ready to process inter-node messages. */ + coordinationCommandLine: string; + /** A list of files that the Batch service will download before running the coordination command line. The difference between common resource files and Task resource files is that common resource files are downloaded for all subtasks including the primary, whereas Task resource files are downloaded only for the primary. Also note that these resource files are not downloaded to the Task working directory, but instead are downloaded to the Task root directory (one directory above the working directory). There is a maximum size for the list of resource files. When the max size is exceeded, the request will fail and the response error code will be RequestEntityTooLarge. If this occurs, the collection of ResourceFiles must be reduced in size. This can be achieved using .zip files, Application Packages, or Docker Containers. */ + commonResourceFiles?: Array; +} + +/** + * Specifies any dependencies of a Task. Any Task that is explicitly specified or + * within a dependency range must complete before the dependant Task will be + * scheduled. + */ +export interface BatchTaskDependencies { + /** The list of Task IDs that this Task depends on. All Tasks in this list must complete successfully before the dependent Task can be scheduled. The taskIds collection is limited to 64000 characters total (i.e. the combined length of all Task IDs). If the taskIds collection exceeds the maximum length, the Add Task request fails with error code TaskDependencyListTooLong. In this case consider using Task ID ranges instead. */ + taskIds?: string[]; + /** The list of Task ID ranges that this Task depends on. All Tasks in all ranges must complete successfully before the dependent Task can be scheduled. */ + taskIdRanges?: Array; +} + +/** + * The start and end of the range are inclusive. For example, if a range has start + * 9 and end 12, then it represents Tasks '9', '10', '11' and '12'. + */ +export interface BatchTaskIdRange { + /** The first Task ID in the range. */ + start: number; + /** The last Task ID in the range. */ + end: number; +} + +/** + * Batch will retry Tasks when a recovery operation is triggered on a Node. + * Examples of recovery operations include (but are not limited to) when an + * unhealthy Node is rebooted or a Compute Node disappeared due to host failure. + * Retries due to recovery operations are independent of and are not counted + * against the maxTaskRetryCount. Even if the maxTaskRetryCount is 0, an internal + * retry due to a recovery operation may occur. Because of this, all Tasks should + * be idempotent. This means Tasks need to tolerate being interrupted and + * restarted without causing any corruption or duplicate data. The best practice + * for long running Tasks is to use some form of checkpointing. + */ +export interface BatchTask { + /** The execution constraints that apply to this Task. */ + constraints?: BatchTaskConstraints; +} + +/** Information about the execution of a Task. */ +export interface BatchTaskExecutionInfo { + /** The time at which the Task started running. 'Running' corresponds to the running state, so if the Task specifies resource files or Packages, then the start time reflects the time at which the Task started downloading or deploying these. If the Task has been restarted or retried, this is the most recent time at which the Task started running. This property is present only for Tasks that are in the running or completed state. */ + startTime?: Date | string; + /** The time at which the Task completed. This property is set only if the Task is in the Completed state. */ + endTime?: Date | string; + /** The exit code of the program specified on the Task command line. This property is set only if the Task is in the completed state. In general, the exit code for a process reflects the specific convention implemented by the application developer for that process. If you use the exit code value to make decisions in your code, be sure that you know the exit code convention used by the application process. However, if the Batch service terminates the Task (due to timeout, or user termination via the API) you may see an operating system-defined exit code. */ + exitCode?: number; + /** Information about the container under which the Task is executing. This property is set only if the Task runs in a container context. */ + containerInfo?: BatchTaskContainerExecutionInfo; + /** Information describing the Task failure, if any. This property is set only if the Task is in the completed state and encountered a failure. */ + failureInfo?: BatchTaskFailureInfo; + /** The number of times the Task has been retried by the Batch service. Task application failures (non-zero exit code) are retried, pre-processing errors (the Task could not be run) and file upload errors are not retried. The Batch service will retry the Task up to the limit specified by the constraints. */ + retryCount: number; + /** The most recent time at which a retry of the Task started running. This element is present only if the Task was retried (i.e. retryCount is nonzero). If present, this is typically the same as startTime, but may be different if the Task has been restarted for reasons other than retry; for example, if the Compute Node was rebooted during a retry, then the startTime is updated but the lastRetryTime is not. */ + lastRetryTime?: Date | string; + /** The number of times the Task has been requeued by the Batch service as the result of a user request. When the user removes Compute Nodes from a Pool (by resizing/shrinking the pool) or when the Job is being disabled, the user can specify that running Tasks on the Compute Nodes be requeued for execution. This count tracks how many times the Task has been requeued for these reasons. */ + requeueCount: number; + /** The most recent time at which the Task has been requeued by the Batch service as the result of a user request. This property is set only if the requeueCount is nonzero. */ + lastRequeueTime?: Date | string; + /** + * The result of the Task execution. If the value is 'failed', then the details of the failure can be found in the failureInfo property. + * + * Possible values: success, failure + */ + result?: string; +} + +/** Information about the Compute Node on which a Task ran. */ +export interface BatchNodeInfo { + /** An identifier for the Node on which the Task ran, which can be passed when adding a Task to request that the Task be scheduled on this Compute Node. */ + affinityId?: string; + /** The URL of the Compute Node on which the Task ran. */ + nodeUrl?: string; + /** The ID of the Pool on which the Task ran. */ + poolId?: string; + /** The ID of the Compute Node on which the Task ran. */ + nodeId?: string; + /** The root directory of the Task on the Compute Node. */ + taskRootDirectory?: string; + /** The URL to the root directory of the Task on the Compute Node. */ + taskRootDirectoryUrl?: string; +} + +/** Resource usage statistics for a Task. */ +export interface BatchTaskStatistics { + /** The URL of the statistics. */ + url: string; + /** The start time of the time range covered by the statistics. */ + startTime: Date | string; + /** The time at which the statistics were last updated. All statistics are limited to the range between startTime and lastUpdateTime. */ + lastUpdateTime: Date | string; + /** The total user mode CPU time (summed across all cores and all Compute Nodes) consumed by the Task. */ + userCPUTime: string; + /** The total kernel mode CPU time (summed across all cores and all Compute Nodes) consumed by the Task. */ + kernelCPUTime: string; + /** The total wall clock time of the Task. The wall clock time is the elapsed time from when the Task started running on a Compute Node to when it finished (or to the last time the statistics were updated, if the Task had not finished by then). If the Task was retried, this includes the wall clock time of all the Task retries. */ + wallClockTime: string; + /** The total number of disk read operations made by the Task. */ + readIOps: number; + /** The total number of disk write operations made by the Task. */ + writeIOps: number; + /** The total gibibytes read from disk by the Task. */ + readIOGiB: number; + /** The total gibibytes written to disk by the Task. */ + writeIOGiB: number; + /** The total wait time of the Task. The wait time for a Task is defined as the elapsed time between the creation of the Task and the start of Task execution. (If the Task is retried due to failures, the wait time is the time to the most recent Task execution.). */ + waitTime: string; +} + +/** A collection of Azure Batch Tasks to add. */ +export interface BatchTaskCollection { + /** The collection of Tasks to add. The maximum count of Tasks is 100. The total serialized size of this collection must be less than 1MB. If it is greater than 1MB (for example if each Task has 100's of resource files or environment variables), the request will fail with code 'RequestBodyTooLarge' and should be retried again with fewer Tasks. */ + value: Array; +} + +/** Parameters for creating a user account for RDP or SSH access on an Azure Batch Compute Node. */ +export interface BatchNodeUserCreateParameters { + /** The user name of the Account. */ + name: string; + /** Whether the Account should be an administrator on the Compute Node. The default value is false. */ + isAdmin?: boolean; + /** The time at which the Account should expire. If omitted, the default is 1 day from the current time. For Linux Compute Nodes, the expiryTime has a precision up to a day. */ + expiryTime?: Date | string; + /** The password of the Account. The password is required for Windows Compute Nodes (those created with 'cloudServiceConfiguration', or created with 'virtualMachineConfiguration' using a Windows Image reference). For Linux Compute Nodes, the password can optionally be specified along with the sshPublicKey property. */ + password?: string; + /** The SSH public key that can be used for remote login to the Compute Node. The public key should be compatible with OpenSSH encoding and should be base 64 encoded. This property can be specified only for Linux Compute Nodes. If this is specified for a Windows Compute Node, then the Batch service rejects the request; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). */ + sshPublicKey?: string; +} + +/** Parameters for updating a user account for RDP or SSH access on an Azure Batch Compute Node. */ +export interface BatchNodeUserUpdateParameters { + /** The password of the Account. The password is required for Windows Compute Nodes (those created with 'cloudServiceConfiguration', or created with 'virtualMachineConfiguration' using a Windows Image reference). For Linux Compute Nodes, the password can optionally be specified along with the sshPublicKey property. If omitted, any existing password is removed. */ + password?: string; + /** The time at which the Account should expire. If omitted, the default is 1 day from the current time. For Linux Compute Nodes, the expiryTime has a precision up to a day. */ + expiryTime?: Date | string; + /** The SSH public key that can be used for remote login to the Compute Node. The public key should be compatible with OpenSSH encoding and should be base 64 encoded. This property can be specified only for Linux Compute Nodes. If this is specified for a Windows Compute Node, then the Batch service rejects the request; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). If omitted, any existing SSH public key is removed. */ + sshPublicKey?: string; +} + +/** Parameters for rebooting an Azure Batch Compute Node. */ +export interface BatchNodeRebootParameters { + /** + * When to reboot the Compute Node and what to do with currently running Tasks. The default value is requeue. + * + * Possible values: requeue, terminate, taskcompletion, retaineddata + */ + nodeRebootOption?: string; +} + +/** Parameters for reimaging an Azure Batch Compute Node. */ +export interface BatchNodeReimageParameters { + /** + * When to reimage the Compute Node and what to do with currently running Tasks. The default value is requeue. + * + * Possible values: requeue, terminate, taskcompletion, retaineddata + */ + nodeReimageOption?: string; +} + +/** Parameters for disabling scheduling on an Azure Batch Compute Node. */ +export interface BatchNodeDisableSchedulingParameters { + /** + * What to do with currently running Tasks when disabling Task scheduling on the Compute Node. The default value is requeue. + * + * Possible values: requeue, terminate, taskcompletion + */ + nodeDisableSchedulingOption?: string; +} + +/** The Azure Batch service log files upload parameters for a Compute Node. */ +export interface UploadBatchServiceLogsParameters { + /** The URL of the container within Azure Blob Storage to which to upload the Batch Service log file(s). If a user assigned managed identity is not being used, the URL must include a Shared Access Signature (SAS) granting write permissions to the container. The SAS duration must allow enough time for the upload to finish. The start time for SAS is optional and recommended to not be specified. */ + containerUrl: string; + /** The start of the time range from which to upload Batch Service log file(s). Any log file containing a log message in the time range will be uploaded. This means that the operation might retrieve more logs than have been requested since the entire log file is always uploaded, but the operation should not retrieve fewer logs than have been requested. */ + startTime: Date | string; + /** The end of the time range from which to upload Batch Service log file(s). Any log file containing a log message in the time range will be uploaded. This means that the operation might retrieve more logs than have been requested since the entire log file is always uploaded, but the operation should not retrieve fewer logs than have been requested. If omitted, the default is to upload all logs available after the startTime. */ + endTime?: Date | string; + /** The reference to the user assigned identity to use to access Azure Blob Storage specified by containerUrl. The identity must have write access to the Azure Blob Storage container. */ + identityReference?: BatchNodeIdentityReference; +} diff --git a/packages/service/src/internal/batch-rest/generated/src/outputModels.ts b/packages/service/src/internal/batch-rest/generated/src/outputModels.ts new file mode 100644 index 000000000..9fff150a7 --- /dev/null +++ b/packages/service/src/internal/batch-rest/generated/src/outputModels.ts @@ -0,0 +1,2509 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +export interface BatchApplicationListResultListOutput {} + +/** The result of listing the applications available in an Account. */ +export interface BatchApplicationListResultOutput { + /** The list of applications available in the Account. */ + value?: Array; + /** The URL to get the next set of results. */ + "odata.nextLink"?: string; +} + +/** Contains information about an application in an Azure Batch Account. */ +export interface BatchApplicationOutput { + /** A string that uniquely identifies the application within the Account. */ + id: string; + /** The display name for the application. */ + displayName: string; + /** The list of available versions of the application. */ + versions: string[]; +} + +/** An error response received from the Azure Batch service. */ +export interface BatchErrorOutput { + /** An identifier for the error. Codes are invariant and are intended to be consumed programmatically. */ + code: string; + /** A message describing the error, intended to be suitable for display in a user interface. */ + message?: BatchErrorMessageOutput; + /** A collection of key-value pairs containing additional details about the error. */ + values?: Array; +} + +/** An error message received in an Azure Batch error response. */ +export interface BatchErrorMessageOutput { + /** The language code of the error message. */ + lang?: string; + /** The text of the message. */ + value?: string; +} + +/** An item of additional information included in an Azure Batch error response. */ +export interface BatchErrorDetailOutput { + /** An identifier specifying the meaning of the Value property. */ + key?: string; + /** The additional information included with the error response. */ + value?: string; +} + +export interface BatchPoolListUsageMetricsResultListOutput {} + +/** The result of a listing the usage metrics for an Account. */ +export interface BatchPoolListUsageMetricsResultOutput { + /** The Pool usage metrics data. */ + value?: Array; + /** The URL to get the next set of results. */ + "odata.nextLink"?: string; +} + +/** Usage metrics for a Pool across an aggregation interval. */ +export interface BatchPoolUsageMetricsOutput { + /** The ID of the Pool whose metrics are aggregated in this entry. */ + poolId: string; + /** The start time of the aggregation interval covered by this entry. */ + startTime: string; + /** The end time of the aggregation interval covered by this entry. */ + endTime: string; + /** The size of virtual machines in the Pool. All VMs in a Pool are the same size. For information about available sizes of virtual machines in Pools, see Choose a VM size for Compute Nodes in an Azure Batch Pool (https://docs.microsoft.com/azure/batch/batch-pool-vm-sizes). */ + vmSize: string; + /** The total core hours used in the Pool during this aggregation interval. */ + totalCoreHours: number; +} + +/** + * The configuration for Compute Nodes in a Pool based on the Azure Cloud Services + * platform. + */ +export interface CloudServiceConfigurationOutput { + /** + * Possible values are: + * 2 - OS Family 2, equivalent to Windows Server 2008 R2 + * SP1. + * 3 - OS Family 3, equivalent to Windows Server 2012. + * 4 - OS Family 4, + * equivalent to Windows Server 2012 R2. + * 5 - OS Family 5, equivalent to Windows + * Server 2016. + * 6 - OS Family 6, equivalent to Windows Server 2019. For more + * information, see Azure Guest OS Releases + * (https://azure.microsoft.com/documentation/articles/cloud-services-guestos-update-matrix/#releases). + */ + osFamily: string; + /** The Azure Guest OS version to be installed on the virtual machines in the Pool. The default value is * which specifies the latest operating system version for the specified OS family. */ + osVersion?: string; +} + +/** + * The configuration for Compute Nodes in a Pool based on the Azure Virtual + * Machines infrastructure. + */ +export interface VirtualMachineConfigurationOutput { + /** A reference to the Azure Virtual Machines Marketplace Image or the custom Virtual Machine Image to use. */ + imageReference: ImageReferenceOutput; + /** The SKU of the Batch Compute Node agent to be provisioned on Compute Nodes in the Pool. The Batch Compute Node agent is a program that runs on each Compute Node in the Pool, and provides the command-and-control interface between the Compute Node and the Batch service. There are different implementations of the Compute Node agent, known as SKUs, for different operating systems. You must specify a Compute Node agent SKU which matches the selected Image reference. To get the list of supported Compute Node agent SKUs along with their list of verified Image references, see the 'List supported Compute Node agent SKUs' operation. */ + nodeAgentSKUId: string; + /** Windows operating system settings on the virtual machine. This property must not be specified if the imageReference property specifies a Linux OS Image. */ + windowsConfiguration?: WindowsConfigurationOutput; + /** The configuration for data disks attached to the Compute Nodes in the Pool. This property must be specified if the Compute Nodes in the Pool need to have empty data disks attached to them. This cannot be updated. Each Compute Node gets its own disk (the disk is not a file share). Existing disks cannot be attached, each attached disk is empty. When the Compute Node is removed from the Pool, the disk and all data associated with it is also deleted. The disk is not formatted after being attached, it must be formatted before use - for more information see https://docs.microsoft.com/en-us/azure/virtual-machines/linux/classic/attach-disk#initialize-a-new-data-disk-in-linux and https://docs.microsoft.com/en-us/azure/virtual-machines/windows/attach-disk-ps#add-an-empty-data-disk-to-a-virtual-machine. */ + dataDisks?: Array; + /** + * This only applies to Images that contain the Windows operating system, and + * should only be used when you hold valid on-premises licenses for the Compute + * Nodes which will be deployed. If omitted, no on-premises licensing discount is + * applied. Values are: + * + * Windows_Server - The on-premises license is for Windows + * Server. + * Windows_Client - The on-premises license is for Windows Client. + * + */ + licenseType?: string; + /** The container configuration for the Pool. If specified, setup is performed on each Compute Node in the Pool to allow Tasks to run in containers. All regular Tasks and Job manager Tasks run on this Pool must specify the containerSettings property, and all other Tasks may specify it. */ + containerConfiguration?: ContainerConfigurationOutput; + /** The disk encryption configuration for the pool. If specified, encryption is performed on each node in the pool during node provisioning. */ + diskEncryptionConfiguration?: DiskEncryptionConfigurationOutput; + /** The node placement configuration for the pool. This configuration will specify rules on how nodes in the pool will be physically allocated. */ + nodePlacementConfiguration?: BatchNodePlacementConfigurationOutput; + /** The virtual machine extension for the pool. If specified, the extensions mentioned in this configuration will be installed on each node. */ + extensions?: Array; + /** Settings for the operating system disk of the Virtual Machine. */ + osDisk?: OSDiskOutput; + /** Specifies the security profile settings for the virtual machine or virtual machine scale set. */ + securityProfile?: SecurityProfileOutput; + /** Specifies the service artifact reference id used to set same image version for all virtual machines in the scale set when using 'latest' image version. The service artifact reference id in the form of /subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Compute/galleries/{galleryName}/serviceArtifacts/{serviceArtifactName}/vmArtifactsProfiles/{vmArtifactsProfilesName} */ + serviceArtifactReference?: ServiceArtifactReferenceOutput; +} + +/** + * A reference to an Azure Virtual Machines Marketplace Image or a Azure Compute Gallery Image. + * To get the list of all Azure Marketplace Image references verified by Azure Batch, see the + * ' List Supported Images ' operation. + */ +export interface ImageReferenceOutput { + /** The publisher of the Azure Virtual Machines Marketplace Image. For example, Canonical or MicrosoftWindowsServer. */ + publisher?: string; + /** The offer type of the Azure Virtual Machines Marketplace Image. For example, UbuntuServer or WindowsServer. */ + offer?: string; + /** The SKU of the Azure Virtual Machines Marketplace Image. For example, 18.04-LTS or 2019-Datacenter. */ + sku?: string; + /** The version of the Azure Virtual Machines Marketplace Image. A value of 'latest' can be specified to select the latest version of an Image. If omitted, the default is 'latest'. */ + version?: string; + /** The ARM resource identifier of the Azure Compute Gallery Image. Compute Nodes in the Pool will be created using this Image Id. This is of the form /subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Compute/galleries/{galleryName}/images/{imageDefinitionName}/versions/{VersionId} or /subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Compute/galleries/{galleryName}/images/{imageDefinitionName} for always defaulting to the latest image version. This property is mutually exclusive with other ImageReference properties. The Azure Compute Gallery Image must have replicas in the same region and must be in the same subscription as the Azure Batch account. If the image version is not specified in the imageId, the latest version will be used. For information about the firewall settings for the Batch Compute Node agent to communicate with the Batch service see https://docs.microsoft.com/en-us/azure/batch/batch-api-basics#virtual-network-vnet-and-firewall-configuration. */ + virtualMachineImageId?: string; + /** The specific version of the platform image or marketplace image used to create the node. This read-only field differs from 'version' only if the value specified for 'version' when the pool was created was 'latest'. */ + readonly exactVersion?: string; +} + +/** Windows operating system settings to apply to the virtual machine. */ +export interface WindowsConfigurationOutput { + /** Whether automatic updates are enabled on the virtual machine. If omitted, the default value is true. */ + enableAutomaticUpdates?: boolean; +} + +/** + * Settings which will be used by the data disks associated to Compute Nodes in + * the Pool. When using attached data disks, you need to mount and format the + * disks from within a VM to use them. + */ +export interface DataDiskOutput { + /** The logical unit number. The lun is used to uniquely identify each data disk. If attaching multiple disks, each should have a distinct lun. The value must be between 0 and 63, inclusive. */ + lun: number; + /** + * The type of caching to be enabled for the data disks. The default value for caching is readwrite. For information about the caching options see: https://blogs.msdn.microsoft.com/windowsazurestorage/2012/06/27/exploring-windows-azure-drives-disks-and-images/. + * + * Possible values: none, readonly, readwrite + */ + caching?: string; + /** The initial disk size in gigabytes. */ + diskSizeGB: number; + /** + * The storage Account type to be used for the data disk. If omitted, the default is "standard_lrs". + * + * Possible values: standard_lrs, premium_lrs, standardssd_lrs + */ + storageAccountType?: string; +} + +/** The configuration for container-enabled Pools. */ +export interface ContainerConfigurationOutput { + /** + * The container technology to be used. + * + * Possible values: dockerCompatible, criCompatible + */ + type: string; + /** The collection of container Image names. This is the full Image reference, as would be specified to "docker pull". An Image will be sourced from the default Docker registry unless the Image is fully qualified with an alternative registry. */ + containerImageNames?: string[]; + /** Additional private registries from which containers can be pulled. If any Images must be downloaded from a private registry which requires credentials, then those credentials must be provided here. */ + containerRegistries?: Array; +} + +/** A private container registry. */ +export interface ContainerRegistryOutput { + /** The user name to log into the registry server. */ + username?: string; + /** The password to log into the registry server. */ + password?: string; + /** The registry URL. If omitted, the default is "docker.io". */ + registryServer?: string; + /** The reference to the user assigned identity to use to access an Azure Container Registry instead of username and password. */ + identityReference?: BatchNodeIdentityReferenceOutput; +} + +/** + * The reference to a user assigned identity associated with the Batch pool which + * a compute node will use. + */ +export interface BatchNodeIdentityReferenceOutput { + /** The ARM resource id of the user assigned identity. */ + resourceId?: string; +} + +/** + * The disk encryption configuration applied on compute nodes in the pool. + * Disk encryption configuration is not supported on Linux pool created with + * Azure Compute Gallery Image. + */ +export interface DiskEncryptionConfigurationOutput { + /** The list of disk targets Batch Service will encrypt on the compute node. If omitted, no disks on the compute nodes in the pool will be encrypted. On Linux pool, only "TemporaryDisk" is supported; on Windows pool, "OsDisk" and "TemporaryDisk" must be specified. */ + targets?: string[]; +} + +/** + * For regional placement, nodes in the pool will be allocated in the same region. + * For zonal placement, nodes in the pool will be spread across different zones + * with best effort balancing. + */ +export interface BatchNodePlacementConfigurationOutput { + /** + * Node placement Policy type on Batch Pools. Allocation policy used by Batch Service to provision the nodes. If not specified, Batch will use the regional policy. + * + * Possible values: regional, zonal + */ + policy?: string; +} + +/** The configuration for virtual machine extensions. */ +export interface VMExtensionOutput { + /** The name of the virtual machine extension. */ + name: string; + /** The name of the extension handler publisher. */ + publisher: string; + /** The type of the extension. */ + type: string; + /** The version of script handler. */ + typeHandlerVersion?: string; + /** Indicates whether the extension should use a newer minor version if one is available at deployment time. Once deployed, however, the extension will not upgrade minor versions unless redeployed, even with this property set to true. */ + autoUpgradeMinorVersion?: boolean; + /** Indicates whether the extension should be automatically upgraded by the platform if there is a newer version of the extension available. */ + enableAutomaticUpgrade?: boolean; + /** JSON formatted public settings for the extension. */ + settings?: Record; + /** The extension can contain either protectedSettings or protectedSettingsFromKeyVault or no protected settings at all. */ + protectedSettings?: Record; + /** The collection of extension names. Collection of extension names after which this extension needs to be provisioned. */ + provisionAfterExtensions?: string[]; +} + +/** Settings for the operating system disk of the compute node (VM). */ +export interface OSDiskOutput { + /** Specifies the ephemeral Disk Settings for the operating system disk used by the compute node (VM). */ + ephemeralOSDiskSettings?: DiffDiskSettingsOutput; + /** + * Specifies the caching requirements. Possible values are: None, ReadOnly, ReadWrite. The default values are: None for Standard storage. ReadOnly for Premium storage. + * + * Possible values: none, readonly, readwrite + */ + caching?: string; + /** The initial disk size in GB when creating new OS disk. */ + diskSizeGB?: number; + /** The managed disk parameters. */ + managedDisk?: ManagedDiskOutput; + /** Specifies whether writeAccelerator should be enabled or disabled on the disk. */ + writeAcceleratorEnabled?: boolean; +} + +/** + * Specifies the ephemeral Disk Settings for the operating system disk used by the + * compute node (VM). + */ +export interface DiffDiskSettingsOutput { + /** + * Specifies the ephemeral disk placement for operating system disk for all VMs in the pool. This property can be used by user in the request to choose the location e.g., cache disk space for Ephemeral OS disk provisioning. For more information on Ephemeral OS disk size requirements, please refer to Ephemeral OS disk size requirements for Windows VMs at https://docs.microsoft.com/en-us/azure/virtual-machines/windows/ephemeral-os-disks#size-requirements and Linux VMs at https://docs.microsoft.com/en-us/azure/virtual-machines/linux/ephemeral-os-disks#size-requirements. + * + * Possible values: cachedisk + */ + placement?: string; +} + +/** The managed disk parameters. */ +export interface ManagedDiskOutput { + /** + * The storage account type for managed disk. + * + * Possible values: standard_lrs, premium_lrs, standardssd_lrs + */ + storageAccountType: string; +} + +/** Specifies the security profile settings for the virtual machine or virtual machine scale set. */ +export interface SecurityProfileOutput { + /** This property can be used by user in the request to enable or disable the Host Encryption for the virtual machine or virtual machine scale set. This will enable the encryption for all the disks including Resource/Temp disk at host itself. */ + encryptionAtHost: boolean; + /** + * Specifies the SecurityType of the virtual machine. It has to be set to any specified value to enable UefiSettings. + * + * Possible values: trustedLaunch + */ + securityType: string; + /** Specifies the security settings like secure boot and vTPM used while creating the virtual machine. Specifies the security settings like secure boot and vTPM used while creating the virtual machine. */ + uefiSettings: UefiSettingsOutput; +} + +/** Specifies the security settings like secure boot and vTPM used while creating the virtual machine. */ +export interface UefiSettingsOutput { + /** Specifies whether secure boot should be enabled on the virtual machine. */ + secureBootEnabled?: boolean; + /** Specifies whether vTPM should be enabled on the virtual machine. */ + vTpmEnabled?: boolean; +} + +/** + * Specifies the service artifact reference id used to set same image version + * for all virtual machines in the scale set when using 'latest' image version. + */ +export interface ServiceArtifactReferenceOutput { + /** The service artifact reference id of ServiceArtifactReference. The service artifact reference id in the form of /subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Compute/galleries/{galleryName}/serviceArtifacts/{serviceArtifactName}/vmArtifactsProfiles/{vmArtifactsProfilesName} */ + id: string; +} + +/** The network configuration for a Pool. */ +export interface NetworkConfigurationOutput { + /** The ARM resource identifier of the virtual network subnet which the Compute Nodes of the Pool will join. This is of the form /subscriptions/{subscription}/resourceGroups/{group}/providers/{provider}/virtualNetworks/{network}/subnets/{subnet}. The virtual network must be in the same region and subscription as the Azure Batch Account. The specified subnet should have enough free IP addresses to accommodate the number of Compute Nodes in the Pool. If the subnet doesn't have enough free IP addresses, the Pool will partially allocate Nodes and a resize error will occur. The 'MicrosoftAzureBatch' service principal must have the 'Classic Virtual Machine Contributor' Role-Based Access Control (RBAC) role for the specified VNet. The specified subnet must allow communication from the Azure Batch service to be able to schedule Tasks on the Nodes. This can be verified by checking if the specified VNet has any associated Network Security Groups (NSG). If communication to the Nodes in the specified subnet is denied by an NSG, then the Batch service will set the state of the Compute Nodes to unusable. For Pools created with virtualMachineConfiguration only ARM virtual networks ('Microsoft.Network/virtualNetworks') are supported, but for Pools created with cloudServiceConfiguration both ARM and classic virtual networks are supported. If the specified VNet has any associated Network Security Groups (NSG), then a few reserved system ports must be enabled for inbound communication. For Pools created with a virtual machine configuration, enable ports 29876 and 29877, as well as port 22 for Linux and port 3389 for Windows. For Pools created with a cloud service configuration, enable ports 10100, 20100, and 30100. Also enable outbound connections to Azure Storage on port 443. For more details see: https://docs.microsoft.com/en-us/azure/batch/batch-api-basics#virtual-network-vnet-and-firewall-configuration. */ + subnetId?: string; + /** + * The scope of dynamic vnet assignment. + * + * Possible values: none, job + */ + dynamicVNetAssignmentScope?: string; + /** The configuration for endpoints on Compute Nodes in the Batch Pool. Pool endpoint configuration is only supported on Pools with the virtualMachineConfiguration property. */ + endpointConfiguration?: BatchPoolEndpointConfigurationOutput; + /** The Public IPAddress configuration for Compute Nodes in the Batch Pool. Public IP configuration property is only supported on Pools with the virtualMachineConfiguration property. */ + publicIPAddressConfiguration?: PublicIPAddressConfigurationOutput; + /** Whether this pool should enable accelerated networking. Accelerated networking enables single root I/O virtualization (SR-IOV) to a VM, which may lead to improved networking performance. For more details, see: https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview. */ + enableAcceleratedNetworking?: boolean; +} + +/** The endpoint configuration for a Pool. */ +export interface BatchPoolEndpointConfigurationOutput { + /** A list of inbound NAT Pools that can be used to address specific ports on an individual Compute Node externally. The maximum number of inbound NAT Pools per Batch Pool is 5. If the maximum number of inbound NAT Pools is exceeded the request fails with HTTP status code 400. This cannot be specified if the IPAddressProvisioningType is NoPublicIPAddresses. */ + inboundNATPools: Array; +} + +/** + * A inbound NAT Pool that can be used to address specific ports on Compute Nodes + * in a Batch Pool externally. + */ +export interface InboundNATPoolOutput { + /** The name of the endpoint. The name must be unique within a Batch Pool, can contain letters, numbers, underscores, periods, and hyphens. Names must start with a letter or number, must end with a letter, number, or underscore, and cannot exceed 77 characters. If any invalid values are provided the request fails with HTTP status code 400. */ + name: string; + /** + * The protocol of the endpoint. + * + * Possible values: tcp, udp + */ + protocol: string; + /** The port number on the Compute Node. This must be unique within a Batch Pool. Acceptable values are between 1 and 65535 except for 22, 3389, 29876 and 29877 as these are reserved. If any reserved values are provided the request fails with HTTP status code 400. */ + backendPort: number; + /** The first port number in the range of external ports that will be used to provide inbound access to the backendPort on individual Compute Nodes. Acceptable values range between 1 and 65534 except ports from 50000 to 55000 which are reserved. All ranges within a Pool must be distinct and cannot overlap. Each range must contain at least 40 ports. If any reserved or overlapping values are provided the request fails with HTTP status code 400. */ + frontendPortRangeStart: number; + /** The last port number in the range of external ports that will be used to provide inbound access to the backendPort on individual Compute Nodes. Acceptable values range between 1 and 65534 except ports from 50000 to 55000 which are reserved by the Batch service. All ranges within a Pool must be distinct and cannot overlap. Each range must contain at least 40 ports. If any reserved or overlapping values are provided the request fails with HTTP status code 400. */ + frontendPortRangeEnd: number; + /** A list of network security group rules that will be applied to the endpoint. The maximum number of rules that can be specified across all the endpoints on a Batch Pool is 25. If no network security group rules are specified, a default rule will be created to allow inbound access to the specified backendPort. If the maximum number of network security group rules is exceeded the request fails with HTTP status code 400. */ + networkSecurityGroupRules?: Array; +} + +/** A network security group rule to apply to an inbound endpoint. */ +export interface NetworkSecurityGroupRuleOutput { + /** The priority for this rule. Priorities within a Pool must be unique and are evaluated in order of priority. The lower the number the higher the priority. For example, rules could be specified with order numbers of 150, 250, and 350. The rule with the order number of 150 takes precedence over the rule that has an order of 250. Allowed priorities are 150 to 4096. If any reserved or duplicate values are provided the request fails with HTTP status code 400. */ + priority: number; + /** + * The action that should be taken for a specified IP address, subnet range or tag. + * + * Possible values: allow, deny + */ + access: string; + /** The source address prefix or tag to match for the rule. Valid values are a single IP address (i.e. 10.10.10.10), IP subnet (i.e. 192.168.1.0/24), default tag, or * (for all addresses). If any other values are provided the request fails with HTTP status code 400. */ + sourceAddressPrefix: string; + /** The source port ranges to match for the rule. Valid values are '*' (for all ports 0 - 65535), a specific port (i.e. 22), or a port range (i.e. 100-200). The ports must be in the range of 0 to 65535. Each entry in this collection must not overlap any other entry (either a range or an individual port). If any other values are provided the request fails with HTTP status code 400. The default value is '*'. */ + sourcePortRanges?: string[]; +} + +/** The public IP Address configuration of the networking configuration of a Pool. */ +export interface PublicIPAddressConfigurationOutput { + /** + * The provisioning type for Public IP Addresses for the Pool. The default value is BatchManaged. + * + * Possible values: batchmanaged, usermanaged, nopublicipaddresses + */ + provision?: string; + /** The list of public IPs which the Batch service will use when provisioning Compute Nodes. The number of IPs specified here limits the maximum size of the Pool - 100 dedicated nodes or 100 Spot/Low-priority nodes can be allocated for each public IP. For example, a pool needing 250 dedicated VMs would need at least 3 public IPs specified. Each element of this collection is of the form: /subscriptions/{subscription}/resourceGroups/{group}/providers/Microsoft.Network/publicIPAddresses/{ip}. */ + ipAddressIds?: string[]; +} + +/** + * Batch will retry Tasks when a recovery operation is triggered on a Node. + * Examples of recovery operations include (but are not limited to) when an + * unhealthy Node is rebooted or a Compute Node disappeared due to host failure. + * Retries due to recovery operations are independent of and are not counted + * against the maxTaskRetryCount. Even if the maxTaskRetryCount is 0, an internal + * retry due to a recovery operation may occur. Because of this, all Tasks should + * be idempotent. This means Tasks need to tolerate being interrupted and + * restarted without causing any corruption or duplicate data. The best practice + * for long running Tasks is to use some form of checkpointing. In some cases the + * StartTask may be re-run even though the Compute Node was not rebooted. Special + * care should be taken to avoid StartTasks which create breakaway process or + * install/launch services from the StartTask working directory, as this will + * block Batch from being able to re-run the StartTask. + */ +export interface BatchStartTaskOutput { + /** The command line of the StartTask. The command line does not run under a shell, and therefore cannot take advantage of shell features such as environment variable expansion. If you want to take advantage of such features, you should invoke the shell in the command line, for example using "cmd /c MyCommand" in Windows or "/bin/sh -c MyCommand" in Linux. If the command line refers to file paths, it should use a relative path (relative to the Task working directory), or use the Batch provided environment variable (https://docs.microsoft.com/en-us/azure/batch/batch-compute-node-environment-variables). */ + commandLine: string; + /** The settings for the container under which the StartTask runs. When this is specified, all directories recursively below the AZ_BATCH_NODE_ROOT_DIR (the root of Azure Batch directories on the node) are mapped into the container, all Task environment variables are mapped into the container, and the Task command line is executed in the container. Files produced in the container outside of AZ_BATCH_NODE_ROOT_DIR might not be reflected to the host disk, meaning that Batch file APIs will not be able to access those files. */ + containerSettings?: BatchTaskContainerSettingsOutput; + /** A list of files that the Batch service will download to the Compute Node before running the command line. There is a maximum size for the list of resource files. When the max size is exceeded, the request will fail and the response error code will be RequestEntityTooLarge. If this occurs, the collection of ResourceFiles must be reduced in size. This can be achieved using .zip files, Application Packages, or Docker Containers. Files listed under this element are located in the Task's working directory. */ + resourceFiles?: Array; + /** A list of environment variable settings for the StartTask. */ + environmentSettings?: Array; + /** The user identity under which the StartTask runs. If omitted, the Task runs as a non-administrative user unique to the Task. */ + userIdentity?: UserIdentityOutput; + /** The maximum number of times the Task may be retried. The Batch service retries a Task if its exit code is nonzero. Note that this value specifically controls the number of retries. The Batch service will try the Task once, and may then retry up to this limit. For example, if the maximum retry count is 3, Batch tries the Task up to 4 times (one initial try and 3 retries). If the maximum retry count is 0, the Batch service does not retry the Task. If the maximum retry count is -1, the Batch service retries the Task without limit, however this is not recommended for a start task or any task. The default value is 0 (no retries). */ + maxTaskRetryCount?: number; + /** Whether the Batch service should wait for the StartTask to complete successfully (that is, to exit with exit code 0) before scheduling any Tasks on the Compute Node. If true and the StartTask fails on a Node, the Batch service retries the StartTask up to its maximum retry count (maxTaskRetryCount). If the Task has still not completed successfully after all retries, then the Batch service marks the Node unusable, and will not schedule Tasks to it. This condition can be detected via the Compute Node state and failure info details. If false, the Batch service will not wait for the StartTask to complete. In this case, other Tasks can start executing on the Compute Node while the StartTask is still running; and even if the StartTask fails, new Tasks will continue to be scheduled on the Compute Node. The default is true. */ + waitForSuccess?: boolean; +} + +/** The container settings for a Task. */ +export interface BatchTaskContainerSettingsOutput { + /** Additional options to the container create command. These additional options are supplied as arguments to the "docker create" command, in addition to those controlled by the Batch Service. */ + containerRunOptions?: string; + /** The Image to use to create the container in which the Task will run. This is the full Image reference, as would be specified to "docker pull". If no tag is provided as part of the Image name, the tag ":latest" is used as a default. */ + imageName: string; + /** The private registry which contains the container Image. This setting can be omitted if was already provided at Pool creation. */ + registry?: ContainerRegistryOutput; + /** + * The location of the container Task working directory. The default is 'taskWorkingDirectory'. + * + * Possible values: taskWorkingDirectory, containerImageDefault + */ + workingDirectory?: string; +} + +/** A single file or multiple files to be downloaded to a Compute Node. */ +export interface ResourceFileOutput { + /** The storage container name in the auto storage Account. The autoStorageContainerName, storageContainerUrl and httpUrl properties are mutually exclusive and one of them must be specified. */ + autoStorageContainerName?: string; + /** The URL of the blob container within Azure Blob Storage. The autoStorageContainerName, storageContainerUrl and httpUrl properties are mutually exclusive and one of them must be specified. This URL must be readable and listable from compute nodes. There are three ways to get such a URL for a container in Azure storage: include a Shared Access Signature (SAS) granting read and list permissions on the container, use a managed identity with read and list permissions, or set the ACL for the container to allow public access. */ + storageContainerUrl?: string; + /** The URL of the file to download. The autoStorageContainerName, storageContainerUrl and httpUrl properties are mutually exclusive and one of them must be specified. If the URL points to Azure Blob Storage, it must be readable from compute nodes. There are three ways to get such a URL for a blob in Azure storage: include a Shared Access Signature (SAS) granting read permissions on the blob, use a managed identity with read permission, or set the ACL for the blob or its container to allow public access. */ + httpUrl?: string; + /** The blob prefix to use when downloading blobs from an Azure Storage container. Only the blobs whose names begin with the specified prefix will be downloaded. The property is valid only when autoStorageContainerName or storageContainerUrl is used. This prefix can be a partial filename or a subdirectory. If a prefix is not specified, all the files in the container will be downloaded. */ + blobPrefix?: string; + /** The location on the Compute Node to which to download the file(s), relative to the Task's working directory. If the httpUrl property is specified, the filePath is required and describes the path which the file will be downloaded to, including the filename. Otherwise, if the autoStorageContainerName or storageContainerUrl property is specified, filePath is optional and is the directory to download the files to. In the case where filePath is used as a directory, any directory structure already associated with the input data will be retained in full and appended to the specified filePath directory. The specified relative path cannot break out of the Task's working directory (for example by using '..'). */ + filePath?: string; + /** The file permission mode attribute in octal format. This property applies only to files being downloaded to Linux Compute Nodes. It will be ignored if it is specified for a resourceFile which will be downloaded to a Windows Compute Node. If this property is not specified for a Linux Compute Node, then a default value of 0770 is applied to the file. */ + fileMode?: string; + /** The reference to the user assigned identity to use to access Azure Blob Storage specified by storageContainerUrl or httpUrl. */ + identityReference?: BatchNodeIdentityReferenceOutput; +} + +/** An environment variable to be set on a Task process. */ +export interface EnvironmentSettingOutput { + /** The name of the environment variable. */ + name: string; + /** The value of the environment variable. */ + value?: string; +} + +/** The definition of the user identity under which the Task is run. Specify either the userName or autoUser property, but not both. */ +export interface UserIdentityOutput { + /** The name of the user identity under which the Task is run. The userName and autoUser properties are mutually exclusive; you must specify one but not both. */ + username?: string; + /** The auto user under which the Task is run. The userName and autoUser properties are mutually exclusive; you must specify one but not both. */ + autoUser?: AutoUserSpecificationOutput; +} + +/** Specifies the options for the auto user that runs an Azure Batch Task. */ +export interface AutoUserSpecificationOutput { + /** + * The scope for the auto user. The default value is pool. If the pool is running Windows a value of Task should be specified if stricter isolation between tasks is required. For example, if the task mutates the registry in a way which could impact other tasks, or if certificates have been specified on the pool which should not be accessible by normal tasks but should be accessible by StartTasks. + * + * Possible values: task, pool + */ + scope?: string; + /** + * The elevation level of the auto user. The default value is nonAdmin. + * + * Possible values: nonadmin, admin + */ + elevationLevel?: string; +} + +/** A reference to a Certificate to be installed on Compute Nodes in a Pool. Warning: This object is deprecated and will be removed after February, 2024. Please use the [Azure KeyVault Extension](https://learn.microsoft.com/azure/batch/batch-certificate-migration-guide) instead. */ +export interface BatchCertificateReferenceOutput { + /** The thumbprint of the Certificate. */ + thumbprint: string; + /** The algorithm with which the thumbprint is associated. This must be sha1. */ + thumbprintAlgorithm: string; + /** + * The location of the Certificate store on the Compute Node into which to install the Certificate. The default value is currentuser. This property is applicable only for Pools configured with Windows Compute Nodes (that is, created with cloudServiceConfiguration, or with virtualMachineConfiguration using a Windows Image reference). For Linux Compute Nodes, the Certificates are stored in a directory inside the Task working directory and an environment variable AZ_BATCH_CERTIFICATES_DIR is supplied to the Task to query for this location. For Certificates with visibility of 'remoteUser', a 'certs' directory is created in the user's home directory (e.g., /home/{user-name}/certs) and Certificates are placed in that directory. + * + * Possible values: currentuser, localmachine + */ + storeLocation?: string; + /** The name of the Certificate store on the Compute Node into which to install the Certificate. This property is applicable only for Pools configured with Windows Compute Nodes (that is, created with cloudServiceConfiguration, or with virtualMachineConfiguration using a Windows Image reference). Common store names include: My, Root, CA, Trust, Disallowed, TrustedPeople, TrustedPublisher, AuthRoot, AddressBook, but any custom store name can also be used. The default value is My. */ + storeName?: string; + /** Which user Accounts on the Compute Node should have access to the private data of the Certificate. You can specify more than one visibility in this collection. The default is all Accounts. */ + visibility?: string[]; +} + +/** A reference to an Package to be deployed to Compute Nodes. */ +export interface BatchApplicationPackageReferenceOutput { + /** The ID of the application to deploy. When creating a pool, the package's application ID must be fully qualified (/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Batch/batchAccounts/{accountName}/applications/{applicationName}). */ + applicationId: string; + /** The version of the application to deploy. If omitted, the default version is deployed. If this is omitted on a Pool, and no default version is specified for this application, the request fails with the error code InvalidApplicationPackageReferences and HTTP status code 409. If this is omitted on a Task, and no default version is specified for this application, the Task fails with a pre-processing error. */ + version?: string; +} + +/** Specifies how Tasks should be distributed across Compute Nodes. */ +export interface BatchTaskSchedulingPolicyOutput { + /** + * How Tasks are distributed across Compute Nodes in a Pool. If not specified, the default is spread. + * + * Possible values: spread, pack + */ + nodeFillType: string; +} + +/** + * Properties used to create a user used to execute Tasks on an Azure Batch + * Compute Node. + */ +export interface UserAccountOutput { + /** The name of the user Account. Names can contain any Unicode characters up to a maximum length of 20. */ + name: string; + /** The password for the user Account. */ + password: string; + /** + * The elevation level of the user Account. The default value is nonAdmin. + * + * Possible values: nonadmin, admin + */ + elevationLevel?: string; + /** The Linux-specific user configuration for the user Account. This property is ignored if specified on a Windows Pool. If not specified, the user is created with the default options. */ + linuxUserConfiguration?: LinuxUserConfigurationOutput; + /** The Windows-specific user configuration for the user Account. This property can only be specified if the user is on a Windows Pool. If not specified and on a Windows Pool, the user is created with the default options. */ + windowsUserConfiguration?: WindowsUserConfigurationOutput; +} + +/** Properties used to create a user Account on a Linux Compute Node. */ +export interface LinuxUserConfigurationOutput { + /** The user ID of the user Account. The uid and gid properties must be specified together or not at all. If not specified the underlying operating system picks the uid. */ + uid?: number; + /** The group ID for the user Account. The uid and gid properties must be specified together or not at all. If not specified the underlying operating system picks the gid. */ + gid?: number; + /** The SSH private key for the user Account. The private key must not be password protected. The private key is used to automatically configure asymmetric-key based authentication for SSH between Compute Nodes in a Linux Pool when the Pool's enableInterNodeCommunication property is true (it is ignored if enableInterNodeCommunication is false). It does this by placing the key pair into the user's .ssh directory. If not specified, password-less SSH is not configured between Compute Nodes (no modification of the user's .ssh directory is done). */ + sshPrivateKey?: string; +} + +/** Properties used to create a user Account on a Windows Compute Node. */ +export interface WindowsUserConfigurationOutput { + /** + * The login mode for the user. The default value for VirtualMachineConfiguration Pools is 'batch' and for CloudServiceConfiguration Pools is 'interactive'. + * + * Possible values: batch, interactive + */ + loginMode?: string; +} + +/** + * The Batch service does not assign any meaning to this metadata; it is solely + * for the use of user code. + */ +export interface MetadataItemOutput { + /** The name of the metadata item. */ + name: string; + /** The value of the metadata item. */ + value: string; +} + +/** The file system to mount on each node. */ +export interface MountConfigurationOutput { + /** The Azure Storage Container to mount using blob FUSE on each node. This property is mutually exclusive with all other properties. */ + azureBlobFileSystemConfiguration?: AzureBlobFileSystemConfigurationOutput; + /** The NFS file system to mount on each node. This property is mutually exclusive with all other properties. */ + nfsMountConfiguration?: NFSMountConfigurationOutput; + /** The CIFS/SMB file system to mount on each node. This property is mutually exclusive with all other properties. */ + cifsMountConfiguration?: CifsMountConfigurationOutput; + /** The Azure File Share to mount on each node. This property is mutually exclusive with all other properties. */ + azureFileShareConfiguration?: AzureFileShareConfigurationOutput; +} + +/** Information used to connect to an Azure Storage Container using Blobfuse. */ +export interface AzureBlobFileSystemConfigurationOutput { + /** The Azure Storage Account name. */ + accountName: string; + /** The Azure Blob Storage Container name. */ + containerName: string; + /** The Azure Storage Account key. This property is mutually exclusive with both sasKey and identity; exactly one must be specified. */ + accountKey?: string; + /** The Azure Storage SAS token. This property is mutually exclusive with both accountKey and identity; exactly one must be specified. */ + sasKey?: string; + /** Additional command line options to pass to the mount command. These are 'net use' options in Windows and 'mount' options in Linux. */ + blobfuseOptions?: string; + /** The relative path on the compute node where the file system will be mounted. All file systems are mounted relative to the Batch mounts directory, accessible via the AZ_BATCH_NODE_MOUNTS_DIR environment variable. */ + relativeMountPath: string; + /** The reference to the user assigned identity to use to access containerName. This property is mutually exclusive with both accountKey and sasKey; exactly one must be specified. */ + identityReference?: BatchNodeIdentityReferenceOutput; +} + +/** Information used to connect to an NFS file system. */ +export interface NFSMountConfigurationOutput { + /** The URI of the file system to mount. */ + source: string; + /** The relative path on the compute node where the file system will be mounted. All file systems are mounted relative to the Batch mounts directory, accessible via the AZ_BATCH_NODE_MOUNTS_DIR environment variable. */ + relativeMountPath: string; + /** Additional command line options to pass to the mount command. These are 'net use' options in Windows and 'mount' options in Linux. */ + mountOptions?: string; +} + +/** Information used to connect to a CIFS file system. */ +export interface CifsMountConfigurationOutput { + /** The user to use for authentication against the CIFS file system. */ + username: string; + /** The URI of the file system to mount. */ + source: string; + /** The relative path on the compute node where the file system will be mounted. All file systems are mounted relative to the Batch mounts directory, accessible via the AZ_BATCH_NODE_MOUNTS_DIR environment variable. */ + relativeMountPath: string; + /** Additional command line options to pass to the mount command. These are 'net use' options in Windows and 'mount' options in Linux. */ + mountOptions?: string; + /** The password to use for authentication against the CIFS file system. */ + password: string; +} + +/** Information used to connect to an Azure Fileshare. */ +export interface AzureFileShareConfigurationOutput { + /** The Azure Storage account name. */ + accountName: string; + /** The Azure Files URL. This is of the form 'https://{account}.file.core.windows.net/'. */ + azureFileUrl: string; + /** The Azure Storage account key. */ + accountKey: string; + /** The relative path on the compute node where the file system will be mounted. All file systems are mounted relative to the Batch mounts directory, accessible via the AZ_BATCH_NODE_MOUNTS_DIR environment variable. */ + relativeMountPath: string; + /** Additional command line options to pass to the mount command. These are 'net use' options in Windows and 'mount' options in Linux. */ + mountOptions?: string; +} + +export interface BatchPoolListResultListOutput {} + +/** The result of listing the Pools in an Account. */ +export interface BatchPoolListResultOutput { + /** The list of Pools. */ + value?: Array; + /** The URL to get the next set of results. */ + "odata.nextLink"?: string; +} + +/** A Pool in the Azure Batch service. */ +export interface BatchPoolOutput { + /** A string that uniquely identifies the Pool within the Account. The ID can contain any combination of alphanumeric characters including hyphens and underscores, and cannot contain more than 64 characters. The ID is case-preserving and case-insensitive (that is, you may not have two IDs within an Account that differ only by case). */ + readonly id?: string; + /** The display name for the Pool. The display name need not be unique and can contain any Unicode characters up to a maximum length of 1024. */ + readonly displayName?: string; + /** The URL of the Pool. */ + readonly url?: string; + /** The ETag of the Pool. This is an opaque string. You can use it to detect whether the Pool has changed between requests. In particular, you can be pass the ETag when updating a Pool to specify that your changes should take effect only if nobody else has modified the Pool in the meantime. */ + readonly eTag?: string; + /** The last modified time of the Pool. This is the last time at which the Pool level data, such as the targetDedicatedNodes or enableAutoscale settings, changed. It does not factor in node-level changes such as a Compute Node changing state. */ + readonly lastModified?: string; + /** The creation time of the Pool. */ + readonly creationTime?: string; + /** + * The current state of the Pool. + * + * Possible values: active, deleting + */ + readonly state?: string; + /** The time at which the Pool entered its current state. */ + readonly stateTransitionTime?: string; + /** + * Whether the Pool is resizing. + * + * Possible values: steady, resizing, stopping + */ + readonly allocationState?: string; + /** The time at which the Pool entered its current allocation state. */ + readonly allocationStateTransitionTime?: string; + /** The size of virtual machines in the Pool. All virtual machines in a Pool are the same size. For information about available sizes of virtual machines in Pools, see Choose a VM size for Compute Nodes in an Azure Batch Pool (https://docs.microsoft.com/azure/batch/batch-pool-vm-sizes). */ + readonly vmSize?: string; + /** The cloud service configuration for the Pool. This property and virtualMachineConfiguration are mutually exclusive and one of the properties must be specified. This property cannot be specified if the Batch Account was created with its poolAllocationMode property set to 'UserSubscription'. */ + readonly cloudServiceConfiguration?: CloudServiceConfigurationOutput; + /** The virtual machine configuration for the Pool. This property and cloudServiceConfiguration are mutually exclusive and one of the properties must be specified. */ + readonly virtualMachineConfiguration?: VirtualMachineConfigurationOutput; + /** The timeout for allocation of Compute Nodes to the Pool. This is the timeout for the most recent resize operation. (The initial sizing when the Pool is created counts as a resize.) The default value is 15 minutes. */ + readonly resizeTimeout?: string; + /** A list of errors encountered while performing the last resize on the Pool. This property is set only if one or more errors occurred during the last Pool resize, and only when the Pool allocationState is Steady. */ + readonly resizeErrors?: Array; + /** The user-specified tags associated with the pool. The user-defined tags to be associated with the Azure Batch Pool. When specified, these tags are propagated to the backing Azure resources associated with the pool. This property can only be specified when the Batch account was created with the poolAllocationMode property set to 'UserSubscription'. */ + readonly resourceTags?: Record; + /** The number of dedicated Compute Nodes currently in the Pool. */ + readonly currentDedicatedNodes?: number; + /** The number of Spot/Low-priority Compute Nodes currently in the Pool. Spot/Low-priority Compute Nodes which have been preempted are included in this count. */ + readonly currentLowPriorityNodes?: number; + /** The desired number of dedicated Compute Nodes in the Pool. */ + readonly targetDedicatedNodes?: number; + /** The desired number of Spot/Low-priority Compute Nodes in the Pool. */ + readonly targetLowPriorityNodes?: number; + /** Whether the Pool size should automatically adjust over time. If false, at least one of targetDedicatedNodes and targetLowPriorityNodes must be specified. If true, the autoScaleFormula property is required and the Pool automatically resizes according to the formula. The default value is false. */ + readonly enableAutoScale?: boolean; + /** A formula for the desired number of Compute Nodes in the Pool. This property is set only if the Pool automatically scales, i.e. enableAutoScale is true. */ + readonly autoScaleFormula?: string; + /** The time interval at which to automatically adjust the Pool size according to the autoscale formula. This property is set only if the Pool automatically scales, i.e. enableAutoScale is true. */ + readonly autoScaleEvaluationInterval?: string; + /** The results and errors from the last execution of the autoscale formula. This property is set only if the Pool automatically scales, i.e. enableAutoScale is true. */ + readonly autoScaleRun?: AutoScaleRunOutput; + /** Whether the Pool permits direct communication between Compute Nodes. This imposes restrictions on which Compute Nodes can be assigned to the Pool. Specifying this value can reduce the chance of the requested number of Compute Nodes to be allocated in the Pool. */ + readonly enableInterNodeCommunication?: boolean; + /** The network configuration for the Pool. */ + readonly networkConfiguration?: NetworkConfigurationOutput; + /** A Task specified to run on each Compute Node as it joins the Pool. */ + startTask?: BatchStartTaskOutput; + /** + * For Windows Nodes, the Batch service installs the Certificates to the specified Certificate store and location. + * For Linux Compute Nodes, the Certificates are stored in a directory inside the Task working directory and an environment variable AZ_BATCH_CERTIFICATES_DIR is supplied to the Task to query for this location. + * For Certificates with visibility of 'remoteUser', a 'certs' directory is created in the user's home directory (e.g., /home/{user-name}/certs) and Certificates are placed in that directory. + * Warning: This property is deprecated and will be removed after February, 2024. Please use the [Azure KeyVault Extension](https://learn.microsoft.com/azure/batch/batch-certificate-migration-guide) instead. + */ + readonly certificateReferences?: Array; + /** The list of Packages to be installed on each Compute Node in the Pool. Changes to Package references affect all new Nodes joining the Pool, but do not affect Compute Nodes that are already in the Pool until they are rebooted or reimaged. There is a maximum of 10 Package references on any given Pool. */ + readonly applicationPackageReferences?: Array; + /** The list of application licenses the Batch service will make available on each Compute Node in the Pool. The list of application licenses must be a subset of available Batch service application licenses. If a license is requested which is not supported, Pool creation will fail. */ + readonly applicationLicenses?: string[]; + /** The number of task slots that can be used to run concurrent tasks on a single compute node in the pool. The default value is 1. The maximum value is the smaller of 4 times the number of cores of the vmSize of the pool or 256. */ + readonly taskSlotsPerNode?: number; + /** How Tasks are distributed across Compute Nodes in a Pool. If not specified, the default is spread. */ + readonly taskSchedulingPolicy?: BatchTaskSchedulingPolicyOutput; + /** The list of user Accounts to be created on each Compute Node in the Pool. */ + readonly userAccounts?: Array; + /** A list of name-value pairs associated with the Pool as metadata. */ + readonly metadata?: Array; + /** Utilization and resource usage statistics for the entire lifetime of the Pool. This property is populated only if the CloudPool was retrieved with an expand clause including the 'stats' attribute; otherwise it is null. The statistics may not be immediately available. The Batch service performs periodic roll-up of statistics. The typical delay is about 30 minutes. */ + readonly stats?: BatchPoolStatisticsOutput; + /** A list of file systems to mount on each node in the pool. This supports Azure Files, NFS, CIFS/SMB, and Blobfuse. */ + readonly mountConfiguration?: Array; + /** The identity of the Batch pool, if configured. The list of user identities associated with the Batch pool. The user identity dictionary key references will be ARM resource ids in the form: '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}'. */ + readonly identity?: BatchPoolIdentityOutput; + /** + * The desired node communication mode for the pool. If omitted, the default value is Default. + * + * Possible values: default, classic, simplified + */ + targetNodeCommunicationMode?: string; + /** + * The current state of the pool communication mode. + * + * Possible values: default, classic, simplified + */ + readonly currentNodeCommunicationMode?: string; +} + +/** An error that occurred when resizing a Pool. */ +export interface ResizeErrorOutput { + /** An identifier for the Pool resize error. Codes are invariant and are intended to be consumed programmatically. */ + code?: string; + /** A message describing the Pool resize error, intended to be suitable for display in a user interface. */ + message?: string; + /** A list of additional error details related to the Pool resize error. */ + values?: Array; +} + +/** Represents a name-value pair. */ +export interface NameValuePairOutput { + /** The name in the name-value pair. */ + name?: string; + /** The value in the name-value pair. */ + value?: string; +} + +/** The results and errors from an execution of a Pool autoscale formula. */ +export interface AutoScaleRunOutput { + /** The time at which the autoscale formula was last evaluated. */ + timestamp: string; + /** The final values of all variables used in the evaluation of the autoscale formula. Each variable value is returned in the form $variable=value, and variables are separated by semicolons. */ + results?: string; + /** Details of the error encountered evaluating the autoscale formula on the Pool, if the evaluation was unsuccessful. */ + error?: AutoScaleRunErrorOutput; +} + +/** An error that occurred when executing or evaluating a Pool autoscale formula. */ +export interface AutoScaleRunErrorOutput { + /** An identifier for the autoscale error. Codes are invariant and are intended to be consumed programmatically. */ + code?: string; + /** A message describing the autoscale error, intended to be suitable for display in a user interface. */ + message?: string; + /** A list of additional error details related to the autoscale error. */ + values?: Array; +} + +/** Contains utilization and resource usage statistics for the lifetime of a Pool. */ +export interface BatchPoolStatisticsOutput { + /** The URL for the statistics. */ + url: string; + /** The start time of the time range covered by the statistics. */ + startTime: string; + /** The time at which the statistics were last updated. All statistics are limited to the range between startTime and lastUpdateTime. */ + lastUpdateTime: string; + /** Statistics related to Pool usage, such as the amount of core-time used. */ + usageStats?: BatchPoolUsageStatisticsOutput; + /** Statistics related to resource consumption by Compute Nodes in the Pool. */ + resourceStats?: BatchPoolResourceStatisticsOutput; +} + +/** Statistics related to Pool usage information. */ +export interface BatchPoolUsageStatisticsOutput { + /** The start time of the time range covered by the statistics. */ + startTime: string; + /** The time at which the statistics were last updated. All statistics are limited to the range between startTime and lastUpdateTime. */ + lastUpdateTime: string; + /** The aggregated wall-clock time of the dedicated Compute Node cores being part of the Pool. */ + dedicatedCoreTime: string; +} + +/** Statistics related to resource consumption by Compute Nodes in a Pool. */ +export interface BatchPoolResourceStatisticsOutput { + /** The start time of the time range covered by the statistics. */ + startTime: string; + /** The time at which the statistics were last updated. All statistics are limited to the range between startTime and lastUpdateTime. */ + lastUpdateTime: string; + /** The average CPU usage across all Compute Nodes in the Pool (percentage per node). */ + avgCPUPercentage: number; + /** The average memory usage in GiB across all Compute Nodes in the Pool. */ + avgMemoryGiB: number; + /** The peak memory usage in GiB across all Compute Nodes in the Pool. */ + peakMemoryGiB: number; + /** The average used disk space in GiB across all Compute Nodes in the Pool. */ + avgDiskGiB: number; + /** The peak used disk space in GiB across all Compute Nodes in the Pool. */ + peakDiskGiB: number; + /** The total number of disk read operations across all Compute Nodes in the Pool. */ + diskReadIOps: number; + /** The total number of disk write operations across all Compute Nodes in the Pool. */ + diskWriteIOps: number; + /** The total amount of data in GiB of disk reads across all Compute Nodes in the Pool. */ + diskReadGiB: number; + /** The total amount of data in GiB of disk writes across all Compute Nodes in the Pool. */ + diskWriteGiB: number; + /** The total amount of data in GiB of network reads across all Compute Nodes in the Pool. */ + networkReadGiB: number; + /** The total amount of data in GiB of network writes across all Compute Nodes in the Pool. */ + networkWriteGiB: number; +} + +/** The identity of the Batch pool, if configured. */ +export interface BatchPoolIdentityOutput { + /** + * The identity of the Batch pool, if configured. The list of user identities associated with the Batch pool. The user identity dictionary key references will be ARM resource ids in the form: '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}'. + * + * Possible values: UserAssigned, None + */ + type: string; + /** The list of user identities associated with the Batch account. The user identity dictionary key references will be ARM resource ids in the form: '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}'. */ + userAssignedIdentities?: Array; +} + +/** The user assigned Identity */ +export interface UserAssignedIdentityOutput { + /** The ARM resource id of the user assigned identity. */ + resourceId: string; + /** The client id of the user assigned identity. */ + readonly clientId?: string; + /** The principal id of the user assigned identity. */ + readonly principalId?: string; +} + +/** Parameters for evaluating an automatic scaling formula on an Azure Batch Pool. */ +export interface BatchPoolEvaluateAutoScaleParametersOutput { + /** The formula for the desired number of Compute Nodes in the Pool. The formula is validated and its results calculated, but it is not applied to the Pool. To apply the formula to the Pool, 'Enable automatic scaling on a Pool'. For more information about specifying this formula, see Automatically scale Compute Nodes in an Azure Batch Pool (https://azure.microsoft.com/en-us/documentation/articles/batch-automatic-scaling). */ + autoScaleFormula: string; +} + +export interface BatchAccountListSupportedImagesResultListOutput {} + +/** The result of listing the supported Virtual Machine Images. */ +export interface BatchAccountListSupportedImagesResultOutput { + /** The list of supported Virtual Machine Images. */ + value?: Array; + /** The URL to get the next set of results. */ + "odata.nextLink"?: string; +} + +/** + * A reference to the Azure Virtual Machines Marketplace Image and additional + * information about the Image. + */ +export interface ImageInfoOutput { + /** The ID of the Compute Node agent SKU which the Image supports. */ + nodeAgentSKUId: string; + /** The reference to the Azure Virtual Machine's Marketplace Image. */ + imageReference: ImageReferenceOutput; + /** + * The type of operating system (e.g. Windows or Linux) of the Image. + * + * Possible values: linux, windows + */ + osType: string; + /** The capabilities or features which the Image supports. Not every capability of the Image is listed. Capabilities in this list are considered of special interest and are generally related to integration with other features in the Azure Batch service. */ + capabilities?: string[]; + /** The time when the Azure Batch service will stop accepting create Pool requests for the Image. */ + batchSupportEndOfLife?: string; + /** + * Whether the Azure Batch service actively verifies that the Image is compatible with the associated Compute Node agent SKU. + * + * Possible values: verified, unverified + */ + verificationType: string; +} + +export interface BatchPoolNodeCountsListResultListOutput {} + +/** The result of listing the Compute Node counts in the Account. */ +export interface BatchPoolNodeCountsListResultOutput { + /** A list of Compute Node counts by Pool. */ + value?: Array; + /** The URL to get the next set of results. */ + "odata.nextLink"?: string; +} + +/** The number of Compute Nodes in each state for a Pool. */ +export interface BatchPoolNodeCountsOutput { + /** The ID of the Pool. */ + poolId: string; + /** The number of dedicated Compute Nodes in each state. */ + dedicated?: BatchNodeCountsOutput; + /** The number of Spot/Low-priority Compute Nodes in each state. */ + lowPriority?: BatchNodeCountsOutput; +} + +/** The number of Compute Nodes in each Compute Node state. */ +export interface BatchNodeCountsOutput { + /** The number of Compute Nodes in the creating state. */ + creating: number; + /** The number of Compute Nodes in the idle state. */ + idle: number; + /** The number of Compute Nodes in the offline state. */ + offline: number; + /** The number of Compute Nodes in the preempted state. */ + preempted: number; + /** The count of Compute Nodes in the rebooting state. */ + rebooting: number; + /** The number of Compute Nodes in the reimaging state. */ + reimaging: number; + /** The number of Compute Nodes in the running state. */ + running: number; + /** The number of Compute Nodes in the starting state. */ + starting: number; + /** The number of Compute Nodes in the startTaskFailed state. */ + startTaskFailed: number; + /** The number of Compute Nodes in the leavingPool state. */ + leavingPool: number; + /** The number of Compute Nodes in the unknown state. */ + unknown: number; + /** The number of Compute Nodes in the unusable state. */ + unusable: number; + /** The number of Compute Nodes in the waitingForStartTask state. */ + waitingForStartTask: number; + /** The total number of Compute Nodes. */ + total: number; +} + +/** An Azure Batch Job. */ +export interface BatchJobOutput { + /** A string that uniquely identifies the Job within the Account. The ID is case-preserving and case-insensitive (that is, you may not have two IDs within an Account that differ only by case). */ + readonly id?: string; + /** The display name for the Job. */ + readonly displayName?: string; + /** Whether Tasks in the Job can define dependencies on each other. The default is false. */ + readonly usesTaskDependencies?: boolean; + /** The URL of the Job. */ + readonly url?: string; + /** The ETag of the Job. This is an opaque string. You can use it to detect whether the Job has changed between requests. In particular, you can be pass the ETag when updating a Job to specify that your changes should take effect only if nobody else has modified the Job in the meantime. */ + readonly eTag?: string; + /** The last modified time of the Job. This is the last time at which the Job level data, such as the Job state or priority, changed. It does not factor in task-level changes such as adding new Tasks or Tasks changing state. */ + readonly lastModified?: string; + /** The creation time of the Job. */ + readonly creationTime?: string; + /** + * The current state of the Job. + * + * Possible values: active, disabling, disabled, enabling, terminating, completed, deleting + */ + readonly state?: string; + /** The time at which the Job entered its current state. */ + readonly stateTransitionTime?: string; + /** + * The previous state of the Job. This property is not set if the Job is in its initial Active state. + * + * Possible values: active, disabling, disabled, enabling, terminating, completed, deleting + */ + readonly previousState?: string; + /** The time at which the Job entered its previous state. This property is not set if the Job is in its initial Active state. */ + readonly previousStateTransitionTime?: string; + /** The priority of the Job. Priority values can range from -1000 to 1000, with -1000 being the lowest priority and 1000 being the highest priority. The default value is 0. */ + priority?: number; + /** Whether Tasks in this job can be preempted by other high priority jobs. If the value is set to True, other high priority jobs submitted to the system will take precedence and will be able requeue tasks from this job. You can update a job's allowTaskPreemption after it has been created using the update job API. */ + allowTaskPreemption?: boolean; + /** The maximum number of tasks that can be executed in parallel for the job. The value of maxParallelTasks must be -1 or greater than 0 if specified. If not specified, the default value is -1, which means there's no limit to the number of tasks that can be run at once. You can update a job's maxParallelTasks after it has been created using the update job API. */ + maxParallelTasks?: number; + /** The execution constraints for the Job. */ + constraints?: BatchJobConstraintsOutput; + /** Details of a Job Manager Task to be launched when the Job is started. */ + readonly jobManagerTask?: BatchJobManagerTaskOutput; + /** The Job Preparation Task. The Job Preparation Task is a special Task run on each Compute Node before any other Task of the Job. */ + readonly jobPreparationTask?: BatchJobPreparationTaskOutput; + /** The Job Release Task. The Job Release Task is a special Task run at the end of the Job on each Compute Node that has run any other Task of the Job. */ + readonly jobReleaseTask?: BatchJobReleaseTaskOutput; + /** The list of common environment variable settings. These environment variables are set for all Tasks in the Job (including the Job Manager, Job Preparation and Job Release Tasks). Individual Tasks can override an environment setting specified here by specifying the same setting name with a different value. */ + readonly commonEnvironmentSettings?: Array; + /** The Pool settings associated with the Job. */ + poolInfo: BatchPoolInfoOutput; + /** + * The action the Batch service should take when all Tasks in the Job are in the completed state. The default is noaction. + * + * Possible values: noaction, terminatejob + */ + onAllTasksComplete?: string; + /** + * The action the Batch service should take when any Task in the Job fails. A Task is considered to have failed if has a failureInfo. A failureInfo is set if the Task completes with a non-zero exit code after exhausting its retry count, or if there was an error starting the Task, for example due to a resource file download error. The default is noaction. + * + * Possible values: noaction, performexitoptionsjobaction + */ + readonly onTaskFailure?: string; + /** The network configuration for the Job. */ + readonly networkConfiguration?: BatchJobNetworkConfigurationOutput; + /** A list of name-value pairs associated with the Job as metadata. The Batch service does not assign any meaning to metadata; it is solely for the use of user code. */ + metadata?: Array; + /** The execution information for the Job. */ + readonly executionInfo?: BatchJobExecutionInfoOutput; + /** Resource usage statistics for the entire lifetime of the Job. This property is populated only if the CloudJob was retrieved with an expand clause including the 'stats' attribute; otherwise it is null. The statistics may not be immediately available. The Batch service performs periodic roll-up of statistics. The typical delay is about 30 minutes. */ + readonly stats?: BatchJobStatisticsOutput; +} + +/** The execution constraints for a Job. */ +export interface BatchJobConstraintsOutput { + /** The maximum elapsed time that the Job may run, measured from the time the Job is created. If the Job does not complete within the time limit, the Batch service terminates it and any Tasks that are still running. In this case, the termination reason will be MaxWallClockTimeExpiry. If this property is not specified, there is no time limit on how long the Job may run. */ + maxWallClockTime?: string; + /** The maximum number of times each Task may be retried. The Batch service retries a Task if its exit code is nonzero. Note that this value specifically controls the number of retries. The Batch service will try each Task once, and may then retry up to this limit. For example, if the maximum retry count is 3, Batch tries a Task up to 4 times (one initial try and 3 retries). If the maximum retry count is 0, the Batch service does not retry Tasks. If the maximum retry count is -1, the Batch service retries Tasks without limit. The default value is 0 (no retries). */ + maxTaskRetryCount?: number; +} + +/** + * Specifies details of a Job Manager Task. + * The Job Manager Task is automatically started when the Job is created. The + * Batch service tries to schedule the Job Manager Task before any other Tasks in + * the Job. When shrinking a Pool, the Batch service tries to preserve Nodes where + * Job Manager Tasks are running for as long as possible (that is, Compute Nodes + * running 'normal' Tasks are removed before Compute Nodes running Job Manager + * Tasks). When a Job Manager Task fails and needs to be restarted, the system + * tries to schedule it at the highest priority. If there are no idle Compute + * Nodes available, the system may terminate one of the running Tasks in the Pool + * and return it to the queue in order to make room for the Job Manager Task to + * restart. Note that a Job Manager Task in one Job does not have priority over + * Tasks in other Jobs. Across Jobs, only Job level priorities are observed. For + * example, if a Job Manager in a priority 0 Job needs to be restarted, it will + * not displace Tasks of a priority 1 Job. Batch will retry Tasks when a recovery + * operation is triggered on a Node. Examples of recovery operations include (but + * are not limited to) when an unhealthy Node is rebooted or a Compute Node + * disappeared due to host failure. Retries due to recovery operations are + * independent of and are not counted against the maxTaskRetryCount. Even if the + * maxTaskRetryCount is 0, an internal retry due to a recovery operation may + * occur. Because of this, all Tasks should be idempotent. This means Tasks need + * to tolerate being interrupted and restarted without causing any corruption or + * duplicate data. The best practice for long running Tasks is to use some form of + * checkpointing. + */ +export interface BatchJobManagerTaskOutput { + /** A string that uniquely identifies the Job Manager Task within the Job. The ID can contain any combination of alphanumeric characters including hyphens and underscores and cannot contain more than 64 characters. */ + id: string; + /** The display name of the Job Manager Task. It need not be unique and can contain any Unicode characters up to a maximum length of 1024. */ + displayName?: string; + /** The command line of the Job Manager Task. The command line does not run under a shell, and therefore cannot take advantage of shell features such as environment variable expansion. If you want to take advantage of such features, you should invoke the shell in the command line, for example using "cmd /c MyCommand" in Windows or "/bin/sh -c MyCommand" in Linux. If the command line refers to file paths, it should use a relative path (relative to the Task working directory), or use the Batch provided environment variable (https://docs.microsoft.com/en-us/azure/batch/batch-compute-node-environment-variables). */ + commandLine: string; + /** The settings for the container under which the Job Manager Task runs. If the Pool that will run this Task has containerConfiguration set, this must be set as well. If the Pool that will run this Task doesn't have containerConfiguration set, this must not be set. When this is specified, all directories recursively below the AZ_BATCH_NODE_ROOT_DIR (the root of Azure Batch directories on the node) are mapped into the container, all Task environment variables are mapped into the container, and the Task command line is executed in the container. Files produced in the container outside of AZ_BATCH_NODE_ROOT_DIR might not be reflected to the host disk, meaning that Batch file APIs will not be able to access those files. */ + containerSettings?: BatchTaskContainerSettingsOutput; + /** A list of files that the Batch service will download to the Compute Node before running the command line. Files listed under this element are located in the Task's working directory. There is a maximum size for the list of resource files. When the max size is exceeded, the request will fail and the response error code will be RequestEntityTooLarge. If this occurs, the collection of ResourceFiles must be reduced in size. This can be achieved using .zip files, Application Packages, or Docker Containers. */ + resourceFiles?: Array; + /** A list of files that the Batch service will upload from the Compute Node after running the command line. For multi-instance Tasks, the files will only be uploaded from the Compute Node on which the primary Task is executed. */ + outputFiles?: Array; + /** A list of environment variable settings for the Job Manager Task. */ + environmentSettings?: Array; + /** Constraints that apply to the Job Manager Task. */ + constraints?: BatchTaskConstraintsOutput; + /** The number of scheduling slots that the Task requires to run. The default is 1. A Task can only be scheduled to run on a compute node if the node has enough free scheduling slots available. For multi-instance Tasks, this property is not supported and must not be specified. */ + requiredSlots?: number; + /** Whether completion of the Job Manager Task signifies completion of the entire Job. If true, when the Job Manager Task completes, the Batch service marks the Job as complete. If any Tasks are still running at this time (other than Job Release), those Tasks are terminated. If false, the completion of the Job Manager Task does not affect the Job status. In this case, you should either use the onAllTasksComplete attribute to terminate the Job, or have a client or user terminate the Job explicitly. An example of this is if the Job Manager creates a set of Tasks but then takes no further role in their execution. The default value is true. If you are using the onAllTasksComplete and onTaskFailure attributes to control Job lifetime, and using the Job Manager Task only to create the Tasks for the Job (not to monitor progress), then it is important to set killJobOnCompletion to false. */ + killJobOnCompletion?: boolean; + /** The user identity under which the Job Manager Task runs. If omitted, the Task runs as a non-administrative user unique to the Task. */ + userIdentity?: UserIdentityOutput; + /** Whether the Job Manager Task requires exclusive use of the Compute Node where it runs. If true, no other Tasks will run on the same Node for as long as the Job Manager is running. If false, other Tasks can run simultaneously with the Job Manager on a Compute Node. The Job Manager Task counts normally against the Compute Node's concurrent Task limit, so this is only relevant if the Compute Node allows multiple concurrent Tasks. The default value is true. */ + runExclusive?: boolean; + /** + * A list of Application Packages that the Batch service will deploy to the + * Compute Node before running the command line.Application Packages are + * downloaded and deployed to a shared directory, not the Task working + * directory. Therefore, if a referenced Application Package is already + * on the Compute Node, and is up to date, then it is not re-downloaded; + * the existing copy on the Compute Node is used. If a referenced Application + * Package cannot be installed, for example because the package has been deleted + * or because download failed, the Task fails. + */ + applicationPackageReferences?: Array; + /** The settings for an authentication token that the Task can use to perform Batch service operations. If this property is set, the Batch service provides the Task with an authentication token which can be used to authenticate Batch service operations without requiring an Account access key. The token is provided via the AZ_BATCH_AUTHENTICATION_TOKEN environment variable. The operations that the Task can carry out using the token depend on the settings. For example, a Task can request Job permissions in order to add other Tasks to the Job, or check the status of the Job or of other Tasks under the Job. */ + authenticationTokenSettings?: AuthenticationTokenSettingsOutput; + /** Whether the Job Manager Task may run on a Spot/Low-priority Compute Node. The default value is true. */ + allowLowPriorityNode?: boolean; +} + +/** On every file uploads, Batch service writes two log files to the compute node, 'fileuploadout.txt' and 'fileuploaderr.txt'. These log files are used to learn more about a specific failure. */ +export interface OutputFileOutput { + /** A pattern indicating which file(s) to upload. Both relative and absolute paths are supported. Relative paths are relative to the Task working directory. The following wildcards are supported: * matches 0 or more characters (for example pattern abc* would match abc or abcdef), ** matches any directory, ? matches any single character, [abc] matches one character in the brackets, and [a-c] matches one character in the range. Brackets can include a negation to match any character not specified (for example [!abc] matches any character but a, b, or c). If a file name starts with "." it is ignored by default but may be matched by specifying it explicitly (for example *.gif will not match .a.gif, but .*.gif will). A simple example: **\*.txt matches any file that does not start in '.' and ends with .txt in the Task working directory or any subdirectory. If the filename contains a wildcard character it can be escaped using brackets (for example abc[*] would match a file named abc*). Note that both \ and / are treated as directory separators on Windows, but only / is on Linux. Environment variables (%var% on Windows or $var on Linux) are expanded prior to the pattern being applied. */ + filePattern: string; + /** The destination for the output file(s). */ + destination: OutputFileDestinationOutput; + /** Additional options for the upload operation, including under what conditions to perform the upload. */ + uploadOptions: OutputFileUploadOptionsOutput; +} + +/** The destination to which a file should be uploaded. */ +export interface OutputFileDestinationOutput { + /** A location in Azure blob storage to which files are uploaded. */ + container?: OutputFileBlobContainerDestinationOutput; +} + +/** Specifies a file upload destination within an Azure blob storage container. */ +export interface OutputFileBlobContainerDestinationOutput { + /** The destination blob or virtual directory within the Azure Storage container. If filePattern refers to a specific file (i.e. contains no wildcards), then path is the name of the blob to which to upload that file. If filePattern contains one or more wildcards (and therefore may match multiple files), then path is the name of the blob virtual directory (which is prepended to each blob name) to which to upload the file(s). If omitted, file(s) are uploaded to the root of the container with a blob name matching their file name. */ + path?: string; + /** The URL of the container within Azure Blob Storage to which to upload the file(s). If not using a managed identity, the URL must include a Shared Access Signature (SAS) granting write permissions to the container. */ + containerUrl: string; + /** The reference to the user assigned identity to use to access Azure Blob Storage specified by containerUrl. The identity must have write access to the Azure Blob Storage container. */ + identityReference?: BatchNodeIdentityReferenceOutput; + /** A list of name-value pairs for headers to be used in uploading output files. These headers will be specified when uploading files to Azure Storage. Official document on allowed headers when uploading blobs: https://docs.microsoft.com/en-us/rest/api/storageservices/put-blob#request-headers-all-blob-types. */ + uploadHeaders?: Array; +} + +/** An HTTP header name-value pair */ +export interface HttpHeaderOutput { + /** The case-insensitive name of the header to be used while uploading output files. */ + name: string; + /** The value of the header to be used while uploading output files. */ + value?: string; +} + +/** + * Options for an output file upload operation, including under what conditions + * to perform the upload. + */ +export interface OutputFileUploadOptionsOutput { + /** + * The conditions under which the Task output file or set of files should be uploaded. The default is taskcompletion. + * + * Possible values: tasksuccess, taskfailure, taskcompletion + */ + uploadCondition: string; +} + +/** Execution constraints to apply to a Task. */ +export interface BatchTaskConstraintsOutput { + /** The maximum elapsed time that the Task may run, measured from the time the Task starts. If the Task does not complete within the time limit, the Batch service terminates it. If this is not specified, there is no time limit on how long the Task may run. */ + maxWallClockTime?: string; + /** The minimum time to retain the Task directory on the Compute Node where it ran, from the time it completes execution. After this time, the Batch service may delete the Task directory and all its contents. The default is 7 days, i.e. the Task directory will be retained for 7 days unless the Compute Node is removed or the Job is deleted. */ + retentionTime?: string; + /** The maximum number of times the Task may be retried. The Batch service retries a Task if its exit code is nonzero. Note that this value specifically controls the number of retries for the Task executable due to a nonzero exit code. The Batch service will try the Task once, and may then retry up to this limit. For example, if the maximum retry count is 3, Batch tries the Task up to 4 times (one initial try and 3 retries). If the maximum retry count is 0, the Batch service does not retry the Task after the first attempt. If the maximum retry count is -1, the Batch service retries the Task without limit, however this is not recommended for a start task or any task. The default value is 0 (no retries). */ + maxTaskRetryCount?: number; +} + +/** + * The settings for an authentication token that the Task can use to perform Batch + * service operations. + */ +export interface AuthenticationTokenSettingsOutput { + /** The Batch resources to which the token grants access. The authentication token grants access to a limited set of Batch service operations. Currently the only supported value for the access property is 'job', which grants access to all operations related to the Job which contains the Task. */ + access?: string[]; +} + +/** + * A Job Preparation Task to run before any Tasks of the Job on any given Compute Node. + * You can use Job Preparation to prepare a Node to run Tasks for the Job. + * Activities commonly performed in Job Preparation include: Downloading common + * resource files used by all the Tasks in the Job. The Job Preparation Task can + * download these common resource files to the shared location on the Node. + * (AZ_BATCH_NODE_ROOT_DIR\shared), or starting a local service on the Node so + * that all Tasks of that Job can communicate with it. If the Job Preparation Task + * fails (that is, exhausts its retry count before exiting with exit code 0), + * Batch will not run Tasks of this Job on the Node. The Compute Node remains + * ineligible to run Tasks of this Job until it is reimaged. The Compute Node + * remains active and can be used for other Jobs. The Job Preparation Task can run + * multiple times on the same Node. Therefore, you should write the Job + * Preparation Task to handle re-execution. If the Node is rebooted, the Job + * Preparation Task is run again on the Compute Node before scheduling any other + * Task of the Job, if rerunOnNodeRebootAfterSuccess is true or if the Job + * Preparation Task did not previously complete. If the Node is reimaged, the Job + * Preparation Task is run again before scheduling any Task of the Job. Batch will + * retry Tasks when a recovery operation is triggered on a Node. Examples of + * recovery operations include (but are not limited to) when an unhealthy Node is + * rebooted or a Compute Node disappeared due to host failure. Retries due to + * recovery operations are independent of and are not counted against the + * maxTaskRetryCount. Even if the maxTaskRetryCount is 0, an internal retry due to + * a recovery operation may occur. Because of this, all Tasks should be + * idempotent. This means Tasks need to tolerate being interrupted and restarted + * without causing any corruption or duplicate data. The best practice for long + * running Tasks is to use some form of checkpointing. + */ +export interface BatchJobPreparationTaskOutput { + /** A string that uniquely identifies the Job Preparation Task within the Job. The ID can contain any combination of alphanumeric characters including hyphens and underscores and cannot contain more than 64 characters. If you do not specify this property, the Batch service assigns a default value of 'jobpreparation'. No other Task in the Job can have the same ID as the Job Preparation Task. If you try to submit a Task with the same id, the Batch service rejects the request with error code TaskIdSameAsJobPreparationTask; if you are calling the REST API directly, the HTTP status code is 409 (Conflict). */ + id?: string; + /** The command line of the Job Preparation Task. The command line does not run under a shell, and therefore cannot take advantage of shell features such as environment variable expansion. If you want to take advantage of such features, you should invoke the shell in the command line, for example using "cmd /c MyCommand" in Windows or "/bin/sh -c MyCommand" in Linux. If the command line refers to file paths, it should use a relative path (relative to the Task working directory), or use the Batch provided environment variable (https://docs.microsoft.com/en-us/azure/batch/batch-compute-node-environment-variables). */ + commandLine: string; + /** The settings for the container under which the Job Preparation Task runs. When this is specified, all directories recursively below the AZ_BATCH_NODE_ROOT_DIR (the root of Azure Batch directories on the node) are mapped into the container, all Task environment variables are mapped into the container, and the Task command line is executed in the container. Files produced in the container outside of AZ_BATCH_NODE_ROOT_DIR might not be reflected to the host disk, meaning that Batch file APIs will not be able to access those files. */ + containerSettings?: BatchTaskContainerSettingsOutput; + /** A list of files that the Batch service will download to the Compute Node before running the command line. Files listed under this element are located in the Task's working directory. There is a maximum size for the list of resource files. When the max size is exceeded, the request will fail and the response error code will be RequestEntityTooLarge. If this occurs, the collection of ResourceFiles must be reduced in size. This can be achieved using .zip files, Application Packages, or Docker Containers. */ + resourceFiles?: Array; + /** A list of environment variable settings for the Job Preparation Task. */ + environmentSettings?: Array; + /** Constraints that apply to the Job Preparation Task. */ + constraints?: BatchTaskConstraintsOutput; + /** Whether the Batch service should wait for the Job Preparation Task to complete successfully before scheduling any other Tasks of the Job on the Compute Node. A Job Preparation Task has completed successfully if it exits with exit code 0. If true and the Job Preparation Task fails on a Node, the Batch service retries the Job Preparation Task up to its maximum retry count (as specified in the constraints element). If the Task has still not completed successfully after all retries, then the Batch service will not schedule Tasks of the Job to the Node. The Node remains active and eligible to run Tasks of other Jobs. If false, the Batch service will not wait for the Job Preparation Task to complete. In this case, other Tasks of the Job can start executing on the Compute Node while the Job Preparation Task is still running; and even if the Job Preparation Task fails, new Tasks will continue to be scheduled on the Compute Node. The default value is true. */ + waitForSuccess?: boolean; + /** The user identity under which the Job Preparation Task runs. If omitted, the Task runs as a non-administrative user unique to the Task on Windows Compute Nodes, or a non-administrative user unique to the Pool on Linux Compute Nodes. */ + userIdentity?: UserIdentityOutput; + /** Whether the Batch service should rerun the Job Preparation Task after a Compute Node reboots. The Job Preparation Task is always rerun if a Compute Node is reimaged, or if the Job Preparation Task did not complete (e.g. because the reboot occurred while the Task was running). Therefore, you should always write a Job Preparation Task to be idempotent and to behave correctly if run multiple times. The default value is true. */ + rerunOnNodeRebootAfterSuccess?: boolean; +} + +/** + * A Job Release Task to run on Job completion on any Compute Node where the Job has run. + * The Job Release Task runs when the Job ends, because of one of the following: + * The user calls the Terminate Job API, or the Delete Job API while the Job is + * still active, the Job's maximum wall clock time constraint is reached, and the + * Job is still active, or the Job's Job Manager Task completed, and the Job is + * configured to terminate when the Job Manager completes. The Job Release Task + * runs on each Node where Tasks of the Job have run and the Job Preparation Task + * ran and completed. If you reimage a Node after it has run the Job Preparation + * Task, and the Job ends without any further Tasks of the Job running on that + * Node (and hence the Job Preparation Task does not re-run), then the Job Release + * Task does not run on that Compute Node. If a Node reboots while the Job Release + * Task is still running, the Job Release Task runs again when the Compute Node + * starts up. The Job is not marked as complete until all Job Release Tasks have + * completed. The Job Release Task runs in the background. It does not occupy a + * scheduling slot; that is, it does not count towards the taskSlotsPerNode limit + * specified on the Pool. + */ +export interface BatchJobReleaseTaskOutput { + /** A string that uniquely identifies the Job Release Task within the Job. The ID can contain any combination of alphanumeric characters including hyphens and underscores and cannot contain more than 64 characters. If you do not specify this property, the Batch service assigns a default value of 'jobrelease'. No other Task in the Job can have the same ID as the Job Release Task. If you try to submit a Task with the same id, the Batch service rejects the request with error code TaskIdSameAsJobReleaseTask; if you are calling the REST API directly, the HTTP status code is 409 (Conflict). */ + id?: string; + /** The command line of the Job Release Task. The command line does not run under a shell, and therefore cannot take advantage of shell features such as environment variable expansion. If you want to take advantage of such features, you should invoke the shell in the command line, for example using "cmd /c MyCommand" in Windows or "/bin/sh -c MyCommand" in Linux. If the command line refers to file paths, it should use a relative path (relative to the Task working directory), or use the Batch provided environment variable (https://docs.microsoft.com/en-us/azure/batch/batch-compute-node-environment-variables). */ + commandLine: string; + /** The settings for the container under which the Job Release Task runs. When this is specified, all directories recursively below the AZ_BATCH_NODE_ROOT_DIR (the root of Azure Batch directories on the node) are mapped into the container, all Task environment variables are mapped into the container, and the Task command line is executed in the container. Files produced in the container outside of AZ_BATCH_NODE_ROOT_DIR might not be reflected to the host disk, meaning that Batch file APIs will not be able to access those files. */ + containerSettings?: BatchTaskContainerSettingsOutput; + /** A list of files that the Batch service will download to the Compute Node before running the command line. There is a maximum size for the list of resource files. When the max size is exceeded, the request will fail and the response error code will be RequestEntityTooLarge. If this occurs, the collection of ResourceFiles must be reduced in size. This can be achieved using .zip files, Application Packages, or Docker Containers. Files listed under this element are located in the Task's working directory. */ + resourceFiles?: Array; + /** A list of environment variable settings for the Job Release Task. */ + environmentSettings?: Array; + /** The maximum elapsed time that the Job Release Task may run on a given Compute Node, measured from the time the Task starts. If the Task does not complete within the time limit, the Batch service terminates it. The default value is 15 minutes. You may not specify a timeout longer than 15 minutes. If you do, the Batch service rejects it with an error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). */ + maxWallClockTime?: string; + /** The minimum time to retain the Task directory for the Job Release Task on the Compute Node. After this time, the Batch service may delete the Task directory and all its contents. The default is 7 days, i.e. the Task directory will be retained for 7 days unless the Compute Node is removed or the Job is deleted. */ + retentionTime?: string; + /** The user identity under which the Job Release Task runs. If omitted, the Task runs as a non-administrative user unique to the Task. */ + userIdentity?: UserIdentityOutput; +} + +/** Specifies how a Job should be assigned to a Pool. */ +export interface BatchPoolInfoOutput { + /** The ID of an existing Pool. All the Tasks of the Job will run on the specified Pool. You must ensure that the Pool referenced by this property exists. If the Pool does not exist at the time the Batch service tries to schedule a Job, no Tasks for the Job will run until you create a Pool with that id. Note that the Batch service will not reject the Job request; it will simply not run Tasks until the Pool exists. You must specify either the Pool ID or the auto Pool specification, but not both. */ + poolId?: string; + /** Characteristics for a temporary 'auto pool'. The Batch service will create this auto Pool when the Job is submitted. If auto Pool creation fails, the Batch service moves the Job to a completed state, and the Pool creation error is set in the Job's scheduling error property. The Batch service manages the lifetime (both creation and, unless keepAlive is specified, deletion) of the auto Pool. Any user actions that affect the lifetime of the auto Pool while the Job is active will result in unexpected behavior. You must specify either the Pool ID or the auto Pool specification, but not both. */ + autoPoolSpecification?: BatchAutoPoolSpecificationOutput; +} + +/** + * Specifies characteristics for a temporary 'auto pool'. The Batch service will + * create this auto Pool when the Job is submitted. + */ +export interface BatchAutoPoolSpecificationOutput { + /** A prefix to be added to the unique identifier when a Pool is automatically created. The Batch service assigns each auto Pool a unique identifier on creation. To distinguish between Pools created for different purposes, you can specify this element to add a prefix to the ID that is assigned. The prefix can be up to 20 characters long. */ + autoPoolIdPrefix?: string; + /** + * The minimum lifetime of created auto Pools, and how multiple Jobs on a schedule are assigned to Pools. + * + * Possible values: jobschedule, job + */ + poolLifetimeOption: string; + /** Whether to keep an auto Pool alive after its lifetime expires. If false, the Batch service deletes the Pool once its lifetime (as determined by the poolLifetimeOption setting) expires; that is, when the Job or Job Schedule completes. If true, the Batch service does not delete the Pool automatically. It is up to the user to delete auto Pools created with this option. */ + keepAlive?: boolean; + /** The Pool specification for the auto Pool. */ + pool?: BatchPoolSpecificationOutput; +} + +/** Specification for creating a new Pool. */ +export interface BatchPoolSpecificationOutput { + /** The display name for the Pool. The display name need not be unique and can contain any Unicode characters up to a maximum length of 1024. */ + displayName?: string; + /** The size of the virtual machines in the Pool. All virtual machines in a Pool are the same size. For information about available sizes of virtual machines in Pools, see Choose a VM size for Compute Nodes in an Azure Batch Pool (https://docs.microsoft.com/azure/batch/batch-pool-vm-sizes). */ + vmSize: string; + /** The cloud service configuration for the Pool. This property must be specified if the Pool needs to be created with Azure PaaS VMs. This property and virtualMachineConfiguration are mutually exclusive and one of the properties must be specified. If neither is specified then the Batch service returns an error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). This property cannot be specified if the Batch Account was created with its poolAllocationMode property set to 'UserSubscription'. */ + cloudServiceConfiguration?: CloudServiceConfigurationOutput; + /** The virtual machine configuration for the Pool. This property must be specified if the Pool needs to be created with Azure IaaS VMs. This property and cloudServiceConfiguration are mutually exclusive and one of the properties must be specified. If neither is specified then the Batch service returns an error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). */ + virtualMachineConfiguration?: VirtualMachineConfigurationOutput; + /** The number of task slots that can be used to run concurrent tasks on a single compute node in the pool. The default value is 1. The maximum value is the smaller of 4 times the number of cores of the vmSize of the pool or 256. */ + taskSlotsPerNode?: number; + /** How Tasks are distributed across Compute Nodes in a Pool. If not specified, the default is spread. */ + taskSchedulingPolicy?: BatchTaskSchedulingPolicyOutput; + /** The timeout for allocation of Compute Nodes to the Pool. This timeout applies only to manual scaling; it has no effect when enableAutoScale is set to true. The default value is 15 minutes. The minimum value is 5 minutes. If you specify a value less than 5 minutes, the Batch service rejects the request with an error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). */ + resizeTimeout?: string; + /** The user-specified tags associated with the pool.The user-defined tags to be associated with the Azure Batch Pool. When specified, these tags are propagated to the backing Azure resources associated with the pool. This property can only be specified when the Batch account was created with the poolAllocationMode property set to 'UserSubscription'. */ + resourceTags?: string; + /** The desired number of dedicated Compute Nodes in the Pool. This property must not be specified if enableAutoScale is set to true. If enableAutoScale is set to false, then you must set either targetDedicatedNodes, targetLowPriorityNodes, or both. */ + targetDedicatedNodes?: number; + /** The desired number of Spot/Low-priority Compute Nodes in the Pool. This property must not be specified if enableAutoScale is set to true. If enableAutoScale is set to false, then you must set either targetDedicatedNodes, targetLowPriorityNodes, or both. */ + targetLowPriorityNodes?: number; + /** Whether the Pool size should automatically adjust over time. If false, at least one of targetDedicatedNodes and targetLowPriorityNodes must be specified. If true, the autoScaleFormula element is required. The Pool automatically resizes according to the formula. The default value is false. */ + enableAutoScale?: boolean; + /** The formula for the desired number of Compute Nodes in the Pool. This property must not be specified if enableAutoScale is set to false. It is required if enableAutoScale is set to true. The formula is checked for validity before the Pool is created. If the formula is not valid, the Batch service rejects the request with detailed error information. */ + autoScaleFormula?: string; + /** The time interval at which to automatically adjust the Pool size according to the autoscale formula. The default value is 15 minutes. The minimum and maximum value are 5 minutes and 168 hours respectively. If you specify a value less than 5 minutes or greater than 168 hours, the Batch service rejects the request with an invalid property value error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). */ + autoScaleEvaluationInterval?: string; + /** Whether the Pool permits direct communication between Compute Nodes. Enabling inter-node communication limits the maximum size of the Pool due to deployment restrictions on the Compute Nodes of the Pool. This may result in the Pool not reaching its desired size. The default value is false. */ + enableInterNodeCommunication?: boolean; + /** The network configuration for the Pool. */ + networkConfiguration?: NetworkConfigurationOutput; + /** A Task to run on each Compute Node as it joins the Pool. The Task runs when the Compute Node is added to the Pool or when the Compute Node is restarted. */ + startTask?: BatchStartTaskOutput; + /** + * For Windows Nodes, the Batch service installs the Certificates to the specified Certificate store and location. For Linux Compute Nodes, the Certificates are stored in a directory inside the Task working directory and an environment variable AZ_BATCH_CERTIFICATES_DIR is supplied to the Task to query for this location. For Certificates with visibility of 'remoteUser', a 'certs' directory is created in the user's home directory (e.g., /home/{user-name}/certs) and Certificates are placed in that directory. + * Warning: This property is deprecated and will be removed after February, 2024. + * Please use the [Azure KeyVault Extension](https://learn.microsoft.com/azure/batch/batch-certificate-migration-guide) instead. + */ + certificateReferences?: Array; + /** The list of Packages to be installed on each Compute Node in the Pool. When creating a pool, the package's application ID must be fully qualified (/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Batch/batchAccounts/{accountName}/applications/{applicationName}). Changes to Package references affect all new Nodes joining the Pool, but do not affect Compute Nodes that are already in the Pool until they are rebooted or reimaged. There is a maximum of 10 Package references on any given Pool. */ + applicationPackageReferences?: Array; + /** The list of application licenses the Batch service will make available on each Compute Node in the Pool. The list of application licenses must be a subset of available Batch service application licenses. If a license is requested which is not supported, Pool creation will fail. The permitted licenses available on the Pool are 'maya', 'vray', '3dsmax', 'arnold'. An additional charge applies for each application license added to the Pool. */ + applicationLicenses?: string[]; + /** The list of user Accounts to be created on each Compute Node in the Pool. */ + userAccounts?: Array; + /** A list of name-value pairs associated with the Pool as metadata. The Batch service does not assign any meaning to metadata; it is solely for the use of user code. */ + metadata?: Array; + /** A list of file systems to mount on each node in the pool. This supports Azure Files, NFS, CIFS/SMB, and Blobfuse. */ + mountConfiguration?: Array; + /** + * The desired node communication mode for the pool. If omitted, the default value is Default. + * + * Possible values: default, classic, simplified + */ + targetNodeCommunicationMode?: string; +} + +/** The network configuration for the Job. */ +export interface BatchJobNetworkConfigurationOutput { + /** The ARM resource identifier of the virtual network subnet which Compute Nodes running Tasks from the Job will join for the duration of the Task. This will only work with a VirtualMachineConfiguration Pool. The virtual network must be in the same region and subscription as the Azure Batch Account. The specified subnet should have enough free IP addresses to accommodate the number of Compute Nodes which will run Tasks from the Job. This can be up to the number of Compute Nodes in the Pool. The 'MicrosoftAzureBatch' service principal must have the 'Classic Virtual Machine Contributor' Role-Based Access Control (RBAC) role for the specified VNet so that Azure Batch service can schedule Tasks on the Nodes. This can be verified by checking if the specified VNet has any associated Network Security Groups (NSG). If communication to the Nodes in the specified subnet is denied by an NSG, then the Batch service will set the state of the Compute Nodes to unusable. This is of the form /subscriptions/{subscription}/resourceGroups/{group}/providers/{provider}/virtualNetworks/{network}/subnets/{subnet}. If the specified VNet has any associated Network Security Groups (NSG), then a few reserved system ports must be enabled for inbound communication from the Azure Batch service. For Pools created with a Virtual Machine configuration, enable ports 29876 and 29877, as well as port 22 for Linux and port 3389 for Windows. Port 443 is also required to be open for outbound connections for communications to Azure Storage. For more details see: https://docs.microsoft.com/en-us/azure/batch/batch-api-basics#virtual-network-vnet-and-firewall-configuration. */ + subnetId: string; +} + +/** Contains information about the execution of a Job in the Azure Batch service. */ +export interface BatchJobExecutionInfoOutput { + /** The start time of the Job. This is the time at which the Job was created. */ + startTime: string; + /** The completion time of the Job. This property is set only if the Job is in the completed state. */ + endTime?: string; + /** The ID of the Pool to which this Job is assigned. This element contains the actual Pool where the Job is assigned. When you get Job details from the service, they also contain a poolInfo element, which contains the Pool configuration data from when the Job was added or updated. That poolInfo element may also contain a poolId element. If it does, the two IDs are the same. If it does not, it means the Job ran on an auto Pool, and this property contains the ID of that auto Pool. */ + poolId?: string; + /** Details of any error encountered by the service in starting the Job. This property is not set if there was no error starting the Job. */ + schedulingError?: BatchJobSchedulingErrorOutput; + /** A string describing the reason the Job ended. This property is set only if the Job is in the completed state. If the Batch service terminates the Job, it sets the reason as follows: JMComplete - the Job Manager Task completed, and killJobOnCompletion was set to true. MaxWallClockTimeExpiry - the Job reached its maxWallClockTime constraint. TerminateJobSchedule - the Job ran as part of a schedule, and the schedule terminated. AllTasksComplete - the Job's onAllTasksComplete attribute is set to terminatejob, and all Tasks in the Job are complete. TaskFailed - the Job's onTaskFailure attribute is set to performExitOptionsJobAction, and a Task in the Job failed with an exit condition that specified a jobAction of terminatejob. Any other string is a user-defined reason specified in a call to the 'Terminate a Job' operation. */ + terminateReason?: string; +} + +/** An error encountered by the Batch service when scheduling a Job. */ +export interface BatchJobSchedulingErrorOutput { + /** + * The category of the Job scheduling error. + * + * Possible values: usererror, servererror + */ + category: string; + /** An identifier for the Job scheduling error. Codes are invariant and are intended to be consumed programmatically. */ + code?: string; + /** A message describing the Job scheduling error, intended to be suitable for display in a user interface. */ + message?: string; + /** A list of additional error details related to the scheduling error. */ + details?: Array; +} + +/** Resource usage statistics for a Job. */ +export interface BatchJobStatisticsOutput { + /** The URL of the statistics. */ + url: string; + /** The start time of the time range covered by the statistics. */ + startTime: string; + /** The time at which the statistics were last updated. All statistics are limited to the range between startTime and lastUpdateTime. */ + lastUpdateTime: string; + /** The total user mode CPU time (summed across all cores and all Compute Nodes) consumed by all Tasks in the Job. */ + userCPUTime: string; + /** The total kernel mode CPU time (summed across all cores and all Compute Nodes) consumed by all Tasks in the Job. */ + kernelCPUTime: string; + /** The total wall clock time of all Tasks in the Job. The wall clock time is the elapsed time from when the Task started running on a Compute Node to when it finished (or to the last time the statistics were updated, if the Task had not finished by then). If a Task was retried, this includes the wall clock time of all the Task retries. */ + wallClockTime: string; + /** The total number of disk read operations made by all Tasks in the Job. */ + readIOps: number; + /** The total number of disk write operations made by all Tasks in the Job. */ + writeIOps: number; + /** The total amount of data in GiB read from disk by all Tasks in the Job. */ + readIOGiB: number; + /** The total amount of data in GiB written to disk by all Tasks in the Job. */ + writeIOGiB: number; + /** The total number of Tasks successfully completed in the Job during the given time range. A Task completes successfully if it returns exit code 0. */ + numSucceededTasks: number; + /** The total number of Tasks in the Job that failed during the given time range. A Task fails if it exhausts its maximum retry count without returning exit code 0. */ + numFailedTasks: number; + /** The total number of retries on all the Tasks in the Job during the given time range. */ + numTaskRetries: number; + /** The total wait time of all Tasks in the Job. The wait time for a Task is defined as the elapsed time between the creation of the Task and the start of Task execution. (If the Task is retried due to failures, the wait time is the time to the most recent Task execution.) This value is only reported in the Account lifetime statistics; it is not included in the Job statistics. */ + waitTime: string; +} + +export interface BatchJobListResultListOutput {} + +/** The result of listing the Jobs in an Account. */ +export interface BatchJobListResultOutput { + /** The list of Jobs. */ + value?: Array; + /** The URL to get the next set of results. */ + "odata.nextLink"?: string; +} + +export interface BatchJobPreparationAndReleaseTaskStatusListResultListOutput {} + +/** + * The result of listing the status of the Job Preparation and Job Release Tasks + * for a Job. + */ +export interface BatchJobPreparationAndReleaseTaskStatusListResultOutput { + /** A list of Job Preparation and Job Release Task execution information. */ + value?: Array; + /** The URL to get the next set of results. */ + "odata.nextLink"?: string; +} + +/** The status of the Job Preparation and Job Release Tasks on a Compute Node. */ +export interface BatchJobPreparationAndReleaseTaskStatusOutput { + /** The ID of the Pool containing the Compute Node to which this entry refers. */ + poolId?: string; + /** The ID of the Compute Node to which this entry refers. */ + nodeId?: string; + /** The URL of the Compute Node to which this entry refers. */ + nodeUrl?: string; + /** Information about the execution status of the Job Preparation Task on this Compute Node. */ + jobPreparationTaskExecutionInfo?: BatchJobPreparationTaskExecutionInfoOutput; + /** Information about the execution status of the Job Release Task on this Compute Node. This property is set only if the Job Release Task has run on the Compute Node. */ + jobReleaseTaskExecutionInfo?: BatchJobReleaseTaskExecutionInfoOutput; +} + +/** + * Contains information about the execution of a Job Preparation Task on a Compute + * Node. + */ +export interface BatchJobPreparationTaskExecutionInfoOutput { + /** The time at which the Task started running. If the Task has been restarted or retried, this is the most recent time at which the Task started running. */ + startTime: string; + /** The time at which the Job Preparation Task completed. This property is set only if the Task is in the Completed state. */ + endTime?: string; + /** + * The current state of the Job Preparation Task on the Compute Node. + * + * Possible values: running, completed + */ + state: string; + /** The root directory of the Job Preparation Task on the Compute Node. You can use this path to retrieve files created by the Task, such as log files. */ + taskRootDirectory?: string; + /** The URL to the root directory of the Job Preparation Task on the Compute Node. */ + taskRootDirectoryUrl?: string; + /** The exit code of the program specified on the Task command line. This parameter is returned only if the Task is in the completed state. The exit code for a process reflects the specific convention implemented by the application developer for that process. If you use the exit code value to make decisions in your code, be sure that you know the exit code convention used by the application process. Note that the exit code may also be generated by the Compute Node operating system, such as when a process is forcibly terminated. */ + exitCode?: number; + /** Information about the container under which the Task is executing. This property is set only if the Task runs in a container context. */ + containerInfo?: BatchTaskContainerExecutionInfoOutput; + /** Information describing the Task failure, if any. This property is set only if the Task is in the completed state and encountered a failure. */ + failureInfo?: BatchTaskFailureInfoOutput; + /** The number of times the Task has been retried by the Batch service. Task application failures (non-zero exit code) are retried, pre-processing errors (the Task could not be run) and file upload errors are not retried. The Batch service will retry the Task up to the limit specified by the constraints. Task application failures (non-zero exit code) are retried, pre-processing errors (the Task could not be run) and file upload errors are not retried. The Batch service will retry the Task up to the limit specified by the constraints. */ + retryCount: number; + /** The most recent time at which a retry of the Job Preparation Task started running. This property is set only if the Task was retried (i.e. retryCount is nonzero). If present, this is typically the same as startTime, but may be different if the Task has been restarted for reasons other than retry; for example, if the Compute Node was rebooted during a retry, then the startTime is updated but the lastRetryTime is not. */ + lastRetryTime?: string; + /** + * The result of the Task execution. If the value is 'failed', then the details of the failure can be found in the failureInfo property. + * + * Possible values: success, failure + */ + result?: string; +} + +/** Contains information about the container which a Task is executing. */ +export interface BatchTaskContainerExecutionInfoOutput { + /** The ID of the container. */ + containerId?: string; + /** The state of the container. This is the state of the container according to the Docker service. It is equivalent to the status field returned by "docker inspect". */ + state?: string; + /** Detailed error information about the container. This is the detailed error string from the Docker service, if available. It is equivalent to the error field returned by "docker inspect". */ + error?: string; +} + +/** Information about a Task failure. */ +export interface BatchTaskFailureInfoOutput { + /** + * The category of the Task error. + * + * Possible values: usererror, servererror + */ + category: string; + /** An identifier for the Task error. Codes are invariant and are intended to be consumed programmatically. */ + code?: string; + /** A message describing the Task error, intended to be suitable for display in a user interface. */ + message?: string; + /** A list of additional details related to the error. */ + details?: Array; +} + +/** + * Contains information about the execution of a Job Release Task on a Compute + * Node. + */ +export interface BatchJobReleaseTaskExecutionInfoOutput { + /** The time at which the Task started running. If the Task has been restarted or retried, this is the most recent time at which the Task started running. */ + startTime: string; + /** The time at which the Job Release Task completed. This property is set only if the Task is in the Completed state. */ + endTime?: string; + /** + * The current state of the Job Release Task on the Compute Node. + * + * Possible values: running, completed + */ + state: string; + /** The root directory of the Job Release Task on the Compute Node. You can use this path to retrieve files created by the Task, such as log files. */ + taskRootDirectory?: string; + /** The URL to the root directory of the Job Release Task on the Compute Node. */ + taskRootDirectoryUrl?: string; + /** The exit code of the program specified on the Task command line. This parameter is returned only if the Task is in the completed state. The exit code for a process reflects the specific convention implemented by the application developer for that process. If you use the exit code value to make decisions in your code, be sure that you know the exit code convention used by the application process. Note that the exit code may also be generated by the Compute Node operating system, such as when a process is forcibly terminated. */ + exitCode?: number; + /** Information about the container under which the Task is executing. This property is set only if the Task runs in a container context. */ + containerInfo?: BatchTaskContainerExecutionInfoOutput; + /** Information describing the Task failure, if any. This property is set only if the Task is in the completed state and encountered a failure. */ + failureInfo?: BatchTaskFailureInfoOutput; + /** + * The result of the Task execution. If the value is 'failed', then the details of the failure can be found in the failureInfo property. + * + * Possible values: success, failure + */ + result?: string; +} + +/** The Task and TaskSlot counts for a Job. */ +export interface BatchTaskCountsResultOutput { + /** The number of Tasks per state. */ + taskCounts: BatchTaskCountsOutput; + /** The number of TaskSlots required by Tasks per state. */ + taskSlotCounts: BatchTaskSlotCountsOutput; +} + +/** The Task counts for a Job. */ +export interface BatchTaskCountsOutput { + /** The number of Tasks in the active state. */ + active: number; + /** The number of Tasks in the running or preparing state. */ + running: number; + /** The number of Tasks in the completed state. */ + completed: number; + /** The number of Tasks which succeeded. A Task succeeds if its result (found in the executionInfo property) is 'success'. */ + succeeded: number; + /** The number of Tasks which failed. A Task fails if its result (found in the executionInfo property) is 'failure'. */ + failed: number; +} + +/** The TaskSlot counts for a Job. */ +export interface BatchTaskSlotCountsOutput { + /** The number of TaskSlots for active Tasks. */ + active: number; + /** The number of TaskSlots for running Tasks. */ + running: number; + /** The number of TaskSlots for completed Tasks. */ + completed: number; + /** The number of TaskSlots for succeeded Tasks. */ + succeeded: number; + /** The number of TaskSlots for failed Tasks. */ + failed: number; +} + +/** + * A Certificate that can be installed on Compute Nodes and can be used to + * authenticate operations on the machine. + */ +export interface BatchCertificateOutput { + /** The X.509 thumbprint of the Certificate. This is a sequence of up to 40 hex digits (it may include spaces but these are removed). */ + thumbprint: string; + /** The algorithm used to derive the thumbprint. This must be sha1. */ + thumbprintAlgorithm: string; + /** The URL of the Certificate. */ + readonly url?: string; + /** + * The state of the Certificate. + * + * Possible values: active, deleting, deletefailed + */ + readonly state?: string; + /** The time at which the Certificate entered its current state. */ + readonly stateTransitionTime?: string; + /** + * The previous state of the Certificate. This property is not set if the Certificate is in its initial active state. + * + * Possible values: active, deleting, deletefailed + */ + readonly previousState?: string; + /** The time at which the Certificate entered its previous state. This property is not set if the Certificate is in its initial Active state. */ + readonly previousStateTransitionTime?: string; + /** The public part of the Certificate as a base-64 encoded .cer file. */ + readonly publicData?: string; + /** The error that occurred on the last attempt to delete this Certificate. This property is set only if the Certificate is in the DeleteFailed state. */ + readonly deleteCertificateError?: DeleteBatchCertificateErrorOutput; + /** The base64-encoded contents of the Certificate. The maximum size is 10KB. */ + data: string; + /** + * The format of the Certificate data. + * + * Possible values: pfx, cer + */ + certificateFormat?: string; + /** The password to access the Certificate's private key. This must be omitted if the Certificate format is cer. */ + password?: string; +} + +/** An error encountered by the Batch service when deleting a Certificate. */ +export interface DeleteBatchCertificateErrorOutput { + /** An identifier for the Certificate deletion error. Codes are invariant and are intended to be consumed programmatically. */ + code?: string; + /** A message describing the Certificate deletion error, intended to be suitable for display in a user interface. */ + message?: string; + /** A list of additional error details related to the Certificate deletion error. This list includes details such as the active Pools and Compute Nodes referencing this Certificate. However, if a large number of resources reference the Certificate, the list contains only about the first hundred. */ + values?: Array; +} + +export interface BatchCertificateListResultListOutput {} + +/** The result of listing the Certificates in the Account. */ +export interface BatchCertificateListResultOutput { + /** The list of Certificates. */ + value?: Array; + /** The URL to get the next set of results. */ + "odata.nextLink"?: string; +} + +/** + * A Job Schedule that allows recurring Jobs by specifying when to run Jobs and a + * specification used to create each Job. + */ +export interface BatchJobScheduleOutput { + /** A string that uniquely identifies the schedule within the Account. */ + readonly id?: string; + /** The display name for the schedule. */ + readonly displayName?: string; + /** The URL of the Job Schedule. */ + readonly url?: string; + /** The ETag of the Job Schedule. This is an opaque string. You can use it to detect whether the Job Schedule has changed between requests. In particular, you can be pass the ETag with an Update Job Schedule request to specify that your changes should take effect only if nobody else has modified the schedule in the meantime. */ + readonly eTag?: string; + /** The last modified time of the Job Schedule. This is the last time at which the schedule level data, such as the Job specification or recurrence information, changed. It does not factor in job-level changes such as new Jobs being created or Jobs changing state. */ + readonly lastModified?: string; + /** The creation time of the Job Schedule. */ + readonly creationTime?: string; + /** + * The current state of the Job Schedule. + * + * Possible values: active, completed, disabled, terminating, deleting + */ + readonly state?: string; + /** The time at which the Job Schedule entered the current state. */ + readonly stateTransitionTime?: string; + /** + * The previous state of the Job Schedule. This property is not present if the Job Schedule is in its initial active state. + * + * Possible values: active, completed, disabled, terminating, deleting + */ + readonly previousState?: string; + /** The time at which the Job Schedule entered its previous state. This property is not present if the Job Schedule is in its initial active state. */ + readonly previousStateTransitionTime?: string; + /** The schedule according to which Jobs will be created. All times are fixed respective to UTC and are not impacted by daylight saving time. */ + schedule?: ScheduleOutput; + /** The details of the Jobs to be created on this schedule. */ + jobSpecification: BatchJobSpecificationOutput; + /** Information about Jobs that have been and will be run under this schedule. */ + readonly executionInfo?: BatchJobScheduleExecutionInfoOutput; + /** A list of name-value pairs associated with the schedule as metadata. The Batch service does not assign any meaning to metadata; it is solely for the use of user code. */ + metadata?: Array; + /** The lifetime resource usage statistics for the Job Schedule. The statistics may not be immediately available. The Batch service performs periodic roll-up of statistics. The typical delay is about 30 minutes. */ + readonly stats?: BatchJobScheduleStatisticsOutput; +} + +/** + * The schedule according to which Jobs will be created. All times are fixed + * respective to UTC and are not impacted by daylight saving time. + */ +export interface ScheduleOutput { + /** The earliest time at which any Job may be created under this Job Schedule. If you do not specify a doNotRunUntil time, the schedule becomes ready to create Jobs immediately. */ + doNotRunUntil?: string; + /** A time after which no Job will be created under this Job Schedule. The schedule will move to the completed state as soon as this deadline is past and there is no active Job under this Job Schedule. If you do not specify a doNotRunAfter time, and you are creating a recurring Job Schedule, the Job Schedule will remain active until you explicitly terminate it. */ + doNotRunAfter?: string; + /** The time interval, starting from the time at which the schedule indicates a Job should be created, within which a Job must be created. If a Job is not created within the startWindow interval, then the 'opportunity' is lost; no Job will be created until the next recurrence of the schedule. If the schedule is recurring, and the startWindow is longer than the recurrence interval, then this is equivalent to an infinite startWindow, because the Job that is 'due' in one recurrenceInterval is not carried forward into the next recurrence interval. The default is infinite. The minimum value is 1 minute. If you specify a lower value, the Batch service rejects the schedule with an error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). */ + startWindow?: string; + /** The time interval between the start times of two successive Jobs under the Job Schedule. A Job Schedule can have at most one active Job under it at any given time. Because a Job Schedule can have at most one active Job under it at any given time, if it is time to create a new Job under a Job Schedule, but the previous Job is still running, the Batch service will not create the new Job until the previous Job finishes. If the previous Job does not finish within the startWindow period of the new recurrenceInterval, then no new Job will be scheduled for that interval. For recurring Jobs, you should normally specify a jobManagerTask in the jobSpecification. If you do not use jobManagerTask, you will need an external process to monitor when Jobs are created, add Tasks to the Jobs and terminate the Jobs ready for the next recurrence. The default is that the schedule does not recur: one Job is created, within the startWindow after the doNotRunUntil time, and the schedule is complete as soon as that Job finishes. The minimum value is 1 minute. If you specify a lower value, the Batch service rejects the schedule with an error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). */ + recurrenceInterval?: string; +} + +/** Specifies details of the Jobs to be created on a schedule. */ +export interface BatchJobSpecificationOutput { + /** The priority of Jobs created under this schedule. Priority values can range from -1000 to 1000, with -1000 being the lowest priority and 1000 being the highest priority. The default value is 0. This priority is used as the default for all Jobs under the Job Schedule. You can update a Job's priority after it has been created using by using the update Job API. */ + priority?: number; + /** Whether Tasks in this job can be preempted by other high priority jobs. If the value is set to True, other high priority jobs submitted to the system will take precedence and will be able requeue tasks from this job. You can update a job's allowTaskPreemption after it has been created using the update job API. */ + allowTaskPreemption?: boolean; + /** The maximum number of tasks that can be executed in parallel for the job. The value of maxParallelTasks must be -1 or greater than 0 if specified. If not specified, the default value is -1, which means there's no limit to the number of tasks that can be run at once. You can update a job's maxParallelTasks after it has been created using the update job API. */ + maxParallelTasks?: number; + /** The display name for Jobs created under this schedule. The name need not be unique and can contain any Unicode characters up to a maximum length of 1024. */ + displayName?: string; + /** Whether Tasks in the Job can define dependencies on each other. The default is false. */ + usesTaskDependencies?: boolean; + /** + * The action the Batch service should take when all Tasks in a Job created under this schedule are in the completed state. Note that if a Job contains no Tasks, then all Tasks are considered complete. This option is therefore most commonly used with a Job Manager task; if you want to use automatic Job termination without a Job Manager, you should initially set onAllTasksComplete to noaction and update the Job properties to set onAllTasksComplete to terminatejob once you have finished adding Tasks. The default is noaction. + * + * Possible values: noaction, terminatejob + */ + onAllTasksComplete?: string; + /** + * The action the Batch service should take when any Task fails in a Job created under this schedule. A Task is considered to have failed if it have failed if has a failureInfo. A failureInfo is set if the Task completes with a non-zero exit code after exhausting its retry count, or if there was an error starting the Task, for example due to a resource file download error. The default is noaction. + * + * Possible values: noaction, performexitoptionsjobaction + */ + onTaskFailure?: string; + /** The network configuration for the Job. */ + networkConfiguration?: BatchJobNetworkConfigurationOutput; + /** The execution constraints for Jobs created under this schedule. */ + constraints?: BatchJobConstraintsOutput; + /** The details of a Job Manager Task to be launched when a Job is started under this schedule. If the Job does not specify a Job Manager Task, the user must explicitly add Tasks to the Job using the Task API. If the Job does specify a Job Manager Task, the Batch service creates the Job Manager Task when the Job is created, and will try to schedule the Job Manager Task before scheduling other Tasks in the Job. */ + jobManagerTask?: BatchJobManagerTaskOutput; + /** The Job Preparation Task for Jobs created under this schedule. If a Job has a Job Preparation Task, the Batch service will run the Job Preparation Task on a Node before starting any Tasks of that Job on that Compute Node. */ + jobPreparationTask?: BatchJobPreparationTaskOutput; + /** The Job Release Task for Jobs created under this schedule. The primary purpose of the Job Release Task is to undo changes to Nodes made by the Job Preparation Task. Example activities include deleting local files, or shutting down services that were started as part of Job preparation. A Job Release Task cannot be specified without also specifying a Job Preparation Task for the Job. The Batch service runs the Job Release Task on the Compute Nodes that have run the Job Preparation Task. */ + jobReleaseTask?: BatchJobReleaseTaskOutput; + /** A list of common environment variable settings. These environment variables are set for all Tasks in Jobs created under this schedule (including the Job Manager, Job Preparation and Job Release Tasks). Individual Tasks can override an environment setting specified here by specifying the same setting name with a different value. */ + commonEnvironmentSettings?: Array; + /** The Pool on which the Batch service runs the Tasks of Jobs created under this schedule. */ + poolInfo: BatchPoolInfoOutput; + /** A list of name-value pairs associated with each Job created under this schedule as metadata. The Batch service does not assign any meaning to metadata; it is solely for the use of user code. */ + metadata?: Array; +} + +/** + * Contains information about Jobs that have been and will be run under a Job + * Schedule. + */ +export interface BatchJobScheduleExecutionInfoOutput { + /** The next time at which a Job will be created under this schedule. This property is meaningful only if the schedule is in the active state when the time comes around. For example, if the schedule is disabled, no Job will be created at nextRunTime unless the Job is enabled before then. */ + nextRunTime?: string; + /** Information about the most recent Job under the Job Schedule. This property is present only if the at least one Job has run under the schedule. */ + recentJob?: RecentBatchJobOutput; + /** The time at which the schedule ended. This property is set only if the Job Schedule is in the completed state. */ + endTime?: string; +} + +/** Information about the most recent Job to run under the Job Schedule. */ +export interface RecentBatchJobOutput { + /** The ID of the Job. */ + id?: string; + /** The URL of the Job. */ + url?: string; +} + +/** Resource usage statistics for a Job Schedule. */ +export interface BatchJobScheduleStatisticsOutput { + /** The URL of the statistics. */ + url: string; + /** The start time of the time range covered by the statistics. */ + startTime: string; + /** The time at which the statistics were last updated. All statistics are limited to the range between startTime and lastUpdateTime. */ + lastUpdateTime: string; + /** The total user mode CPU time (summed across all cores and all Compute Nodes) consumed by all Tasks in all Jobs created under the schedule. */ + userCPUTime: string; + /** The total kernel mode CPU time (summed across all cores and all Compute Nodes) consumed by all Tasks in all Jobs created under the schedule. */ + kernelCPUTime: string; + /** The total wall clock time of all the Tasks in all the Jobs created under the schedule. The wall clock time is the elapsed time from when the Task started running on a Compute Node to when it finished (or to the last time the statistics were updated, if the Task had not finished by then). If a Task was retried, this includes the wall clock time of all the Task retries. */ + wallClockTime: string; + /** The total number of disk read operations made by all Tasks in all Jobs created under the schedule. */ + readIOps: number; + /** The total number of disk write operations made by all Tasks in all Jobs created under the schedule. */ + writeIOps: number; + /** The total gibibytes read from disk by all Tasks in all Jobs created under the schedule. */ + readIOGiB: number; + /** The total gibibytes written to disk by all Tasks in all Jobs created under the schedule. */ + writeIOGiB: number; + /** The total number of Tasks successfully completed during the given time range in Jobs created under the schedule. A Task completes successfully if it returns exit code 0. */ + numSucceededTasks: number; + /** The total number of Tasks that failed during the given time range in Jobs created under the schedule. A Task fails if it exhausts its maximum retry count without returning exit code 0. */ + numFailedTasks: number; + /** The total number of retries during the given time range on all Tasks in all Jobs created under the schedule. */ + numTaskRetries: number; + /** The total wait time of all Tasks in all Jobs created under the schedule. The wait time for a Task is defined as the elapsed time between the creation of the Task and the start of Task execution. (If the Task is retried due to failures, the wait time is the time to the most recent Task execution.). This value is only reported in the Account lifetime statistics; it is not included in the Job statistics. */ + waitTime: string; +} + +export interface BatchJobScheduleListResultListOutput {} + +/** The result of listing the Job Schedules in an Account. */ +export interface BatchJobScheduleListResultOutput { + /** The list of Job Schedules. */ + value?: Array; + /** The URL to get the next set of results. */ + "odata.nextLink"?: string; +} + +/** Parameters for creating an Azure Batch Task. */ +export interface BatchTaskCreateParametersOutput { + /** A string that uniquely identifies the Task within the Job. The ID can contain any combination of alphanumeric characters including hyphens and underscores, and cannot contain more than 64 characters. The ID is case-preserving and case-insensitive (that is, you may not have two IDs within a Job that differ only by case). */ + id: string; + /** A display name for the Task. The display name need not be unique and can contain any Unicode characters up to a maximum length of 1024. */ + displayName?: string; + /** How the Batch service should respond when the Task completes. */ + exitConditions?: ExitConditionsOutput; + /** The command line of the Task. For multi-instance Tasks, the command line is executed as the primary Task, after the primary Task and all subtasks have finished executing the coordination command line. The command line does not run under a shell, and therefore cannot take advantage of shell features such as environment variable expansion. If you want to take advantage of such features, you should invoke the shell in the command line, for example using "cmd /c MyCommand" in Windows or "/bin/sh -c MyCommand" in Linux. If the command line refers to file paths, it should use a relative path (relative to the Task working directory), or use the Batch provided environment variable (https://docs.microsoft.com/en-us/azure/batch/batch-compute-node-environment-variables). */ + commandLine: string; + /** The settings for the container under which the Task runs. If the Pool that will run this Task has containerConfiguration set, this must be set as well. If the Pool that will run this Task doesn't have containerConfiguration set, this must not be set. When this is specified, all directories recursively below the AZ_BATCH_NODE_ROOT_DIR (the root of Azure Batch directories on the node) are mapped into the container, all Task environment variables are mapped into the container, and the Task command line is executed in the container. Files produced in the container outside of AZ_BATCH_NODE_ROOT_DIR might not be reflected to the host disk, meaning that Batch file APIs will not be able to access those files. */ + containerSettings?: BatchTaskContainerSettingsOutput; + /** A list of files that the Batch service will download to the Compute Node before running the command line. For multi-instance Tasks, the resource files will only be downloaded to the Compute Node on which the primary Task is executed. There is a maximum size for the list of resource files. When the max size is exceeded, the request will fail and the response error code will be RequestEntityTooLarge. If this occurs, the collection of ResourceFiles must be reduced in size. This can be achieved using .zip files, Application Packages, or Docker Containers. */ + resourceFiles?: Array; + /** A list of files that the Batch service will upload from the Compute Node after running the command line. For multi-instance Tasks, the files will only be uploaded from the Compute Node on which the primary Task is executed. */ + outputFiles?: Array; + /** A list of environment variable settings for the Task. */ + environmentSettings?: Array; + /** A locality hint that can be used by the Batch service to select a Compute Node on which to start the new Task. */ + affinityInfo?: AffinityInfoOutput; + /** The execution constraints that apply to this Task. If you do not specify constraints, the maxTaskRetryCount is the maxTaskRetryCount specified for the Job, the maxWallClockTime is infinite, and the retentionTime is 7 days. */ + constraints?: BatchTaskConstraintsOutput; + /** The number of scheduling slots that the Task required to run. The default is 1. A Task can only be scheduled to run on a compute node if the node has enough free scheduling slots available. For multi-instance Tasks, this must be 1. */ + requiredSlots?: number; + /** The user identity under which the Task runs. If omitted, the Task runs as a non-administrative user unique to the Task. */ + userIdentity?: UserIdentityOutput; + /** An object that indicates that the Task is a multi-instance Task, and contains information about how to run the multi-instance Task. */ + multiInstanceSettings?: MultiInstanceSettingsOutput; + /** The Tasks that this Task depends on. This Task will not be scheduled until all Tasks that it depends on have completed successfully. If any of those Tasks fail and exhaust their retry counts, this Task will never be scheduled. If the Job does not have usesTaskDependencies set to true, and this element is present, the request fails with error code TaskDependenciesNotSpecifiedOnJob. */ + dependsOn?: BatchTaskDependenciesOutput; + /** A list of Packages that the Batch service will deploy to the Compute Node before running the command line. Application packages are downloaded and deployed to a shared directory, not the Task working directory. Therefore, if a referenced package is already on the Node, and is up to date, then it is not re-downloaded; the existing copy on the Compute Node is used. If a referenced Package cannot be installed, for example because the package has been deleted or because download failed, the Task fails. */ + applicationPackageReferences?: Array; + /** The settings for an authentication token that the Task can use to perform Batch service operations. If this property is set, the Batch service provides the Task with an authentication token which can be used to authenticate Batch service operations without requiring an Account access key. The token is provided via the AZ_BATCH_AUTHENTICATION_TOKEN environment variable. The operations that the Task can carry out using the token depend on the settings. For example, a Task can request Job permissions in order to add other Tasks to the Job, or check the status of the Job or of other Tasks under the Job. */ + authenticationTokenSettings?: AuthenticationTokenSettingsOutput; +} + +/** Specifies how the Batch service should respond when the Task completes. */ +export interface ExitConditionsOutput { + /** A list of individual Task exit codes and how the Batch service should respond to them. */ + exitCodes?: Array; + /** A list of Task exit code ranges and how the Batch service should respond to them. */ + exitCodeRanges?: Array; + /** How the Batch service should respond if the Task fails to start due to an error. */ + preProcessingError?: ExitOptionsOutput; + /** How the Batch service should respond if a file upload error occurs. If the Task exited with an exit code that was specified via exitCodes or exitCodeRanges, and then encountered a file upload error, then the action specified by the exit code takes precedence. */ + fileUploadError?: ExitOptionsOutput; + /** How the Batch service should respond if the Task fails with an exit condition not covered by any of the other properties. This value is used if the Task exits with any nonzero exit code not listed in the exitCodes or exitCodeRanges collection, with a pre-processing error if the preProcessingError property is not present, or with a file upload error if the fileUploadError property is not present. If you want non-default behavior on exit code 0, you must list it explicitly using the exitCodes or exitCodeRanges collection. */ + default?: ExitOptionsOutput; +} + +/** + * How the Batch service should respond if a Task exits with a particular exit + * code. + */ +export interface ExitCodeMappingOutput { + /** A process exit code. */ + code: number; + /** How the Batch service should respond if the Task exits with this exit code. */ + exitOptions: ExitOptionsOutput; +} + +/** Specifies how the Batch service responds to a particular exit condition. */ +export interface ExitOptionsOutput { + /** + * An action to take on the Job containing the Task, if the Task completes with the given exit condition and the Job's onTaskFailed property is 'performExitOptionsJobAction'. The default is none for exit code 0 and terminate for all other exit conditions. If the Job's onTaskFailed property is noaction, then specifying this property returns an error and the add Task request fails with an invalid property value error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). + * + * Possible values: none, disable, terminate + */ + jobAction?: string; + /** + * An action that the Batch service performs on Tasks that depend on this Task. Possible values are 'satisfy' (allowing dependent tasks to progress) and 'block' (dependent tasks continue to wait). Batch does not yet support cancellation of dependent tasks. + * + * Possible values: satisfy, block + */ + dependencyAction?: string; +} + +/** + * A range of exit codes and how the Batch service should respond to exit codes + * within that range. + */ +export interface ExitCodeRangeMappingOutput { + /** The first exit code in the range. */ + start: number; + /** The last exit code in the range. */ + end: number; + /** How the Batch service should respond if the Task exits with an exit code in the range start to end (inclusive). */ + exitOptions: ExitOptionsOutput; +} + +/** + * A locality hint that can be used by the Batch service to select a Compute Node + * on which to start a Task. + */ +export interface AffinityInfoOutput { + /** An opaque string representing the location of a Compute Node or a Task that has run previously. You can pass the affinityId of a Node to indicate that this Task needs to run on that Compute Node. Note that this is just a soft affinity. If the target Compute Node is busy or unavailable at the time the Task is scheduled, then the Task will be scheduled elsewhere. */ + affinityId: string; +} + +/** + * Multi-instance Tasks are commonly used to support MPI Tasks. In the MPI case, + * if any of the subtasks fail (for example due to exiting with a non-zero exit + * code) the entire multi-instance Task fails. The multi-instance Task is then + * terminated and retried, up to its retry limit. + */ +export interface MultiInstanceSettingsOutput { + /** The number of Compute Nodes required by the Task. If omitted, the default is 1. */ + numberOfInstances?: number; + /** The command line to run on all the Compute Nodes to enable them to coordinate when the primary runs the main Task command. A typical coordination command line launches a background service and verifies that the service is ready to process inter-node messages. */ + coordinationCommandLine: string; + /** A list of files that the Batch service will download before running the coordination command line. The difference between common resource files and Task resource files is that common resource files are downloaded for all subtasks including the primary, whereas Task resource files are downloaded only for the primary. Also note that these resource files are not downloaded to the Task working directory, but instead are downloaded to the Task root directory (one directory above the working directory). There is a maximum size for the list of resource files. When the max size is exceeded, the request will fail and the response error code will be RequestEntityTooLarge. If this occurs, the collection of ResourceFiles must be reduced in size. This can be achieved using .zip files, Application Packages, or Docker Containers. */ + commonResourceFiles?: Array; +} + +/** + * Specifies any dependencies of a Task. Any Task that is explicitly specified or + * within a dependency range must complete before the dependant Task will be + * scheduled. + */ +export interface BatchTaskDependenciesOutput { + /** The list of Task IDs that this Task depends on. All Tasks in this list must complete successfully before the dependent Task can be scheduled. The taskIds collection is limited to 64000 characters total (i.e. the combined length of all Task IDs). If the taskIds collection exceeds the maximum length, the Add Task request fails with error code TaskDependencyListTooLong. In this case consider using Task ID ranges instead. */ + taskIds?: string[]; + /** The list of Task ID ranges that this Task depends on. All Tasks in all ranges must complete successfully before the dependent Task can be scheduled. */ + taskIdRanges?: Array; +} + +/** + * The start and end of the range are inclusive. For example, if a range has start + * 9 and end 12, then it represents Tasks '9', '10', '11' and '12'. + */ +export interface BatchTaskIdRangeOutput { + /** The first Task ID in the range. */ + start: number; + /** The last Task ID in the range. */ + end: number; +} + +export interface BatchTaskListResultListOutput {} + +/** The result of listing the Tasks in a Job. */ +export interface BatchTaskListResultOutput { + /** The list of Tasks. */ + value?: Array; + /** The URL to get the next set of results. */ + "odata.nextLink"?: string; +} + +/** + * Batch will retry Tasks when a recovery operation is triggered on a Node. + * Examples of recovery operations include (but are not limited to) when an + * unhealthy Node is rebooted or a Compute Node disappeared due to host failure. + * Retries due to recovery operations are independent of and are not counted + * against the maxTaskRetryCount. Even if the maxTaskRetryCount is 0, an internal + * retry due to a recovery operation may occur. Because of this, all Tasks should + * be idempotent. This means Tasks need to tolerate being interrupted and + * restarted without causing any corruption or duplicate data. The best practice + * for long running Tasks is to use some form of checkpointing. + */ +export interface BatchTaskOutput { + /** A string that uniquely identifies the Task within the Job. The ID can contain any combination of alphanumeric characters including hyphens and underscores, and cannot contain more than 64 characters. */ + readonly id?: string; + /** A display name for the Task. The display name need not be unique and can contain any Unicode characters up to a maximum length of 1024. */ + readonly displayName?: string; + /** The URL of the Task. */ + readonly url?: string; + /** The ETag of the Task. This is an opaque string. You can use it to detect whether the Task has changed between requests. In particular, you can be pass the ETag when updating a Task to specify that your changes should take effect only if nobody else has modified the Task in the meantime. */ + readonly eTag?: string; + /** The last modified time of the Task. */ + readonly lastModified?: string; + /** The creation time of the Task. */ + readonly creationTime?: string; + /** How the Batch service should respond when the Task completes. */ + readonly exitConditions?: ExitConditionsOutput; + /** + * The current state of the Task. + * + * Possible values: active, preparing, running, completed + */ + readonly state?: string; + /** The time at which the Task entered its current state. */ + readonly stateTransitionTime?: string; + /** + * The previous state of the Task. This property is not set if the Task is in its initial Active state. + * + * Possible values: active, preparing, running, completed + */ + readonly previousState?: string; + /** The time at which the Task entered its previous state. This property is not set if the Task is in its initial Active state. */ + readonly previousStateTransitionTime?: string; + /** The command line of the Task. For multi-instance Tasks, the command line is executed as the primary Task, after the primary Task and all subtasks have finished executing the coordination command line. The command line does not run under a shell, and therefore cannot take advantage of shell features such as environment variable expansion. If you want to take advantage of such features, you should invoke the shell in the command line, for example using "cmd /c MyCommand" in Windows or "/bin/sh -c MyCommand" in Linux. If the command line refers to file paths, it should use a relative path (relative to the Task working directory), or use the Batch provided environment variable (https://docs.microsoft.com/en-us/azure/batch/batch-compute-node-environment-variables). */ + readonly commandLine?: string; + /** The settings for the container under which the Task runs. If the Pool that will run this Task has containerConfiguration set, this must be set as well. If the Pool that will run this Task doesn't have containerConfiguration set, this must not be set. When this is specified, all directories recursively below the AZ_BATCH_NODE_ROOT_DIR (the root of Azure Batch directories on the node) are mapped into the container, all Task environment variables are mapped into the container, and the Task command line is executed in the container. Files produced in the container outside of AZ_BATCH_NODE_ROOT_DIR might not be reflected to the host disk, meaning that Batch file APIs will not be able to access those files. */ + readonly containerSettings?: BatchTaskContainerSettingsOutput; + /** A list of files that the Batch service will download to the Compute Node before running the command line. For multi-instance Tasks, the resource files will only be downloaded to the Compute Node on which the primary Task is executed. There is a maximum size for the list of resource files. When the max size is exceeded, the request will fail and the response error code will be RequestEntityTooLarge. If this occurs, the collection of ResourceFiles must be reduced in size. This can be achieved using .zip files, Application Packages, or Docker Containers. */ + readonly resourceFiles?: Array; + /** A list of files that the Batch service will upload from the Compute Node after running the command line. For multi-instance Tasks, the files will only be uploaded from the Compute Node on which the primary Task is executed. */ + readonly outputFiles?: Array; + /** A list of environment variable settings for the Task. */ + readonly environmentSettings?: Array; + /** A locality hint that can be used by the Batch service to select a Compute Node on which to start the new Task. */ + readonly affinityInfo?: AffinityInfoOutput; + /** The execution constraints that apply to this Task. */ + constraints?: BatchTaskConstraintsOutput; + /** The number of scheduling slots that the Task requires to run. The default is 1. A Task can only be scheduled to run on a compute node if the node has enough free scheduling slots available. For multi-instance Tasks, this must be 1. */ + readonly requiredSlots?: number; + /** The user identity under which the Task runs. If omitted, the Task runs as a non-administrative user unique to the Task. */ + readonly userIdentity?: UserIdentityOutput; + /** Information about the execution of the Task. */ + readonly executionInfo?: BatchTaskExecutionInfoOutput; + /** Information about the Compute Node on which the Task ran. */ + readonly nodeInfo?: BatchNodeInfoOutput; + /** An object that indicates that the Task is a multi-instance Task, and contains information about how to run the multi-instance Task. */ + readonly multiInstanceSettings?: MultiInstanceSettingsOutput; + /** Resource usage statistics for the Task. */ + readonly stats?: BatchTaskStatisticsOutput; + /** The Tasks that this Task depends on. This Task will not be scheduled until all Tasks that it depends on have completed successfully. If any of those Tasks fail and exhaust their retry counts, this Task will never be scheduled. */ + readonly dependsOn?: BatchTaskDependenciesOutput; + /** A list of Packages that the Batch service will deploy to the Compute Node before running the command line. Application packages are downloaded and deployed to a shared directory, not the Task working directory. Therefore, if a referenced package is already on the Node, and is up to date, then it is not re-downloaded; the existing copy on the Compute Node is used. If a referenced Package cannot be installed, for example because the package has been deleted or because download failed, the Task fails. */ + readonly applicationPackageReferences?: Array; + /** The settings for an authentication token that the Task can use to perform Batch service operations. If this property is set, the Batch service provides the Task with an authentication token which can be used to authenticate Batch service operations without requiring an Account access key. The token is provided via the AZ_BATCH_AUTHENTICATION_TOKEN environment variable. The operations that the Task can carry out using the token depend on the settings. For example, a Task can request Job permissions in order to add other Tasks to the Job, or check the status of the Job or of other Tasks under the Job. */ + readonly authenticationTokenSettings?: AuthenticationTokenSettingsOutput; +} + +/** Information about the execution of a Task. */ +export interface BatchTaskExecutionInfoOutput { + /** The time at which the Task started running. 'Running' corresponds to the running state, so if the Task specifies resource files or Packages, then the start time reflects the time at which the Task started downloading or deploying these. If the Task has been restarted or retried, this is the most recent time at which the Task started running. This property is present only for Tasks that are in the running or completed state. */ + startTime?: string; + /** The time at which the Task completed. This property is set only if the Task is in the Completed state. */ + endTime?: string; + /** The exit code of the program specified on the Task command line. This property is set only if the Task is in the completed state. In general, the exit code for a process reflects the specific convention implemented by the application developer for that process. If you use the exit code value to make decisions in your code, be sure that you know the exit code convention used by the application process. However, if the Batch service terminates the Task (due to timeout, or user termination via the API) you may see an operating system-defined exit code. */ + exitCode?: number; + /** Information about the container under which the Task is executing. This property is set only if the Task runs in a container context. */ + containerInfo?: BatchTaskContainerExecutionInfoOutput; + /** Information describing the Task failure, if any. This property is set only if the Task is in the completed state and encountered a failure. */ + failureInfo?: BatchTaskFailureInfoOutput; + /** The number of times the Task has been retried by the Batch service. Task application failures (non-zero exit code) are retried, pre-processing errors (the Task could not be run) and file upload errors are not retried. The Batch service will retry the Task up to the limit specified by the constraints. */ + retryCount: number; + /** The most recent time at which a retry of the Task started running. This element is present only if the Task was retried (i.e. retryCount is nonzero). If present, this is typically the same as startTime, but may be different if the Task has been restarted for reasons other than retry; for example, if the Compute Node was rebooted during a retry, then the startTime is updated but the lastRetryTime is not. */ + lastRetryTime?: string; + /** The number of times the Task has been requeued by the Batch service as the result of a user request. When the user removes Compute Nodes from a Pool (by resizing/shrinking the pool) or when the Job is being disabled, the user can specify that running Tasks on the Compute Nodes be requeued for execution. This count tracks how many times the Task has been requeued for these reasons. */ + requeueCount: number; + /** The most recent time at which the Task has been requeued by the Batch service as the result of a user request. This property is set only if the requeueCount is nonzero. */ + lastRequeueTime?: string; + /** + * The result of the Task execution. If the value is 'failed', then the details of the failure can be found in the failureInfo property. + * + * Possible values: success, failure + */ + result?: string; +} + +/** Information about the Compute Node on which a Task ran. */ +export interface BatchNodeInfoOutput { + /** An identifier for the Node on which the Task ran, which can be passed when adding a Task to request that the Task be scheduled on this Compute Node. */ + affinityId?: string; + /** The URL of the Compute Node on which the Task ran. */ + nodeUrl?: string; + /** The ID of the Pool on which the Task ran. */ + poolId?: string; + /** The ID of the Compute Node on which the Task ran. */ + nodeId?: string; + /** The root directory of the Task on the Compute Node. */ + taskRootDirectory?: string; + /** The URL to the root directory of the Task on the Compute Node. */ + taskRootDirectoryUrl?: string; +} + +/** Resource usage statistics for a Task. */ +export interface BatchTaskStatisticsOutput { + /** The URL of the statistics. */ + url: string; + /** The start time of the time range covered by the statistics. */ + startTime: string; + /** The time at which the statistics were last updated. All statistics are limited to the range between startTime and lastUpdateTime. */ + lastUpdateTime: string; + /** The total user mode CPU time (summed across all cores and all Compute Nodes) consumed by the Task. */ + userCPUTime: string; + /** The total kernel mode CPU time (summed across all cores and all Compute Nodes) consumed by the Task. */ + kernelCPUTime: string; + /** The total wall clock time of the Task. The wall clock time is the elapsed time from when the Task started running on a Compute Node to when it finished (or to the last time the statistics were updated, if the Task had not finished by then). If the Task was retried, this includes the wall clock time of all the Task retries. */ + wallClockTime: string; + /** The total number of disk read operations made by the Task. */ + readIOps: number; + /** The total number of disk write operations made by the Task. */ + writeIOps: number; + /** The total gibibytes read from disk by the Task. */ + readIOGiB: number; + /** The total gibibytes written to disk by the Task. */ + writeIOGiB: number; + /** The total wait time of the Task. The wait time for a Task is defined as the elapsed time between the creation of the Task and the start of Task execution. (If the Task is retried due to failures, the wait time is the time to the most recent Task execution.). */ + waitTime: string; +} + +/** A collection of Azure Batch Tasks to add. */ +export interface BatchTaskCollectionOutput { + /** The collection of Tasks to add. The maximum count of Tasks is 100. The total serialized size of this collection must be less than 1MB. If it is greater than 1MB (for example if each Task has 100's of resource files or environment variables), the request will fail with code 'RequestBodyTooLarge' and should be retried again with fewer Tasks. */ + value: Array; +} + +/** The result of adding a collection of Tasks to a Job. */ +export interface BatchTaskAddCollectionResultOutput { + /** The results of the add Task collection operation. */ + value?: Array; +} + +/** Result for a single Task added as part of an add Task collection operation. */ +export interface BatchTaskAddResultOutput { + /** + * The status of the add Task request. + * + * Possible values: success, clienterror, servererror + */ + status: string; + /** The ID of the Task for which this is the result. */ + taskId: string; + /** The ETag of the Task, if the Task was successfully added. You can use this to detect whether the Task has changed between requests. In particular, you can be pass the ETag with an Update Task request to specify that your changes should take effect only if nobody else has modified the Job in the meantime. */ + eTag?: string; + /** The last modified time of the Task. */ + lastModified?: string; + /** The URL of the Task, if the Task was successfully added. */ + location?: string; + /** The error encountered while attempting to add the Task. */ + error?: BatchErrorOutput; +} + +export interface BatchTaskListSubtasksResultListOutput {} + +/** The result of listing the subtasks of a Task. */ +export interface BatchTaskListSubtasksResultOutput { + /** The list of subtasks. */ + value?: Array; + /** The URL to get the next set of results. */ + "odata.nextLink"?: string; +} + +/** Information about an Azure Batch subtask. */ +export interface BatchSubtaskOutput { + /** The ID of the subtask. */ + id?: number; + /** Information about the Compute Node on which the subtask ran. */ + nodeInfo?: BatchNodeInfoOutput; + /** The time at which the subtask started running. If the subtask has been restarted or retried, this is the most recent time at which the subtask started running. */ + startTime?: string; + /** The time at which the subtask completed. This property is set only if the subtask is in the Completed state. */ + endTime?: string; + /** The exit code of the program specified on the subtask command line. This property is set only if the subtask is in the completed state. In general, the exit code for a process reflects the specific convention implemented by the application developer for that process. If you use the exit code value to make decisions in your code, be sure that you know the exit code convention used by the application process. However, if the Batch service terminates the subtask (due to timeout, or user termination via the API) you may see an operating system-defined exit code. */ + exitCode?: number; + /** Information about the container under which the Task is executing. This property is set only if the Task runs in a container context. */ + containerInfo?: BatchTaskContainerExecutionInfoOutput; + /** Information describing the Task failure, if any. This property is set only if the Task is in the completed state and encountered a failure. */ + failureInfo?: BatchTaskFailureInfoOutput; + /** + * The current state of the subtask. + * + * Possible values: preparing, running, completed + */ + state?: string; + /** The time at which the subtask entered its current state. */ + stateTransitionTime?: string; + /** + * The previous state of the subtask. This property is not set if the subtask is in its initial running state. + * + * Possible values: preparing, running, completed + */ + previousState?: string; + /** The time at which the subtask entered its previous state. This property is not set if the subtask is in its initial running state. */ + previousStateTransitionTime?: string; + /** + * The result of the Task execution. If the value is 'failed', then the details of the failure can be found in the failureInfo property. + * + * Possible values: success, failure + */ + result?: string; +} + +export interface BatchNodeFileListResultListOutput {} + +/** + * The result of listing the files on a Compute Node, or the files associated with + * a Task on a Compute Node. + */ +export interface BatchNodeFileListResultOutput { + /** The list of files. */ + value?: Array; + /** The URL to get the next set of results. */ + "odata.nextLink"?: string; +} + +/** Information about a file or directory on a Compute Node. */ +export interface BatchNodeFileOutput { + /** The file path. */ + name?: string; + /** The URL of the file. */ + url?: string; + /** Whether the object represents a directory. */ + isDirectory?: boolean; + /** The file properties. */ + properties?: FilePropertiesOutput; +} + +/** The properties of a file on a Compute Node. */ +export interface FilePropertiesOutput { + /** The file creation time. The creation time is not returned for files on Linux Compute Nodes. */ + creationTime?: string; + /** The time at which the file was last modified. */ + lastModified: string; + /** The length of the file. */ + contentLength: number; + /** The content type of the file. */ + contentType?: string; + /** The file mode attribute in octal format. The file mode is returned only for files on Linux Compute Nodes. */ + fileMode?: string; +} + +/** A Compute Node in the Batch service. */ +export interface BatchNodeOutput { + /** The ID of the Compute Node. Every Compute Node that is added to a Pool is assigned a unique ID. Whenever a Compute Node is removed from a Pool, all of its local files are deleted, and the ID is reclaimed and could be reused for new Compute Nodes. */ + id?: string; + /** The URL of the Compute Node. */ + url?: string; + /** + * The current state of the Compute Node. The Spot/Low-priority Compute Node has been preempted. Tasks which were running on the Compute Node when it was preempted will be rescheduled when another Compute Node becomes available. + * + * Possible values: idle, rebooting, reimaging, running, unusable, creating, starting, waitingforstarttask, starttaskfailed, unknown, leavingpool, offline, preempted + */ + state?: string; + /** + * Whether the Compute Node is available for Task scheduling. + * + * Possible values: enabled, disabled + */ + schedulingState?: string; + /** The time at which the Compute Node entered its current state. */ + stateTransitionTime?: string; + /** The last time at which the Compute Node was started. This property may not be present if the Compute Node state is unusable. */ + lastBootTime?: string; + /** The time at which this Compute Node was allocated to the Pool. This is the time when the Compute Node was initially allocated and doesn't change once set. It is not updated when the Compute Node is service healed or preempted. */ + allocationTime?: string; + /** The IP address that other Nodes can use to communicate with this Compute Node. Every Compute Node that is added to a Pool is assigned a unique IP address. Whenever a Compute Node is removed from a Pool, all of its local files are deleted, and the IP address is reclaimed and could be reused for new Compute Nodes. */ + ipAddress?: string; + /** An identifier which can be passed when adding a Task to request that the Task be scheduled on this Compute Node. Note that this is just a soft affinity. If the target Compute Node is busy or unavailable at the time the Task is scheduled, then the Task will be scheduled elsewhere. */ + affinityId?: string; + /** The size of the virtual machine hosting the Compute Node. For information about available sizes of virtual machines in Pools, see Choose a VM size for Compute Nodes in an Azure Batch Pool (https://docs.microsoft.com/azure/batch/batch-pool-vm-sizes). */ + vmSize?: string; + /** The total number of Job Tasks completed on the Compute Node. This includes Job Manager Tasks and normal Tasks, but not Job Preparation, Job Release or Start Tasks. */ + totalTasksRun?: number; + /** The total number of currently running Job Tasks on the Compute Node. This includes Job Manager Tasks and normal Tasks, but not Job Preparation, Job Release or Start Tasks. */ + runningTasksCount?: number; + /** The total number of scheduling slots used by currently running Job Tasks on the Compute Node. This includes Job Manager Tasks and normal Tasks, but not Job Preparation, Job Release or Start Tasks. */ + runningTaskSlotsCount?: number; + /** The total number of Job Tasks which completed successfully (with exitCode 0) on the Compute Node. This includes Job Manager Tasks and normal Tasks, but not Job Preparation, Job Release or Start Tasks. */ + totalTasksSucceeded?: number; + /** A list of Tasks whose state has recently changed. This property is present only if at least one Task has run on this Compute Node since it was assigned to the Pool. */ + recentTasks?: Array; + /** The Task specified to run on the Compute Node as it joins the Pool. */ + startTask?: BatchStartTaskOutput; + /** Runtime information about the execution of the StartTask on the Compute Node. */ + startTaskInfo?: BatchStartTaskInfoOutput; + /** + * For Windows Nodes, the Batch service installs the Certificates to the specified Certificate store and location. + * For Linux Compute Nodes, the Certificates are stored in a directory inside the Task working directory and an environment variable AZ_BATCH_CERTIFICATES_DIR is supplied to the Task to query for this location. + * For Certificates with visibility of 'remoteUser', a 'certs' directory is created in the user's home directory (e.g., /home/{user-name}/certs) and Certificates are placed in that directory. + * Warning: This property is deprecated and will be removed after February, 2024. Please use the [Azure KeyVault Extension](https://learn.microsoft.com/azure/batch/batch-certificate-migration-guide) instead. + */ + certificateReferences?: Array; + /** The list of errors that are currently being encountered by the Compute Node. */ + errors?: Array; + /** Whether this Compute Node is a dedicated Compute Node. If false, the Compute Node is a Spot/Low-priority Compute Node. */ + isDedicated?: boolean; + /** The endpoint configuration for the Compute Node. */ + endpointConfiguration?: BatchNodeEndpointConfigurationOutput; + /** Information about the Compute Node agent version and the time the Compute Node upgraded to a new version. */ + nodeAgentInfo?: BatchNodeAgentInfoOutput; + /** Info about the current state of the virtual machine. */ + virtualMachineInfo?: VirtualMachineInfoOutput; +} + +/** Information about a Task running on a Compute Node. */ +export interface BatchTaskInfoOutput { + /** The URL of the Task. */ + taskUrl?: string; + /** The ID of the Job to which the Task belongs. */ + jobId?: string; + /** The ID of the Task. */ + taskId?: string; + /** The ID of the subtask if the Task is a multi-instance Task. */ + subtaskId?: number; + /** + * The current state of the Task. + * + * Possible values: active, preparing, running, completed + */ + taskState: string; + /** Information about the execution of the Task. */ + executionInfo?: BatchTaskExecutionInfoOutput; +} + +/** Information about a StartTask running on a Compute Node. */ +export interface BatchStartTaskInfoOutput { + /** + * The state of the StartTask on the Compute Node. + * + * Possible values: running, completed + */ + state: string; + /** The time at which the StartTask started running. This value is reset every time the Task is restarted or retried (that is, this is the most recent time at which the StartTask started running). */ + startTime: string; + /** The time at which the StartTask stopped running. This is the end time of the most recent run of the StartTask, if that run has completed (even if that run failed and a retry is pending). This element is not present if the StartTask is currently running. */ + endTime?: string; + /** The exit code of the program specified on the StartTask command line. This property is set only if the StartTask is in the completed state. In general, the exit code for a process reflects the specific convention implemented by the application developer for that process. If you use the exit code value to make decisions in your code, be sure that you know the exit code convention used by the application process. However, if the Batch service terminates the StartTask (due to timeout, or user termination via the API) you may see an operating system-defined exit code. */ + exitCode?: number; + /** Information about the container under which the Task is executing. This property is set only if the Task runs in a container context. */ + containerInfo?: BatchTaskContainerExecutionInfoOutput; + /** Information describing the Task failure, if any. This property is set only if the Task is in the completed state and encountered a failure. */ + failureInfo?: BatchTaskFailureInfoOutput; + /** The number of times the Task has been retried by the Batch service. Task application failures (non-zero exit code) are retried, pre-processing errors (the Task could not be run) and file upload errors are not retried. The Batch service will retry the Task up to the limit specified by the constraints. */ + retryCount: number; + /** The most recent time at which a retry of the Task started running. This element is present only if the Task was retried (i.e. retryCount is nonzero). If present, this is typically the same as startTime, but may be different if the Task has been restarted for reasons other than retry; for example, if the Compute Node was rebooted during a retry, then the startTime is updated but the lastRetryTime is not. */ + lastRetryTime?: string; + /** + * The result of the Task execution. If the value is 'failed', then the details of the failure can be found in the failureInfo property. + * + * Possible values: success, failure + */ + result?: string; +} + +/** An error encountered by a Compute Node. */ +export interface BatchNodeErrorOutput { + /** An identifier for the Compute Node error. Codes are invariant and are intended to be consumed programmatically. */ + code?: string; + /** A message describing the Compute Node error, intended to be suitable for display in a user interface. */ + message?: string; + /** The list of additional error details related to the Compute Node error. */ + errorDetails?: Array; +} + +/** The endpoint configuration for the Compute Node. */ +export interface BatchNodeEndpointConfigurationOutput { + /** The list of inbound endpoints that are accessible on the Compute Node. */ + inboundEndpoints: Array; +} + +/** An inbound endpoint on a Compute Node. */ +export interface InboundEndpointOutput { + /** The name of the endpoint. */ + name: string; + /** + * The protocol of the endpoint. + * + * Possible values: tcp, udp + */ + protocol: string; + /** The public IP address of the Compute Node. */ + publicIPAddress: string; + /** The public fully qualified domain name for the Compute Node. */ + publicFQDN: string; + /** The public port number of the endpoint. */ + frontendPort: number; + /** The backend port number of the endpoint. */ + backendPort: number; +} + +/** + * The Batch Compute Node agent is a program that runs on each Compute Node in the + * Pool and provides Batch capability on the Compute Node. + */ +export interface BatchNodeAgentInfoOutput { + /** The version of the Batch Compute Node agent running on the Compute Node. This version number can be checked against the Compute Node agent release notes located at https://github.com/Azure/Batch/blob/master/changelogs/nodeagent/CHANGELOG.md. */ + version: string; + /** The time when the Compute Node agent was updated on the Compute Node. This is the most recent time that the Compute Node agent was updated to a new version. */ + lastUpdateTime: string; +} + +/** Info about the current state of the virtual machine. */ +export interface VirtualMachineInfoOutput { + /** The reference to the Azure Virtual Machine's Marketplace Image. */ + imageReference?: ImageReferenceOutput; + /** The resource ID of the Compute Node's current Virtual Machine Scale Set VM. Only defined if the Batch Account was created with its poolAllocationMode property set to 'UserSubscription'. */ + scaleSetVmResourceId?: string; +} + +/** The remote login settings for a Compute Node. */ +export interface BatchNodeRemoteLoginSettingsOutput { + /** The IP address used for remote login to the Compute Node. */ + remoteLoginIPAddress: string; + /** The port used for remote login to the Compute Node. */ + remoteLoginPort: number; +} + +/** The Azure Batch service log files upload parameters for a Compute Node. */ +export interface UploadBatchServiceLogsParametersOutput { + /** The URL of the container within Azure Blob Storage to which to upload the Batch Service log file(s). If a user assigned managed identity is not being used, the URL must include a Shared Access Signature (SAS) granting write permissions to the container. The SAS duration must allow enough time for the upload to finish. The start time for SAS is optional and recommended to not be specified. */ + containerUrl: string; + /** The start of the time range from which to upload Batch Service log file(s). Any log file containing a log message in the time range will be uploaded. This means that the operation might retrieve more logs than have been requested since the entire log file is always uploaded, but the operation should not retrieve fewer logs than have been requested. */ + startTime: string; + /** The end of the time range from which to upload Batch Service log file(s). Any log file containing a log message in the time range will be uploaded. This means that the operation might retrieve more logs than have been requested since the entire log file is always uploaded, but the operation should not retrieve fewer logs than have been requested. If omitted, the default is to upload all logs available after the startTime. */ + endTime?: string; + /** The reference to the user assigned identity to use to access Azure Blob Storage specified by containerUrl. The identity must have write access to the Azure Blob Storage container. */ + identityReference?: BatchNodeIdentityReferenceOutput; +} + +/** The result of uploading Batch service log files from a specific Compute Node. */ +export interface UploadBatchServiceLogsResultOutput { + /** The virtual directory within Azure Blob Storage container to which the Batch Service log file(s) will be uploaded. The virtual directory name is part of the blob name for each log file uploaded, and it is built based poolId, nodeId and a unique identifier. */ + virtualDirectoryName: string; + /** The number of log files which will be uploaded. */ + numberOfFilesUploaded: number; +} + +export interface BatchNodeListResultListOutput {} + +/** The result of listing the Compute Nodes in a Pool. */ +export interface BatchNodeListResultOutput { + /** The list of Compute Nodes. */ + value?: Array; + /** The URL to get the next set of results. */ + "odata.nextLink"?: string; +} + +/** The configuration for virtual machine extension instance view. */ +export interface BatchNodeVMExtensionOutput { + /** The provisioning state of the virtual machine extension. */ + provisioningState?: string; + /** The virtual machine extension. */ + vmExtension?: VMExtensionOutput; + /** The vm extension instance view. */ + instanceView?: VMExtensionInstanceViewOutput; +} + +/** The vm extension instance view. */ +export interface VMExtensionInstanceViewOutput { + /** The name of the vm extension instance view. */ + name?: string; + /** The resource status information. */ + statuses?: Array; + /** The resource status information. */ + subStatuses?: Array; +} + +/** The instance view status. */ +export interface InstanceViewStatusOutput { + /** The status code. */ + code?: string; + /** The localized label for the status. */ + displayStatus?: string; + /** + * Level code. + * + * Possible values: Error, Info, Warning + */ + level?: string; + /** The detailed status message. */ + message?: string; + /** The time of the status. */ + time?: string; +} + +export interface BatchNodeVMExtensionListResultListOutput {} + +/** The result of listing the Compute Node extensions in a Node. */ +export interface BatchNodeVMExtensionListResultOutput { + /** The list of Compute Node extensions. */ + value?: Array; + /** The URL to get the next set of results. */ + "odata.nextLink"?: string; +} diff --git a/packages/service/src/internal/batch-rest/generated/src/paginateHelper.ts b/packages/service/src/internal/batch-rest/generated/src/paginateHelper.ts new file mode 100644 index 000000000..95baa6a40 --- /dev/null +++ b/packages/service/src/internal/batch-rest/generated/src/paginateHelper.ts @@ -0,0 +1,200 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { + getPagedAsyncIterator, + PagedAsyncIterableIterator, + PagedResult, +} from "@azure/core-paging"; +import { + Client, + createRestError, + PathUncheckedResponse, +} from "@azure-rest/core-client"; + +/** + * Helper type to extract the type of an array + */ +export type GetArrayType = T extends Array ? TData : never; + +/** + * The type of a custom function that defines how to get a page and a link to the next one if any. + */ +export type GetPage = ( + pageLink: string, + maxPageSize?: number +) => Promise<{ + page: TPage; + nextPageLink?: string; +}>; + +/** + * Options for the paging helper + */ +export interface PagingOptions { + /** + * Custom function to extract pagination details for crating the PagedAsyncIterableIterator + */ + customGetPage?: GetPage[]>; +} + +/** + * Helper type to infer the Type of the paged elements from the response type + * This type is generated based on the swagger information for x-ms-pageable + * specifically on the itemName property which indicates the property of the response + * where the page items are found. The default value is `value`. + * This type will allow us to provide strongly typed Iterator based on the response we get as second parameter + */ +export type PaginateReturn = TResult extends { + body: { value?: infer TPage }; +} + ? GetArrayType + : Array; + +/** + * Helper to paginate results from an initial response that follows the specification of Autorest `x-ms-pageable` extension + * @param client - Client to use for sending the next page requests + * @param initialResponse - Initial response containing the nextLink and current page of elements + * @param customGetPage - Optional - Function to define how to extract the page and next link to be used to paginate the results + * @returns - PagedAsyncIterableIterator to iterate the elements + */ +export function paginate( + client: Client, + initialResponse: TResponse, + options: PagingOptions = {} +): PagedAsyncIterableIterator> { + // Extract element type from initial response + type TElement = PaginateReturn; + let firstRun = true; + // We need to check the response for success before trying to inspect it looking for + // the properties to use for nextLink and itemName + checkPagingRequest(initialResponse); + const { itemName, nextLinkName } = getPaginationProperties(initialResponse); + const { customGetPage } = options; + const pagedResult: PagedResult = { + firstPageLink: "", + getPage: + typeof customGetPage === "function" + ? customGetPage + : async (pageLink: string) => { + const result = firstRun + ? initialResponse + : await client.pathUnchecked(pageLink).get(); + firstRun = false; + checkPagingRequest(result); + const nextLink = getNextLink(result.body, nextLinkName); + const values = getElements(result.body, itemName); + return { + page: values, + nextPageLink: nextLink, + }; + }, + }; + + return getPagedAsyncIterator(pagedResult); +} + +/** + * Gets for the value of nextLink in the body + */ +function getNextLink(body: unknown, nextLinkName?: string): string | undefined { + if (!nextLinkName) { + return undefined; + } + + const nextLink = (body as Record)[nextLinkName]; + + if (typeof nextLink !== "string" && typeof nextLink !== "undefined") { + throw new Error( + `Body Property ${nextLinkName} should be a string or undefined` + ); + } + + return nextLink; +} + +/** + * Gets the elements of the current request in the body. + */ +function getElements(body: unknown, itemName: string): T[] { + const value = (body as Record)[itemName] as T[]; + + // value has to be an array according to the x-ms-pageable extension. + // The fact that this must be an array is used above to calculate the + // type of elements in the page in PaginateReturn + if (!Array.isArray(value)) { + throw new Error( + `Couldn't paginate response\n Body doesn't contain an array property with name: ${itemName}` + ); + } + + return value ?? []; +} + +/** + * Checks if a request failed + */ +function checkPagingRequest(response: PathUncheckedResponse): void { + const Http2xxStatusCodes = [ + "200", + "201", + "202", + "203", + "204", + "205", + "206", + "207", + "208", + "226", + ]; + if (!Http2xxStatusCodes.includes(response.status)) { + throw createRestError( + `Pagination failed with unexpected statusCode ${response.status}`, + response + ); + } +} + +/** + * Extracts the itemName and nextLinkName from the initial response to use them for pagination + */ +function getPaginationProperties(initialResponse: PathUncheckedResponse) { + // Build a set with the passed custom nextLinkNames + const nextLinkNames = new Set(["nextLink", "odata.nextLink"]); + + // Build a set with the passed custom set of itemNames + const itemNames = new Set(["value"]); + + let nextLinkName: string | undefined; + let itemName: string | undefined; + + for (const name of nextLinkNames) { + const nextLink = (initialResponse.body as Record)[ + name + ] as string; + if (nextLink) { + nextLinkName = name; + break; + } + } + + for (const name of itemNames) { + const item = (initialResponse.body as Record)[ + name + ] as string; + if (item) { + itemName = name; + break; + } + } + + if (!itemName) { + throw new Error( + `Couldn't paginate response\n Body doesn't contain an array property with name: ${[ + ...itemNames, + ].join(" OR ")}` + ); + } + + return { itemName, nextLinkName }; +} diff --git a/packages/service/src/internal/batch-rest/generated/src/parameters.ts b/packages/service/src/internal/batch-rest/generated/src/parameters.ts new file mode 100644 index 000000000..06b251179 --- /dev/null +++ b/packages/service/src/internal/batch-rest/generated/src/parameters.ts @@ -0,0 +1,4027 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { RawHttpHeadersInput } from "@azure/core-rest-pipeline"; +import { RequestParameters } from "@azure-rest/core-client"; +import { + BatchPoolCreateParameters, + BatchPoolUpdateParameters, + BatchPoolEnableAutoScaleParameters, + BatchPoolEvaluateAutoScaleParameters, + BatchPoolResizeParameters, + BatchPoolReplaceParameters, + BatchNodeRemoveParameters, + BatchJobUpdateParameters, + BatchJob, + BatchJobDisableParameters, + BatchJobTerminateParameters, + BatchJobCreateParameters, + BatchCertificate, + BatchJobScheduleUpdateParameters, + BatchJobSchedule, + BatchJobScheduleCreateParameters, + BatchTaskCreateParameters, + BatchTaskCollection, + BatchTask, + BatchNodeUserCreateParameters, + BatchNodeUserUpdateParameters, + BatchNodeRebootParameters, + BatchNodeReimageParameters, + BatchNodeDisableSchedulingParameters, + UploadBatchServiceLogsParameters, +} from "./models"; + +export interface ListApplicationsHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface ListApplicationsQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; + /** + * The maximum number of items to return in the response. A maximum of 1000 + * applications can be returned. + */ + maxresults?: number; +} + +export interface ListApplicationsQueryParam { + queryParameters?: ListApplicationsQueryParamProperties; +} + +export interface ListApplicationsHeaderParam { + headers?: RawHttpHeadersInput & ListApplicationsHeaders; +} + +export type ListApplicationsParameters = ListApplicationsQueryParam & + ListApplicationsHeaderParam & + RequestParameters; + +export interface GetApplicationHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface GetApplicationQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface GetApplicationQueryParam { + queryParameters?: GetApplicationQueryParamProperties; +} + +export interface GetApplicationHeaderParam { + headers?: RawHttpHeadersInput & GetApplicationHeaders; +} + +export type GetApplicationParameters = GetApplicationQueryParam & + GetApplicationHeaderParam & + RequestParameters; + +export interface ListPoolUsageMetricsHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface ListPoolUsageMetricsQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; + /** + * The maximum number of items to return in the response. A maximum of 1000 + * applications can be returned. + */ + maxresults?: number; + /** + * The earliest time from which to include metrics. This must be at least two and + * a half hours before the current time. If not specified this defaults to the + * start time of the last aggregation interval currently available. + */ + startTime?: Date | string; + /** + * The latest time from which to include metrics. This must be at least two hours + * before the current time. If not specified this defaults to the end time of the + * last aggregation interval currently available. + */ + endtime?: Date | string; + /** + * An OData $filter clause. For more information on constructing this filter, see + * https://docs.microsoft.com/en-us/rest/api/batchservice/odata-filters-in-batch#list-account-usage-metrics. + */ + $filter?: string; +} + +export interface ListPoolUsageMetricsQueryParam { + queryParameters?: ListPoolUsageMetricsQueryParamProperties; +} + +export interface ListPoolUsageMetricsHeaderParam { + headers?: RawHttpHeadersInput & ListPoolUsageMetricsHeaders; +} + +export type ListPoolUsageMetricsParameters = ListPoolUsageMetricsQueryParam & + ListPoolUsageMetricsHeaderParam & + RequestParameters; + +export interface CreatePoolHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface CreatePoolBodyParam { + /** The Pool to be created. */ + body: BatchPoolCreateParameters; +} + +export interface CreatePoolQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface CreatePoolQueryParam { + queryParameters?: CreatePoolQueryParamProperties; +} + +export interface CreatePoolHeaderParam { + headers?: RawHttpHeadersInput & CreatePoolHeaders; +} + +export interface CreatePoolMediaTypesParam { + /** Type of content */ + contentType: "application/json; odata=minimalmetadata"; +} + +export type CreatePoolParameters = CreatePoolQueryParam & + CreatePoolHeaderParam & + CreatePoolMediaTypesParam & + CreatePoolBodyParam & + RequestParameters; + +export interface ListPoolsHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface ListPoolsQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; + /** + * The maximum number of items to return in the response. A maximum of 1000 + * applications can be returned. + */ + maxresults?: number; + /** + * An OData $filter clause. For more information on constructing this filter, see + * https://docs.microsoft.com/en-us/rest/api/batchservice/odata-filters-in-batch#list-pools. + */ + $filter?: string; + /** An OData $select clause. */ + $select?: string[]; + /** An OData $expand clause. */ + $expand?: string[]; +} + +export interface ListPoolsQueryParam { + queryParameters?: ListPoolsQueryParamProperties; +} + +export interface ListPoolsHeaderParam { + headers?: RawHttpHeadersInput & ListPoolsHeaders; +} + +export type ListPoolsParameters = ListPoolsQueryParam & + ListPoolsHeaderParam & + RequestParameters; + +export interface DeletePoolHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service exactly matches the value specified by the client. + */ + "If-Match"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service does not match the value specified by the client. + */ + "If-None-Match"?: string; +} + +export interface DeletePoolQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface DeletePoolQueryParam { + queryParameters?: DeletePoolQueryParamProperties; +} + +export interface DeletePoolHeaderParam { + headers?: RawHttpHeadersInput & DeletePoolHeaders; +} + +export type DeletePoolParameters = DeletePoolQueryParam & + DeletePoolHeaderParam & + RequestParameters; + +export interface PoolExistsHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service exactly matches the value specified by the client. + */ + "If-Match"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service does not match the value specified by the client. + */ + "If-None-Match"?: string; +} + +export interface PoolExistsQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface PoolExistsQueryParam { + queryParameters?: PoolExistsQueryParamProperties; +} + +export interface PoolExistsHeaderParam { + headers?: RawHttpHeadersInput & PoolExistsHeaders; +} + +export type PoolExistsParameters = PoolExistsQueryParam & + PoolExistsHeaderParam & + RequestParameters; + +export interface GetPoolHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service exactly matches the value specified by the client. + */ + "If-Match"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service does not match the value specified by the client. + */ + "If-None-Match"?: string; +} + +export interface GetPoolQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; + /** An OData $select clause. */ + $select?: string[]; + /** An OData $expand clause. */ + $expand?: string[]; +} + +export interface GetPoolQueryParam { + queryParameters?: GetPoolQueryParamProperties; +} + +export interface GetPoolHeaderParam { + headers?: RawHttpHeadersInput & GetPoolHeaders; +} + +export type GetPoolParameters = GetPoolQueryParam & + GetPoolHeaderParam & + RequestParameters; + +export interface UpdatePoolHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service exactly matches the value specified by the client. + */ + "If-Match"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service does not match the value specified by the client. + */ + "If-None-Match"?: string; +} + +export interface UpdatePoolBodyParam { + /** The pool properties to update. */ + body: BatchPoolUpdateParameters; +} + +export interface UpdatePoolQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface UpdatePoolQueryParam { + queryParameters?: UpdatePoolQueryParamProperties; +} + +export interface UpdatePoolHeaderParam { + headers?: RawHttpHeadersInput & UpdatePoolHeaders; +} + +export interface UpdatePoolMediaTypesParam { + /** Type of content */ + contentType: "application/json; odata=minimalmetadata"; +} + +export type UpdatePoolParameters = UpdatePoolQueryParam & + UpdatePoolHeaderParam & + UpdatePoolMediaTypesParam & + UpdatePoolBodyParam & + RequestParameters; + +export interface DisablePoolAutoScaleHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface DisablePoolAutoScaleQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface DisablePoolAutoScaleQueryParam { + queryParameters?: DisablePoolAutoScaleQueryParamProperties; +} + +export interface DisablePoolAutoScaleHeaderParam { + headers?: RawHttpHeadersInput & DisablePoolAutoScaleHeaders; +} + +export type DisablePoolAutoScaleParameters = DisablePoolAutoScaleQueryParam & + DisablePoolAutoScaleHeaderParam & + RequestParameters; + +export interface EnablePoolAutoScaleHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service exactly matches the value specified by the client. + */ + "If-Match"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service does not match the value specified by the client. + */ + "If-None-Match"?: string; +} + +export interface EnablePoolAutoScaleBodyParam { + /** The options to use for enabling automatic scaling. */ + body: BatchPoolEnableAutoScaleParameters; +} + +export interface EnablePoolAutoScaleQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface EnablePoolAutoScaleQueryParam { + queryParameters?: EnablePoolAutoScaleQueryParamProperties; +} + +export interface EnablePoolAutoScaleHeaderParam { + headers?: RawHttpHeadersInput & EnablePoolAutoScaleHeaders; +} + +export interface EnablePoolAutoScaleMediaTypesParam { + /** Type of content */ + contentType: "application/json; odata=minimalmetadata"; +} + +export type EnablePoolAutoScaleParameters = EnablePoolAutoScaleQueryParam & + EnablePoolAutoScaleHeaderParam & + EnablePoolAutoScaleMediaTypesParam & + EnablePoolAutoScaleBodyParam & + RequestParameters; + +export interface EvaluatePoolAutoScaleHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface EvaluatePoolAutoScaleBodyParam { + /** The options to use for evaluating the automatic scaling formula. */ + body: BatchPoolEvaluateAutoScaleParameters; +} + +export interface EvaluatePoolAutoScaleQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface EvaluatePoolAutoScaleQueryParam { + queryParameters?: EvaluatePoolAutoScaleQueryParamProperties; +} + +export interface EvaluatePoolAutoScaleHeaderParam { + headers?: RawHttpHeadersInput & EvaluatePoolAutoScaleHeaders; +} + +export interface EvaluatePoolAutoScaleMediaTypesParam { + /** Type of content */ + contentType: "application/json; odata=minimalmetadata"; +} + +export type EvaluatePoolAutoScaleParameters = EvaluatePoolAutoScaleQueryParam & + EvaluatePoolAutoScaleHeaderParam & + EvaluatePoolAutoScaleMediaTypesParam & + EvaluatePoolAutoScaleBodyParam & + RequestParameters; + +export interface ResizePoolHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service exactly matches the value specified by the client. + */ + "If-Match"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service does not match the value specified by the client. + */ + "If-None-Match"?: string; +} + +export interface ResizePoolBodyParam { + /** The options to use for resizing the pool. */ + body: BatchPoolResizeParameters; +} + +export interface ResizePoolQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface ResizePoolQueryParam { + queryParameters?: ResizePoolQueryParamProperties; +} + +export interface ResizePoolHeaderParam { + headers?: RawHttpHeadersInput & ResizePoolHeaders; +} + +export interface ResizePoolMediaTypesParam { + /** Type of content */ + contentType: "application/json; odata=minimalmetadata"; +} + +export type ResizePoolParameters = ResizePoolQueryParam & + ResizePoolHeaderParam & + ResizePoolMediaTypesParam & + ResizePoolBodyParam & + RequestParameters; + +export interface StopPoolResizeHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service exactly matches the value specified by the client. + */ + "If-Match"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service does not match the value specified by the client. + */ + "If-None-Match"?: string; +} + +export interface StopPoolResizeQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface StopPoolResizeQueryParam { + queryParameters?: StopPoolResizeQueryParamProperties; +} + +export interface StopPoolResizeHeaderParam { + headers?: RawHttpHeadersInput & StopPoolResizeHeaders; +} + +export type StopPoolResizeParameters = StopPoolResizeQueryParam & + StopPoolResizeHeaderParam & + RequestParameters; + +export interface ReplacePoolPropertiesHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface ReplacePoolPropertiesBodyParam { + /** The options to use for replacing properties on the pool. */ + body: BatchPoolReplaceParameters; +} + +export interface ReplacePoolPropertiesQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface ReplacePoolPropertiesQueryParam { + queryParameters?: ReplacePoolPropertiesQueryParamProperties; +} + +export interface ReplacePoolPropertiesHeaderParam { + headers?: RawHttpHeadersInput & ReplacePoolPropertiesHeaders; +} + +export interface ReplacePoolPropertiesMediaTypesParam { + /** Type of content */ + contentType: "application/json; odata=minimalmetadata"; +} + +export type ReplacePoolPropertiesParameters = ReplacePoolPropertiesQueryParam & + ReplacePoolPropertiesHeaderParam & + ReplacePoolPropertiesMediaTypesParam & + ReplacePoolPropertiesBodyParam & + RequestParameters; + +export interface RemoveNodesHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service exactly matches the value specified by the client. + */ + "If-Match"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service does not match the value specified by the client. + */ + "If-None-Match"?: string; +} + +export interface RemoveNodesBodyParam { + /** The options to use for removing the node. */ + body: BatchNodeRemoveParameters; +} + +export interface RemoveNodesQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface RemoveNodesQueryParam { + queryParameters?: RemoveNodesQueryParamProperties; +} + +export interface RemoveNodesHeaderParam { + headers?: RawHttpHeadersInput & RemoveNodesHeaders; +} + +export interface RemoveNodesMediaTypesParam { + /** Type of content */ + contentType: "application/json; odata=minimalmetadata"; +} + +export type RemoveNodesParameters = RemoveNodesQueryParam & + RemoveNodesHeaderParam & + RemoveNodesMediaTypesParam & + RemoveNodesBodyParam & + RequestParameters; + +export interface ListSupportedImagesHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface ListSupportedImagesQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; + /** + * The maximum number of items to return in the response. A maximum of 1000 + * applications can be returned. + */ + maxresults?: number; + /** + * An OData $filter clause. For more information on constructing this filter, see + * https://docs.microsoft.com/en-us/rest/api/batchservice/odata-filters-in-batch#list-support-images. + */ + $filter?: string; +} + +export interface ListSupportedImagesQueryParam { + queryParameters?: ListSupportedImagesQueryParamProperties; +} + +export interface ListSupportedImagesHeaderParam { + headers?: RawHttpHeadersInput & ListSupportedImagesHeaders; +} + +export type ListSupportedImagesParameters = ListSupportedImagesQueryParam & + ListSupportedImagesHeaderParam & + RequestParameters; + +export interface ListPoolNodeCountsHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface ListPoolNodeCountsQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; + /** + * The maximum number of items to return in the response. A maximum of 1000 + * applications can be returned. + */ + maxresults?: number; + /** + * An OData $filter clause. For more information on constructing this filter, see + * https://docs.microsoft.com/en-us/rest/api/batchservice/odata-filters-in-batch#list-support-images. + */ + $filter?: string; +} + +export interface ListPoolNodeCountsQueryParam { + queryParameters?: ListPoolNodeCountsQueryParamProperties; +} + +export interface ListPoolNodeCountsHeaderParam { + headers?: RawHttpHeadersInput & ListPoolNodeCountsHeaders; +} + +export type ListPoolNodeCountsParameters = ListPoolNodeCountsQueryParam & + ListPoolNodeCountsHeaderParam & + RequestParameters; + +export interface DeleteJobHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service exactly matches the value specified by the client. + */ + "If-Match"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service does not match the value specified by the client. + */ + "If-None-Match"?: string; +} + +export interface DeleteJobQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface DeleteJobQueryParam { + queryParameters?: DeleteJobQueryParamProperties; +} + +export interface DeleteJobHeaderParam { + headers?: RawHttpHeadersInput & DeleteJobHeaders; +} + +export type DeleteJobParameters = DeleteJobQueryParam & + DeleteJobHeaderParam & + RequestParameters; + +export interface GetJobHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service exactly matches the value specified by the client. + */ + "If-Match"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service does not match the value specified by the client. + */ + "If-None-Match"?: string; +} + +export interface GetJobQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; + /** An OData $select clause. */ + $select?: string[]; + /** An OData $expand clause. */ + $expand?: string[]; +} + +export interface GetJobQueryParam { + queryParameters?: GetJobQueryParamProperties; +} + +export interface GetJobHeaderParam { + headers?: RawHttpHeadersInput & GetJobHeaders; +} + +export type GetJobParameters = GetJobQueryParam & + GetJobHeaderParam & + RequestParameters; + +export interface UpdateJobHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service exactly matches the value specified by the client. + */ + "If-Match"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service does not match the value specified by the client. + */ + "If-None-Match"?: string; +} + +export interface UpdateJobBodyParam { + /** The options to use for updating the Job. */ + body: BatchJobUpdateParameters; +} + +export interface UpdateJobQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface UpdateJobQueryParam { + queryParameters?: UpdateJobQueryParamProperties; +} + +export interface UpdateJobHeaderParam { + headers?: RawHttpHeadersInput & UpdateJobHeaders; +} + +export interface UpdateJobMediaTypesParam { + /** Type of content */ + contentType: "application/json; odata=minimalmetadata"; +} + +export type UpdateJobParameters = UpdateJobQueryParam & + UpdateJobHeaderParam & + UpdateJobMediaTypesParam & + UpdateJobBodyParam & + RequestParameters; + +export interface ReplaceJobHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service exactly matches the value specified by the client. + */ + "If-Match"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service does not match the value specified by the client. + */ + "If-None-Match"?: string; +} + +export interface ReplaceJobBodyParam { + /** A job with updated properties */ + body: BatchJob; +} + +export interface ReplaceJobQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface ReplaceJobQueryParam { + queryParameters?: ReplaceJobQueryParamProperties; +} + +export interface ReplaceJobHeaderParam { + headers?: RawHttpHeadersInput & ReplaceJobHeaders; +} + +export interface ReplaceJobMediaTypesParam { + /** Type of content */ + contentType: "application/json; odata=minimalmetadata"; +} + +export type ReplaceJobParameters = ReplaceJobQueryParam & + ReplaceJobHeaderParam & + ReplaceJobMediaTypesParam & + ReplaceJobBodyParam & + RequestParameters; + +export interface DisableJobHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service exactly matches the value specified by the client. + */ + "If-Match"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service does not match the value specified by the client. + */ + "If-None-Match"?: string; +} + +export interface DisableJobBodyParam { + /** The options to use for disabling the Job. */ + body: BatchJobDisableParameters; +} + +export interface DisableJobQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface DisableJobQueryParam { + queryParameters?: DisableJobQueryParamProperties; +} + +export interface DisableJobHeaderParam { + headers?: RawHttpHeadersInput & DisableJobHeaders; +} + +export interface DisableJobMediaTypesParam { + /** Type of content */ + contentType: "application/json; odata=minimalmetadata"; +} + +export type DisableJobParameters = DisableJobQueryParam & + DisableJobHeaderParam & + DisableJobMediaTypesParam & + DisableJobBodyParam & + RequestParameters; + +export interface EnableJobHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service exactly matches the value specified by the client. + */ + "If-Match"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service does not match the value specified by the client. + */ + "If-None-Match"?: string; +} + +export interface EnableJobQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface EnableJobQueryParam { + queryParameters?: EnableJobQueryParamProperties; +} + +export interface EnableJobHeaderParam { + headers?: RawHttpHeadersInput & EnableJobHeaders; +} + +export type EnableJobParameters = EnableJobQueryParam & + EnableJobHeaderParam & + RequestParameters; + +export interface TerminateJobHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service exactly matches the value specified by the client. + */ + "If-Match"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service does not match the value specified by the client. + */ + "If-None-Match"?: string; +} + +export interface TerminateJobBodyParam { + /** The options to use for terminating the Job. */ + body?: BatchJobTerminateParameters; +} + +export interface TerminateJobQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface TerminateJobQueryParam { + queryParameters?: TerminateJobQueryParamProperties; +} + +export interface TerminateJobHeaderParam { + headers?: RawHttpHeadersInput & TerminateJobHeaders; +} + +export interface TerminateJobMediaTypesParam { + /** Type of content */ + contentType: "application/json; odata=minimalmetadata"; +} + +export type TerminateJobParameters = TerminateJobQueryParam & + TerminateJobHeaderParam & + TerminateJobMediaTypesParam & + TerminateJobBodyParam & + RequestParameters; + +export interface CreateJobHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface CreateJobBodyParam { + /** The Job to be created. */ + body: BatchJobCreateParameters; +} + +export interface CreateJobQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface CreateJobQueryParam { + queryParameters?: CreateJobQueryParamProperties; +} + +export interface CreateJobHeaderParam { + headers?: RawHttpHeadersInput & CreateJobHeaders; +} + +export interface CreateJobMediaTypesParam { + /** Type of content */ + contentType: "application/json; odata=minimalmetadata"; +} + +export type CreateJobParameters = CreateJobQueryParam & + CreateJobHeaderParam & + CreateJobMediaTypesParam & + CreateJobBodyParam & + RequestParameters; + +export interface ListJobsHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface ListJobsQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; + /** + * The maximum number of items to return in the response. A maximum of 1000 + * applications can be returned. + */ + maxresults?: number; + /** + * An OData $filter clause. For more information on constructing this filter, see + * https://docs.microsoft.com/en-us/rest/api/batchservice/odata-filters-in-batch#list-jobs. + */ + $filter?: string; + /** An OData $select clause. */ + $select?: string[]; + /** An OData $expand clause. */ + $expand?: string[]; +} + +export interface ListJobsQueryParam { + queryParameters?: ListJobsQueryParamProperties; +} + +export interface ListJobsHeaderParam { + headers?: RawHttpHeadersInput & ListJobsHeaders; +} + +export type ListJobsParameters = ListJobsQueryParam & + ListJobsHeaderParam & + RequestParameters; + +export interface ListJobsFromScheduleHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface ListJobsFromScheduleQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; + /** + * The maximum number of items to return in the response. A maximum of 1000 + * applications can be returned. + */ + maxresults?: number; + /** + * An OData $filter clause. For more information on constructing this filter, see + * https://docs.microsoft.com/en-us/rest/api/batchservice/odata-filters-in-batch#list-jobs-in-a-job-schedule. + */ + $filter?: string; + /** An OData $select clause. */ + $select?: string[]; + /** An OData $expand clause. */ + $expand?: string[]; +} + +export interface ListJobsFromScheduleQueryParam { + queryParameters?: ListJobsFromScheduleQueryParamProperties; +} + +export interface ListJobsFromScheduleHeaderParam { + headers?: RawHttpHeadersInput & ListJobsFromScheduleHeaders; +} + +export type ListJobsFromScheduleParameters = ListJobsFromScheduleQueryParam & + ListJobsFromScheduleHeaderParam & + RequestParameters; + +export interface ListJobPreparationAndReleaseTaskStatusHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface ListJobPreparationAndReleaseTaskStatusQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; + /** + * The maximum number of items to return in the response. A maximum of 1000 + * applications can be returned. + */ + maxresults?: number; + /** + * An OData $filter clause. For more information on constructing this filter, see + * https://docs.microsoft.com/en-us/rest/api/batchservice/odata-filters-in-batch#list-job-preparation-and-release-status. + */ + $filter?: string; + /** An OData $select clause. */ + $select?: string[]; +} + +export interface ListJobPreparationAndReleaseTaskStatusQueryParam { + queryParameters?: ListJobPreparationAndReleaseTaskStatusQueryParamProperties; +} + +export interface ListJobPreparationAndReleaseTaskStatusHeaderParam { + headers?: RawHttpHeadersInput & ListJobPreparationAndReleaseTaskStatusHeaders; +} + +export type ListJobPreparationAndReleaseTaskStatusParameters = + ListJobPreparationAndReleaseTaskStatusQueryParam & + ListJobPreparationAndReleaseTaskStatusHeaderParam & + RequestParameters; + +export interface GetJobTaskCountsHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface GetJobTaskCountsQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface GetJobTaskCountsQueryParam { + queryParameters?: GetJobTaskCountsQueryParamProperties; +} + +export interface GetJobTaskCountsHeaderParam { + headers?: RawHttpHeadersInput & GetJobTaskCountsHeaders; +} + +export type GetJobTaskCountsParameters = GetJobTaskCountsQueryParam & + GetJobTaskCountsHeaderParam & + RequestParameters; + +export interface CreateCertificateHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface CreateCertificateBodyParam { + /** The Certificate to be created. */ + body: BatchCertificate; +} + +export interface CreateCertificateQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface CreateCertificateQueryParam { + queryParameters?: CreateCertificateQueryParamProperties; +} + +export interface CreateCertificateHeaderParam { + headers?: RawHttpHeadersInput & CreateCertificateHeaders; +} + +export interface CreateCertificateMediaTypesParam { + /** Type of content */ + contentType: "application/json; odata=minimalmetadata"; +} + +export type CreateCertificateParameters = CreateCertificateQueryParam & + CreateCertificateHeaderParam & + CreateCertificateMediaTypesParam & + CreateCertificateBodyParam & + RequestParameters; + +export interface ListCertificatesHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface ListCertificatesQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; + /** + * The maximum number of items to return in the response. A maximum of 1000 + * applications can be returned. + */ + maxresults?: number; + /** + * An OData $filter clause. For more information on constructing this filter, see + * https://docs.microsoft.com/en-us/rest/api/batchservice/odata-filters-in-batch#list-certificates. + */ + $filter?: string; + /** An OData $select clause. */ + $select?: string[]; +} + +export interface ListCertificatesQueryParam { + queryParameters?: ListCertificatesQueryParamProperties; +} + +export interface ListCertificatesHeaderParam { + headers?: RawHttpHeadersInput & ListCertificatesHeaders; +} + +export type ListCertificatesParameters = ListCertificatesQueryParam & + ListCertificatesHeaderParam & + RequestParameters; + +export interface CancelCertificateDeletionHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface CancelCertificateDeletionQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface CancelCertificateDeletionQueryParam { + queryParameters?: CancelCertificateDeletionQueryParamProperties; +} + +export interface CancelCertificateDeletionHeaderParam { + headers?: RawHttpHeadersInput & CancelCertificateDeletionHeaders; +} + +export type CancelCertificateDeletionParameters = + CancelCertificateDeletionQueryParam & + CancelCertificateDeletionHeaderParam & + RequestParameters; + +export interface DeleteCertificateHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface DeleteCertificateQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface DeleteCertificateQueryParam { + queryParameters?: DeleteCertificateQueryParamProperties; +} + +export interface DeleteCertificateHeaderParam { + headers?: RawHttpHeadersInput & DeleteCertificateHeaders; +} + +export type DeleteCertificateParameters = DeleteCertificateQueryParam & + DeleteCertificateHeaderParam & + RequestParameters; + +export interface GetCertificateHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface GetCertificateQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; + /** An OData $select clause. */ + $select?: string[]; +} + +export interface GetCertificateQueryParam { + queryParameters?: GetCertificateQueryParamProperties; +} + +export interface GetCertificateHeaderParam { + headers?: RawHttpHeadersInput & GetCertificateHeaders; +} + +export type GetCertificateParameters = GetCertificateQueryParam & + GetCertificateHeaderParam & + RequestParameters; + +export interface JobScheduleExistsHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service exactly matches the value specified by the client. + */ + "If-Match"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service does not match the value specified by the client. + */ + "If-None-Match"?: string; +} + +export interface JobScheduleExistsQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface JobScheduleExistsQueryParam { + queryParameters?: JobScheduleExistsQueryParamProperties; +} + +export interface JobScheduleExistsHeaderParam { + headers?: RawHttpHeadersInput & JobScheduleExistsHeaders; +} + +export type JobScheduleExistsParameters = JobScheduleExistsQueryParam & + JobScheduleExistsHeaderParam & + RequestParameters; + +export interface DeleteJobScheduleHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service exactly matches the value specified by the client. + */ + "If-Match"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service does not match the value specified by the client. + */ + "If-None-Match"?: string; +} + +export interface DeleteJobScheduleQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface DeleteJobScheduleQueryParam { + queryParameters?: DeleteJobScheduleQueryParamProperties; +} + +export interface DeleteJobScheduleHeaderParam { + headers?: RawHttpHeadersInput & DeleteJobScheduleHeaders; +} + +export type DeleteJobScheduleParameters = DeleteJobScheduleQueryParam & + DeleteJobScheduleHeaderParam & + RequestParameters; + +export interface GetJobScheduleHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service exactly matches the value specified by the client. + */ + "If-Match"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service does not match the value specified by the client. + */ + "If-None-Match"?: string; +} + +export interface GetJobScheduleQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; + /** An OData $select clause. */ + $select?: string[]; + /** An OData $expand clause. */ + $expand?: string[]; +} + +export interface GetJobScheduleQueryParam { + queryParameters?: GetJobScheduleQueryParamProperties; +} + +export interface GetJobScheduleHeaderParam { + headers?: RawHttpHeadersInput & GetJobScheduleHeaders; +} + +export type GetJobScheduleParameters = GetJobScheduleQueryParam & + GetJobScheduleHeaderParam & + RequestParameters; + +export interface UpdateJobScheduleHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service exactly matches the value specified by the client. + */ + "If-Match"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service does not match the value specified by the client. + */ + "If-None-Match"?: string; +} + +export interface UpdateJobScheduleBodyParam { + /** The options to use for updating the Job Schedule. */ + body: BatchJobScheduleUpdateParameters; +} + +export interface UpdateJobScheduleQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface UpdateJobScheduleQueryParam { + queryParameters?: UpdateJobScheduleQueryParamProperties; +} + +export interface UpdateJobScheduleHeaderParam { + headers?: RawHttpHeadersInput & UpdateJobScheduleHeaders; +} + +export interface UpdateJobScheduleMediaTypesParam { + /** Type of content */ + contentType: "application/json; odata=minimalmetadata"; +} + +export type UpdateJobScheduleParameters = UpdateJobScheduleQueryParam & + UpdateJobScheduleHeaderParam & + UpdateJobScheduleMediaTypesParam & + UpdateJobScheduleBodyParam & + RequestParameters; + +export interface ReplaceJobScheduleHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service exactly matches the value specified by the client. + */ + "If-Match"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service does not match the value specified by the client. + */ + "If-None-Match"?: string; +} + +export interface ReplaceJobScheduleBodyParam { + /** A Job Schedule with updated properties */ + body: BatchJobSchedule; +} + +export interface ReplaceJobScheduleQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface ReplaceJobScheduleQueryParam { + queryParameters?: ReplaceJobScheduleQueryParamProperties; +} + +export interface ReplaceJobScheduleHeaderParam { + headers?: RawHttpHeadersInput & ReplaceJobScheduleHeaders; +} + +export interface ReplaceJobScheduleMediaTypesParam { + /** Type of content */ + contentType: "application/json; odata=minimalmetadata"; +} + +export type ReplaceJobScheduleParameters = ReplaceJobScheduleQueryParam & + ReplaceJobScheduleHeaderParam & + ReplaceJobScheduleMediaTypesParam & + ReplaceJobScheduleBodyParam & + RequestParameters; + +export interface DisableJobScheduleHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service exactly matches the value specified by the client. + */ + "If-Match"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service does not match the value specified by the client. + */ + "If-None-Match"?: string; +} + +export interface DisableJobScheduleQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface DisableJobScheduleQueryParam { + queryParameters?: DisableJobScheduleQueryParamProperties; +} + +export interface DisableJobScheduleHeaderParam { + headers?: RawHttpHeadersInput & DisableJobScheduleHeaders; +} + +export type DisableJobScheduleParameters = DisableJobScheduleQueryParam & + DisableJobScheduleHeaderParam & + RequestParameters; + +export interface EnableJobScheduleHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service exactly matches the value specified by the client. + */ + "If-Match"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service does not match the value specified by the client. + */ + "If-None-Match"?: string; +} + +export interface EnableJobScheduleQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface EnableJobScheduleQueryParam { + queryParameters?: EnableJobScheduleQueryParamProperties; +} + +export interface EnableJobScheduleHeaderParam { + headers?: RawHttpHeadersInput & EnableJobScheduleHeaders; +} + +export type EnableJobScheduleParameters = EnableJobScheduleQueryParam & + EnableJobScheduleHeaderParam & + RequestParameters; + +export interface TerminateJobScheduleHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service exactly matches the value specified by the client. + */ + "If-Match"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service does not match the value specified by the client. + */ + "If-None-Match"?: string; +} + +export interface TerminateJobScheduleQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface TerminateJobScheduleQueryParam { + queryParameters?: TerminateJobScheduleQueryParamProperties; +} + +export interface TerminateJobScheduleHeaderParam { + headers?: RawHttpHeadersInput & TerminateJobScheduleHeaders; +} + +export type TerminateJobScheduleParameters = TerminateJobScheduleQueryParam & + TerminateJobScheduleHeaderParam & + RequestParameters; + +export interface CreateJobScheduleHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface CreateJobScheduleBodyParam { + /** The Job Schedule to be created. */ + body: BatchJobScheduleCreateParameters; +} + +export interface CreateJobScheduleQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface CreateJobScheduleQueryParam { + queryParameters?: CreateJobScheduleQueryParamProperties; +} + +export interface CreateJobScheduleHeaderParam { + headers?: RawHttpHeadersInput & CreateJobScheduleHeaders; +} + +export interface CreateJobScheduleMediaTypesParam { + /** Type of content */ + contentType: "application/json; odata=minimalmetadata"; +} + +export type CreateJobScheduleParameters = CreateJobScheduleQueryParam & + CreateJobScheduleHeaderParam & + CreateJobScheduleMediaTypesParam & + CreateJobScheduleBodyParam & + RequestParameters; + +export interface ListJobSchedulesHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface ListJobSchedulesQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; + /** + * The maximum number of items to return in the response. A maximum of 1000 + * applications can be returned. + */ + maxresults?: number; + /** + * An OData $filter clause. For more information on constructing this filter, see + * https://docs.microsoft.com/en-us/rest/api/batchservice/odata-filters-in-batch#list-job-schedules. + */ + $filter?: string; + /** An OData $select clause. */ + $select?: string[]; + /** An OData $expand clause. */ + $expand?: string[]; +} + +export interface ListJobSchedulesQueryParam { + queryParameters?: ListJobSchedulesQueryParamProperties; +} + +export interface ListJobSchedulesHeaderParam { + headers?: RawHttpHeadersInput & ListJobSchedulesHeaders; +} + +export type ListJobSchedulesParameters = ListJobSchedulesQueryParam & + ListJobSchedulesHeaderParam & + RequestParameters; + +export interface CreateTaskHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface CreateTaskBodyParam { + /** The Task to be created. */ + body: BatchTaskCreateParameters; +} + +export interface CreateTaskQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface CreateTaskQueryParam { + queryParameters?: CreateTaskQueryParamProperties; +} + +export interface CreateTaskHeaderParam { + headers?: RawHttpHeadersInput & CreateTaskHeaders; +} + +export interface CreateTaskMediaTypesParam { + /** Type of content */ + contentType: "application/json; odata=minimalmetadata"; +} + +export type CreateTaskParameters = CreateTaskQueryParam & + CreateTaskHeaderParam & + CreateTaskMediaTypesParam & + CreateTaskBodyParam & + RequestParameters; + +export interface ListTasksHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface ListTasksQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; + /** + * The maximum number of items to return in the response. A maximum of 1000 + * applications can be returned. + */ + maxresults?: number; + /** + * An OData $filter clause. For more information on constructing this filter, see + * https://docs.microsoft.com/en-us/rest/api/batchservice/odata-filters-in-batch#list-tasks. + */ + $filter?: string; + /** An OData $select clause. */ + $select?: string[]; + /** An OData $expand clause. */ + $expand?: string[]; +} + +export interface ListTasksQueryParam { + queryParameters?: ListTasksQueryParamProperties; +} + +export interface ListTasksHeaderParam { + headers?: RawHttpHeadersInput & ListTasksHeaders; +} + +export type ListTasksParameters = ListTasksQueryParam & + ListTasksHeaderParam & + RequestParameters; + +export interface CreateTaskCollectionHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface CreateTaskCollectionBodyParam { + /** The Tasks to be added. */ + body: BatchTaskCollection; +} + +export interface CreateTaskCollectionQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface CreateTaskCollectionQueryParam { + queryParameters?: CreateTaskCollectionQueryParamProperties; +} + +export interface CreateTaskCollectionHeaderParam { + headers?: RawHttpHeadersInput & CreateTaskCollectionHeaders; +} + +export interface CreateTaskCollectionMediaTypesParam { + /** Type of content */ + contentType: "application/json; odata=minimalmetadata"; +} + +export type CreateTaskCollectionParameters = CreateTaskCollectionQueryParam & + CreateTaskCollectionHeaderParam & + CreateTaskCollectionMediaTypesParam & + CreateTaskCollectionBodyParam & + RequestParameters; + +export interface DeleteTaskHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service exactly matches the value specified by the client. + */ + "If-Match"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service does not match the value specified by the client. + */ + "If-None-Match"?: string; +} + +export interface DeleteTaskQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface DeleteTaskQueryParam { + queryParameters?: DeleteTaskQueryParamProperties; +} + +export interface DeleteTaskHeaderParam { + headers?: RawHttpHeadersInput & DeleteTaskHeaders; +} + +export type DeleteTaskParameters = DeleteTaskQueryParam & + DeleteTaskHeaderParam & + RequestParameters; + +export interface GetTaskHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service exactly matches the value specified by the client. + */ + "If-Match"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service does not match the value specified by the client. + */ + "If-None-Match"?: string; +} + +export interface GetTaskQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; + /** An OData $select clause. */ + $select?: string[]; + /** An OData $expand clause. */ + $expand?: string[]; +} + +export interface GetTaskQueryParam { + queryParameters?: GetTaskQueryParamProperties; +} + +export interface GetTaskHeaderParam { + headers?: RawHttpHeadersInput & GetTaskHeaders; +} + +export type GetTaskParameters = GetTaskQueryParam & + GetTaskHeaderParam & + RequestParameters; + +export interface ReplaceTaskHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service exactly matches the value specified by the client. + */ + "If-Match"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service does not match the value specified by the client. + */ + "If-None-Match"?: string; +} + +export interface ReplaceTaskBodyParam { + /** The Task to update. */ + body: BatchTask; +} + +export interface ReplaceTaskQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface ReplaceTaskQueryParam { + queryParameters?: ReplaceTaskQueryParamProperties; +} + +export interface ReplaceTaskHeaderParam { + headers?: RawHttpHeadersInput & ReplaceTaskHeaders; +} + +export interface ReplaceTaskMediaTypesParam { + /** Type of content */ + contentType: "application/json; odata=minimalmetadata"; +} + +export type ReplaceTaskParameters = ReplaceTaskQueryParam & + ReplaceTaskHeaderParam & + ReplaceTaskMediaTypesParam & + ReplaceTaskBodyParam & + RequestParameters; + +export interface ListSubTasksHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface ListSubTasksQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; + /** An OData $select clause. */ + $select?: string[]; +} + +export interface ListSubTasksQueryParam { + queryParameters?: ListSubTasksQueryParamProperties; +} + +export interface ListSubTasksHeaderParam { + headers?: RawHttpHeadersInput & ListSubTasksHeaders; +} + +export type ListSubTasksParameters = ListSubTasksQueryParam & + ListSubTasksHeaderParam & + RequestParameters; + +export interface TerminateTaskHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service exactly matches the value specified by the client. + */ + "If-Match"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service does not match the value specified by the client. + */ + "If-None-Match"?: string; +} + +export interface TerminateTaskQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface TerminateTaskQueryParam { + queryParameters?: TerminateTaskQueryParamProperties; +} + +export interface TerminateTaskHeaderParam { + headers?: RawHttpHeadersInput & TerminateTaskHeaders; +} + +export type TerminateTaskParameters = TerminateTaskQueryParam & + TerminateTaskHeaderParam & + RequestParameters; + +export interface ReactivateTaskHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service exactly matches the value specified by the client. + */ + "If-Match"?: string; + /** + * An ETag value associated with the version of the resource known to the client. + * The operation will be performed only if the resource's current ETag on the + * service does not match the value specified by the client. + */ + "If-None-Match"?: string; +} + +export interface ReactivateTaskQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface ReactivateTaskQueryParam { + queryParameters?: ReactivateTaskQueryParamProperties; +} + +export interface ReactivateTaskHeaderParam { + headers?: RawHttpHeadersInput & ReactivateTaskHeaders; +} + +export type ReactivateTaskParameters = ReactivateTaskQueryParam & + ReactivateTaskHeaderParam & + RequestParameters; + +export interface DeleteTaskFileHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface DeleteTaskFileQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; + /** + * Whether to delete children of a directory. If the filePath parameter represents + * a directory instead of a file, you can set recursive to true to delete the + * directory and all of the files and subdirectories in it. If recursive is false + * then the directory must be empty or deletion will fail. + */ + recursive?: boolean; +} + +export interface DeleteTaskFileQueryParam { + queryParameters?: DeleteTaskFileQueryParamProperties; +} + +export interface DeleteTaskFileHeaderParam { + headers?: RawHttpHeadersInput & DeleteTaskFileHeaders; +} + +export type DeleteTaskFileParameters = DeleteTaskFileQueryParam & + DeleteTaskFileHeaderParam & + RequestParameters; + +export interface GetTaskFileHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * The byte range to be retrieved. The default is to retrieve the entire file. The + * format is bytes=startRange-endRange. + */ + "ocp-range"?: string; +} + +export interface GetTaskFileQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface GetTaskFileQueryParam { + queryParameters?: GetTaskFileQueryParamProperties; +} + +export interface GetTaskFileHeaderParam { + headers?: RawHttpHeadersInput & GetTaskFileHeaders; +} + +export type GetTaskFileParameters = GetTaskFileQueryParam & + GetTaskFileHeaderParam & + RequestParameters; + +export interface GetTaskFilePropertiesHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; +} + +export interface GetTaskFilePropertiesQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface GetTaskFilePropertiesQueryParam { + queryParameters?: GetTaskFilePropertiesQueryParamProperties; +} + +export interface GetTaskFilePropertiesHeaderParam { + headers?: RawHttpHeadersInput & GetTaskFilePropertiesHeaders; +} + +export type GetTaskFilePropertiesParameters = GetTaskFilePropertiesQueryParam & + GetTaskFilePropertiesHeaderParam & + RequestParameters; + +export interface ListTaskFilesHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface ListTaskFilesQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; + /** + * The maximum number of items to return in the response. A maximum of 1000 + * applications can be returned. + */ + maxresults?: number; + /** + * An OData $filter clause. For more information on constructing this filter, see + * https://docs.microsoft.com/en-us/rest/api/batchservice/odata-filters-in-batch#list-task-files. + */ + $filter?: string; + /** + * Whether to list children of the Task directory. This parameter can be used in + * combination with the filter parameter to list specific type of files. + */ + recursive?: boolean; +} + +export interface ListTaskFilesQueryParam { + queryParameters?: ListTaskFilesQueryParamProperties; +} + +export interface ListTaskFilesHeaderParam { + headers?: RawHttpHeadersInput & ListTaskFilesHeaders; +} + +export type ListTaskFilesParameters = ListTaskFilesQueryParam & + ListTaskFilesHeaderParam & + RequestParameters; + +export interface CreateNodeUserHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface CreateNodeUserBodyParam { + /** The options to use for creating the user. */ + body: BatchNodeUserCreateParameters; +} + +export interface CreateNodeUserQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface CreateNodeUserQueryParam { + queryParameters?: CreateNodeUserQueryParamProperties; +} + +export interface CreateNodeUserHeaderParam { + headers?: RawHttpHeadersInput & CreateNodeUserHeaders; +} + +export interface CreateNodeUserMediaTypesParam { + /** Type of content */ + contentType: "application/json; odata=minimalmetadata"; +} + +export type CreateNodeUserParameters = CreateNodeUserQueryParam & + CreateNodeUserHeaderParam & + CreateNodeUserMediaTypesParam & + CreateNodeUserBodyParam & + RequestParameters; + +export interface DeleteNodeUserHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface DeleteNodeUserQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface DeleteNodeUserQueryParam { + queryParameters?: DeleteNodeUserQueryParamProperties; +} + +export interface DeleteNodeUserHeaderParam { + headers?: RawHttpHeadersInput & DeleteNodeUserHeaders; +} + +export type DeleteNodeUserParameters = DeleteNodeUserQueryParam & + DeleteNodeUserHeaderParam & + RequestParameters; + +export interface ReplaceNodeUserHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface ReplaceNodeUserBodyParam { + /** The options to use for updating the user. */ + body: BatchNodeUserUpdateParameters; +} + +export interface ReplaceNodeUserQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface ReplaceNodeUserQueryParam { + queryParameters?: ReplaceNodeUserQueryParamProperties; +} + +export interface ReplaceNodeUserHeaderParam { + headers?: RawHttpHeadersInput & ReplaceNodeUserHeaders; +} + +export interface ReplaceNodeUserMediaTypesParam { + /** Type of content */ + contentType: "application/json; odata=minimalmetadata"; +} + +export type ReplaceNodeUserParameters = ReplaceNodeUserQueryParam & + ReplaceNodeUserHeaderParam & + ReplaceNodeUserMediaTypesParam & + ReplaceNodeUserBodyParam & + RequestParameters; + +export interface GetNodeHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface GetNodeQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; + /** An OData $select clause. */ + $select?: string[]; +} + +export interface GetNodeQueryParam { + queryParameters?: GetNodeQueryParamProperties; +} + +export interface GetNodeHeaderParam { + headers?: RawHttpHeadersInput & GetNodeHeaders; +} + +export type GetNodeParameters = GetNodeQueryParam & + GetNodeHeaderParam & + RequestParameters; + +export interface RebootNodeHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface RebootNodeBodyParam { + /** The options to use for rebooting the Compute Node. */ + body?: BatchNodeRebootParameters; +} + +export interface RebootNodeQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface RebootNodeQueryParam { + queryParameters?: RebootNodeQueryParamProperties; +} + +export interface RebootNodeHeaderParam { + headers?: RawHttpHeadersInput & RebootNodeHeaders; +} + +export interface RebootNodeMediaTypesParam { + /** Type of content */ + contentType: "application/json; odata=minimalmetadata"; +} + +export type RebootNodeParameters = RebootNodeQueryParam & + RebootNodeHeaderParam & + RebootNodeMediaTypesParam & + RebootNodeBodyParam & + RequestParameters; + +export interface ReimageNodeHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface ReimageNodeBodyParam { + /** The options to use for reimaging the Compute Node. */ + body?: BatchNodeReimageParameters; +} + +export interface ReimageNodeQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface ReimageNodeQueryParam { + queryParameters?: ReimageNodeQueryParamProperties; +} + +export interface ReimageNodeHeaderParam { + headers?: RawHttpHeadersInput & ReimageNodeHeaders; +} + +export interface ReimageNodeMediaTypesParam { + /** Type of content */ + contentType: "application/json; odata=minimalmetadata"; +} + +export type ReimageNodeParameters = ReimageNodeQueryParam & + ReimageNodeHeaderParam & + ReimageNodeMediaTypesParam & + ReimageNodeBodyParam & + RequestParameters; + +export interface DisableNodeSchedulingHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface DisableNodeSchedulingBodyParam { + /** The options to use for disabling scheduling on the Compute Node. */ + body?: BatchNodeDisableSchedulingParameters; +} + +export interface DisableNodeSchedulingQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface DisableNodeSchedulingQueryParam { + queryParameters?: DisableNodeSchedulingQueryParamProperties; +} + +export interface DisableNodeSchedulingHeaderParam { + headers?: RawHttpHeadersInput & DisableNodeSchedulingHeaders; +} + +export interface DisableNodeSchedulingMediaTypesParam { + /** Type of content */ + contentType: "application/json; odata=minimalmetadata"; +} + +export type DisableNodeSchedulingParameters = DisableNodeSchedulingQueryParam & + DisableNodeSchedulingHeaderParam & + DisableNodeSchedulingMediaTypesParam & + DisableNodeSchedulingBodyParam & + RequestParameters; + +export interface EnableNodeSchedulingHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface EnableNodeSchedulingQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface EnableNodeSchedulingQueryParam { + queryParameters?: EnableNodeSchedulingQueryParamProperties; +} + +export interface EnableNodeSchedulingHeaderParam { + headers?: RawHttpHeadersInput & EnableNodeSchedulingHeaders; +} + +export type EnableNodeSchedulingParameters = EnableNodeSchedulingQueryParam & + EnableNodeSchedulingHeaderParam & + RequestParameters; + +export interface GetNodeRemoteLoginSettingsHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface GetNodeRemoteLoginSettingsQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface GetNodeRemoteLoginSettingsQueryParam { + queryParameters?: GetNodeRemoteLoginSettingsQueryParamProperties; +} + +export interface GetNodeRemoteLoginSettingsHeaderParam { + headers?: RawHttpHeadersInput & GetNodeRemoteLoginSettingsHeaders; +} + +export type GetNodeRemoteLoginSettingsParameters = + GetNodeRemoteLoginSettingsQueryParam & + GetNodeRemoteLoginSettingsHeaderParam & + RequestParameters; + +export interface GetNodeRemoteDesktopFileHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface GetNodeRemoteDesktopFileQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface GetNodeRemoteDesktopFileQueryParam { + queryParameters?: GetNodeRemoteDesktopFileQueryParamProperties; +} + +export interface GetNodeRemoteDesktopFileHeaderParam { + headers?: RawHttpHeadersInput & GetNodeRemoteDesktopFileHeaders; +} + +export type GetNodeRemoteDesktopFileParameters = + GetNodeRemoteDesktopFileQueryParam & + GetNodeRemoteDesktopFileHeaderParam & + RequestParameters; + +export interface UploadNodeLogsHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface UploadNodeLogsBodyParam { + /** The Azure Batch service log files upload options. */ + body: UploadBatchServiceLogsParameters; +} + +export interface UploadNodeLogsQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface UploadNodeLogsQueryParam { + queryParameters?: UploadNodeLogsQueryParamProperties; +} + +export interface UploadNodeLogsHeaderParam { + headers?: RawHttpHeadersInput & UploadNodeLogsHeaders; +} + +export interface UploadNodeLogsMediaTypesParam { + /** Type of content */ + contentType: "application/json; odata=minimalmetadata"; +} + +export type UploadNodeLogsParameters = UploadNodeLogsQueryParam & + UploadNodeLogsHeaderParam & + UploadNodeLogsMediaTypesParam & + UploadNodeLogsBodyParam & + RequestParameters; + +export interface ListNodesHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface ListNodesQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; + /** + * The maximum number of items to return in the response. A maximum of 1000 + * applications can be returned. + */ + maxresults?: number; + /** + * An OData $filter clause. For more information on constructing this filter, see + * https://docs.microsoft.com/en-us/rest/api/batchservice/odata-filters-in-batch#list-nodes-in-a-pool. + */ + $filter?: string; + /** An OData $select clause. */ + $select?: string[]; +} + +export interface ListNodesQueryParam { + queryParameters?: ListNodesQueryParamProperties; +} + +export interface ListNodesHeaderParam { + headers?: RawHttpHeadersInput & ListNodesHeaders; +} + +export type ListNodesParameters = ListNodesQueryParam & + ListNodesHeaderParam & + RequestParameters; + +export interface GetNodeExtensionHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface GetNodeExtensionQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; + /** An OData $select clause. */ + $select?: string[]; +} + +export interface GetNodeExtensionQueryParam { + queryParameters?: GetNodeExtensionQueryParamProperties; +} + +export interface GetNodeExtensionHeaderParam { + headers?: RawHttpHeadersInput & GetNodeExtensionHeaders; +} + +export type GetNodeExtensionParameters = GetNodeExtensionQueryParam & + GetNodeExtensionHeaderParam & + RequestParameters; + +export interface ListNodeExtensionsHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface ListNodeExtensionsQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; + /** + * The maximum number of items to return in the response. A maximum of 1000 + * applications can be returned. + */ + maxresults?: number; + /** An OData $select clause. */ + $select?: string[]; +} + +export interface ListNodeExtensionsQueryParam { + queryParameters?: ListNodeExtensionsQueryParamProperties; +} + +export interface ListNodeExtensionsHeaderParam { + headers?: RawHttpHeadersInput & ListNodeExtensionsHeaders; +} + +export type ListNodeExtensionsParameters = ListNodeExtensionsQueryParam & + ListNodeExtensionsHeaderParam & + RequestParameters; + +export interface DeleteNodeFileHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface DeleteNodeFileQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; + /** + * Whether to delete children of a directory. If the filePath parameter represents + * a directory instead of a file, you can set recursive to true to delete the + * directory and all of the files and subdirectories in it. If recursive is false + * then the directory must be empty or deletion will fail. + */ + recursive?: boolean; +} + +export interface DeleteNodeFileQueryParam { + queryParameters?: DeleteNodeFileQueryParamProperties; +} + +export interface DeleteNodeFileHeaderParam { + headers?: RawHttpHeadersInput & DeleteNodeFileHeaders; +} + +export type DeleteNodeFileParameters = DeleteNodeFileQueryParam & + DeleteNodeFileHeaderParam & + RequestParameters; + +export interface GetNodeFileHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; + /** + * The byte range to be retrieved. The default is to retrieve the entire file. The + * format is bytes=startRange-endRange. + */ + "ocp-range"?: string; +} + +export interface GetNodeFileQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface GetNodeFileQueryParam { + queryParameters?: GetNodeFileQueryParamProperties; +} + +export interface GetNodeFileHeaderParam { + headers?: RawHttpHeadersInput & GetNodeFileHeaders; +} + +export type GetNodeFileParameters = GetNodeFileQueryParam & + GetNodeFileHeaderParam & + RequestParameters; + +export interface GetNodeFilePropertiesHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * been modified since the specified time. + */ + "If-Modified-Since"?: string; + /** + * A timestamp indicating the last modified time of the resource known to the + * client. The operation will be performed only if the resource on the service has + * not been modified since the specified time. + */ + "If-Unmodified-Since"?: string; +} + +export interface GetNodeFilePropertiesQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; +} + +export interface GetNodeFilePropertiesQueryParam { + queryParameters?: GetNodeFilePropertiesQueryParamProperties; +} + +export interface GetNodeFilePropertiesHeaderParam { + headers?: RawHttpHeadersInput & GetNodeFilePropertiesHeaders; +} + +export type GetNodeFilePropertiesParameters = GetNodeFilePropertiesQueryParam & + GetNodeFilePropertiesHeaderParam & + RequestParameters; + +export interface ListNodeFilesHeaders { + /** + * The caller-generated request identity, in the form of a GUID with no decoration + * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. + */ + "client-request-id"?: string; + /** Whether the server should return the client-request-id in the response. */ + "return-client-request-id"?: boolean; + /** + * The time the request was issued. Client libraries typically set this to the + * current system clock time; set it explicitly if you are calling the REST API + * directly. + */ + "ocp-date"?: string; +} + +export interface ListNodeFilesQueryParamProperties { + /** + * Sets the maximum time that the server can spend processing the request, + * in seconds. The default is 30 seconds. + */ + timeOut?: number; + /** + * The maximum number of items to return in the response. A maximum of 1000 + * applications can be returned. + */ + maxresults?: number; + /** + * An OData $filter clause. For more information on constructing this filter, see + * https://docs.microsoft.com/en-us/rest/api/batchservice/odata-filters-in-batch#list-compute-node-files. + */ + $filter?: string; + /** Whether to list children of a directory. */ + recursive?: boolean; +} + +export interface ListNodeFilesQueryParam { + queryParameters?: ListNodeFilesQueryParamProperties; +} + +export interface ListNodeFilesHeaderParam { + headers?: RawHttpHeadersInput & ListNodeFilesHeaders; +} + +export type ListNodeFilesParameters = ListNodeFilesQueryParam & + ListNodeFilesHeaderParam & + RequestParameters; diff --git a/packages/service/src/internal/batch-rest/generated/src/responses.ts b/packages/service/src/internal/batch-rest/generated/src/responses.ts new file mode 100644 index 000000000..0a835fa2e --- /dev/null +++ b/packages/service/src/internal/batch-rest/generated/src/responses.ts @@ -0,0 +1,1833 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { RawHttpHeaders } from "@azure/core-rest-pipeline"; +import { HttpResponse } from "@azure-rest/core-client"; +import { + BatchApplicationListResultOutput, + BatchErrorOutput, + BatchApplicationOutput, + BatchPoolListUsageMetricsResultOutput, + BatchPoolListResultOutput, + BatchPoolOutput, + AutoScaleRunOutput, + BatchAccountListSupportedImagesResultOutput, + BatchPoolNodeCountsListResultOutput, + BatchJobOutput, + BatchJobListResultOutput, + BatchJobPreparationAndReleaseTaskStatusListResultOutput, + BatchTaskCountsResultOutput, + BatchCertificateListResultOutput, + BatchCertificateOutput, + BatchJobScheduleOutput, + BatchJobScheduleListResultOutput, + BatchTaskListResultOutput, + BatchTaskAddCollectionResultOutput, + BatchTaskOutput, + BatchTaskListSubtasksResultOutput, + BatchNodeFileListResultOutput, + BatchNodeOutput, + BatchNodeRemoteLoginSettingsOutput, + UploadBatchServiceLogsResultOutput, + BatchNodeListResultOutput, + BatchNodeVMExtensionOutput, + BatchNodeVMExtensionListResultOutput, +} from "./outputModels"; + +export interface ListApplications200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface ListApplications200Response extends HttpResponse { + status: "200"; + body: BatchApplicationListResultOutput; + headers: RawHttpHeaders & ListApplications200Headers; +} + +export interface ListApplicationsDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface GetApplication200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface GetApplication200Response extends HttpResponse { + status: "200"; + body: BatchApplicationOutput; + headers: RawHttpHeaders & GetApplication200Headers; +} + +export interface GetApplicationDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface ListPoolUsageMetrics200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface ListPoolUsageMetrics200Response extends HttpResponse { + status: "200"; + body: BatchPoolListUsageMetricsResultOutput; + headers: RawHttpHeaders & ListPoolUsageMetrics200Headers; +} + +export interface ListPoolUsageMetricsDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface CreatePool201Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** The request has succeeded and a new resource has been created as a result. */ +export interface CreatePool201Response extends HttpResponse { + status: "201"; + headers: RawHttpHeaders & CreatePool201Headers; +} + +export interface CreatePoolDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface ListPools200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface ListPools200Response extends HttpResponse { + status: "200"; + body: BatchPoolListResultOutput; + headers: RawHttpHeaders & ListPools200Headers; +} + +export interface ListPoolsDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface DeletePool202Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; +} + +/** The request has been accepted for processing, but processing has not yet completed. */ +export interface DeletePool202Response extends HttpResponse { + status: "202"; + headers: RawHttpHeaders & DeletePool202Headers; +} + +export interface DeletePoolDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface PoolExists200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface PoolExists200Response extends HttpResponse { + status: "200"; + headers: RawHttpHeaders & PoolExists200Headers; +} + +/** The server cannot find the requested resource. */ +export interface PoolExists404Response extends HttpResponse { + status: "404"; +} + +export interface PoolExistsDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface GetPool200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface GetPool200Response extends HttpResponse { + status: "200"; + body: BatchPoolOutput; + headers: RawHttpHeaders & GetPool200Headers; +} + +export interface GetPoolDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface UpdatePool200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** The request has succeeded. */ +export interface UpdatePool200Response extends HttpResponse { + status: "200"; + headers: RawHttpHeaders & UpdatePool200Headers; +} + +export interface UpdatePoolDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface DisablePoolAutoScale200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** The request has succeeded. */ +export interface DisablePoolAutoScale200Response extends HttpResponse { + status: "200"; + headers: RawHttpHeaders & DisablePoolAutoScale200Headers; +} + +export interface DisablePoolAutoScaleDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface EnablePoolAutoScale200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** The request has succeeded. */ +export interface EnablePoolAutoScale200Response extends HttpResponse { + status: "200"; + headers: RawHttpHeaders & EnablePoolAutoScale200Headers; +} + +export interface EnablePoolAutoScaleDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface EvaluatePoolAutoScale200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** The request has succeeded. */ +export interface EvaluatePoolAutoScale200Response extends HttpResponse { + status: "200"; + body: AutoScaleRunOutput; + headers: RawHttpHeaders & EvaluatePoolAutoScale200Headers; +} + +export interface EvaluatePoolAutoScaleDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface ResizePool202Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** The request has been accepted for processing, but processing has not yet completed. */ +export interface ResizePool202Response extends HttpResponse { + status: "202"; + headers: RawHttpHeaders & ResizePool202Headers; +} + +export interface ResizePoolDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface StopPoolResize202Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** The request has been accepted for processing, but processing has not yet completed. */ +export interface StopPoolResize202Response extends HttpResponse { + status: "202"; + headers: RawHttpHeaders & StopPoolResize202Headers; +} + +export interface StopPoolResizeDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface ReplacePoolProperties204Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** There is no content to send for this request, but the headers may be useful. */ +export interface ReplacePoolProperties204Response extends HttpResponse { + status: "204"; + headers: RawHttpHeaders & ReplacePoolProperties204Headers; +} + +export interface ReplacePoolPropertiesDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface RemoveNodes202Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** The request has been accepted for processing, but processing has not yet completed. */ +export interface RemoveNodes202Response extends HttpResponse { + status: "202"; + headers: RawHttpHeaders & RemoveNodes202Headers; +} + +export interface RemoveNodesDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface ListSupportedImages200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface ListSupportedImages200Response extends HttpResponse { + status: "200"; + body: BatchAccountListSupportedImagesResultOutput; + headers: RawHttpHeaders & ListSupportedImages200Headers; +} + +export interface ListSupportedImagesDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface ListPoolNodeCounts200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface ListPoolNodeCounts200Response extends HttpResponse { + status: "200"; + body: BatchPoolNodeCountsListResultOutput; + headers: RawHttpHeaders & ListPoolNodeCounts200Headers; +} + +export interface ListPoolNodeCountsDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface DeleteJob202Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; +} + +/** The request has been accepted for processing, but processing has not yet completed. */ +export interface DeleteJob202Response extends HttpResponse { + status: "202"; + headers: RawHttpHeaders & DeleteJob202Headers; +} + +export interface DeleteJobDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface GetJob200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface GetJob200Response extends HttpResponse { + status: "200"; + body: BatchJobOutput; + headers: RawHttpHeaders & GetJob200Headers; +} + +export interface GetJobDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface UpdateJob200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** The request has succeeded. */ +export interface UpdateJob200Response extends HttpResponse { + status: "200"; + headers: RawHttpHeaders & UpdateJob200Headers; +} + +export interface UpdateJobDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface ReplaceJob200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** The request has succeeded. */ +export interface ReplaceJob200Response extends HttpResponse { + status: "200"; + headers: RawHttpHeaders & ReplaceJob200Headers; +} + +export interface ReplaceJobDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface DisableJob202Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** The request has been accepted for processing, but processing has not yet completed. */ +export interface DisableJob202Response extends HttpResponse { + status: "202"; + headers: RawHttpHeaders & DisableJob202Headers; +} + +export interface DisableJobDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface EnableJob202Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** The request has been accepted for processing, but processing has not yet completed. */ +export interface EnableJob202Response extends HttpResponse { + status: "202"; + headers: RawHttpHeaders & EnableJob202Headers; +} + +export interface EnableJobDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface TerminateJob202Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** The request has been accepted for processing, but processing has not yet completed. */ +export interface TerminateJob202Response extends HttpResponse { + status: "202"; + headers: RawHttpHeaders & TerminateJob202Headers; +} + +export interface TerminateJobDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface CreateJob201Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** The request has succeeded and a new resource has been created as a result. */ +export interface CreateJob201Response extends HttpResponse { + status: "201"; + headers: RawHttpHeaders & CreateJob201Headers; +} + +export interface CreateJobDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface ListJobs200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface ListJobs200Response extends HttpResponse { + status: "200"; + body: BatchJobListResultOutput; + headers: RawHttpHeaders & ListJobs200Headers; +} + +export interface ListJobsDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface ListJobsFromSchedule200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface ListJobsFromSchedule200Response extends HttpResponse { + status: "200"; + body: BatchJobListResultOutput; + headers: RawHttpHeaders & ListJobsFromSchedule200Headers; +} + +export interface ListJobsFromScheduleDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface ListJobPreparationAndReleaseTaskStatus200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface ListJobPreparationAndReleaseTaskStatus200Response + extends HttpResponse { + status: "200"; + body: BatchJobPreparationAndReleaseTaskStatusListResultOutput; + headers: RawHttpHeaders & ListJobPreparationAndReleaseTaskStatus200Headers; +} + +export interface ListJobPreparationAndReleaseTaskStatusDefaultResponse + extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface GetJobTaskCounts200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface GetJobTaskCounts200Response extends HttpResponse { + status: "200"; + body: BatchTaskCountsResultOutput; + headers: RawHttpHeaders & GetJobTaskCounts200Headers; +} + +export interface GetJobTaskCountsDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface CreateCertificate201Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** The request has succeeded and a new resource has been created as a result. */ +export interface CreateCertificate201Response extends HttpResponse { + status: "201"; + headers: RawHttpHeaders & CreateCertificate201Headers; +} + +export interface CreateCertificateDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface ListCertificates200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface ListCertificates200Response extends HttpResponse { + status: "200"; + body: BatchCertificateListResultOutput; + headers: RawHttpHeaders & ListCertificates200Headers; +} + +export interface ListCertificatesDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface CancelCertificateDeletion204Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** There is no content to send for this request, but the headers may be useful. */ +export interface CancelCertificateDeletion204Response extends HttpResponse { + status: "204"; + headers: RawHttpHeaders & CancelCertificateDeletion204Headers; +} + +export interface CancelCertificateDeletionDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface DeleteCertificate202Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has been accepted for processing, but processing has not yet completed. */ +export interface DeleteCertificate202Response extends HttpResponse { + status: "202"; + headers: RawHttpHeaders & DeleteCertificate202Headers; +} + +export interface DeleteCertificateDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface GetCertificate200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface GetCertificate200Response extends HttpResponse { + status: "200"; + body: BatchCertificateOutput; + headers: RawHttpHeaders & GetCertificate200Headers; +} + +export interface GetCertificateDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface JobScheduleExists200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface JobScheduleExists200Response extends HttpResponse { + status: "200"; + headers: RawHttpHeaders & JobScheduleExists200Headers; +} + +/** The server cannot find the requested resource. */ +export interface JobScheduleExists404Response extends HttpResponse { + status: "404"; +} + +export interface JobScheduleExistsDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface DeleteJobSchedule202Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; +} + +/** The request has been accepted for processing, but processing has not yet completed. */ +export interface DeleteJobSchedule202Response extends HttpResponse { + status: "202"; + headers: RawHttpHeaders & DeleteJobSchedule202Headers; +} + +export interface DeleteJobScheduleDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface GetJobSchedule200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface GetJobSchedule200Response extends HttpResponse { + status: "200"; + body: BatchJobScheduleOutput; + headers: RawHttpHeaders & GetJobSchedule200Headers; +} + +export interface GetJobScheduleDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface UpdateJobSchedule200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** The request has succeeded. */ +export interface UpdateJobSchedule200Response extends HttpResponse { + status: "200"; + headers: RawHttpHeaders & UpdateJobSchedule200Headers; +} + +export interface UpdateJobScheduleDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface ReplaceJobSchedule200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** The request has succeeded. */ +export interface ReplaceJobSchedule200Response extends HttpResponse { + status: "200"; + headers: RawHttpHeaders & ReplaceJobSchedule200Headers; +} + +export interface ReplaceJobScheduleDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface DisableJobSchedule204Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** There is no content to send for this request, but the headers may be useful. */ +export interface DisableJobSchedule204Response extends HttpResponse { + status: "204"; + headers: RawHttpHeaders & DisableJobSchedule204Headers; +} + +export interface DisableJobScheduleDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface EnableJobSchedule204Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** There is no content to send for this request, but the headers may be useful. */ +export interface EnableJobSchedule204Response extends HttpResponse { + status: "204"; + headers: RawHttpHeaders & EnableJobSchedule204Headers; +} + +export interface EnableJobScheduleDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface TerminateJobSchedule202Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** The request has been accepted for processing, but processing has not yet completed. */ +export interface TerminateJobSchedule202Response extends HttpResponse { + status: "202"; + headers: RawHttpHeaders & TerminateJobSchedule202Headers; +} + +export interface TerminateJobScheduleDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface CreateJobSchedule201Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** The request has succeeded and a new resource has been created as a result. */ +export interface CreateJobSchedule201Response extends HttpResponse { + status: "201"; + headers: RawHttpHeaders & CreateJobSchedule201Headers; +} + +export interface CreateJobScheduleDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface ListJobSchedules200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface ListJobSchedules200Response extends HttpResponse { + status: "200"; + body: BatchJobScheduleListResultOutput; + headers: RawHttpHeaders & ListJobSchedules200Headers; +} + +export interface ListJobSchedulesDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface CreateTask201Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** The request has succeeded and a new resource has been created as a result. */ +export interface CreateTask201Response extends HttpResponse { + status: "201"; + headers: RawHttpHeaders & CreateTask201Headers; +} + +export interface CreateTaskDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface ListTasks200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface ListTasks200Response extends HttpResponse { + status: "200"; + body: BatchTaskListResultOutput; + headers: RawHttpHeaders & ListTasks200Headers; +} + +export interface ListTasksDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface CreateTaskCollection200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface CreateTaskCollection200Response extends HttpResponse { + status: "200"; + body: BatchTaskAddCollectionResultOutput; + headers: RawHttpHeaders & CreateTaskCollection200Headers; +} + +export interface CreateTaskCollectionDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface DeleteTask200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; +} + +/** The request has succeeded. */ +export interface DeleteTask200Response extends HttpResponse { + status: "200"; + headers: RawHttpHeaders & DeleteTask200Headers; +} + +export interface DeleteTaskDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface GetTask200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** The request has succeeded. */ +export interface GetTask200Response extends HttpResponse { + status: "200"; + body: BatchTaskOutput; + headers: RawHttpHeaders & GetTask200Headers; +} + +export interface GetTaskDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface ReplaceTask200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** The request has succeeded. */ +export interface ReplaceTask200Response extends HttpResponse { + status: "200"; + headers: RawHttpHeaders & ReplaceTask200Headers; +} + +export interface ReplaceTaskDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface ListSubTasks200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface ListSubTasks200Response extends HttpResponse { + status: "200"; + body: BatchTaskListSubtasksResultOutput; + headers: RawHttpHeaders & ListSubTasks200Headers; +} + +export interface ListSubTasksDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface TerminateTask204Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** There is no content to send for this request, but the headers may be useful. */ +export interface TerminateTask204Response extends HttpResponse { + status: "204"; + headers: RawHttpHeaders & TerminateTask204Headers; +} + +export interface TerminateTaskDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface ReactivateTask204Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** There is no content to send for this request, but the headers may be useful. */ +export interface ReactivateTask204Response extends HttpResponse { + status: "204"; + headers: RawHttpHeaders & ReactivateTask204Headers; +} + +export interface ReactivateTaskDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface DeleteTaskFile200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; +} + +/** The request has succeeded. */ +export interface DeleteTaskFile200Response extends HttpResponse { + status: "200"; + headers: RawHttpHeaders & DeleteTaskFile200Headers; +} + +export interface DeleteTaskFileDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface GetTaskFile200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The file creation time. */ + "ocp-creation-time"?: string; + /** Whether the object represents a directory. */ + "ocp-batch-file-isdirectory": boolean; + /** The URL of the file. */ + "ocp-batch-file-url": string; + /** The file mode attribute in octal format. */ + "ocp-batch-file-mode": string; + /** The length of the file. */ + "content-length": number; +} + +/** The request has succeeded. */ +export interface GetTaskFile200Response extends HttpResponse { + status: "200"; + /** Value may contain any sequence of octets */ + body: Uint8Array; + headers: RawHttpHeaders & GetTaskFile200Headers; +} + +export interface GetTaskFileDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface GetTaskFileProperties200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The file creation time. */ + "ocp-creation-time"?: string; + /** Whether the object represents a directory. */ + "ocp-batch-file-isdirectory": boolean; + /** The URL of the file. */ + "ocp-batch-file-url": string; + /** The file mode attribute in octal format. */ + "ocp-batch-file-mode": string; + /** The length of the file. */ + "content-length": number; +} + +/** The request has succeeded. */ +export interface GetTaskFileProperties200Response extends HttpResponse { + status: "200"; + headers: RawHttpHeaders & GetTaskFileProperties200Headers; +} + +export interface GetTaskFilePropertiesDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface ListTaskFiles200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface ListTaskFiles200Response extends HttpResponse { + status: "200"; + body: BatchNodeFileListResultOutput; + headers: RawHttpHeaders & ListTaskFiles200Headers; +} + +export interface ListTaskFilesDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface CreateNodeUser201Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** The request has succeeded and a new resource has been created as a result. */ +export interface CreateNodeUser201Response extends HttpResponse { + status: "201"; + headers: RawHttpHeaders & CreateNodeUser201Headers; +} + +export interface CreateNodeUserDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface DeleteNodeUser200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; +} + +/** The request has succeeded. */ +export interface DeleteNodeUser200Response extends HttpResponse { + status: "200"; + headers: RawHttpHeaders & DeleteNodeUser200Headers; +} + +export interface DeleteNodeUserDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface ReplaceNodeUser200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** The request has succeeded. */ +export interface ReplaceNodeUser200Response extends HttpResponse { + status: "200"; + headers: RawHttpHeaders & ReplaceNodeUser200Headers; +} + +export interface ReplaceNodeUserDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface GetNode200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface GetNode200Response extends HttpResponse { + status: "200"; + body: BatchNodeOutput; + headers: RawHttpHeaders & GetNode200Headers; +} + +export interface GetNodeDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface RebootNode202Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** The request has been accepted for processing, but processing has not yet completed. */ +export interface RebootNode202Response extends HttpResponse { + status: "202"; + headers: RawHttpHeaders & RebootNode202Headers; +} + +export interface RebootNodeDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface ReimageNode202Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** The request has been accepted for processing, but processing has not yet completed. */ +export interface ReimageNode202Response extends HttpResponse { + status: "202"; + headers: RawHttpHeaders & ReimageNode202Headers; +} + +export interface ReimageNodeDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface DisableNodeScheduling200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** The request has succeeded. */ +export interface DisableNodeScheduling200Response extends HttpResponse { + status: "200"; + headers: RawHttpHeaders & DisableNodeScheduling200Headers; +} + +export interface DisableNodeSchedulingDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface EnableNodeScheduling200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; +} + +/** The request has succeeded. */ +export interface EnableNodeScheduling200Response extends HttpResponse { + status: "200"; + headers: RawHttpHeaders & EnableNodeScheduling200Headers; +} + +export interface EnableNodeSchedulingDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface GetNodeRemoteLoginSettings200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface GetNodeRemoteLoginSettings200Response extends HttpResponse { + status: "200"; + body: BatchNodeRemoteLoginSettingsOutput; + headers: RawHttpHeaders & GetNodeRemoteLoginSettings200Headers; +} + +export interface GetNodeRemoteLoginSettingsDefaultResponse + extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface GetNodeRemoteDesktopFile200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface GetNodeRemoteDesktopFile200Response extends HttpResponse { + status: "200"; + body: string; + headers: RawHttpHeaders & GetNodeRemoteDesktopFile200Headers; +} + +export interface GetNodeRemoteDesktopFileDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface UploadNodeLogs200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface UploadNodeLogs200Response extends HttpResponse { + status: "200"; + body: UploadBatchServiceLogsResultOutput; + headers: RawHttpHeaders & UploadNodeLogs200Headers; +} + +export interface UploadNodeLogsDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface ListNodes200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface ListNodes200Response extends HttpResponse { + status: "200"; + body: BatchNodeListResultOutput; + headers: RawHttpHeaders & ListNodes200Headers; +} + +export interface ListNodesDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface GetNodeExtension200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface GetNodeExtension200Response extends HttpResponse { + status: "200"; + body: BatchNodeVMExtensionOutput; + headers: RawHttpHeaders & GetNodeExtension200Headers; +} + +export interface GetNodeExtensionDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface ListNodeExtensions200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface ListNodeExtensions200Response extends HttpResponse { + status: "200"; + body: BatchNodeVMExtensionListResultOutput; + headers: RawHttpHeaders & ListNodeExtensions200Headers; +} + +export interface ListNodeExtensionsDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface DeleteNodeFile200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; +} + +/** The request has succeeded. */ +export interface DeleteNodeFile200Response extends HttpResponse { + status: "200"; + headers: RawHttpHeaders & DeleteNodeFile200Headers; +} + +export interface DeleteNodeFileDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface GetNodeFile200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The file creation time. */ + "ocp-creation-time"?: string; + /** Whether the object represents a directory. */ + "ocp-batch-file-isdirectory": boolean; + /** The URL of the file. */ + "ocp-batch-file-url": string; + /** The file mode attribute in octal format. */ + "ocp-batch-file-mode": string; + /** The length of the file. */ + "content-length": number; +} + +/** The request has succeeded. */ +export interface GetNodeFile200Response extends HttpResponse { + status: "200"; + body: string; + headers: RawHttpHeaders & GetNodeFile200Headers; +} + +export interface GetNodeFileDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface GetNodeFileProperties200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; + /** The file creation time. */ + "ocp-creation-time"?: string; + /** Whether the object represents a directory. */ + "ocp-batch-file-isdirectory": boolean; + /** The URL of the file. */ + "ocp-batch-file-url": string; + /** The file mode attribute in octal format. */ + "ocp-batch-file-mode": string; + /** The length of the file. */ + "content-length": number; +} + +/** The request has succeeded. */ +export interface GetNodeFileProperties200Response extends HttpResponse { + status: "200"; + headers: RawHttpHeaders & GetNodeFileProperties200Headers; +} + +export interface GetNodeFilePropertiesDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} + +export interface ListNodeFiles200Headers { + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; + /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ + etag?: string; + /** The time at which the resource was last modified. */ + "last-modified"?: string; +} + +/** The request has succeeded. */ +export interface ListNodeFiles200Response extends HttpResponse { + status: "200"; + body: BatchNodeFileListResultOutput; + headers: RawHttpHeaders & ListNodeFiles200Headers; +} + +export interface ListNodeFilesDefaultResponse extends HttpResponse { + status: string; + body: BatchErrorOutput; +} diff --git a/packages/service/src/internal/batch-rest/generated/tsp-location.yaml b/packages/service/src/internal/batch-rest/generated/tsp-location.yaml new file mode 100644 index 000000000..520084cd7 --- /dev/null +++ b/packages/service/src/internal/batch-rest/generated/tsp-location.yaml @@ -0,0 +1,4 @@ +directory: specification/batch/Azure.Batch +commit: e4b9c403b879114eabb38f23071161e5a6cd508e +repo: wiboris/azure-rest-api-specs +additionalDirectories: diff --git a/packages/service/src/internal/batch-rest/index.ts b/packages/service/src/internal/batch-rest/index.ts new file mode 100644 index 000000000..efa0c01fd --- /dev/null +++ b/packages/service/src/internal/batch-rest/index.ts @@ -0,0 +1,3 @@ +/// +export * from "./generated/src/index"; +export * from "./client"; diff --git a/packages/arm-batch-rest/src/__tests__/pipeline-http-headers.spec.ts b/packages/service/src/internal/client-http/__tests__/pipeline-http-headers.spec.ts similarity index 97% rename from packages/arm-batch-rest/src/__tests__/pipeline-http-headers.spec.ts rename to packages/service/src/internal/client-http/__tests__/pipeline-http-headers.spec.ts index 4a416508f..310fd0f91 100644 --- a/packages/arm-batch-rest/src/__tests__/pipeline-http-headers.spec.ts +++ b/packages/service/src/internal/client-http/__tests__/pipeline-http-headers.spec.ts @@ -1,5 +1,5 @@ import { RawHttpHeaders } from "@azure/core-rest-pipeline"; -import { PipelineHttpHeadersImpl } from "../http/pipeline-http-headers"; +import { PipelineHttpHeadersImpl } from "../pipeline-http-headers"; import { MapHttpHeaders } from "@azure/bonito-core/lib/http"; describe("PipelineHttpHeadersImpl", () => { diff --git a/packages/arm-batch-rest/src/http/batch-http-client.ts b/packages/service/src/internal/client-http/batch-http-client.ts similarity index 100% rename from packages/arm-batch-rest/src/http/batch-http-client.ts rename to packages/service/src/internal/client-http/batch-http-client.ts diff --git a/packages/arm-batch-rest/src/http/pipeline-http-headers.ts b/packages/service/src/internal/client-http/pipeline-http-headers.ts similarity index 100% rename from packages/arm-batch-rest/src/http/pipeline-http-headers.ts rename to packages/service/src/internal/client-http/pipeline-http-headers.ts diff --git a/packages/arm-batch-rest/src/http/rest-error.ts b/packages/service/src/internal/client-http/rest-error.ts similarity index 100% rename from packages/arm-batch-rest/src/http/rest-error.ts rename to packages/service/src/internal/client-http/rest-error.ts diff --git a/packages/service/src/node/__tests__/fake-node-service.spec.ts b/packages/service/src/node/__tests__/fake-node-service.spec.ts new file mode 100644 index 000000000..deca7f9e1 --- /dev/null +++ b/packages/service/src/node/__tests__/fake-node-service.spec.ts @@ -0,0 +1,34 @@ +import { initMockBatchEnvironment } from "../../environment"; +import { BatchFakeSet, BasicBatchFakeSet } from "../../test-util/fakes"; +import { FakeNodeService } from "../fake-node-service"; + +describe("FakeNodeService", () => { + const poolId = `/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/supercomputing/providers/Microsoft.Batch/batchAccounts/hobo/pools/hobopool1`; + const nodeId = `tvmps_id1`; + + let service: FakeNodeService; + let fakeSet: BatchFakeSet; + + beforeEach(() => { + initMockBatchEnvironment(); + fakeSet = new BasicBatchFakeSet(); + service = new FakeNodeService(); + service.setFakes(fakeSet); + }); + + test("List batch nodes", async () => { + const nodes = await service.listBatchNodes("", poolId); + expect(nodes?.map((node) => node.id)).toEqual([nodeId]); + }); + + test("List batch node extensions", async () => { + const extensions = await service.listBatchNodeExtensions( + "", + "", + nodeId + ); + expect( + extensions?.map((extension) => extension?.vmExtension?.name) + ).toEqual(["CustomExtension100"]); + }); +}); diff --git a/packages/service/src/node/fake-node-service.ts b/packages/service/src/node/fake-node-service.ts new file mode 100644 index 000000000..8fb47a6bf --- /dev/null +++ b/packages/service/src/node/fake-node-service.ts @@ -0,0 +1,29 @@ +import { OperationOptions } from "@azure/bonito-core"; +import { BatchFakeSet, BasicBatchFakeSet } from "../test-util/fakes"; +import { BatchNodeOutput, BatchNodeVMExtensionOutput } from "./node-models"; +import type { NodeService } from "./node-service"; + +export class FakeNodeService implements NodeService { + fakeSet: BatchFakeSet = new BasicBatchFakeSet(); + + setFakes(fakeSet: BatchFakeSet): void { + this.fakeSet = fakeSet; + } + + async listBatchNodes( + accountEndpoint: string, + poolId: string, + opts?: OperationOptions | undefined + ): Promise { + return this.fakeSet.listBatchNodes(poolId); + } + + async listBatchNodeExtensions( + accountEndpoint: string, + poolId: string, + nodeId: string, + opts?: OperationOptions | undefined + ): Promise { + return this.fakeSet.listBatchNodeExtensions(nodeId); + } +} diff --git a/packages/service/src/node/index.ts b/packages/service/src/node/index.ts new file mode 100644 index 000000000..fa0d1ada4 --- /dev/null +++ b/packages/service/src/node/index.ts @@ -0,0 +1,4 @@ +export * from "./node-models"; +export * from "./node-service"; +export * from "./fake-node-service"; +export * from "./live-node-service"; diff --git a/packages/service/src/node/live-node-service.ts b/packages/service/src/node/live-node-service.ts new file mode 100644 index 000000000..7199b5c7d --- /dev/null +++ b/packages/service/src/node/live-node-service.ts @@ -0,0 +1,58 @@ +import { AbstractHttpService, OperationOptions } from "@azure/bonito-core"; +import { BatchNodeOutput, BatchNodeVMExtensionOutput } from "./node-models"; +import { NodeService } from "./node-service"; +import { createBatchClient, isUnexpected } from "../internal/batch-rest"; +import { createBatchUnexpectedStatusCodeError } from "../utils"; + +export class LiveNodeService + extends AbstractHttpService + implements NodeService +{ + private _ensureHttpsEndpoint(accountEndpoint: string): string { + if (!accountEndpoint.startsWith("https://")) { + return `https://${accountEndpoint}`; + } + + return accountEndpoint; + } + + async listBatchNodes( + accountEndpoint: string, + poolId: string, + opts?: OperationOptions | undefined + ): Promise { + const listNodePath = "/pools/{poolId}/nodes"; + const batchClient = createBatchClient( + this._ensureHttpsEndpoint(accountEndpoint) + ); + const res = await batchClient.path(listNodePath, poolId).get(); + + if (isUnexpected(res)) { + throw createBatchUnexpectedStatusCodeError(res); + } + + return res.body.value; + } + + async listBatchNodeExtensions( + accountEndpoint: string, + poolId: string, + nodeId: string, + opts?: OperationOptions | undefined + ): Promise { + const listNodeExtensionPath = + "/pools/{poolId}/nodes/{nodeId}/extensions"; + const batchClient = createBatchClient( + this._ensureHttpsEndpoint(accountEndpoint) + ); + const res = await batchClient + .path(listNodeExtensionPath, poolId, nodeId) + .get(); + + if (isUnexpected(res)) { + throw createBatchUnexpectedStatusCodeError(res); + } + + return res.body.value; + } +} diff --git a/packages/service/src/node/node-models.ts b/packages/service/src/node/node-models.ts new file mode 100644 index 000000000..ea8659cc8 --- /dev/null +++ b/packages/service/src/node/node-models.ts @@ -0,0 +1,4 @@ +export { + BatchNodeVMExtensionOutput, + BatchNodeOutput, +} from "../internal/batch-rest"; diff --git a/packages/service/src/node/node-service.ts b/packages/service/src/node/node-service.ts new file mode 100644 index 000000000..899a8f55d --- /dev/null +++ b/packages/service/src/node/node-service.ts @@ -0,0 +1,17 @@ +import { OperationOptions } from "@azure/bonito-core"; +import { BatchNodeOutput, BatchNodeVMExtensionOutput } from "./node-models"; + +export interface NodeService { + listBatchNodes( + accountEndpoint: string, + poolId: string, + opts?: OperationOptions + ): Promise; + + listBatchNodeExtensions( + accountEndpoint: string, + poolId: string, + nodeId: string, + opts?: OperationOptions + ): Promise; +} diff --git a/packages/service/src/pool/__tests__/fake-pool-service.spec.ts b/packages/service/src/pool/__tests__/fake-pool-service.spec.ts index 428daab9a..d521cbe2f 100644 --- a/packages/service/src/pool/__tests__/fake-pool-service.spec.ts +++ b/packages/service/src/pool/__tests__/fake-pool-service.spec.ts @@ -7,6 +7,9 @@ describe("FakePoolService", () => { const hoboAcctId = "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/supercomputing/providers/Microsoft.Batch/batchAccounts/hobo"; + const hoboPoolArmId = `${hoboAcctId}/pools/hobopool1`; + const newTestPoolArmId = `${hoboAcctId}/pools/newtestpool`; + let service: FakePoolService; let fakeSet: BatchFakeSet; @@ -23,9 +26,7 @@ describe("FakePoolService", () => { }); test("Get by resource ID", async () => { - const pool = await service.get( - "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/supercomputing/providers/Microsoft.Batch/batchAccounts/hobo/pools/hobopool1" - ); + const pool = await service.get(hoboPoolArmId); expect(pool?.name).toEqual("hobopool1"); }); @@ -57,7 +58,7 @@ describe("FakePoolService", () => { }, }; - const pool = await service.createOrUpdate(newPool); + const pool = await service.createOrUpdate(newTestPoolArmId, newPool); expect(pool?.name).toEqual("newtestpool"); const pools = await service.listByAccountId(hoboAcctId); @@ -93,7 +94,7 @@ describe("FakePoolService", () => { }, }; - const pool = await service.createOrUpdate(poolUpdate); + const pool = await service.createOrUpdate(hoboPoolArmId, poolUpdate); expect(pool?.name).toEqual("hobopool1"); // Updated an existing pool rather than created a new one @@ -116,7 +117,7 @@ describe("FakePoolService", () => { }, }; - const pool = await service.patch(update); + const pool = await service.patch(hoboPoolArmId, update); expect(pool?.name).toEqual("hobopool1"); expect( pool?.properties?.scaleSettings?.fixedScale?.targetDedicatedNodes diff --git a/packages/service/src/pool/__tests__/live-pool-service.spec.ts b/packages/service/src/pool/__tests__/live-pool-service.spec.ts index e1bb949e4..d722f8f38 100644 --- a/packages/service/src/pool/__tests__/live-pool-service.spec.ts +++ b/packages/service/src/pool/__tests__/live-pool-service.spec.ts @@ -11,8 +11,8 @@ import { initMockBatchEnvironment } from "../../environment"; describe("LivePoolService", () => { const hoboAcctId = "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/supercomputing/providers/Microsoft.Batch/batchAccounts/hobo"; - const hoboPoolOneId = - "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/supercomputing/providers/Microsoft.Batch/batchAccounts/hobo/pools/hobopool1"; + const hoboPoolArmId = `${hoboAcctId}/pools/hobopool1`; + const newTestPoolArmId = `${hoboAcctId}/pools/newtestpool`; let service: PoolService; let fakeSet: BatchFakeSet; @@ -59,32 +59,35 @@ describe("LivePoolService", () => { ) ); - expect(() => service.listByAccountId(hoboAcctId)).rejects.toThrowError( - `Failed to list pools under account ${hoboAcctId} [unexpected 500 status]\nResponse body:\nBoom` - ); + await expect(() => service.listByAccountId(hoboAcctId)).rejects + .toMatchInlineSnapshot(` + [Error: The Batch management plane returned an unexpected status code [unexpected 500 status] + Response body: + "Boom"] + `); }); test("Get by resource ID", async () => { httpClient.addExpected( new MockHttpResponse( - `${getArmUrl()}${hoboPoolOneId}?api-version=${ + `${getArmUrl()}${hoboPoolArmId}?api-version=${ BatchApiVersion.arm }`, { status: 200, - body: JSON.stringify(fakeSet.getPool(hoboPoolOneId)), + body: JSON.stringify(fakeSet.getPool(hoboPoolArmId)), } ) ); - const pool = await service.get(hoboPoolOneId); + const pool = await service.get(hoboPoolArmId); expect(pool?.name).toEqual("hobopool1"); }); test("Get by resource ID error", async () => { httpClient.addExpected( new MockHttpResponse( - `${getArmUrl()}${hoboPoolOneId}?api-version=${ + `${getArmUrl()}${hoboPoolArmId}?api-version=${ BatchApiVersion.arm }`, { @@ -94,9 +97,12 @@ describe("LivePoolService", () => { ) ); - expect(() => service.get(hoboPoolOneId)).rejects.toThrowError( - `Failed to get pool by ID ${hoboPoolOneId} [unexpected 500 status]\nResponse body:\nBoom` - ); + await expect(() => service.get(hoboPoolArmId)).rejects + .toMatchInlineSnapshot(` + [Error: The Batch management plane returned an unexpected status code [unexpected 500 status] + Response body: + "Boom"] + `); }); test("Create, update, patch", async () => { @@ -149,7 +155,7 @@ describe("LivePoolService", () => { ); // Create - let pool = await service.createOrUpdate(newPool); + let pool = await service.createOrUpdate(newTestPoolArmId, newPool); expect(pool?.name).toEqual("newtestpool"); if (newPool.properties?.scaleSettings?.fixedScale) { @@ -179,7 +185,7 @@ describe("LivePoolService", () => { ); // Update - pool = await service.createOrUpdate(newPool); + pool = await service.createOrUpdate(newTestPoolArmId, newPool); expect(pool?.name).toEqual("newtestpool"); const patch: Pool = { @@ -210,7 +216,7 @@ describe("LivePoolService", () => { ); // Patch - pool = await service.patch(patch); + pool = await service.patch(newTestPoolArmId, patch); expect(pool?.name).toEqual("newtestpool"); expect( pool?.properties?.scaleSettings?.fixedScale?.targetDedicatedNodes diff --git a/packages/service/src/pool/fake-pool-service.ts b/packages/service/src/pool/fake-pool-service.ts index 2bed0b6b8..77780713a 100644 --- a/packages/service/src/pool/fake-pool-service.ts +++ b/packages/service/src/pool/fake-pool-service.ts @@ -9,19 +9,19 @@ export class FakePoolService implements PoolService { this.fakeSet = fakeSet; } - async createOrUpdate(pool: Pool): Promise { + async createOrUpdate(poolArmId: string, pool: Pool): Promise { return this.fakeSet.putPool(pool); } - async get(id: string): Promise { - return this.fakeSet.getPool(id); + async get(poolArmId: string): Promise { + return this.fakeSet.getPool(poolArmId); } async listByAccountId(accountId: string): Promise { return this.fakeSet.listPoolsByAccount(accountId); } - async patch(pool: Pool): Promise { + async patch(poolArmId: string, pool: Pool): Promise { return this.fakeSet.patchPool(pool); } } diff --git a/packages/service/src/pool/live-pool-service.ts b/packages/service/src/pool/live-pool-service.ts index 8d0f542b6..04ba16306 100644 --- a/packages/service/src/pool/live-pool-service.ts +++ b/packages/service/src/pool/live-pool-service.ts @@ -1,119 +1,156 @@ -import { BatchApiVersion } from "../constants"; -import type { ListPoolsResultOutput, Pool, PoolOutput } from "./pool-models"; +// import { BatchApiVersion } from "../constants"; +import type { Pool, PoolOutput } from "./pool-models"; import type { PoolService } from "./pool-service"; import { - getHttpClient, - StandardHttpHeaders, - MediaType, AbstractHttpService, OperationOptions, getArmUrl, - buildRequestMetadata, - UnexpectedStatusCodeError, } from "@azure/bonito-core"; +import { createARMBatchClient, isUnexpected } from "../internal/arm-batch-rest"; +import { + createArmUnexpectedStatusCodeError, + parseBatchAccountIdInfo, + parsePoolArmIdInfo, +} from "../utils"; + +const SINGLE_POOL_PATH = + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Batch/batchAccounts/{accountName}/pools/{poolName}"; + +const POOLS_PATH = + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Batch/batchAccounts/{accountName}/pools"; export class LivePoolService extends AbstractHttpService implements PoolService { async createOrUpdate( + poolArmId: string, pool: Pool, opts?: OperationOptions ): Promise { - const response = await getHttpClient().put( - `${getArmUrl()}${pool.id}?api-version=${BatchApiVersion.arm}`, - { - body: JSON.stringify(pool), - metadata: buildRequestMetadata(opts), - } - ); - - if (response.status === 200) { - return (await response.json()) as PoolOutput; + const armBatchClient = createARMBatchClient({ + baseUrl: getArmUrl(), + }); + + const { + subscriptionId, + resourceGroupName, + batchAccountName, + poolName, + } = parsePoolArmIdInfo(poolArmId); + + const res = await armBatchClient + .path( + SINGLE_POOL_PATH, + subscriptionId, + resourceGroupName, + batchAccountName, + poolName + ) + .put({ + body: pool, + headers: {}, + }); + + if (isUnexpected(res)) { + throw createArmUnexpectedStatusCodeError(res); } - throw new UnexpectedStatusCodeError( - `Failed to create or update pool ${pool.id}`, - response.status, - await response.text() - ); + return res.body; } async get( - id: string, + poolArmId: string, opts?: OperationOptions ): Promise { - const response = await getHttpClient().get( - `${getArmUrl()}${id}?api-version=${BatchApiVersion.arm}`, - { - metadata: buildRequestMetadata(opts), - } - ); - - if (response.status === 404) { - return undefined; - } + const armBatchClient = createARMBatchClient({ + baseUrl: getArmUrl(), + }); + + const { + subscriptionId, + resourceGroupName, + batchAccountName, + poolName, + } = parsePoolArmIdInfo(poolArmId); + + const res = await armBatchClient + .path( + SINGLE_POOL_PATH, + subscriptionId, + resourceGroupName, + batchAccountName, + poolName + ) + .get(); - if (response.status === 200) { - return (await response.json()) as PoolOutput; + if (isUnexpected(res)) { + throw createArmUnexpectedStatusCodeError(res); } - throw new UnexpectedStatusCodeError( - `Failed to get pool by ID ${id}`, - response.status, - await response.text() - ); + return res.body; } async listByAccountId( - accountId: string, + batchAccountId: string, opts?: OperationOptions ): Promise { - const response = await getHttpClient().get( - `${getArmUrl()}${accountId}/pools?api-version=${ - BatchApiVersion.arm - }`, - { - metadata: buildRequestMetadata(opts), - } - ); - - if (response.status === 200) { - const json = (await response.json()) as ListPoolsResultOutput; - return json.value ?? []; + const armBatchClient = createARMBatchClient({ + baseUrl: getArmUrl(), + }); + + const { subscriptionId, resourceGroupName, batchAccountName } = + parseBatchAccountIdInfo(batchAccountId); + + const res = await armBatchClient + .path( + POOLS_PATH, + subscriptionId, + resourceGroupName, + batchAccountName + ) + .get(); + + if (isUnexpected(res)) { + throw createArmUnexpectedStatusCodeError(res); } - throw new UnexpectedStatusCodeError( - `Failed to list pools under account ${accountId}`, - response.status, - await response.text() - ); + return res.body.value ?? []; } - async patch(pool: Pool, opts?: OperationOptions): Promise { - if (!pool.id) { - throw new Error("Pool ID must be defined"); - } + async patch( + poolArmId: string, + pool: Pool, + opts?: OperationOptions + ): Promise { + const armBatchClient = createARMBatchClient({ + baseUrl: getArmUrl(), + }); + + const { + subscriptionId, + resourceGroupName, + batchAccountName, + poolName, + } = parsePoolArmIdInfo(poolArmId); + + const res = await armBatchClient + .path( + SINGLE_POOL_PATH, + subscriptionId, + resourceGroupName, + batchAccountName, + poolName + ) + .patch({ + body: pool, + headers: {}, + }); - const response = await getHttpClient().patch( - `${getArmUrl()}${pool.id}?api-version=${BatchApiVersion.arm}`, - { - headers: { - [StandardHttpHeaders.ContentType]: MediaType.Json, - }, - body: JSON.stringify(pool), - metadata: buildRequestMetadata(opts), - } - ); - - if (response.status === 200) { - return (await response.json()) as PoolOutput; + if (isUnexpected(res)) { + throw createArmUnexpectedStatusCodeError(res); } - throw new UnexpectedStatusCodeError( - `Failed to patch pool ${pool.id}`, - response.status, - await response.text() - ); + return res.body; } } diff --git a/packages/service/src/pool/pool-models.ts b/packages/service/src/pool/pool-models.ts index 3a4552c89..05d891d36 100644 --- a/packages/service/src/pool/pool-models.ts +++ b/packages/service/src/pool/pool-models.ts @@ -9,6 +9,6 @@ export { PoolDisableAutoScaleParameters, PoolStopResizeParameters, PoolOutput, -} from "@batch/arm-batch-rest"; +} from "../internal/arm-batch-rest"; export type NodeCommunicationMode = "Default" | "Simplified" | "Classic"; diff --git a/packages/service/src/pool/pool-service.ts b/packages/service/src/pool/pool-service.ts index 4d00d7353..ca8ab6500 100644 --- a/packages/service/src/pool/pool-service.ts +++ b/packages/service/src/pool/pool-service.ts @@ -2,8 +2,18 @@ import { OperationOptions } from "@azure/bonito-core"; import { Pool, PoolOutput } from "./pool-models"; export interface PoolService { - createOrUpdate(pool: Pool, opts?: OperationOptions): Promise; - get(id: string, opts?: OperationOptions): Promise; - listByAccountId(accountId: string): Promise; - patch(pool: Pool, opts?: OperationOptions): Promise; + createOrUpdate(poolArmId: string, pool: Pool): Promise; + get( + poolArmId: string, + opts?: OperationOptions + ): Promise; + listByAccountId( + accountId: string, + opts?: OperationOptions + ): Promise; + patch( + poolArmId: string, + pool: Pool, + opts?: OperationOptions + ): Promise; } diff --git a/packages/service/src/test-util/fakes.ts b/packages/service/src/test-util/fakes.ts index c4663d3b7..dc08fb21a 100644 --- a/packages/service/src/test-util/fakes.ts +++ b/packages/service/src/test-util/fakes.ts @@ -13,6 +13,10 @@ import { } from "@azure/bonito-core"; import { AbstractFakeSet, FakeSet } from "@azure/bonito-core/lib/test-util"; import { BatchAccountOutput } from "../account/account-models"; +import { + BatchNodeOutput, + BatchNodeVMExtensionOutput, +} from "../node/node-models"; import { Pool, PoolOutput } from "../pool/pool-models"; /** @@ -59,9 +63,16 @@ export interface BatchFakeSet extends FakeSet { * @param subscriptionId The full ARM resource ID of the account */ listPoolsByAccount(accountId: string): PoolOutput[]; + + listBatchNodes(poolId: string): BatchNodeOutput[]; + + listBatchNodeExtensions(nodeId: string): BatchNodeVMExtensionOutput[]; } -export abstract class AbstractBatchFakeSet extends AbstractFakeSet { +export abstract class AbstractBatchFakeSet + extends AbstractFakeSet + implements BatchFakeSet +{ abstract defaultTenantArmId: string; protected abstract batchAccounts: { @@ -69,6 +80,12 @@ export abstract class AbstractBatchFakeSet extends AbstractFakeSet { }; protected abstract batchPools: { [poolId: string]: PoolOutput }; + protected abstract batchNodes: { [poolId: string]: BatchNodeOutput[] }; + + protected abstract batchNodeExtensions: { + [nodeId: string]: BatchNodeVMExtensionOutput[]; + }; + getBatchAccount(batchAccountId: string): BatchAccountOutput | undefined { return this.batchAccounts[batchAccountId.toLowerCase()]; } @@ -126,6 +143,14 @@ export abstract class AbstractBatchFakeSet extends AbstractFakeSet { return this.patchPool(pool); } + + listBatchNodes(poolId: string): BatchNodeOutput[] { + return this.batchNodes[poolId] ?? []; + } + + listBatchNodeExtensions(nodeId: string): BatchNodeVMExtensionOutput[] { + return this.batchNodeExtensions[nodeId] ?? []; + } } export class BasicBatchFakeSet extends AbstractBatchFakeSet { @@ -507,6 +532,7 @@ export class BasicBatchFakeSet extends AbstractBatchFakeSet { userAccounts: [ { name: "username1", + password: "password1", elevationLevel: "Admin", linuxUserConfiguration: { uid: 1234, @@ -526,6 +552,84 @@ export class BasicBatchFakeSet extends AbstractBatchFakeSet { }, }, }; + + batchNodes: { [poolId: string]: BatchNodeOutput[] } = { + "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/supercomputing/providers/Microsoft.Batch/batchAccounts/hobo/pools/hobopool1": + [ + { + id: "tvmps_id1", + url: "https://account.region.batch.azure.com/pools/hobopool1/nodes/tvmps_id1", + state: "starting", + schedulingState: "enabled", + stateTransitionTime: "2023-11-09T07:20:55.000Z", + allocationTime: "2023-11-09T07:20:45.000Z", + ipAddress: "10.0.0.4", + affinityId: + "TVM:tvmps_7b5797648c5d43f7a15b952e5ada3c082ccac8de5eb95f5518ab1242bc79aa3b_d", + vmSize: "standard_d2_v2", + totalTasksRun: 0, + runningTasksCount: 0, + runningTaskSlotsCount: 0, + totalTasksSucceeded: 0, + isDedicated: true, + endpointConfiguration: { + inboundEndpoints: [ + { + name: "SSHRule.0", + protocol: "tcp", + publicIPAddress: "20.24.241.25", + publicFQDN: + "cloudservice.region.cloudapp.azure.com", + frontendPort: 50000, + backendPort: 3389, + }, + ], + }, + virtualMachineInfo: { + imageReference: { + publisher: "microsoftwindowsserver", + offer: "windowsserver", + sku: "2022-datacenter", + version: "latest", + exactVersion: "20348.2031.231006", + }, + }, + }, + ], + }; + + batchNodeExtensions: { [nodeId: string]: BatchNodeVMExtensionOutput[] } = { + tvmps_id1: [ + { + provisioningState: "Succeeded", + instanceView: { + name: "CustomExtension100", + statuses: [ + { + code: "ProvisioningState/succeeded", + level: "0", + displayStatus: "Provisioning succeeded", + message: + "ExtensionOperation:enable. Status:Success", + time: "11/9/2023 7:44:19 AM", + }, + ], + }, + vmExtension: { + name: "CustomExtension100", + publisher: "Microsoft.Azure.Geneva", + type: "GenevaMonitoring", + typeHandlerVersion: "2.0", + autoUpgradeMinorVersion: true, + enableAutomaticUpgrade: true, + settings: { + applicationId: "settings1", + version: "3.3.3", + }, + }, + }, + ], + }; } /** diff --git a/packages/service/src/utils.ts b/packages/service/src/utils.ts new file mode 100644 index 000000000..03b02818d --- /dev/null +++ b/packages/service/src/utils.ts @@ -0,0 +1,127 @@ +import { HttpResponse as AzureCoreHttpResponse } from "@azure-rest/core-client"; +import { UnexpectedStatusCodeError } from "@azure/bonito-core"; +import { CloudErrorOutput } from "./internal/arm-batch-rest"; +import { BatchErrorOutput } from "./internal/batch-rest"; + +const batchAccountIdRegex = + /\/subscriptions\/(.*)\/resourceGroups\/(.*)\/providers\/Microsoft.Batch\/batchAccounts\/(.*)/i; + +const poolArmIdRegex = + /\/subscriptions\/(.*)\/resourceGroups\/(.*)\/providers\/Microsoft.Batch\/batchAccounts\/(.*)\/pools\/(.*)/i; + +interface ErrorResponse extends AzureCoreHttpResponse { + status: string; + body: BatchErrorOutput | CloudErrorOutput; +} + +export interface BatchAccountIdInfo { + subscriptionId: string; + resourceGroupName: string; + batchAccountName: string; +} + +export function createArmUnexpectedStatusCodeError( + res: ErrorResponse +): UnexpectedStatusCodeError { + return createUnexpectedStatusCodeError( + `The Batch management plane returned an unexpected status code`, + res + ); +} + +export function createBatchUnexpectedStatusCodeError( + res: ErrorResponse +): UnexpectedStatusCodeError { + return createUnexpectedStatusCodeError( + `The Batch data plane returned an unexpected status code`, + res + ); +} + +export function createUnexpectedStatusCodeError( + msg: string, + res: ErrorResponse +): UnexpectedStatusCodeError { + return new UnexpectedStatusCodeError( + msg, + +res.status, + JSON.stringify(res.body) + ); +} + +/** + * + * @param oriBatchAccountId is of the form: + * /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Batch/batchAccounts/{accountName} + * case-insensitive + */ +export function parseBatchAccountIdInfo( + oriBatchAccountId: string +): BatchAccountIdInfo { + // use regex to parse the batch account id + const batchAccountId = ensureRelativeUrl(oriBatchAccountId); + const match = batchAccountId.match(batchAccountIdRegex); + if (!match) { + throw new Error(`Unable to parse batch account id: ${batchAccountId}`); + } + const [, subscriptionId, resourceGroupName, batchAccountName] = match; + return { + subscriptionId, + resourceGroupName, + batchAccountName, + }; +} + +/** + * + * @param oriPoolArmId is of the form: + * /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Batch/batchAccounts/{accountName}/pools/{poolName}F + * case-insensitive + */ +export function parsePoolArmIdInfo(oriPoolArmId: string): { + subscriptionId: string; + resourceGroupName: string; + batchAccountName: string; + poolName: string; +} { + // use regex to parse the batch account id + const poolArmId = ensureRelativeUrl(oriPoolArmId); + const match = poolArmId.match(poolArmIdRegex); + if (!match) { + throw new Error(`Unable to parse pool ARM id: ${poolArmId}`); + } + const [, subscriptionId, resourceGroupName, batchAccountName, poolName] = + match; + return { + subscriptionId, + resourceGroupName, + batchAccountName, + poolName, + }; +} + +export function ensureRelativeUrl(untrustedUrlString: string): string { + let relative = null; + + try { + // Treat input as absolute, make relative + const absolute = new URL(untrustedUrlString); + relative = absolute.href.slice(absolute.origin.length); + } catch { + // Input was already relative + relative = untrustedUrlString; + } + + if (!relative) { + relative = ""; + } + if (relative != "" && !relative.startsWith("/")) { + relative = "/" + relative; + } + + // Normalize any leading '/' or '\' characters + relative = relative.replace(/^[/\\]+/, "/"); + + // Return relative url + return relative; +} diff --git a/packages/arm-batch-rest/swagger/README.md b/packages/service/swagger/README.md similarity index 94% rename from packages/arm-batch-rest/swagger/README.md rename to packages/service/swagger/README.md index bf9cae439..02ffd1e03 100644 --- a/packages/arm-batch-rest/swagger/README.md +++ b/packages/service/swagger/README.md @@ -12,8 +12,8 @@ generate-metadata: false generate-test: false generate-sample: false license-header: MICROSOFT_MIT_NO_VERSION -output-folder: ../ -source-code-folder-path: ./src/generated +output-folder: ../src/internal/arm-batch-rest +source-code-folder-path: ./generated input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/main/specification/batch/resource-manager/Microsoft.Batch/stable/2023-05-01/BatchManagement.json package-version: 1.0.0-beta.1 rest-level-client: true diff --git a/web/src/index.tsx b/web/src/index.tsx index 2c8afc766..def1212e1 100644 --- a/web/src/index.tsx +++ b/web/src/index.tsx @@ -22,6 +22,7 @@ import { BatchBrowserDependencyFactories, BatchFormControlResolver, } from "@batch/ui-react"; +import { FakeNodeService } from "@batch/ui-service"; import { BatchDependencyName } from "@batch/ui-service/lib/environment"; import { FakePoolService } from "@batch/ui-service/lib/pool"; import * as React from "react"; @@ -63,6 +64,7 @@ export async function init(rootEl: HTMLElement): Promise { new FakeLocationService(), [DependencyName.Notifier]: () => new AlertNotifier(), // TODO: update with real notification implementation [BatchDependencyName.PoolService]: () => new FakePoolService(), + [BatchDependencyName.NodeService]: () => new FakeNodeService(), [DependencyName.ResourceGroupService]: () => new FakeResourceGroupService(), [DependencyName.StorageAccountService]: () => From 70be245d3b7349ac6cc61ff4535165cb84a65aee Mon Sep 17 00:00:00 2001 From: David Watrous <509299+dpwatrous@users.noreply.github.com> Date: Mon, 26 Feb 2024 11:55:12 -0500 Subject: [PATCH 04/57] Prevent duplicate env initialization (#2888) Fixes AB#26854084 --- desktop/src/app/app.component.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/desktop/src/app/app.component.ts b/desktop/src/app/app.component.ts index 39c18c0dc..3986e7a6a 100644 --- a/desktop/src/app/app.component.ts +++ b/desktop/src/app/app.component.ts @@ -81,6 +81,7 @@ export class AppComponent implements OnInit, OnDestroy { if (ready && !this._envInitialized) { initDesktopEnvironment(translationsLoaderService, authService, batchExplorer); + this._envInitialized = true; } this.isAppReady = ready; From 2b1b988c1bc8fe783401ddffc6ad0c0f9861e5c9 Mon Sep 17 00:00:00 2001 From: David Watrous <509299+dpwatrous@users.noreply.github.com> Date: Mon, 26 Feb 2024 15:17:40 -0500 Subject: [PATCH 05/57] Update service mgmt API version to 2023-11-01 (#2887) --- packages/service/package.json | 2 +- packages/service/src/constants.ts | 2 +- .../__tests__/arm-batch-rest.spec.ts | 6 +- .../arm-batch-rest/__tests__/utils/client.ts | 5 +- .../generated/batchManagementClient.ts | 2 +- .../arm-batch-rest/generated/models.ts | 52 +++++++- .../arm-batch-rest/generated/outputModels.ts | 50 ++++++- .../batch-rest/__tests__/batch-rest.spec.ts | 14 +- .../pool/__tests__/fake-pool-service.spec.ts | 12 +- .../pool/__tests__/live-pool-service.spec.ts | 23 +++- packages/service/src/test-util/fakes.ts | 125 ++++++++++++++++++ packages/service/swagger/README.md | 2 +- 12 files changed, 265 insertions(+), 30 deletions(-) diff --git a/packages/service/package.json b/packages/service/package.json index 270957c61..949c45439 100644 --- a/packages/service/package.json +++ b/packages/service/package.json @@ -26,7 +26,7 @@ "clean:esm": "bux rmrf ./lib", "clean:cjs": "bux rmrf ./lib-cjs", "generate:arm-client": "autorest --typescript swagger/README.md", - "generate:client": "powershell -ExecutionPolicy Bypass -File ./generate-client.ps1", + "generate:client": "pwsh -ExecutionPolicy Bypass -File ./generate-client.ps1", "test": "jest", "test:coverage": "jest --collect-coverage", "test:all": "npm run test:coverage", diff --git a/packages/service/src/constants.ts b/packages/service/src/constants.ts index 3e2a4086d..873a15960 100644 --- a/packages/service/src/constants.ts +++ b/packages/service/src/constants.ts @@ -1,4 +1,4 @@ export const BatchApiVersion = { - arm: `2023-05-01`, + arm: `2023-11-01`, data: `2023-05-01.17.0`, }; diff --git a/packages/service/src/internal/arm-batch-rest/__tests__/arm-batch-rest.spec.ts b/packages/service/src/internal/arm-batch-rest/__tests__/arm-batch-rest.spec.ts index 54f6826f3..b716d4c5e 100644 --- a/packages/service/src/internal/arm-batch-rest/__tests__/arm-batch-rest.spec.ts +++ b/packages/service/src/internal/arm-batch-rest/__tests__/arm-batch-rest.spec.ts @@ -12,7 +12,6 @@ import { PoolUpdateParameters, } from "../generated"; import { - BATCH_API_VERSION, getUrlBatchAccountPath, getUrlPoolPath, } from "../__tests__/utils/client"; @@ -22,8 +21,9 @@ import { initMockEnvironment, } from "@azure/bonito-core/lib/environment"; import { MockHttpClient, MockHttpResponse } from "@azure/bonito-core/lib/http"; +import { BatchApiVersion } from "../../../constants"; -const _SUFFIX = Math.random().toString(16).substr(2, 4); +const _SUFFIX = Math.random().toString(16).substring(2, 6); function getPoolName(type: string) { return `jssdktest-${type}-${_SUFFIX}`; @@ -325,7 +325,7 @@ describe("Batch Management Client With Mock Http Client Test", () => { test("should get information about batch account associated with a resource group successfully", async () => { const requestUrlPath = getUrlBatchAccountPath(subscriptionId, resourceGroupName) + - `?api-version=${BATCH_API_VERSION}`; + `?api-version=${BatchApiVersion.arm}`; mockClient.addExpected( new MockHttpResponse(requestUrlPath, { diff --git a/packages/service/src/internal/arm-batch-rest/__tests__/utils/client.ts b/packages/service/src/internal/arm-batch-rest/__tests__/utils/client.ts index 3540d86fa..007f92f4a 100644 --- a/packages/service/src/internal/arm-batch-rest/__tests__/utils/client.ts +++ b/packages/service/src/internal/arm-batch-rest/__tests__/utils/client.ts @@ -1,5 +1,6 @@ +import { BatchApiVersion } from "../../../../constants"; + const ARM_API_BASE_URI = "https://management.azure.com"; -export const BATCH_API_VERSION = "2023-05-01"; function getUrlBasePath(subscriptionId: string) { return `${ARM_API_BASE_URI}/subscriptions/${subscriptionId}`; @@ -43,6 +44,6 @@ export function getUrlPoolPath( stringUrlBuilder.push(`/${poolName}`); } - stringUrlBuilder.push(`?api-version=${BATCH_API_VERSION}`); + stringUrlBuilder.push(`?api-version=${BatchApiVersion.arm}`); return stringUrlBuilder.join(""); } diff --git a/packages/service/src/internal/arm-batch-rest/generated/batchManagementClient.ts b/packages/service/src/internal/arm-batch-rest/generated/batchManagementClient.ts index 0218bc696..66d50ae7a 100644 --- a/packages/service/src/internal/arm-batch-rest/generated/batchManagementClient.ts +++ b/packages/service/src/internal/arm-batch-rest/generated/batchManagementClient.ts @@ -14,7 +14,7 @@ export default function createClient( options: ClientOptions = {} ): BatchManagementClient { const baseUrl = options.baseUrl ?? `https://management.azure.com`; - options.apiVersion = options.apiVersion ?? "2023-05-01"; + options.apiVersion = options.apiVersion ?? "2023-11-01"; options = { ...options, credentials: { diff --git a/packages/service/src/internal/arm-batch-rest/generated/models.ts b/packages/service/src/internal/arm-batch-rest/generated/models.ts index a5997d427..118ede1a9 100644 --- a/packages/service/src/internal/arm-batch-rest/generated/models.ts +++ b/packages/service/src/internal/arm-batch-rest/generated/models.ts @@ -17,7 +17,7 @@ export interface AccountBatchCreateParameters { export interface BatchAccountCreateProperties { /** The properties related to the auto-storage account. */ autoStorage?: AutoStorageBaseProperties; - /** The pool allocation mode also affects how clients may authenticate to the Batch Service API. If the mode is BatchService, clients may authenticate using access keys or Azure Active Directory. If the mode is UserSubscription, clients must use Azure Active Directory. The default is BatchService. */ + /** The pool allocation mode also affects how clients may authenticate to the Batch Service API. If the mode is BatchService, clients may authenticate using access keys or Microsoft Entra ID. If the mode is UserSubscription, clients must use Microsoft Entra ID. The default is BatchService. */ poolAllocationMode?: "BatchService" | "UserSubscription"; /** A reference to the Azure key vault associated with the Batch account. */ keyVaultReference?: KeyVaultReference; @@ -415,6 +415,8 @@ export interface PoolProperties { targetNodeCommunicationMode?: "Default" | "Classic" | "Simplified"; /** Determines how a pool communicates with the Batch service. */ currentNodeCommunicationMode?: "Default" | "Classic" | "Simplified"; + /** The user-defined tags to be associated with the Azure Batch Pool. When specified, these tags are propagated to the backing Azure resources associated with the pool. This property can only be specified when the Batch account was created with the poolAllocationMode property set to 'UserSubscription'. */ + resourceTags?: Record; } /** Deployment configuration properties. */ @@ -461,6 +463,10 @@ export interface VirtualMachineConfiguration { extensions?: Array; /** Contains configuration for ephemeral OSDisk settings. */ osDisk?: OSDisk; + /** Specifies the security profile settings for the virtual machine or virtual machine scale set. */ + securityProfile?: SecurityProfile; + /** The service artifact reference id in the form of /subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Compute/galleries/{galleryName}/serviceArtifacts/{serviceArtifactName}/vmArtifactsProfiles/{vmArtifactsProfilesName} */ + serviceArtifactReference?: ServiceArtifactReference; } /** A reference to an Azure Virtual Machines Marketplace image or the Azure Image resource of a custom Virtual Machine. To get the list of all imageReferences verified by Azure Batch, see the 'List supported node agent SKUs' operation. */ @@ -473,7 +479,7 @@ export interface ImageReference { sku?: string; /** A value of 'latest' can be specified to select the latest version of an image. If omitted, the default is 'latest'. */ version?: string; - /** This property is mutually exclusive with other properties. The Shared Image Gallery image must have replicas in the same region as the Azure Batch account. For information about the firewall settings for the Batch node agent to communicate with the Batch service see https://docs.microsoft.com/en-us/azure/batch/batch-api-basics#virtual-network-vnet-and-firewall-configuration. */ + /** This property is mutually exclusive with other properties. The Azure Compute Gallery Image must have replicas in the same region as the Azure Batch account. For information about the firewall settings for the Batch node agent to communicate with the Batch service see https://docs.microsoft.com/en-us/azure/batch/batch-api-basics#virtual-network-vnet-and-firewall-configuration. */ id?: string; } @@ -505,7 +511,7 @@ export interface DataDisk { * Standard_LRS - The data disk should use standard locally redundant storage. * Premium_LRS - The data disk should use premium locally redundant storage. */ - storageAccountType?: "Standard_LRS" | "Premium_LRS"; + storageAccountType?: "Standard_LRS" | "Premium_LRS" | "StandardSSD_LRS"; } /** The configuration for container-enabled pools. */ @@ -530,7 +536,7 @@ export interface ContainerRegistry { identityReference?: ComputeNodeIdentityReference; } -/** The disk encryption configuration applied on compute nodes in the pool. Disk encryption configuration is not supported on Linux pool created with Virtual Machine Image or Shared Image Gallery Image. */ +/** The disk encryption configuration applied on compute nodes in the pool. Disk encryption configuration is not supported on Linux pool created with Virtual Machine Image or Azure Compute Gallery Image. */ export interface DiskEncryptionConfiguration { /** On Linux pool, only "TemporaryDisk" is supported; on Windows pool, "OsDisk" and "TemporaryDisk" must be specified. */ targets?: Array<"OsDisk" | "TemporaryDisk">; @@ -568,6 +574,13 @@ export interface VMExtension { export interface OSDisk { /** Specifies the ephemeral Disk Settings for the operating system disk used by the virtual machine. */ ephemeralOSDiskSettings?: DiffDiskSettings; + /** The type of caching to enable for the disk. */ + caching?: "None" | "ReadOnly" | "ReadWrite"; + managedDisk?: ManagedDisk; + /** The initial disk size in GB when creating new OS disk. */ + diskSizeGB?: number; + /** Specifies whether writeAccelerator should be enabled or disabled on the disk. */ + writeAcceleratorEnabled?: boolean; } /** Specifies the ephemeral Disk Settings for the operating system disk used by the virtual machine. */ @@ -576,6 +589,35 @@ export interface DiffDiskSettings { placement?: "CacheDisk"; } +export interface ManagedDisk { + /** The storage account type for use in creating data disks or OS disk. */ + storageAccountType?: "Standard_LRS" | "Premium_LRS" | "StandardSSD_LRS"; +} + +/** Specifies the security profile settings for the virtual machine or virtual machine scale set. */ +export interface SecurityProfile { + /** Specifies the SecurityType of the virtual machine. It has to be set to any specified value to enable UefiSettings. */ + securityType?: "trustedLaunch"; + /** This property can be used by user in the request to enable or disable the Host Encryption for the virtual machine or virtual machine scale set. This will enable the encryption for all the disks including Resource/Temp disk at host itself. */ + encryptionAtHost?: boolean; + /** Specifies the security settings like secure boot and vTPM used while creating the virtual machine. */ + uefiSettings?: UefiSettings; +} + +/** Specifies the security settings like secure boot and vTPM used while creating the virtual machine. */ +export interface UefiSettings { + /** Specifies whether secure boot should be enabled on the virtual machine. */ + secureBootEnabled?: boolean; + /** Specifies whether vTPM should be enabled on the virtual machine. */ + vTpmEnabled?: boolean; +} + +/** Specifies the service artifact reference id used to set same image version for all virtual machines in the scale set when using 'latest' image version. */ +export interface ServiceArtifactReference { + /** The service artifact reference id in the form of /subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Compute/galleries/{galleryName}/serviceArtifacts/{serviceArtifactName}/vmArtifactsProfiles/{vmArtifactsProfilesName} */ + id: string; +} + /** Defines the desired size of the pool. This can either be 'fixedScale' where the requested targetDedicatedNodes is specified, or 'autoScale' which defines a formula which is periodically reevaluated. If this property is not specified, the pool will have a fixed scale with 0 targetDedicatedNodes. */ export interface ScaleSettings { /** This property and autoScale are mutually exclusive and one of the properties must be specified. */ @@ -738,7 +780,7 @@ export interface StartTask { environmentSettings?: Array; /** If omitted, the task runs as a non-administrative user unique to the task. */ userIdentity?: UserIdentity; - /** The Batch service retries a task if its exit code is nonzero. Note that this value specifically controls the number of retries. The Batch service will try the task once, and may then retry up to this limit. For example, if the maximum retry count is 3, Batch tries the task up to 4 times (one initial try and 3 retries). If the maximum retry count is 0, the Batch service does not retry the task. If the maximum retry count is -1, the Batch service retries the task without limit. Default is 0. */ + /** The Batch service retries a task if its exit code is nonzero. Note that this value specifically controls the number of retries. The Batch service will try the task once, and may then retry up to this limit. For example, if the maximum retry count is 3, Batch tries the task up to 4 times (one initial try and 3 retries). If the maximum retry count is 0, the Batch service does not retry the task. If the maximum retry count is -1, the Batch service retries the task without limit. Default is 0 */ maxTaskRetryCount?: number; /** If true and the start task fails on a compute node, the Batch service retries the start task up to its maximum retry count (maxTaskRetryCount). If the task has still not completed successfully after all retries, then the Batch service marks the compute node unusable, and will not schedule tasks to it. This condition can be detected via the node state and scheduling error detail. If false, the Batch service will not wait for the start task to complete. In this case, other tasks can start executing on the compute node while the start task is still running; and even if the start task fails, new tasks will continue to be scheduled on the node. The default is true. */ waitForSuccess?: boolean; diff --git a/packages/service/src/internal/arm-batch-rest/generated/outputModels.ts b/packages/service/src/internal/arm-batch-rest/generated/outputModels.ts index c3e6d5033..6d77c64cf 100644 --- a/packages/service/src/internal/arm-batch-rest/generated/outputModels.ts +++ b/packages/service/src/internal/arm-batch-rest/generated/outputModels.ts @@ -584,6 +584,8 @@ export interface PoolPropertiesOutput { targetNodeCommunicationMode?: "Default" | "Classic" | "Simplified"; /** Determines how a pool communicates with the Batch service. */ currentNodeCommunicationMode?: "Default" | "Classic" | "Simplified"; + /** The user-defined tags to be associated with the Azure Batch Pool. When specified, these tags are propagated to the backing Azure resources associated with the pool. This property can only be specified when the Batch account was created with the poolAllocationMode property set to 'UserSubscription'. */ + resourceTags?: Record; } /** Deployment configuration properties. */ @@ -630,6 +632,10 @@ export interface VirtualMachineConfigurationOutput { extensions?: Array; /** Contains configuration for ephemeral OSDisk settings. */ osDisk?: OSDiskOutput; + /** Specifies the security profile settings for the virtual machine or virtual machine scale set. */ + securityProfile?: SecurityProfileOutput; + /** The service artifact reference id in the form of /subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Compute/galleries/{galleryName}/serviceArtifacts/{serviceArtifactName}/vmArtifactsProfiles/{vmArtifactsProfilesName} */ + serviceArtifactReference?: ServiceArtifactReferenceOutput; } /** A reference to an Azure Virtual Machines Marketplace image or the Azure Image resource of a custom Virtual Machine. To get the list of all imageReferences verified by Azure Batch, see the 'List supported node agent SKUs' operation. */ @@ -642,7 +648,7 @@ export interface ImageReferenceOutput { sku?: string; /** A value of 'latest' can be specified to select the latest version of an image. If omitted, the default is 'latest'. */ version?: string; - /** This property is mutually exclusive with other properties. The Shared Image Gallery image must have replicas in the same region as the Azure Batch account. For information about the firewall settings for the Batch node agent to communicate with the Batch service see https://docs.microsoft.com/en-us/azure/batch/batch-api-basics#virtual-network-vnet-and-firewall-configuration. */ + /** This property is mutually exclusive with other properties. The Azure Compute Gallery Image must have replicas in the same region as the Azure Batch account. For information about the firewall settings for the Batch node agent to communicate with the Batch service see https://docs.microsoft.com/en-us/azure/batch/batch-api-basics#virtual-network-vnet-and-firewall-configuration. */ id?: string; } @@ -674,7 +680,7 @@ export interface DataDiskOutput { * Standard_LRS - The data disk should use standard locally redundant storage. * Premium_LRS - The data disk should use premium locally redundant storage. */ - storageAccountType?: "Standard_LRS" | "Premium_LRS"; + storageAccountType?: "Standard_LRS" | "Premium_LRS" | "StandardSSD_LRS"; } /** The configuration for container-enabled pools. */ @@ -699,7 +705,7 @@ export interface ContainerRegistryOutput { identityReference?: ComputeNodeIdentityReferenceOutput; } -/** The disk encryption configuration applied on compute nodes in the pool. Disk encryption configuration is not supported on Linux pool created with Virtual Machine Image or Shared Image Gallery Image. */ +/** The disk encryption configuration applied on compute nodes in the pool. Disk encryption configuration is not supported on Linux pool created with Virtual Machine Image or Azure Compute Gallery Image. */ export interface DiskEncryptionConfigurationOutput { /** On Linux pool, only "TemporaryDisk" is supported; on Windows pool, "OsDisk" and "TemporaryDisk" must be specified. */ targets?: Array<"OsDisk" | "TemporaryDisk">; @@ -737,6 +743,13 @@ export interface VMExtensionOutput { export interface OSDiskOutput { /** Specifies the ephemeral Disk Settings for the operating system disk used by the virtual machine. */ ephemeralOSDiskSettings?: DiffDiskSettingsOutput; + /** The type of caching to enable for the disk. */ + caching?: "None" | "ReadOnly" | "ReadWrite"; + managedDisk?: ManagedDiskOutput; + /** The initial disk size in GB when creating new OS disk. */ + diskSizeGB?: number; + /** Specifies whether writeAccelerator should be enabled or disabled on the disk. */ + writeAcceleratorEnabled?: boolean; } /** Specifies the ephemeral Disk Settings for the operating system disk used by the virtual machine. */ @@ -745,6 +758,35 @@ export interface DiffDiskSettingsOutput { placement?: "CacheDisk"; } +export interface ManagedDiskOutput { + /** The storage account type for use in creating data disks or OS disk. */ + storageAccountType?: "Standard_LRS" | "Premium_LRS" | "StandardSSD_LRS"; +} + +/** Specifies the security profile settings for the virtual machine or virtual machine scale set. */ +export interface SecurityProfileOutput { + /** Specifies the SecurityType of the virtual machine. It has to be set to any specified value to enable UefiSettings. */ + securityType?: "trustedLaunch"; + /** This property can be used by user in the request to enable or disable the Host Encryption for the virtual machine or virtual machine scale set. This will enable the encryption for all the disks including Resource/Temp disk at host itself. */ + encryptionAtHost?: boolean; + /** Specifies the security settings like secure boot and vTPM used while creating the virtual machine. */ + uefiSettings?: UefiSettingsOutput; +} + +/** Specifies the security settings like secure boot and vTPM used while creating the virtual machine. */ +export interface UefiSettingsOutput { + /** Specifies whether secure boot should be enabled on the virtual machine. */ + secureBootEnabled?: boolean; + /** Specifies whether vTPM should be enabled on the virtual machine. */ + vTpmEnabled?: boolean; +} + +/** Specifies the service artifact reference id used to set same image version for all virtual machines in the scale set when using 'latest' image version. */ +export interface ServiceArtifactReferenceOutput { + /** The service artifact reference id in the form of /subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Compute/galleries/{galleryName}/serviceArtifacts/{serviceArtifactName}/vmArtifactsProfiles/{vmArtifactsProfilesName} */ + id: string; +} + /** Defines the desired size of the pool. This can either be 'fixedScale' where the requested targetDedicatedNodes is specified, or 'autoScale' which defines a formula which is periodically reevaluated. If this property is not specified, the pool will have a fixed scale with 0 targetDedicatedNodes. */ export interface ScaleSettingsOutput { /** This property and autoScale are mutually exclusive and one of the properties must be specified. */ @@ -907,7 +949,7 @@ export interface StartTaskOutput { environmentSettings?: Array; /** If omitted, the task runs as a non-administrative user unique to the task. */ userIdentity?: UserIdentityOutput; - /** The Batch service retries a task if its exit code is nonzero. Note that this value specifically controls the number of retries. The Batch service will try the task once, and may then retry up to this limit. For example, if the maximum retry count is 3, Batch tries the task up to 4 times (one initial try and 3 retries). If the maximum retry count is 0, the Batch service does not retry the task. If the maximum retry count is -1, the Batch service retries the task without limit. Default is 0. */ + /** The Batch service retries a task if its exit code is nonzero. Note that this value specifically controls the number of retries. The Batch service will try the task once, and may then retry up to this limit. For example, if the maximum retry count is 3, Batch tries the task up to 4 times (one initial try and 3 retries). If the maximum retry count is 0, the Batch service does not retry the task. If the maximum retry count is -1, the Batch service retries the task without limit. Default is 0 */ maxTaskRetryCount?: number; /** If true and the start task fails on a compute node, the Batch service retries the start task up to its maximum retry count (maxTaskRetryCount). If the task has still not completed successfully after all retries, then the Batch service marks the compute node unusable, and will not schedule tasks to it. This condition can be detected via the node state and scheduling error detail. If false, the Batch service will not wait for the start task to complete. In this case, other tasks can start executing on the compute node while the start task is still running; and even if the start task fails, new tasks will continue to be scheduled on the node. The default is true. */ waitForSuccess?: boolean; diff --git a/packages/service/src/internal/batch-rest/__tests__/batch-rest.spec.ts b/packages/service/src/internal/batch-rest/__tests__/batch-rest.spec.ts index f744d0f77..e597b5d0c 100644 --- a/packages/service/src/internal/batch-rest/__tests__/batch-rest.spec.ts +++ b/packages/service/src/internal/batch-rest/__tests__/batch-rest.spec.ts @@ -14,9 +14,9 @@ import { BatchNodeVMExtensionListResultOutput, CreateJobParameters, } from "../generated/src"; +import { BatchApiVersion } from "../../../constants"; const batchAccountEndpoint = "https://batchaccount.eastus2.batch.azure.com"; -const BATCH_API_VERSION = "2023-05-01.17.0"; describe("Batch Client With Mock Http Client Test", () => { let batchClient: BatchClient; @@ -34,7 +34,7 @@ describe("Batch Client With Mock Http Client Test", () => { describe("Basic Job operations", () => { test("Create Batch Job", async () => { const jobPath = "/jobs"; - const requestUrlJobPath = `${batchAccountEndpoint}${jobPath}?api-version=${BATCH_API_VERSION}`; + const requestUrlJobPath = `${batchAccountEndpoint}${jobPath}?api-version=${BatchApiVersion.data}`; const mockResponse = new MockHttpResponse(requestUrlJobPath, { status: 201, headers: { @@ -65,7 +65,7 @@ describe("Batch Client With Mock Http Client Test", () => { const requestUrlJobPath = `${batchAccountEndpoint}${jobPath.replace( "{jobId}", jobId - )}?api-version=${BATCH_API_VERSION}`; + )}?api-version=${BatchApiVersion.data}`; const mockResponse = new MockHttpResponse(requestUrlJobPath, { status: 200, headers: { @@ -91,7 +91,7 @@ describe("Batch Client With Mock Http Client Test", () => { test("list job", async () => { const jobPath = "/jobs"; - const requestUrlJobPath = `${batchAccountEndpoint}${jobPath}?api-version=${BATCH_API_VERSION}`; + const requestUrlJobPath = `${batchAccountEndpoint}${jobPath}?api-version=${BatchApiVersion.data}`; const mockResponse = new MockHttpResponse(requestUrlJobPath, { status: 200, headers: { @@ -126,7 +126,7 @@ describe("Batch Client With Mock Http Client Test", () => { const requestUrlJobPath = `${batchAccountEndpoint}${jobPath.replace( "{jobId}", jobId - )}?api-version=${BATCH_API_VERSION}`; + )}?api-version=${BatchApiVersion.data}`; const mockResponse = new MockHttpResponse(requestUrlJobPath, { status: 204, headers: { @@ -150,7 +150,7 @@ describe("Batch Client With Mock Http Client Test", () => { const requestUrlNodePath = `${batchAccountEndpoint}${nodePath.replace( "{poolId}", poolId - )}?api-version=${BATCH_API_VERSION}`; + )}?api-version=${BatchApiVersion.data}`; const mockResponse = new MockHttpResponse(requestUrlNodePath, { status: 200, headers: { @@ -186,7 +186,7 @@ describe("Batch Client With Mock Http Client Test", () => { const nodeExtensionPath = "/pools/{poolId}/nodes/{nodeId}/extensions"; const requestUrlNodeExtensionPath = `${batchAccountEndpoint}${nodeExtensionPath .replace("{poolId}", poolId) - .replace("{nodeId}", nodeId)}?api-version=${BATCH_API_VERSION}`; + .replace("{nodeId}", nodeId)}?api-version=${BatchApiVersion.data}`; const mockResponse = new MockHttpResponse(requestUrlNodeExtensionPath, { status: 200, headers: { diff --git a/packages/service/src/pool/__tests__/fake-pool-service.spec.ts b/packages/service/src/pool/__tests__/fake-pool-service.spec.ts index d521cbe2f..d9678bcec 100644 --- a/packages/service/src/pool/__tests__/fake-pool-service.spec.ts +++ b/packages/service/src/pool/__tests__/fake-pool-service.spec.ts @@ -6,10 +6,13 @@ import { initMockBatchEnvironment } from "../../environment"; describe("FakePoolService", () => { const hoboAcctId = "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/supercomputing/providers/Microsoft.Batch/batchAccounts/hobo"; - const hoboPoolArmId = `${hoboAcctId}/pools/hobopool1`; const newTestPoolArmId = `${hoboAcctId}/pools/newtestpool`; + const byosAcctId = + "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/visualization/providers/Microsoft.Batch/batchAccounts/byos"; + const byosPoolArmId = `${byosAcctId}/pools/byospool1`; + let service: FakePoolService; let fakeSet: BatchFakeSet; @@ -26,8 +29,11 @@ describe("FakePoolService", () => { }); test("Get by resource ID", async () => { - const pool = await service.get(hoboPoolArmId); - expect(pool?.name).toEqual("hobopool1"); + const hoboPool = await service.get(hoboPoolArmId); + expect(hoboPool?.name).toEqual("hobopool1"); + + const byosPool = await service.get(byosPoolArmId); + expect(byosPool?.name).toEqual("byospool1"); }); test("Create", async () => { diff --git a/packages/service/src/pool/__tests__/live-pool-service.spec.ts b/packages/service/src/pool/__tests__/live-pool-service.spec.ts index d722f8f38..5d828a4cf 100644 --- a/packages/service/src/pool/__tests__/live-pool-service.spec.ts +++ b/packages/service/src/pool/__tests__/live-pool-service.spec.ts @@ -14,6 +14,10 @@ describe("LivePoolService", () => { const hoboPoolArmId = `${hoboAcctId}/pools/hobopool1`; const newTestPoolArmId = `${hoboAcctId}/pools/newtestpool`; + const byosAcctId = + "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/visualization/providers/Microsoft.Batch/batchAccounts/byos"; + const byosPoolArmId = `${byosAcctId}/pools/byospool1`; + let service: PoolService; let fakeSet: BatchFakeSet; @@ -80,8 +84,23 @@ describe("LivePoolService", () => { ) ); - const pool = await service.get(hoboPoolArmId); - expect(pool?.name).toEqual("hobopool1"); + const hoboPool = await service.get(hoboPoolArmId); + expect(hoboPool?.name).toEqual("hobopool1"); + + httpClient.addExpected( + new MockHttpResponse( + `${getArmUrl()}${byosPoolArmId}?api-version=${ + BatchApiVersion.arm + }`, + { + status: 200, + body: JSON.stringify(fakeSet.getPool(byosPoolArmId)), + } + ) + ); + + const byosPool = await service.get(byosPoolArmId); + expect(byosPool?.name).toEqual("byospool1"); }); test("Get by resource ID error", async () => { diff --git a/packages/service/src/test-util/fakes.ts b/packages/service/src/test-util/fakes.ts index dc08fb21a..81355500a 100644 --- a/packages/service/src/test-util/fakes.ts +++ b/packages/service/src/test-util/fakes.ts @@ -410,6 +410,53 @@ export class BasicBatchFakeSet extends AbstractBatchFakeSet { id: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/supercomputing/providers/Microsoft.Batch/batchAccounts/mercury", type: "Microsoft.Batch/batchAccounts", }, + "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/visualization/providers/microsoft.batch/batchaccounts/byos": + { + id: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/visualization/providers/Microsoft.Batch/batchAccounts/byos", + name: "byos", + type: "Microsoft.Batch/batchAccounts", + location: "eastus", + properties: { + accountEndpoint: "byos.eastus.batch.azure.com", + nodeManagementEndpoint: + "6b5a23b7-ac5f-49a3-ab3d-b0a6c72292a5.eastus.service.batch.azure.com", + provisioningState: "Succeeded", + dedicatedCoreQuotaPerVMFamilyEnforced: true, + poolQuota: 100, + activeJobAndJobScheduleQuota: 300, + poolAllocationMode: "UserSubscription", + keyVaultReference: { + id: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/visualization/providers/Microsoft.KeyVault/vaults/byoskeyvault", + url: "https://byoskeyvault.vault.azure.net/", + }, + publicNetworkAccess: "Enabled", + networkProfile: { + accountAccess: { + defaultAction: "Allow", + }, + }, + privateEndpointConnections: [], + encryption: { + keySource: "Microsoft.Batch", + }, + allowedAuthenticationModes: [ + "AAD", + "TaskAuthenticationToken", + ], + }, + identity: { + type: "UserAssigned", + userAssignedIdentities: { + "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/visualization/providers/Microsoft.ManagedIdentity/userAssignedIdentities/byos-identity": + { + principalId: + "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", + clientId: + "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb", + }, + }, + }, + }, }; protected batchPools: { [poolId: string]: PoolOutput } = { @@ -551,6 +598,84 @@ export class BasicBatchFakeSet extends AbstractBatchFakeSet { }, }, }, + "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/visualization/providers/microsoft.batch/batchaccounts/byos/pools/byospool1": + { + id: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/visualization/providers/Microsoft.Batch/batchAccounts/byos/pools/byospool1", + name: "byospool1", + type: "Microsoft.Batch/batchAccounts/pools", + etag: 'W/"0x8DC2F2FC68C6235"', + properties: { + lastModified: "2024-02-16T20:42:22.0825141Z", + creationTime: "2024-02-16T20:42:22.0825141Z", + provisioningState: "Succeeded", + provisioningStateTransitionTime: + "2024-02-16T20:42:22.0825141Z", + allocationState: "Steady", + allocationStateTransitionTime: + "2024-02-16T20:42:23.6365371Z", + vmSize: "STANDARD_D2S_V3", + interNodeCommunication: "Disabled", + taskSlotsPerNode: 1, + taskSchedulingPolicy: { + nodeFillType: "Pack", + }, + deploymentConfiguration: { + virtualMachineConfiguration: { + imageReference: { + publisher: "canonical", + offer: "0001-com-ubuntu-server-jammy", + sku: "22_04-lts", + version: "latest", + }, + nodeAgentSkuId: "batch.node.ubuntu 22.04", + osDisk: { + caching: "None", + managedDisk: { + storageAccountType: "Premium_LRS", + }, + }, + nodePlacementConfiguration: { + policy: "Regional", + }, + securityProfile: { + securityType: "trustedLaunch", + uefiSettings: { + secureBootEnabled: true, + }, + }, + }, + }, + networkConfiguration: { + subnetId: + "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/supercomputing/providers/Microsoft.Network/virtualNetworks/vnetA/subnets/subnetA", + publicIPAddressConfiguration: { + provision: "BatchManaged", + }, + dynamicVnetAssignmentScope: "none", + enableAcceleratedNetworking: false, + }, + scaleSettings: { + fixedScale: { + targetDedicatedNodes: 0, + targetLowPriorityNodes: 0, + resizeTimeout: "PT15M", + }, + }, + resizeOperationStatus: { + targetDedicatedNodes: 0, + nodeDeallocationOption: "Requeue", + resizeTimeout: "PT15M", + startTime: "2024-02-16T20:42:22.0825141Z", + }, + currentDedicatedNodes: 0, + currentLowPriorityNodes: 0, + targetNodeCommunicationMode: "Default", + resourceTags: { + tag1: "one", + tag2: "two", + }, + }, + }, }; batchNodes: { [poolId: string]: BatchNodeOutput[] } = { diff --git a/packages/service/swagger/README.md b/packages/service/swagger/README.md index 02ffd1e03..5fe252516 100644 --- a/packages/service/swagger/README.md +++ b/packages/service/swagger/README.md @@ -14,7 +14,7 @@ generate-sample: false license-header: MICROSOFT_MIT_NO_VERSION output-folder: ../src/internal/arm-batch-rest source-code-folder-path: ./generated -input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/main/specification/batch/resource-manager/Microsoft.Batch/stable/2023-05-01/BatchManagement.json +input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/main/specification/batch/resource-manager/Microsoft.Batch/stable/2023-11-01/BatchManagement.json package-version: 1.0.0-beta.1 rest-level-client: true add-credentials: true From c560ef49bad25e59a46a8c943ade7d299c082648 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Feb 2024 20:18:45 +0000 Subject: [PATCH 06/57] Bump es5-ext from 0.10.62 to 0.10.63 in /util/bux Bumps [es5-ext](https://github.com/medikoo/es5-ext) from 0.10.62 to 0.10.63. - [Release notes](https://github.com/medikoo/es5-ext/releases) - [Changelog](https://github.com/medikoo/es5-ext/blob/main/CHANGELOG.md) - [Commits](https://github.com/medikoo/es5-ext/compare/v0.10.62...v0.10.63) --- updated-dependencies: - dependency-name: es5-ext dependency-type: indirect ... Signed-off-by: dependabot[bot] --- util/bux/package-lock.json | 40 +++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/util/bux/package-lock.json b/util/bux/package-lock.json index 8f0c90f6c..c063973fb 100644 --- a/util/bux/package-lock.json +++ b/util/bux/package-lock.json @@ -2069,13 +2069,14 @@ } }, "node_modules/es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "version": "0.10.63", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.63.tgz", + "integrity": "sha512-hUCZd2Byj/mNKjfP9jXrdVZ62B8KuA/VoK7X8nUh5qT+AxDmcbvZz041oDVZdbIN1qW6XY9VDNwzkvKnZvK2TQ==", "hasInstallScript": true, "dependencies": { "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", "next-tick": "^1.1.0" }, "engines": { @@ -2128,6 +2129,25 @@ "node": ">=0.8.0" } }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esniff/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -5674,6 +5694,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", From 99f12a289dc85fdff49c5c4bd9ec0ba64ec0ac65 Mon Sep 17 00:00:00 2001 From: David Watrous <509299+dpwatrous@users.noreply.github.com> Date: Thu, 28 Mar 2024 11:00:00 -0400 Subject: [PATCH 07/57] Add func to format dates to localized strings --- .../datetime/__tests__/datetime-util.spec.ts | 31 ++++++++++++++++++- .../bonito-core/src/datetime/datetime-util.ts | 20 ++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/packages/bonito-core/src/datetime/__tests__/datetime-util.spec.ts b/packages/bonito-core/src/datetime/__tests__/datetime-util.spec.ts index e6fe543ba..4427ef5f3 100644 --- a/packages/bonito-core/src/datetime/__tests__/datetime-util.spec.ts +++ b/packages/bonito-core/src/datetime/__tests__/datetime-util.spec.ts @@ -1,6 +1,14 @@ import { DateTime } from "luxon"; -import { fromIso, isDate, toIsoLocal, toIsoUtc } from "../datetime-util"; +import { + formatDateTime, + fromIso, + isDate, + toIsoLocal, + toIsoUtc, +} from "../datetime-util"; import { initMockEnvironment } from "../../environment"; +import { getLocalizer } from "../../localization"; +import { FakeLocalizer } from "../../localization/fake-localizer"; describe("Date/time utilities", () => { beforeEach(() => initMockEnvironment()); @@ -43,4 +51,25 @@ describe("Date/time utilities", () => { isDate(DateTime.fromISO("2020-12-03T00:12:00.000Z")) ).toBeFalsy(); }); + + test("formatDateTime() function", () => { + // Time zone for testing purposes defaults to -3 offset, so this + // should be 9PM on January 2nd in the local timezone + const date = new Date(Date.parse("03 Jan 2020 00:00:00 UTC")); + + expect(formatDateTime(date, DateTime.DATE_SHORT)).toEqual("1/2/2020"); + expect(formatDateTime(date, DateTime.TIME_SIMPLE)).toEqual("9:00 PM"); + expect(formatDateTime(date, DateTime.DATETIME_FULL)).toEqual( + "January 2, 2020 at 9:00 PM GMT-3" + ); + + // Switching locale should switch format strings + (getLocalizer() as FakeLocalizer).setLocale("fr"); + + expect(formatDateTime(date, DateTime.DATE_SHORT)).toEqual("02/01/2020"); + expect(formatDateTime(date, DateTime.TIME_SIMPLE)).toEqual("21:00"); + expect(formatDateTime(date, DateTime.DATETIME_FULL)).toEqual( + "2 janvier 2020 à 21:00 UTC−3" + ); + }); }); diff --git a/packages/bonito-core/src/datetime/datetime-util.ts b/packages/bonito-core/src/datetime/datetime-util.ts index df9383476..6eaa61200 100644 --- a/packages/bonito-core/src/datetime/datetime-util.ts +++ b/packages/bonito-core/src/datetime/datetime-util.ts @@ -1,6 +1,7 @@ import { Settings, DateTime, Zone } from "luxon"; import { getEnvironment } from "../environment"; import { Clock } from "./clock"; +import { getLocalizer } from "../localization"; // Stored so that the timezone can be reset to its original value in unit tests const initialSystemTimeZone = getSystemTimeZone(); @@ -108,3 +109,22 @@ export function toIsoUtc(date: Date): string { export function isDate(obj: unknown): obj is Date { return obj instanceof Date; } + +/** + * Get a formatted date/time string based on the current environment's + * locale. See Luxon's {@link DateTime} object for some useful presets + * such as `DateTime.DATE_SHORT`. + * + * @param date The date to format + * @param format A date/time format using Intl.DateTimeFormat + * + * @returns A formatted date string + */ +export function formatDateTime( + date: Date, + format: Intl.DateTimeFormatOptions +): string { + return DateTime.fromJSDate(date) + .setLocale(getLocalizer().getLocale()) + .toLocaleString(format); +} From d248fff3ebb90ee406b77ff6efe2074be187bda0 Mon Sep 17 00:00:00 2001 From: Rena Date: Fri, 29 Mar 2024 11:31:28 -0700 Subject: [PATCH 08/57] Rendering UI removal (#2891) * Remove gallery applications leaving only the deprecation warning * Remove rendering os and application license picker from create pool form * Minor update * Update test cases * Update gallery deprecation message * Update deprecation message * Localize gallery deprecation warning * Minor update * Use formatDateTime for localization --- desktop/i18n/resources.resjson | 7 +--- .../aad-app-secret-picker.i18n.yml | 2 +- .../gallery/home/gallery.component.ts | 4 ++ .../app/components/gallery/home/gallery.html | 35 ++++------------ .../components/gallery/home/gallery.i18n.yml | 5 +-- .../app/components/gallery/home/gallery.scss | 41 ------------------- .../app-license-picker.component.spec.ts | 26 ------------ .../app-license-picker.html | 28 +------------ .../os-image-picker.component.spec.ts | 12 +----- .../os-image-picker/os-image-picker.html | 5 --- .../action/add/pool-create-basic-dialog.html | 9 ---- 11 files changed, 18 insertions(+), 156 deletions(-) diff --git a/desktop/i18n/resources.resjson b/desktop/i18n/resources.resjson index 62928a443..319ca7f1f 100644 --- a/desktop/i18n/resources.resjson +++ b/desktop/i18n/resources.resjson @@ -1,6 +1,6 @@ { "aad-app-secret-picker.description.label": "Description (Optional)", - "aad-app-secret-picker.expireIn.label": "Exipre in", + "aad-app-secret-picker.expireIn.label": "Expire in", "aad-app-secret-picker.secret.label": "Secret. One will be generated automatically if not provided", "account-cost-card.subtitle": "This is showing the pre-tax cost reported. Please note that cost might be partial.", "account-cost-card.title": "Daily cost", @@ -160,11 +160,8 @@ "form-footer.buttons.normalForm": "Switch to classic form", "form-footer.buttons.save": "Save", "form-footer.buttons.select": "Select", - "gallery.actions": "Actions", - "gallery.myLibrary": "My library", - "gallery.recentTemplates": "Recent templates", + "gallery.deprecation-warning": "Gallery applications are no longer supported as of {deprecationDate}. See the Azure Batch rendering VM images & licensing retirement announcement for details.", "gallery.title": "Gallery applications", - "gallery.viewReadme": "View readme", "info-box.infoIconTitle": "Information", "job-progress-status.inaccurate": "Task count might not be accurate in real time", "job-progress-status.progressBar": "Job progress", diff --git a/desktop/src/app/components/account/details/programmatic-usage/aad-credentials-picker/aad-app-secret-picker/aad-app-secret-picker.i18n.yml b/desktop/src/app/components/account/details/programmatic-usage/aad-credentials-picker/aad-app-secret-picker/aad-app-secret-picker.i18n.yml index 043f2431c..935f88372 100644 --- a/desktop/src/app/components/account/details/programmatic-usage/aad-credentials-picker/aad-app-secret-picker/aad-app-secret-picker.i18n.yml +++ b/desktop/src/app/components/account/details/programmatic-usage/aad-credentials-picker/aad-app-secret-picker/aad-app-secret-picker.i18n.yml @@ -4,4 +4,4 @@ aad-app-secret-picker: secret: label: Secret. One will be generated automatically if not provided expireIn: - label: Exipre in + label: Expire in diff --git a/desktop/src/app/components/gallery/home/gallery.component.ts b/desktop/src/app/components/gallery/home/gallery.component.ts index ab559e7b7..2cf9f1334 100644 --- a/desktop/src/app/components/gallery/home/gallery.component.ts +++ b/desktop/src/app/components/gallery/home/gallery.component.ts @@ -11,8 +11,10 @@ import { Subject } from "rxjs"; import { map, publishReplay, refCount, takeUntil } from "rxjs/operators"; import { ApplicationSelection } from "../application-list"; import { SubmitMarketApplicationComponent } from "../submit"; +import { formatDateTime } from "@azure/bonito-core/lib/datetime"; import "./gallery.scss"; +import { DateTime } from "luxon"; @Component({ selector: "bl-gallery", @@ -32,6 +34,8 @@ export class GalleryComponent implements OnInit, OnDestroy { private _baseUrl: string; private _destroy = new Subject(); + public deprecateRenderingDate = formatDateTime(new Date(Date.parse("29 Feb 2024")), DateTime.DATE_SHORT) + constructor( private changeDetector: ChangeDetectorRef, private router: Router, diff --git a/desktop/src/app/components/gallery/home/gallery.html b/desktop/src/app/components/gallery/home/gallery.html index 11587a6d6..eabfbd10c 100644 --- a/desktop/src/app/components/gallery/home/gallery.html +++ b/desktop/src/app/components/gallery/home/gallery.html @@ -2,36 +2,15 @@

{{'gallery.title' | i18n }}

- -
-
- - -
- - You must agree to have read each of the end user license agreements by selecting the checkbox -
-
-
From ce19ea7aa6f555e2510101aae6693fe5e99308a8 Mon Sep 17 00:00:00 2001 From: David Watrous <509299+dpwatrous@users.noreply.github.com> Date: Thu, 4 Apr 2024 10:50:15 -0400 Subject: [PATCH 09/57] Update package-lock.json --- desktop/package-lock.json | 4 ++-- util/bux/package-lock.json | 14 -------------- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/desktop/package-lock.json b/desktop/package-lock.json index 3fac644bf..073654746 100644 --- a/desktop/package-lock.json +++ b/desktop/package-lock.json @@ -1,12 +1,12 @@ { "name": "batch-explorer", - "version": "2.20.0", + "version": "2.21.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "batch-explorer", - "version": "2.20.0", + "version": "2.21.0", "license": "MIT", "dependencies": { "@angular/animations": "^11.0.0", diff --git a/util/bux/package-lock.json b/util/bux/package-lock.json index c063973fb..9b364b7c1 100644 --- a/util/bux/package-lock.json +++ b/util/bux/package-lock.json @@ -5694,20 +5694,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "dev": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", From 9242c9cba62d9b01addf2464eea27da3036bf142 Mon Sep 17 00:00:00 2001 From: David Watrous <509299+dpwatrous@users.noreply.github.com> Date: Thu, 4 Apr 2024 10:52:23 -0400 Subject: [PATCH 10/57] Update prettier to 3.x Added "trailingComma": "es5" rule to keep the effective changes minimal --- .prettierrc.json | 11 +++- package-lock.json | 12 ++-- package.json | 2 +- .../src/environment/abstract-environment.ts | 2 +- .../src/environment/environment-util.ts | 6 +- .../src/environment/mock-environment.ts | 2 +- .../src/form/__tests__/form.spec.ts | 2 +- .../bonito-core/src/form/boolean-parameter.ts | 2 +- packages/bonito-core/src/form/entry.ts | 2 +- packages/bonito-core/src/form/form.ts | 2 +- .../src/form/internal/form-impl.ts | 2 +- .../bonito-core/src/form/number-parameter.ts | 2 +- packages/bonito-core/src/form/parameter.ts | 14 ++--- .../src/form/password-parameter.ts | 2 +- packages/bonito-core/src/form/section.ts | 2 +- .../src/form/string-list-parameter.ts | 2 +- .../bonito-core/src/form/string-parameter.ts | 2 +- packages/bonito-core/src/form/subform.ts | 13 +++-- .../src/components/data-grid/data-grid.tsx | 8 +-- .../src/components/form/checkbox.tsx | 2 +- .../form/default-form-control-resolver.tsx | 2 +- .../src/components/form/dropdown.tsx | 6 +- .../components/form/form-control-resolver.ts | 4 +- .../src/components/form/form-control.ts | 2 +- .../src/components/form/list-form-layout.tsx | 6 +- .../src/components/form/location-dropdown.tsx | 2 +- .../src/components/form/radio-button.tsx | 4 +- .../form/resource-group-dropdown.tsx | 2 +- .../form/storage-account-dropdown.tsx | 2 +- .../components/form/subscription-dropdown.tsx | 2 +- .../src/components/form/tab-selector.tsx | 4 +- .../src/components/form/text-field.tsx | 2 +- .../src/environment/browser-environment.ts | 8 +-- .../environment/mock-browser-environment.ts | 2 +- .../src/form/internal/react-form-impl.tsx | 2 +- .../bonito-ui/src/form/location-parameter.ts | 7 +-- packages/bonito-ui/src/form/react-form.ts | 4 +- .../bonito-ui/src/form/react-parameter.ts | 6 +- .../src/form/resource-group-parameter.ts | 2 +- .../src/form/storage-account-parameter.ts | 2 +- .../src/form/subscription-parameter.ts | 2 +- .../__tests__/use-form-parameter.spec.ts | 2 +- .../bonito-ui/src/hooks/use-form-parameter.ts | 2 +- packages/bonito-ui/src/test-util/a11y.ts | 4 +- .../src/form/batch-form-control-resolver.tsx | 2 +- .../react/src/pool/node-comms-dropdown.tsx | 2 +- .../react/src/pool/node-comms-parameter.tsx | 2 +- util/bux/util.ts | 5 +- util/common-config/jest-common.js | 57 +++++++++++-------- 49 files changed, 129 insertions(+), 112 deletions(-) diff --git a/.prettierrc.json b/.prettierrc.json index 168d9d2a0..c21381128 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -1,3 +1,12 @@ { - "endOfLine": "auto" + "endOfLine": "auto", + "trailingComma": "es5", + "overrides": [ + { + "files": ["*.jsonc", "tsconfig.json"], + "options": { + "trailingComma": "none" + } + } + ] } diff --git a/package-lock.json b/package-lock.json index 3ab9265ce..6d9472926 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,7 +39,7 @@ "markdownlint": "^0.25.1", "markdownlint-cli2": "^0.4.0", "npm-run-all": "^4.1.5", - "prettier": "^2.5.1", + "prettier": "^3.0.0", "typescript": "^4.9.0", "which": "^2.0.2" }, @@ -9984,15 +9984,15 @@ } }, "node_modules/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" diff --git a/package.json b/package.json index c2b83aac8..aca06a1fe 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "markdownlint": "^0.25.1", "markdownlint-cli2": "^0.4.0", "npm-run-all": "^4.1.5", - "prettier": "^2.5.1", + "prettier": "^3.0.0", "typescript": "^4.9.0", "which": "^2.0.2" }, diff --git a/packages/bonito-core/src/environment/abstract-environment.ts b/packages/bonito-core/src/environment/abstract-environment.ts index 8b73dce2b..34ec1b586 100644 --- a/packages/bonito-core/src/environment/abstract-environment.ts +++ b/packages/bonito-core/src/environment/abstract-environment.ts @@ -18,7 +18,7 @@ import { Notifier } from "../notification"; */ export abstract class AbstractEnvironment< C extends EnvironmentConfig = EnvironmentConfig, - D extends DependencyFactories = DependencyFactories + D extends DependencyFactories = DependencyFactories, > implements Environment { abstract readonly name: EnvironmentName; diff --git a/packages/bonito-core/src/environment/environment-util.ts b/packages/bonito-core/src/environment/environment-util.ts index fa233dc42..cd29588ea 100644 --- a/packages/bonito-core/src/environment/environment-util.ts +++ b/packages/bonito-core/src/environment/environment-util.ts @@ -15,7 +15,7 @@ let _currentEnvironment: Environment | null = null; * @returns The current environment */ export function getEnvironment< - C extends EnvironmentConfig = EnvironmentConfig + C extends EnvironmentConfig = EnvironmentConfig, >(): Environment { if (!_currentEnvironment) { throw new Error( @@ -60,7 +60,7 @@ export function inject(id: string): T { * environment is not a mock. */ export function getMockEnvironment< - C extends EnvironmentConfig = EnvironmentConfig + C extends EnvironmentConfig = EnvironmentConfig, >(): MockEnvironment { if (!_currentEnvironment) { throw new Error( @@ -103,7 +103,7 @@ export function initEnvironment>( */ export function initMockEnvironment< C extends EnvironmentConfig = EnvironmentConfig, - D extends DependencyFactories = DependencyFactories + D extends DependencyFactories = DependencyFactories, >( configOverrides: Partial = {}, depFactoryOverrides: Partial = {} diff --git a/packages/bonito-core/src/environment/mock-environment.ts b/packages/bonito-core/src/environment/mock-environment.ts index bdb2c6f2a..6edd3be46 100644 --- a/packages/bonito-core/src/environment/mock-environment.ts +++ b/packages/bonito-core/src/environment/mock-environment.ts @@ -34,7 +34,7 @@ export const mockDependencyFactories: DependencyFactories = { }; export class MockEnvironment< - C extends EnvironmentConfig + C extends EnvironmentConfig, > extends AbstractEnvironment { name = EnvironmentName.Mock; diff --git a/packages/bonito-core/src/form/__tests__/form.spec.ts b/packages/bonito-core/src/form/__tests__/form.spec.ts index 73bef2141..feeae83d6 100644 --- a/packages/bonito-core/src/form/__tests__/form.spec.ts +++ b/packages/bonito-core/src/form/__tests__/form.spec.ts @@ -800,7 +800,7 @@ const allowedStates = ["NY", "New York", "CA", "California"]; class ParkParameter< V extends FormValues, K extends ParameterName, - D extends ParameterDependencies + D extends ParameterDependencies, > extends AbstractParameter { async validateAsync(): Promise { let status = await super.validateAsync(); diff --git a/packages/bonito-core/src/form/boolean-parameter.ts b/packages/bonito-core/src/form/boolean-parameter.ts index 5a7c5b1de..f704af63e 100644 --- a/packages/bonito-core/src/form/boolean-parameter.ts +++ b/packages/bonito-core/src/form/boolean-parameter.ts @@ -8,7 +8,7 @@ import { ValidationStatus } from "./validation-status"; */ export class BooleanParameter< V extends FormValues, - K extends ParameterName + K extends ParameterName, > extends AbstractParameter { validateSync(): ValidationStatus { let status = super.validateSync(); diff --git a/packages/bonito-core/src/form/entry.ts b/packages/bonito-core/src/form/entry.ts index f15fe9794..39c5bab32 100644 --- a/packages/bonito-core/src/form/entry.ts +++ b/packages/bonito-core/src/form/entry.ts @@ -61,7 +61,7 @@ export interface EntryInit { export interface ValuedEntryInit< V extends FormValues, - K extends ParameterName + K extends ParameterName, > extends EntryInit { value?: V[K]; } diff --git a/packages/bonito-core/src/form/form.ts b/packages/bonito-core/src/form/form.ts index 2d93f75a3..dabe4e7dc 100644 --- a/packages/bonito-core/src/form/form.ts +++ b/packages/bonito-core/src/form/form.ts @@ -77,7 +77,7 @@ export interface Form { param< K extends ParameterName, D extends ParameterDependencies = ParameterDependencies, - T extends Parameter = Parameter + T extends Parameter = Parameter, >( name: K, parameterConstructor: ParameterConstructor, diff --git a/packages/bonito-core/src/form/internal/form-impl.ts b/packages/bonito-core/src/form/internal/form-impl.ts index 7b608208c..148e1fe47 100644 --- a/packages/bonito-core/src/form/internal/form-impl.ts +++ b/packages/bonito-core/src/form/internal/form-impl.ts @@ -136,7 +136,7 @@ export class FormImpl implements Form { param< K extends ParameterName, D extends ParameterDependencies = ParameterDependencies, - T extends Parameter = Parameter + T extends Parameter = Parameter, >( name: K, parameterConstructor: ParameterConstructor, diff --git a/packages/bonito-core/src/form/number-parameter.ts b/packages/bonito-core/src/form/number-parameter.ts index 8eaf4a244..53eb72556 100644 --- a/packages/bonito-core/src/form/number-parameter.ts +++ b/packages/bonito-core/src/form/number-parameter.ts @@ -8,7 +8,7 @@ import { ValidationStatus } from "./validation-status"; */ export class NumberParameter< V extends FormValues, - K extends ParameterName + K extends ParameterName, > extends AbstractParameter { validateSync(): ValidationStatus { let status = super.validateSync(); diff --git a/packages/bonito-core/src/form/parameter.ts b/packages/bonito-core/src/form/parameter.ts index b984c9d62..b17c56488 100644 --- a/packages/bonito-core/src/form/parameter.ts +++ b/packages/bonito-core/src/form/parameter.ts @@ -12,27 +12,27 @@ import { ValidationStatus } from "./validation-status"; export type ParameterDependencies< V extends FormValues = FormValues, - D extends string = string + D extends string = string, > = Record>; export type ParameterName = Extract; export type ParameterDependencyName< V extends FormValues, - D extends ParameterDependencies + D extends ParameterDependencies, > = keyof D & string; export type ParameterConstructor< V extends FormValues, K extends ParameterName, D extends ParameterDependencies = ParameterDependencies, - T extends Parameter = Parameter + T extends Parameter = Parameter, > = new (form: Form, name: K, init?: ParameterInit) => T; export interface ParameterInit< V extends FormValues, K extends ParameterName, - D extends ParameterDependencies = ParameterDependencies + D extends ParameterDependencies = ParameterDependencies, > extends ValuedEntryInit { label?: string; hideLabel?: boolean; @@ -47,7 +47,7 @@ export interface ParameterInit< export interface DynamicParameterProperties< V extends FormValues, - K extends ParameterName + K extends ParameterName, > extends DynamicEntryProperties { value?: (values: V) => V[K]; label?: (values: V) => string; @@ -59,7 +59,7 @@ export interface DynamicParameterProperties< export interface Parameter< V extends FormValues, K extends ParameterName, - D extends ParameterDependencies = ParameterDependencies + D extends ParameterDependencies = ParameterDependencies, > extends ValuedEntry { /** * A reference to the form containing this parameter. @@ -215,7 +215,7 @@ export interface Parameter< export abstract class AbstractParameter< V extends FormValues, K extends ParameterName, - D extends ParameterDependencies = ParameterDependencies + D extends ParameterDependencies = ParameterDependencies, > implements Parameter { private _logger: Logger; diff --git a/packages/bonito-core/src/form/password-parameter.ts b/packages/bonito-core/src/form/password-parameter.ts index 75e34195b..25b88f02e 100644 --- a/packages/bonito-core/src/form/password-parameter.ts +++ b/packages/bonito-core/src/form/password-parameter.ts @@ -8,7 +8,7 @@ import { ValidationStatus } from "./validation-status"; */ export class PasswordParameter< V extends FormValues, - K extends ParameterName + K extends ParameterName, > extends AbstractParameter { validateSync(): ValidationStatus { let status = super.validateSync(); diff --git a/packages/bonito-core/src/form/section.ts b/packages/bonito-core/src/form/section.ts index 912dbd7c9..c16581dc6 100644 --- a/packages/bonito-core/src/form/section.ts +++ b/packages/bonito-core/src/form/section.ts @@ -102,7 +102,7 @@ export class Section implements Entry { param< K extends ParameterName, - D extends ParameterDependencies = ParameterDependencies + D extends ParameterDependencies = ParameterDependencies, >( name: K, parameterConstructor: new ( diff --git a/packages/bonito-core/src/form/string-list-parameter.ts b/packages/bonito-core/src/form/string-list-parameter.ts index 8c25def87..aaf5d21c8 100644 --- a/packages/bonito-core/src/form/string-list-parameter.ts +++ b/packages/bonito-core/src/form/string-list-parameter.ts @@ -12,7 +12,7 @@ export interface StringListValidationDetails { */ export class StringListParameter< V extends FormValues, - K extends ParameterName + K extends ParameterName, > extends AbstractParameter { validateSync() { let status = super.validateSync(); diff --git a/packages/bonito-core/src/form/string-parameter.ts b/packages/bonito-core/src/form/string-parameter.ts index 5ed29cd27..56539ac6d 100644 --- a/packages/bonito-core/src/form/string-parameter.ts +++ b/packages/bonito-core/src/form/string-parameter.ts @@ -8,7 +8,7 @@ import { ValidationStatus } from "./validation-status"; */ export class StringParameter< V extends FormValues, - K extends ParameterName + K extends ParameterName, > extends AbstractParameter { validateSync(): ValidationStatus { let status = super.validateSync(); diff --git a/packages/bonito-core/src/form/subform.ts b/packages/bonito-core/src/form/subform.ts index 499a5ca08..b085afbda 100644 --- a/packages/bonito-core/src/form/subform.ts +++ b/packages/bonito-core/src/form/subform.ts @@ -29,17 +29,18 @@ export interface SubFormInit> export interface DynamicSubformProperties< V extends FormValues, - K extends ParameterName + K extends ParameterName, > extends DynamicEntryProperties { expanded?: (values: V) => boolean; value?: (values: V) => V[K]; } export class SubForm< - P extends FormValues, - PK extends ParameterName

, - S extends P[PK] & FormValues -> implements ValuedEntry, Form + P extends FormValues, + PK extends ParameterName

, + S extends P[PK] & FormValues, + > + implements ValuedEntry, Form { readonly parentForm: Form

; readonly parentSection?: Section

; @@ -163,7 +164,7 @@ export class SubForm< param< SK extends ParameterName, D extends ParameterDependencies = ParameterDependencies, - T extends Parameter = Parameter + T extends Parameter = Parameter, >( name: SK, parameterConstructor: ParameterConstructor, diff --git a/packages/bonito-ui/src/components/data-grid/data-grid.tsx b/packages/bonito-ui/src/components/data-grid/data-grid.tsx index 3391f8f87..776449576 100644 --- a/packages/bonito-ui/src/components/data-grid/data-grid.tsx +++ b/packages/bonito-ui/src/components/data-grid/data-grid.tsx @@ -133,10 +133,10 @@ export const DataGrid: React.FC = (props) => { selectionMode === "single" ? SelectionMode.single : selectionMode === "multiple" - ? SelectionMode.multiple - : selectionMode === "none" - ? SelectionMode.none - : undefined + ? SelectionMode.multiple + : selectionMode === "none" + ? SelectionMode.none + : undefined } columns={columns} items={items} diff --git a/packages/bonito-ui/src/components/form/checkbox.tsx b/packages/bonito-ui/src/components/form/checkbox.tsx index 995eecf14..ab098f350 100644 --- a/packages/bonito-ui/src/components/form/checkbox.tsx +++ b/packages/bonito-ui/src/components/form/checkbox.tsx @@ -15,7 +15,7 @@ import { Checkbox as FluentCheckbox } from "@fluentui/react/lib/Checkbox"; export function Checkbox< V extends FormValues, K extends ParameterName, - D extends ParameterDependencies = ParameterDependencies + D extends ParameterDependencies = ParameterDependencies, >(props: FormControlProps): JSX.Element { const { ariaLabel, className, disabled, onChange, param } = props; diff --git a/packages/bonito-ui/src/components/form/default-form-control-resolver.tsx b/packages/bonito-ui/src/components/form/default-form-control-resolver.tsx index 55a1c73dd..f40bfd7c5 100644 --- a/packages/bonito-ui/src/components/form/default-form-control-resolver.tsx +++ b/packages/bonito-ui/src/components/form/default-form-control-resolver.tsx @@ -29,7 +29,7 @@ export class DefaultFormControlResolver implements FormControlResolver { getFormControl< V extends FormValues, K extends ParameterName, - D extends ParameterDependencies = ParameterDependencies + D extends ParameterDependencies = ParameterDependencies, >(props: FormControlProps): JSX.Element { const { param, id, onChange } = props; diff --git a/packages/bonito-ui/src/components/form/dropdown.tsx b/packages/bonito-ui/src/components/form/dropdown.tsx index d640e3ee7..b4b106b7b 100644 --- a/packages/bonito-ui/src/components/form/dropdown.tsx +++ b/packages/bonito-ui/src/components/form/dropdown.tsx @@ -15,7 +15,7 @@ import { FormControlProps } from "./form-control"; export interface DropdownProps< V extends FormValues, K extends ParameterName, - D extends ParameterDependencies = ParameterDependencies + D extends ParameterDependencies = ParameterDependencies, > extends FormControlProps { options: DropdownOption[]; valueToKey?: (value?: V[K]) => string; @@ -23,7 +23,7 @@ export interface DropdownProps< export interface DropdownOption< V extends FormValues, - K extends ParameterName + K extends ParameterName, > { key?: string; value: V[K]; @@ -39,7 +39,7 @@ const nullKey = "<<>>"; export function Dropdown< V extends FormValues, K extends ParameterName, - D extends ParameterDependencies = ParameterDependencies + D extends ParameterDependencies = ParameterDependencies, >(props: DropdownProps): JSX.Element { const { ariaLabel, diff --git a/packages/bonito-ui/src/components/form/form-control-resolver.ts b/packages/bonito-ui/src/components/form/form-control-resolver.ts index 1622803ef..62c97a724 100644 --- a/packages/bonito-ui/src/components/form/form-control-resolver.ts +++ b/packages/bonito-ui/src/components/form/form-control-resolver.ts @@ -7,7 +7,7 @@ import { FormControlProps } from "./form-control"; export interface FormControlOptions< V extends FormValues, - K extends ParameterName + K extends ParameterName, > { id?: string; @@ -22,7 +22,7 @@ export interface FormControlResolver { getFormControl< V extends FormValues, K extends ParameterName, - D extends ParameterDependencies = ParameterDependencies + D extends ParameterDependencies = ParameterDependencies, >( props: FormControlProps ): JSX.Element; diff --git a/packages/bonito-ui/src/components/form/form-control.ts b/packages/bonito-ui/src/components/form/form-control.ts index 4719d63fc..9aa83000f 100644 --- a/packages/bonito-ui/src/components/form/form-control.ts +++ b/packages/bonito-ui/src/components/form/form-control.ts @@ -15,7 +15,7 @@ export interface FormControlProps< D extends ParameterDependencies = ParameterDependencies, T extends ReactParameter | Parameter = | ReactParameter - | Parameter + | Parameter, > { /** * The unique HTML ID of the input element diff --git a/packages/bonito-ui/src/components/form/list-form-layout.tsx b/packages/bonito-ui/src/components/form/list-form-layout.tsx index 6711a9e10..739f9a58d 100644 --- a/packages/bonito-ui/src/components/form/list-form-layout.tsx +++ b/packages/bonito-ui/src/components/form/list-form-layout.tsx @@ -161,7 +161,7 @@ const SectionTitle = (props: SectionTitleProps) => { interface SubFormTitleProps< P extends FormValues, PK extends ParameterName

, - S extends P[PK] & FormValues + S extends P[PK] & FormValues, > { subForm: SubForm; } @@ -169,7 +169,7 @@ interface SubFormTitleProps< const SubFormTitle = < P extends FormValues, PK extends ParameterName

, - S extends P[PK] & FormValues + S extends P[PK] & FormValues, >( props: SubFormTitleProps ) => { @@ -269,7 +269,7 @@ const ButtonContainer = (props: ButtonContainerProps) => { export const EntryDebugInfo = < V extends FormValues, - K extends ParameterName + K extends ParameterName, >(props: { entry: Parameter; }) => { diff --git a/packages/bonito-ui/src/components/form/location-dropdown.tsx b/packages/bonito-ui/src/components/form/location-dropdown.tsx index b8095e785..b4e67dfc2 100644 --- a/packages/bonito-ui/src/components/form/location-dropdown.tsx +++ b/packages/bonito-ui/src/components/form/location-dropdown.tsx @@ -8,7 +8,7 @@ import { FormControlProps } from "./form-control"; export function LocationDropdown< V extends FormValues, - K extends ParameterName + K extends ParameterName, >( props: FormControlProps< V, diff --git a/packages/bonito-ui/src/components/form/radio-button.tsx b/packages/bonito-ui/src/components/form/radio-button.tsx index 240a31a88..db542470a 100644 --- a/packages/bonito-ui/src/components/form/radio-button.tsx +++ b/packages/bonito-ui/src/components/form/radio-button.tsx @@ -11,7 +11,7 @@ import { FormControlProps } from "./form-control"; export interface RadioButtonProps< V extends FormValues, K extends ParameterName, - D extends ParameterDependencies = ParameterDependencies + D extends ParameterDependencies = ParameterDependencies, > extends FormControlProps { options: RadioButtonOption[]; defaultSelectedKey?: string; @@ -25,7 +25,7 @@ export interface RadioButtonOption { export function RadioButton< V extends FormValues, K extends ParameterName, - D extends ParameterDependencies = ParameterDependencies + D extends ParameterDependencies = ParameterDependencies, >(props: RadioButtonProps): JSX.Element { const { className, diff --git a/packages/bonito-ui/src/components/form/resource-group-dropdown.tsx b/packages/bonito-ui/src/components/form/resource-group-dropdown.tsx index 0de578297..f90d2eb23 100644 --- a/packages/bonito-ui/src/components/form/resource-group-dropdown.tsx +++ b/packages/bonito-ui/src/components/form/resource-group-dropdown.tsx @@ -11,7 +11,7 @@ import { FormControlProps } from "./form-control"; export function ResourceGroupDropdown< V extends FormValues, - K extends ParameterName + K extends ParameterName, >( props: FormControlProps< V, diff --git a/packages/bonito-ui/src/components/form/storage-account-dropdown.tsx b/packages/bonito-ui/src/components/form/storage-account-dropdown.tsx index 3ede1b02c..8d507f8cb 100644 --- a/packages/bonito-ui/src/components/form/storage-account-dropdown.tsx +++ b/packages/bonito-ui/src/components/form/storage-account-dropdown.tsx @@ -11,7 +11,7 @@ import { FormControlProps } from "./form-control"; export function StorageAccountDropdown< V extends FormValues, - K extends ParameterName + K extends ParameterName, >( props: FormControlProps< V, diff --git a/packages/bonito-ui/src/components/form/subscription-dropdown.tsx b/packages/bonito-ui/src/components/form/subscription-dropdown.tsx index 149df146c..6ef07ef17 100644 --- a/packages/bonito-ui/src/components/form/subscription-dropdown.tsx +++ b/packages/bonito-ui/src/components/form/subscription-dropdown.tsx @@ -17,7 +17,7 @@ import { FormControlProps } from "./form-control"; */ export function SubscriptionDropdown< V extends FormValues, - K extends ParameterName + K extends ParameterName, >( props: FormControlProps< V, diff --git a/packages/bonito-ui/src/components/form/tab-selector.tsx b/packages/bonito-ui/src/components/form/tab-selector.tsx index 1079e9d01..fd75f65de 100644 --- a/packages/bonito-ui/src/components/form/tab-selector.tsx +++ b/packages/bonito-ui/src/components/form/tab-selector.tsx @@ -12,7 +12,7 @@ import { FormControlProps } from "./form-control"; export interface TabSelectorProps< V extends FormValues, K extends ParameterName, - D extends ParameterDependencies = ParameterDependencies + D extends ParameterDependencies = ParameterDependencies, > extends FormControlProps { overflowBehavior?: "none" | "menu" | "wrap"; options: TabOption[]; @@ -34,7 +34,7 @@ const nullKey = "<<>>"; export function TabSelector< V extends FormValues, K extends ParameterName, - D extends ParameterDependencies = ParameterDependencies + D extends ParameterDependencies = ParameterDependencies, >(props: TabSelectorProps): JSX.Element { const { ariaLabel, diff --git a/packages/bonito-ui/src/components/form/text-field.tsx b/packages/bonito-ui/src/components/form/text-field.tsx index 22a5da114..ba1665dfa 100644 --- a/packages/bonito-ui/src/components/form/text-field.tsx +++ b/packages/bonito-ui/src/components/form/text-field.tsx @@ -10,7 +10,7 @@ import { translate } from "@azure/bonito-core"; export interface TextFieldProps< V extends FormValues, - K extends ParameterName + K extends ParameterName, > extends FormControlProps { /** * The type of input to display. diff --git a/packages/bonito-ui/src/environment/browser-environment.ts b/packages/bonito-ui/src/environment/browser-environment.ts index c488a0793..c91b79763 100644 --- a/packages/bonito-ui/src/environment/browser-environment.ts +++ b/packages/bonito-ui/src/environment/browser-environment.ts @@ -25,12 +25,12 @@ import { initFluentIcons } from "./environment-util"; import { MockBrowserEnvironment } from "./mock-browser-environment"; export interface BrowserEnvironment< - C extends BrowserEnvironmentConfig = BrowserEnvironmentConfig + C extends BrowserEnvironmentConfig = BrowserEnvironmentConfig, > extends Environment { getFormControl< V extends FormValues, K extends ParameterName, - D extends ParameterDependencies = ParameterDependencies + D extends ParameterDependencies = ParameterDependencies, >( props: FormControlProps ): JSX.Element; @@ -48,7 +48,7 @@ export interface BrowserEnvironmentConfig extends EnvironmentConfig { */ export class DefaultBrowserEnvironment< C extends BrowserEnvironmentConfig = BrowserEnvironmentConfig, - D extends BrowserDependencyFactories = BrowserDependencyFactories + D extends BrowserDependencyFactories = BrowserDependencyFactories, > extends AbstractEnvironment implements BrowserEnvironment @@ -69,7 +69,7 @@ export class DefaultBrowserEnvironment< getFormControl< V extends FormValues, K extends ParameterName, - D extends ParameterDependencies = ParameterDependencies + D extends ParameterDependencies = ParameterDependencies, >(props: FormControlProps): JSX.Element { // If the parameter has a render function, use it. Otherwise // look up the form control using a the configured resolver. diff --git a/packages/bonito-ui/src/environment/mock-browser-environment.ts b/packages/bonito-ui/src/environment/mock-browser-environment.ts index f804d65db..7277879c3 100644 --- a/packages/bonito-ui/src/environment/mock-browser-environment.ts +++ b/packages/bonito-ui/src/environment/mock-browser-environment.ts @@ -43,7 +43,7 @@ export class MockBrowserEnvironment getFormControl< V extends FormValues, K extends ParameterName, - D extends ParameterDependencies = ParameterDependencies + D extends ParameterDependencies = ParameterDependencies, >(props: FormControlProps): JSX.Element { // If the parameter has a render function, use it. Otherwise // look up the form control using a the configured resolver. diff --git a/packages/bonito-ui/src/form/internal/react-form-impl.tsx b/packages/bonito-ui/src/form/internal/react-form-impl.tsx index 068d3f1ba..d4a76cfd3 100644 --- a/packages/bonito-ui/src/form/internal/react-form-impl.tsx +++ b/packages/bonito-ui/src/form/internal/react-form-impl.tsx @@ -20,7 +20,7 @@ export class ReactFormImpl extends FormImpl { param< K extends ParameterName, D extends ParameterDependencies = ParameterDependencies, - T extends ReactParameter = ReactParameter + T extends ReactParameter = ReactParameter, >( name: K, parameterConstructor: ParameterConstructor, diff --git a/packages/bonito-ui/src/form/location-parameter.ts b/packages/bonito-ui/src/form/location-parameter.ts index a01ed58bf..b113f6b25 100644 --- a/packages/bonito-ui/src/form/location-parameter.ts +++ b/packages/bonito-ui/src/form/location-parameter.ts @@ -19,7 +19,7 @@ export type LocationDependencies = ParameterDependencies< export class LocationParameter< V extends FormValues, K extends ParameterName, - D extends LocationDependencies + D extends LocationDependencies, > extends AbstractParameter { locationService: LocationService = inject(DependencyName.LocationService); @@ -51,9 +51,8 @@ export class LocationParameter< let locations: Location[] = []; if (subId) { try { - locations = await this.locationService.listBySubscriptionId( - subId - ); + locations = + await this.locationService.listBySubscriptionId(subId); this.loadError = undefined; } catch (e) { if (e instanceof Error) { diff --git a/packages/bonito-ui/src/form/react-form.ts b/packages/bonito-ui/src/form/react-form.ts index 906e06053..d2ea9b08a 100644 --- a/packages/bonito-ui/src/form/react-form.ts +++ b/packages/bonito-ui/src/form/react-form.ts @@ -17,7 +17,7 @@ export interface ReactForm extends Form { param< K extends ParameterName, D extends ParameterDependencies = ParameterDependencies, - T extends Parameter = Parameter + T extends Parameter = Parameter, >( name: K, parameterConstructor: ParameterConstructor, @@ -54,7 +54,7 @@ export function createParam< StandaloneForm, "_standaloneParam", D - > + >, >( parameterConstructor: ParameterConstructor< StandaloneForm, diff --git a/packages/bonito-ui/src/form/react-parameter.ts b/packages/bonito-ui/src/form/react-parameter.ts index db0a412df..85c906411 100644 --- a/packages/bonito-ui/src/form/react-parameter.ts +++ b/packages/bonito-ui/src/form/react-parameter.ts @@ -10,7 +10,7 @@ import type { FormControlProps } from "../components/form"; export interface ReactParameterInit< V extends FormValues, K extends ParameterName, - D extends ParameterDependencies = ParameterDependencies + D extends ParameterDependencies = ParameterDependencies, > extends ParameterInit { render?: (props: FormControlProps) => JSX.Element; } @@ -18,7 +18,7 @@ export interface ReactParameterInit< export interface ReactParameter< V extends FormValues, K extends ParameterName, - D extends ParameterDependencies = ParameterDependencies + D extends ParameterDependencies = ParameterDependencies, > extends Parameter { render?: (props: FormControlProps) => JSX.Element; } @@ -26,7 +26,7 @@ export interface ReactParameter< export function isReactParameter< V extends FormValues, K extends ParameterName, - D extends ParameterDependencies + D extends ParameterDependencies, >(param: Parameter): param is ReactParameter { return (param as ReactParameter).render != null; } diff --git a/packages/bonito-ui/src/form/resource-group-parameter.ts b/packages/bonito-ui/src/form/resource-group-parameter.ts index 62ce54478..d7587d1e2 100644 --- a/packages/bonito-ui/src/form/resource-group-parameter.ts +++ b/packages/bonito-ui/src/form/resource-group-parameter.ts @@ -17,7 +17,7 @@ export type ResourceGroupDependencies = export class ResourceGroupParameter< V extends FormValues, K extends ParameterName, - D extends ResourceGroupDependencies + D extends ResourceGroupDependencies, > extends AbstractParameter { resourceGroupService: ResourceGroupService = inject( DependencyName.ResourceGroupService diff --git a/packages/bonito-ui/src/form/storage-account-parameter.ts b/packages/bonito-ui/src/form/storage-account-parameter.ts index 1794ce06a..1bdb5d0b1 100644 --- a/packages/bonito-ui/src/form/storage-account-parameter.ts +++ b/packages/bonito-ui/src/form/storage-account-parameter.ts @@ -17,7 +17,7 @@ export type StorageAccountDependencies = export class StorageAccountParameter< V extends FormValues, K extends ParameterName, - D extends StorageAccountDependencies + D extends StorageAccountDependencies, > extends AbstractParameter { storageAccountService: StorageAccountService = inject( DependencyName.StorageAccountService diff --git a/packages/bonito-ui/src/form/subscription-parameter.ts b/packages/bonito-ui/src/form/subscription-parameter.ts index 33b7b20d4..4a3f98f89 100644 --- a/packages/bonito-ui/src/form/subscription-parameter.ts +++ b/packages/bonito-ui/src/form/subscription-parameter.ts @@ -13,7 +13,7 @@ import { */ export class SubscriptionParameter< V extends FormValues, - K extends ParameterName + K extends ParameterName, > extends AbstractParameter { subscriptionService: SubscriptionService = inject( DependencyName.SubscriptionService diff --git a/packages/bonito-ui/src/hooks/__tests__/use-form-parameter.spec.ts b/packages/bonito-ui/src/hooks/__tests__/use-form-parameter.spec.ts index 5ee202698..7a5f76638 100644 --- a/packages/bonito-ui/src/hooks/__tests__/use-form-parameter.spec.ts +++ b/packages/bonito-ui/src/hooks/__tests__/use-form-parameter.spec.ts @@ -108,7 +108,7 @@ const beverageTestData: Beverage[] = [ class BeverageParameter< V extends FormValues, K extends ParameterName, - D extends BeverageDependencies + D extends BeverageDependencies, > extends AbstractParameter { beverageLoadError: string | undefined = undefined; diff --git a/packages/bonito-ui/src/hooks/use-form-parameter.ts b/packages/bonito-ui/src/hooks/use-form-parameter.ts index 5c521f635..c7acae9ed 100644 --- a/packages/bonito-ui/src/hooks/use-form-parameter.ts +++ b/packages/bonito-ui/src/hooks/use-form-parameter.ts @@ -22,7 +22,7 @@ export function useFormParameter< V extends FormValues, K extends ParameterName, D extends ParameterDependencies = never, - DataResult = never + DataResult = never, >( param: Parameter, opts: { diff --git a/packages/bonito-ui/src/test-util/a11y.ts b/packages/bonito-ui/src/test-util/a11y.ts index 69de73648..e3d8a34a5 100644 --- a/packages/bonito-ui/src/test-util/a11y.ts +++ b/packages/bonito-ui/src/test-util/a11y.ts @@ -21,7 +21,7 @@ let _axe: JestAxe | null = null; */ export async function renderA11y< Q extends Queries = typeof queries, - Container extends Element | DocumentFragment = HTMLElement + Container extends Element | DocumentFragment = HTMLElement, >( ui: React.ReactElement, options: RenderOptions @@ -32,7 +32,7 @@ export async function renderA11y( ): Promise; export async function renderA11y< Q extends Queries, - Container extends Element | DocumentFragment + Container extends Element | DocumentFragment, >( ui: React.ReactElement, options?: RenderOptions diff --git a/packages/react/src/form/batch-form-control-resolver.tsx b/packages/react/src/form/batch-form-control-resolver.tsx index eb8a5a464..3b9dbd5dc 100644 --- a/packages/react/src/form/batch-form-control-resolver.tsx +++ b/packages/react/src/form/batch-form-control-resolver.tsx @@ -14,7 +14,7 @@ export class BatchFormControlResolver extends DefaultFormControlResolver { getFormControl< V extends FormValues, K extends ParameterName, - D extends ParameterDependencies = ParameterDependencies + D extends ParameterDependencies = ParameterDependencies, >(props: FormControlProps): JSX.Element { const { param, id, onChange } = props; diff --git a/packages/react/src/pool/node-comms-dropdown.tsx b/packages/react/src/pool/node-comms-dropdown.tsx index e88c4c86f..282821a1c 100644 --- a/packages/react/src/pool/node-comms-dropdown.tsx +++ b/packages/react/src/pool/node-comms-dropdown.tsx @@ -19,7 +19,7 @@ import { useFormParameter, useUniqueId } from "@azure/bonito-ui/lib/hooks"; export function NodeCommsDropdown< V extends FormValues, - K extends ParameterName + K extends ParameterName, >( props: FormControlProps< V, diff --git a/packages/react/src/pool/node-comms-parameter.tsx b/packages/react/src/pool/node-comms-parameter.tsx index 136b9832f..40da5bc76 100644 --- a/packages/react/src/pool/node-comms-parameter.tsx +++ b/packages/react/src/pool/node-comms-parameter.tsx @@ -16,7 +16,7 @@ export const NODE_COMMS_MODE_SIMPLIFIED = "Simplified"; */ export class NodeCommsParameter< V extends FormValues, - K extends ParameterName + K extends ParameterName, > extends AbstractParameter { validateSync(): ValidationStatus { let status = super.validateSync(); diff --git a/util/bux/util.ts b/util/bux/util.ts index 6cfc65e73..cf0016867 100644 --- a/util/bux/util.ts +++ b/util/bux/util.ts @@ -85,9 +85,8 @@ export async function getEditorConfig( if (filePattern) { configPath += "/" + filePattern; } - const config: editorconfig.KnownProps = await editorconfig.parse( - configPath - ); + const config: editorconfig.KnownProps = + await editorconfig.parse(configPath); return config[option]; } diff --git a/util/common-config/jest-common.js b/util/common-config/jest-common.js index 4ee0dda8a..71dd1eef2 100644 --- a/util/common-config/jest-common.js +++ b/util/common-config/jest-common.js @@ -111,30 +111,39 @@ module.exports = { function getCombinedResourceStrings() { const resourceStrings = [ - require(path.join( - __dirname, - "../../packages/bonito-core/resources/i18n/json/resources.en.json" - )), - require(path.join( - __dirname, - "../../packages/bonito-ui/resources/i18n/json/resources.en.json" - )), - require(path.join( - __dirname, - "../../packages/service/resources/i18n/json/resources.en.json" - )), - require(path.join( - __dirname, - "../../packages/react/resources/i18n/json/resources.en.json" - )), - require(path.join( - __dirname, - "../../packages/playground/resources/i18n/json/resources.en.json" - )), - require(path.join( - __dirname, - "../../web/resources/i18n/resources.en.json" - )), + require( + path.join( + __dirname, + "../../packages/bonito-core/resources/i18n/json/resources.en.json" + ) + ), + require( + path.join( + __dirname, + "../../packages/bonito-ui/resources/i18n/json/resources.en.json" + ) + ), + require( + path.join( + __dirname, + "../../packages/service/resources/i18n/json/resources.en.json" + ) + ), + require( + path.join( + __dirname, + "../../packages/react/resources/i18n/json/resources.en.json" + ) + ), + require( + path.join( + __dirname, + "../../packages/playground/resources/i18n/json/resources.en.json" + ) + ), + require( + path.join(__dirname, "../../web/resources/i18n/resources.en.json") + ), ]; const allResourceStrings = {}; From a0936762a783d8f54201c6132c57c98c732d08d5 Mon Sep 17 00:00:00 2001 From: Haopeng Wang Date: Fri, 5 Apr 2024 12:31:19 -0700 Subject: [PATCH 11/57] feat: add vm extension related components & enable transpiling ESM js file for jest (#2884) * Add VM extensions related files * Add VMExtensionListDemo component * add vm-exts related tests * Add Panel component and PaneFooter component * Add mock browser environment initialization in pane.spec.tsx * Import monaco editor in Jest working * Increase jest timeout in VmExtensionDetailsPanel test * fix ci issue * fix lint issue * Add watchOptions to webpack.config.js * use textfield instead of monaco editor for vm extension details status * Add unit test for MonacoEditor component * Remove unused code and commented out subStatues in VmExtensionDetails component * Add ariaLabel to TextProperty and VmExtensionDetails components * add comments * rename pane to panel * Remove MonacoEditor test file * Revert "Remove MonacoEditor test file" This reverts commit 563c7ab5c8d5c2325b0c46129fc0b54d7ddc5bb4. * Fix accessibility issues in DataGrid and VmExtensionList components * rename test tsBuildInfoFile & rename mock file name * add Hoppe todo * remove duplicated isolatedModules ts-jest setting * Add comments * change enableCollapse to disableCollapse in PropertyGroup * Fix typo in labelStyle prop name * uncomment VmExtensionListDemo panel * move jsdom mocks to setup-tests * Add accessibility tests for node and pool vm extension lists * check if component is mounted when fetching data in useEffect * add generic type for data-grid * Fix test setup and remove unnecessary code * Add mockNodeTestMissingAPIs add address other comments * modfiy test-mocks imports * remove unused * Remove tsconfig parameter from jest-common.js createConfig * Add moduleNameMapper to jest configuration * Remove unnecessary tsconfig.json reference in jest.config.js --------- Co-authored-by: hoppe --- .../bonito-core/config/tsconfig.test.json | 8 + packages/bonito-core/jest.config.js | 1 - .../bonito-core/src/__tests__/setup-tests.ts | 14 +- .../bonito-core/src/test-util/test-mocks.ts | 15 ++ packages/bonito-ui/config/tsconfig.test.json | 8 + packages/bonito-ui/jest.config.js | 1 - .../bonito-ui/src/__tests__/setup-tests.ts | 3 +- .../components/__tests__/data-grid.spec.tsx | 34 ++-- packages/bonito-ui/src/components/button.tsx | 12 +- .../src/components/data-grid/data-grid.tsx | 26 +-- .../data-grid/test-ignore-a11y-rules.ts | 12 ++ .../editor/__tests__/MonacoEditor.spec.tsx | 22 +++ .../components/editor/impl/MonacoWrapper.tsx | 5 +- packages/bonito-ui/src/components/index.ts | 1 + .../components/panel/__tests__/panel.spec.tsx | 52 ++++++ .../bonito-ui/src/components/panel/index.ts | 2 + .../src/components/panel/panel-footer.tsx | 51 ++++++ .../bonito-ui/src/components/panel/panel.tsx | 45 +++++ .../__tests__/property-field.spec.tsx | 6 + .../__tests__/property-group.spec.tsx | 25 +++ .../property/__tests__/text-property.spec.tsx | 33 ++++ .../src/components/property/date-property.tsx | 4 + .../components/property/property-field.tsx | 32 ++-- .../components/property/property-group.tsx | 33 +++- .../src/components/property/text-property.tsx | 31 +++- packages/bonito-ui/src/test-util/index.ts | 1 + .../bonito-ui/src/test-util/jsdom-mocks.ts | 27 +++ packages/playground/config/tsconfig.test.json | 8 + packages/playground/jest.config.js | 1 - .../playground/src/__tests__/setup-tests.tsx | 13 +- packages/playground/src/demo-routes.tsx | 2 + .../vm-extension/vm-extension-list-demo.tsx | 32 ++++ .../playground/src/layout/demo-nav-menu.tsx | 5 + packages/react/config/tsconfig.test.json | 8 + packages/react/i18n/resources.resjson | 27 ++- packages/react/jest.config.js | 1 - packages/react/src/__tests__/setup-tests.ts | 6 +- packages/react/src/common.i18n.yml | 11 ++ packages/react/src/index.ts | 1 + .../react/src/test-util/mock-vm-ext-items.ts | 92 ++++++++++ .../__tests__/node-vm-ext-list.spec.tsx | 42 +++++ .../__tests__/pool-vm-ext-list.spec.tsx | 40 +++++ .../vm-extension-details-panel.spec.tsx | 52 ++++++ .../__tests__/vm-extension-details.spec.tsx | 62 +++++++ .../__tests__/vm-extension-list.spec.tsx | 88 ++++++++++ packages/react/src/vm-extension/index.ts | 5 + .../src/vm-extension/node-vm-ext-list.tsx | 64 +++++++ .../src/vm-extension/pool-vm-ext-list.tsx | 54 ++++++ .../vm-extension-details-panel.tsx | 41 +++++ .../src/vm-extension/vm-extension-details.tsx | 158 +++++++++++++++++ .../src/vm-extension/vm-extension-list.tsx | 165 ++++++++++++++++++ .../src/vm-extension/vm-extension.i18n.yml | 16 ++ packages/service/config/tsconfig.test.json | 8 + packages/service/jest.config.js | 1 - .../src/environment/environment-util.ts | 2 + util/bux/config/tsconfig.test.json | 8 + util/bux/jest.config.js | 14 +- util/common-config/jest-common.js | 44 +++-- util/common-config/mock-style.js | 1 + web/config/tsconfig.test.json | 8 + web/jest.config.js | 1 - web/src/__tests__/setup-tests.ts | 6 +- web/webpack.config.js | 3 + 63 files changed, 1481 insertions(+), 113 deletions(-) create mode 100644 packages/bonito-core/config/tsconfig.test.json create mode 100644 packages/bonito-core/src/test-util/test-mocks.ts create mode 100644 packages/bonito-ui/config/tsconfig.test.json create mode 100644 packages/bonito-ui/src/components/data-grid/test-ignore-a11y-rules.ts create mode 100644 packages/bonito-ui/src/components/editor/__tests__/MonacoEditor.spec.tsx create mode 100644 packages/bonito-ui/src/components/panel/__tests__/panel.spec.tsx create mode 100644 packages/bonito-ui/src/components/panel/index.ts create mode 100644 packages/bonito-ui/src/components/panel/panel-footer.tsx create mode 100644 packages/bonito-ui/src/components/panel/panel.tsx create mode 100644 packages/bonito-ui/src/components/property/__tests__/text-property.spec.tsx create mode 100644 packages/bonito-ui/src/test-util/jsdom-mocks.ts create mode 100644 packages/playground/config/tsconfig.test.json create mode 100644 packages/playground/src/demo/display/vm-extension/vm-extension-list-demo.tsx create mode 100644 packages/react/config/tsconfig.test.json create mode 100644 packages/react/src/common.i18n.yml create mode 100644 packages/react/src/test-util/mock-vm-ext-items.ts create mode 100644 packages/react/src/vm-extension/__tests__/node-vm-ext-list.spec.tsx create mode 100644 packages/react/src/vm-extension/__tests__/pool-vm-ext-list.spec.tsx create mode 100644 packages/react/src/vm-extension/__tests__/vm-extension-details-panel.spec.tsx create mode 100644 packages/react/src/vm-extension/__tests__/vm-extension-details.spec.tsx create mode 100644 packages/react/src/vm-extension/__tests__/vm-extension-list.spec.tsx create mode 100644 packages/react/src/vm-extension/index.ts create mode 100644 packages/react/src/vm-extension/node-vm-ext-list.tsx create mode 100644 packages/react/src/vm-extension/pool-vm-ext-list.tsx create mode 100644 packages/react/src/vm-extension/vm-extension-details-panel.tsx create mode 100644 packages/react/src/vm-extension/vm-extension-details.tsx create mode 100644 packages/react/src/vm-extension/vm-extension-list.tsx create mode 100644 packages/react/src/vm-extension/vm-extension.i18n.yml create mode 100644 packages/service/config/tsconfig.test.json create mode 100644 util/bux/config/tsconfig.test.json create mode 100644 util/common-config/mock-style.js create mode 100644 web/config/tsconfig.test.json diff --git a/packages/bonito-core/config/tsconfig.test.json b/packages/bonito-core/config/tsconfig.test.json new file mode 100644 index 000000000..9f6956996 --- /dev/null +++ b/packages/bonito-core/config/tsconfig.test.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.common.json", + "compilerOptions": { + "tsBuildInfoFile": "../build/cache/ts.test.buildinfo", + "allowJs": true + }, + "include": ["../**/__mocks__/**/*", "../**/__tests__/**/*"] +} diff --git a/packages/bonito-core/jest.config.js b/packages/bonito-core/jest.config.js index 431f4fda5..5a5f475e3 100644 --- a/packages/bonito-core/jest.config.js +++ b/packages/bonito-core/jest.config.js @@ -2,7 +2,6 @@ /* eslint-disable @typescript-eslint/no-var-requires */ module.exports = require("@batch/common-config/jest-common").createConfig( "bonito-core", - require("./tsconfig.json"), { setupFilesAfterEnv: ["/src/__tests__/setup-tests.ts"], } diff --git a/packages/bonito-core/src/__tests__/setup-tests.ts b/packages/bonito-core/src/__tests__/setup-tests.ts index 896db11a4..225500d12 100644 --- a/packages/bonito-core/src/__tests__/setup-tests.ts +++ b/packages/bonito-core/src/__tests__/setup-tests.ts @@ -1,15 +1,9 @@ import { destroyEnvironment } from "../environment"; -import { Blob as NodeBlob } from "node:buffer"; +import { mockNodeTestMissingAPIs } from "../test-util/test-mocks"; -// May be able to use jsdom instead when this issue is resolved: -// https://github.com/jsdom/jsdom/issues/2555 -globalThis.Blob = NodeBlob as unknown as typeof globalThis.Blob; - -// Fetch is also not implemented in jsdom. Adding it here allows it -// to be stubbed by Jest -globalThis.fetch = () => { - throw new Error("Fetch is not supported in tests and must be stubbed."); -}; +beforeAll(() => { + mockNodeTestMissingAPIs(); +}); afterEach(() => { jest.resetAllMocks(); diff --git a/packages/bonito-core/src/test-util/test-mocks.ts b/packages/bonito-core/src/test-util/test-mocks.ts new file mode 100644 index 000000000..afaa20395 --- /dev/null +++ b/packages/bonito-core/src/test-util/test-mocks.ts @@ -0,0 +1,15 @@ +import { Blob as NodeBlob } from "node:buffer"; + +export function mockNodeTestMissingAPIs() { + // Blob is not supported in global in jest in node. + // May be able to use jsdom instead when this issue is resolved: + // https://github.com/jsdom/jsdom/issues/2555 + globalThis.Blob = NodeBlob as unknown as typeof globalThis.Blob; + + // Fetch is not supported in global in jest in node. + // Adding it here allows it to be stubbed by Jest + // https://stackoverflow.com/questions/74945569/cannot-access-built-in-node-js-fetch-function-from-jest-tests + globalThis.fetch = () => { + throw new Error("Fetch is not supported in tests and must be stubbed."); + }; +} diff --git a/packages/bonito-ui/config/tsconfig.test.json b/packages/bonito-ui/config/tsconfig.test.json new file mode 100644 index 000000000..9f6956996 --- /dev/null +++ b/packages/bonito-ui/config/tsconfig.test.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.common.json", + "compilerOptions": { + "tsBuildInfoFile": "../build/cache/ts.test.buildinfo", + "allowJs": true + }, + "include": ["../**/__mocks__/**/*", "../**/__tests__/**/*"] +} diff --git a/packages/bonito-ui/jest.config.js b/packages/bonito-ui/jest.config.js index 0e4fd9c14..948503e4f 100644 --- a/packages/bonito-ui/jest.config.js +++ b/packages/bonito-ui/jest.config.js @@ -2,7 +2,6 @@ /* eslint-disable @typescript-eslint/no-var-requires */ module.exports = require("@batch/common-config/jest-common").createConfig( "bonito-ui", - require("./tsconfig"), { testEnvironment: "jsdom", setupFilesAfterEnv: ["/src/__tests__/setup-tests.ts"], diff --git a/packages/bonito-ui/src/__tests__/setup-tests.ts b/packages/bonito-ui/src/__tests__/setup-tests.ts index f6d4bfb12..61c333dd6 100644 --- a/packages/bonito-ui/src/__tests__/setup-tests.ts +++ b/packages/bonito-ui/src/__tests__/setup-tests.ts @@ -1,8 +1,9 @@ import { destroyEnvironment } from "@azure/bonito-core"; -import { initializeAxe } from "../test-util/a11y"; +import { initializeAxe, mockJsdomMissingAPIs } from "../test-util"; beforeAll(async () => { await initializeAxe(); + mockJsdomMissingAPIs(); }); afterEach(() => { diff --git a/packages/bonito-ui/src/components/__tests__/data-grid.spec.tsx b/packages/bonito-ui/src/components/__tests__/data-grid.spec.tsx index 9087b937e..504664a40 100644 --- a/packages/bonito-ui/src/components/__tests__/data-grid.spec.tsx +++ b/packages/bonito-ui/src/components/__tests__/data-grid.spec.tsx @@ -4,19 +4,7 @@ import { runAxe } from "../../test-util/a11y"; import { initMockBrowserEnvironment } from "../../environment"; import { DataGrid } from "../data-grid"; import { fromIso, translate } from "@azure/bonito-core"; - -const ignoredA11yRules = { - rules: { - // TODO: Re-enable this when DetailsList fixes this issue - "aria-toggle-field-name": { enabled: false }, - // See https://github.com/microsoft/fluentui/issues/28706 - "aria-required-children": { enabled: false }, - // TODO: Figure out if this is a real issue. Started happening - // after upgrading to jest-axe 7.x. May be this issue: - // https://github.com/microsoft/fluentui/issues/18474 - "empty-table-header": { enabled: false }, - }, -}; +import { dataGridIgnoredA11yRules } from "../data-grid/test-ignore-a11y-rules"; describe("DataGrid component", () => { beforeEach(() => initMockBrowserEnvironment()); @@ -72,7 +60,9 @@ describe("DataGrid component", () => { "2021-05-31T21:12:00.000-03:00" ); - expect(await runAxe(container, ignoredA11yRules)).toHaveNoViolations(); + expect( + await runAxe(container, dataGridIgnoredA11yRules) + ).toHaveNoViolations(); }); test("Custom grid columns", async () => { @@ -135,7 +125,9 @@ describe("DataGrid component", () => { expect(thirdRowCells[2].textContent).toBe("black"); expect(thirdRowCells[3].textContent).toBe(""); - expect(await runAxe(container, ignoredA11yRules)).toHaveNoViolations(); + expect( + await runAxe(container, dataGridIgnoredA11yRules) + ).toHaveNoViolations(); }); test("Shimmer lines", async () => { @@ -172,7 +164,9 @@ describe("DataGrid component", () => { expect(getOffsetAriaRowCount(gridEl)).toBe(3); expect(getNumOfShimmerLines(container)).toBe(0); - expect(await runAxe(container, ignoredA11yRules)).toHaveNoViolations(); + expect( + await runAxe(container, dataGridIgnoredA11yRules) + ).toHaveNoViolations(); }); test("onLoadMore callback", async () => { @@ -192,7 +186,9 @@ describe("DataGrid component", () => { // already has items, should trigger onLoadMore expect(onLoadMore).toHaveBeenCalled(); - expect(await runAxe(container, ignoredA11yRules)).toHaveNoViolations(); + expect( + await runAxe(container, dataGridIgnoredA11yRules) + ).toHaveNoViolations(); }); test("Virtual scrolling", async () => { @@ -247,7 +243,9 @@ describe("DataGrid component", () => { // aria-rowcount should iclude 3 lines of shimmering expect(getOffsetAriaRowCount(gridEl)).toBe(items.length + 3); - expect(await runAxe(container, ignoredA11yRules)).toHaveNoViolations(); + expect( + await runAxe(container, dataGridIgnoredA11yRules) + ).toHaveNoViolations(); }); }); diff --git a/packages/bonito-ui/src/components/button.tsx b/packages/bonito-ui/src/components/button.tsx index 6b8bf1235..4693c275c 100644 --- a/packages/bonito-ui/src/components/button.tsx +++ b/packages/bonito-ui/src/components/button.tsx @@ -1,9 +1,7 @@ import * as React from "react"; import { BaseButton, - Button as FluentButton, - DefaultButton, - PrimaryButton, + DefaultButton as FluentButton, } from "@fluentui/react/lib/Button"; type FluentOnClickElement = @@ -36,8 +34,12 @@ export const Button: React.FC = (props) => { [onClick] ); - const FluentButton = primary ? PrimaryButton : DefaultButton; return ( - + ); }; diff --git a/packages/bonito-ui/src/components/data-grid/data-grid.tsx b/packages/bonito-ui/src/components/data-grid/data-grid.tsx index 776449576..b58338dc3 100644 --- a/packages/bonito-ui/src/components/data-grid/data-grid.tsx +++ b/packages/bonito-ui/src/components/data-grid/data-grid.tsx @@ -11,11 +11,11 @@ import { ShimmeredDetailsList } from "@fluentui/react/lib/ShimmeredDetailsList"; export const NUM_OF_SHIMMER_FULL = 10; export const NUM_OF_SHIMMER_MORE = 3; -export interface DataGridProps { +export interface DataGridProps { /** * A list of columns to display in the grid */ - columns?: string[] | DataGridColumn[]; + columns?: string[] | DataGridColumn[]; /** * Global default maximum width for all grid columns. When maxWidth is @@ -26,14 +26,14 @@ export interface DataGridProps { /** * A list of objects to display in the grid */ - items?: unknown[]; + items?: T[]; /** * Callback when a row in the grid becomes active by clicking or navigating * via the keyboard */ onActiveItemChanged?: ( - item?: unknown, + item?: T, index?: number, ev?: React.FocusEvent ) => void; @@ -77,7 +77,7 @@ export interface DataGridProps { /** * Represents a single column of data in the grid */ -export interface DataGridColumn { +export interface DataGridColumn { /** * User-friendly column label (if not defined, the property name will be * used) @@ -102,7 +102,11 @@ export interface DataGridColumn { /** * Custom renderer for cell content, instead of the default text rendering. */ - onRender?: (item?: unknown, index?: number, column?: IColumn) => unknown; + onRender?: ( + item: T, + index?: number, + column?: IColumn + ) => JSX.Element | null | string; } const defaultColumnMinWidth = 48; @@ -111,7 +115,7 @@ const defaultColumnMinWidth = 48; * Displays a sortable, filterable grid. Wraps the Fluent UI DetailsList * component */ -export const DataGrid: React.FC = (props) => { +export const DataGrid = (props: DataGridProps) => { const { columns: propColumns, columnDefaultMaxWidth, @@ -146,8 +150,8 @@ export const DataGrid: React.FC = (props) => { ); }; -function useColumns( - columns: DataGridProps["columns"], +function useColumns( + columns: DataGridProps["columns"], columnDefaultMaxWidth: DataGridProps["columnDefaultMaxWidth"] ): IColumn[] { const detailsListColumns = React.useMemo(() => { @@ -176,7 +180,7 @@ function useColumns( c.onRender ?? ((item) => autoFormat(c.prop ? item[c.prop] : null)), - minWidth: defaultColumnMinWidth, + minWidth: c.minWidth ?? defaultColumnMinWidth, maxWidth: c.maxWidth ?? columnDefaultMaxWidth, isResizable: true, }); @@ -194,7 +198,7 @@ function useColumns( return detailsListColumns; } -function useLoadMoreItems(props: DataGridProps) { +function useLoadMoreItems(props: DataGridProps) { const { items: propsItems = [], hasMore, onLoadMore, noResultText } = props; const noResult = React.useMemo(() => { diff --git a/packages/bonito-ui/src/components/data-grid/test-ignore-a11y-rules.ts b/packages/bonito-ui/src/components/data-grid/test-ignore-a11y-rules.ts new file mode 100644 index 000000000..1acd3732d --- /dev/null +++ b/packages/bonito-ui/src/components/data-grid/test-ignore-a11y-rules.ts @@ -0,0 +1,12 @@ +export const dataGridIgnoredA11yRules = { + rules: { + // TODO: Re-enable this when DetailsList fixes this issue + "aria-toggle-field-name": { enabled: false }, + // See https://github.com/microsoft/fluentui/issues/28706 + "aria-required-children": { enabled: false }, + // TODO: Figure out if this is a real issue. Started happening + // after upgrading to jest-axe 7.x. May be this issue: + // https://github.com/microsoft/fluentui/issues/18474 + "empty-table-header": { enabled: false }, + }, +}; diff --git a/packages/bonito-ui/src/components/editor/__tests__/MonacoEditor.spec.tsx b/packages/bonito-ui/src/components/editor/__tests__/MonacoEditor.spec.tsx new file mode 100644 index 000000000..e2c0be726 --- /dev/null +++ b/packages/bonito-ui/src/components/editor/__tests__/MonacoEditor.spec.tsx @@ -0,0 +1,22 @@ +import * as React from "react"; +import { render, waitFor } from "@testing-library/react"; +import { MonacoEditor } from "../MonacoEditor"; +import { initMockBrowserEnvironment } from "../../../environment"; + +// set timeout to 60 seconds since it needs to transpile the monaco editor +jest.setTimeout(60000); + +describe("MonacoEditor", () => { + beforeEach(() => initMockBrowserEnvironment()); + it("renders", async () => { + const { getByTestId } = render(); + await waitFor( + () => { + expect(getByTestId("monaco-container")).toBeTruthy(); + }, + { + timeout: 60000, + } + ); + }); +}); diff --git a/packages/bonito-ui/src/components/editor/impl/MonacoWrapper.tsx b/packages/bonito-ui/src/components/editor/impl/MonacoWrapper.tsx index f450e2547..a5f03b951 100644 --- a/packages/bonito-ui/src/components/editor/impl/MonacoWrapper.tsx +++ b/packages/bonito-ui/src/components/editor/impl/MonacoWrapper.tsx @@ -7,7 +7,10 @@ import type * as MonacoEditorImpl from "./MonacoEditorImpl"; /** * Import monaco dynamically to allow for code splitting */ -const MonacoEditorLazy = React.lazy(() => import("./MonacoEditorImpl")); +const MonacoEditorLazy = React.lazy( + () => + import(/* webpackChunkName: "MonacoEditorImpl" */ "./MonacoEditorImpl") +); const LoadingSpinner: React.FC = () => { return ( diff --git a/packages/bonito-ui/src/components/index.ts b/packages/bonito-ui/src/components/index.ts index ee88793c4..5ecf0d6a6 100644 --- a/packages/bonito-ui/src/components/index.ts +++ b/packages/bonito-ui/src/components/index.ts @@ -2,4 +2,5 @@ export * from "./action"; export * from "./data-grid"; export * from "./layout"; export * from "./property"; +export * from "./panel"; export { MonacoEditor, MonacoEditorProps, EditorController } from "./editor"; diff --git a/packages/bonito-ui/src/components/panel/__tests__/panel.spec.tsx b/packages/bonito-ui/src/components/panel/__tests__/panel.spec.tsx new file mode 100644 index 000000000..6e6cf3df7 --- /dev/null +++ b/packages/bonito-ui/src/components/panel/__tests__/panel.spec.tsx @@ -0,0 +1,52 @@ +import { render } from "@testing-library/react"; +import { Panel } from "../panel"; +import React from "react"; +import userEvent from "@testing-library/user-event"; +import { initMockBrowserEnvironment } from "../../../environment"; + +describe("Panel", () => { + beforeEach(() => { + initMockBrowserEnvironment(); + }); + + it("should render header text if isOpen", () => { + const { getByText } = render( + + ); + getByText("Test header text"); + }); + + it("should not render header text if not isOpen", () => { + const { getByText } = render( + + ); + expect(() => getByText("Test header text")).toThrow(); + }); + + it("should render children", () => { + const { getByText } = render( + +

Test children
+ + ); + getByText("Test children"); + }); + + it("should render footer buttons", async () => { + const spy = jest.fn(); + const { getByText } = render( + + ); + const btn = getByText("Test button"); + await userEvent.click(btn); + expect(spy).toHaveBeenCalled(); + }); +}); diff --git a/packages/bonito-ui/src/components/panel/index.ts b/packages/bonito-ui/src/components/panel/index.ts new file mode 100644 index 000000000..4cc79d662 --- /dev/null +++ b/packages/bonito-ui/src/components/panel/index.ts @@ -0,0 +1,2 @@ +export * from "./panel"; +export * from "./panel-footer"; diff --git a/packages/bonito-ui/src/components/panel/panel-footer.tsx b/packages/bonito-ui/src/components/panel/panel-footer.tsx new file mode 100644 index 000000000..2c0e30841 --- /dev/null +++ b/packages/bonito-ui/src/components/panel/panel-footer.tsx @@ -0,0 +1,51 @@ +import React from "react"; +import { useAppTheme } from "../../theme"; +import { Button, ButtonProps } from "../button"; + +export interface PanelFooterProps { + buttons?: ButtonProps[]; + children?: React.ReactNode; +} + +export const PanelFooter = (props: PanelFooterProps) => { + const { children, buttons } = props; + + const theme = useAppTheme(); + const style = React.useMemo(() => { + return { + borderTop: `1px solid ${theme.palette.neutralLight}`, + padding: "20px 16px", + display: "flex", + alignItems: "center", + }; + }, [theme.palette.neutralLight]); + + return ( +
+
+ +
+
{children}
+
+ ); +}; + +export const PanelFooterButtons = (props: { buttons?: ButtonProps[] }) => { + const { buttons } = props; + const style = React.useMemo(() => { + return { + display: "flex", + alignItems: "center", + }; + }, []); + + return ( +
+ {buttons?.map((buttonProps, idx) => ( +
+
+ ))} +
+ ); +}; diff --git a/packages/bonito-ui/src/components/panel/panel.tsx b/packages/bonito-ui/src/components/panel/panel.tsx new file mode 100644 index 000000000..e091b6057 --- /dev/null +++ b/packages/bonito-ui/src/components/panel/panel.tsx @@ -0,0 +1,45 @@ +import React, { PropsWithChildren } from "react"; +import { Panel as FluentPanel, PanelType } from "@fluentui/react/lib/Panel"; +import { ButtonProps } from "../button"; +import { PanelFooter } from "./panel-footer"; + +export interface PanelProps { + headerText?: string; + isOpen?: boolean; + onDismiss?: () => void; + isBlocking?: boolean; + footerButtons?: ButtonProps[]; +} + +/** + * A panel component that wraps the FluentUI Panel component and adds a footer + * with buttons. Should be used when a panel needs to have a footer with buttons. + **/ + +export const Panel: React.FC> = (props) => { + const { headerText, isOpen, onDismiss, isBlocking, footerButtons } = props; + return ( + ( + + )} + styles={{ + footerInner: { + padding: "0px", + }, + header: { + height: "64px", + }, + }} + > + {props.children} + + ); +}; diff --git a/packages/bonito-ui/src/components/property/__tests__/property-field.spec.tsx b/packages/bonito-ui/src/components/property/__tests__/property-field.spec.tsx index 3a7196448..31ecb09ff 100644 --- a/packages/bonito-ui/src/components/property/__tests__/property-field.spec.tsx +++ b/packages/bonito-ui/src/components/property/__tests__/property-field.spec.tsx @@ -14,6 +14,7 @@ describe("PropertyField component", () => { ); expect(screen.getByTestId("label").textContent).toEqual("Color"); expect(screen.getByTestId("content").textContent).toEqual("blue"); + expect(screen.getByTestId("clipboard-button")).toBeTruthy(); expect(await runAxe(container)).toHaveNoViolations(); }); @@ -23,6 +24,11 @@ describe("PropertyField component", () => { expect(screen.getByTestId("content").textContent).toEqual("-"); }); + test("Hide copy button", () => { + render(); + expect(screen.queryByTestId("clipboard-button")).toBeNull(); + }); + test("Custom render functions", async () => { const labelId = uniqueElementId("label"); const { container } = render( diff --git a/packages/bonito-ui/src/components/property/__tests__/property-group.spec.tsx b/packages/bonito-ui/src/components/property/__tests__/property-group.spec.tsx index 4288bdced..cfd2a2ab9 100644 --- a/packages/bonito-ui/src/components/property/__tests__/property-group.spec.tsx +++ b/packages/bonito-ui/src/components/property/__tests__/property-group.spec.tsx @@ -33,6 +33,7 @@ describe("PropertyGroup component", () => { const heading = screen.getByRole("heading"); const section = screen.getByTestId("property-group-section"); + expect(screen.queryByTestId("collapse-icon")).toBeTruthy(); expect(heading.tabIndex).toBe(0); expect(section.id).toBeDefined(); expect(heading.getAttribute("aria-controls")).toBe(section.id); @@ -56,4 +57,28 @@ describe("PropertyGroup component", () => { expect(heading.getAttribute("aria-expanded")).toBe("false"); expect(section.style.display).toBe("none"); }); + + test('Should not be able to expand/collapse if "disableCollapse" is true', async () => { + await render( + + + + ); + + expect(screen.queryByTestId("collapse-icon")).toBeNull(); + + const heading = screen.getByRole("heading"); + const section = screen.getByTestId("property-group-section"); + + expect(heading.tabIndex).toBe(0); + expect(section.id).toBeDefined(); + expect(heading.getAttribute("aria-controls")).toBe(section.id); + + expect(heading.getAttribute("aria-expanded")).toBe("true"); + expect(section.style.display).toBeFalsy(); + + fireEvent.click(heading); + expect(heading.getAttribute("aria-expanded")).toBe("true"); + expect(section.style.display).toBeFalsy(); + }); }); diff --git a/packages/bonito-ui/src/components/property/__tests__/text-property.spec.tsx b/packages/bonito-ui/src/components/property/__tests__/text-property.spec.tsx new file mode 100644 index 000000000..f363912d0 --- /dev/null +++ b/packages/bonito-ui/src/components/property/__tests__/text-property.spec.tsx @@ -0,0 +1,33 @@ +import * as React from "react"; + +import { TextProperty } from "../text-property"; +import { initMockBrowserEnvironment } from "../../../environment"; +import { runAxe } from "../../../test-util/a11y"; +import { render, screen } from "@testing-library/react"; + +describe("TextProperty component", () => { + beforeEach(() => initMockBrowserEnvironment()); + + test("Single line", async () => { + const { container } = render( + + ); + expect(screen.getByTestId("text-property-span").textContent).toEqual( + "blue" + ); + expect(await runAxe(container)).toHaveNoViolations(); + }); + + test("Multiline", async () => { + const { container } = render( + + ); + expect(screen.getByTestId("text-property-textfield")).toBeTruthy(); + expect(await runAxe(container)).toHaveNoViolations(); + }); +}); diff --git a/packages/bonito-ui/src/components/property/date-property.tsx b/packages/bonito-ui/src/components/property/date-property.tsx index b38036cda..0830d3db9 100644 --- a/packages/bonito-ui/src/components/property/date-property.tsx +++ b/packages/bonito-ui/src/components/property/date-property.tsx @@ -5,6 +5,8 @@ import { PropertyField } from "./property-field"; export interface DatePropertyProps { label?: string; value?: Date; + hideCopyButton?: boolean; + labelStyle?: React.CSSProperties; } function getText(value?: Date): string { @@ -19,6 +21,8 @@ export const DateProperty: React.FC = (props) => { { return ; diff --git a/packages/bonito-ui/src/components/property/property-field.tsx b/packages/bonito-ui/src/components/property/property-field.tsx index 690a5a278..decdad6d0 100644 --- a/packages/bonito-ui/src/components/property/property-field.tsx +++ b/packages/bonito-ui/src/components/property/property-field.tsx @@ -6,6 +6,8 @@ import { copyToClipboard } from "@azure/bonito-core"; export interface PropertyFieldProps { label?: string; value?: T; + hideCopyButton?: boolean; + labelStyle?: React.CSSProperties; getText?: (value?: T) => string; renderLabel?: (label?: string) => React.ReactNode; renderValue?: (value?: T) => React.ReactNode; @@ -67,7 +69,7 @@ export function PropertyField(props: PropertyFieldProps): JSX.Element { style={{ display: "flex", maxWidth: "1200px", - minWidth: "600px", + minWidth: "500px", }} onMouseOver={mouseOverHandler} onMouseOut={mouseOutHandler} @@ -76,10 +78,11 @@ export function PropertyField(props: PropertyFieldProps): JSX.Element { data-testid="label" className="property-label" style={{ - flexBasis: "160px", + flexBasis: "180px", flexShrink: 0, height: "24px", lineHeight: "24px", + ...props.labelStyle, }} > {props.renderLabel && props.renderLabel(props.label)} @@ -93,18 +96,18 @@ export function PropertyField(props: PropertyFieldProps): JSX.Element { >
- {renderValue(props.value)} - +
(props: PropertyFieldProps): JSX.Element { visibility: "hidden", }} > - + {props.hideCopyButton || ( + + )}
diff --git a/packages/bonito-ui/src/components/property/property-group.tsx b/packages/bonito-ui/src/components/property/property-group.tsx index f2b11daad..125bd1bd3 100644 --- a/packages/bonito-ui/src/components/property/property-group.tsx +++ b/packages/bonito-ui/src/components/property/property-group.tsx @@ -7,6 +7,9 @@ import { useAppTheme } from "../../theme"; export interface PropertyGroupProps { title?: string; collapsed?: boolean; + disableCollapse?: boolean; + titleStyle?: React.CSSProperties; + containerStyle?: React.CSSProperties; } /** @@ -15,6 +18,8 @@ export interface PropertyGroupProps { export const PropertyGroup: React.FC = (props) => { const theme = useAppTheme(); + const { disableCollapse = false, titleStyle, containerStyle } = props; + const [collapsed, setCollapsed] = React.useState( props.collapsed ?? false ); @@ -23,6 +28,9 @@ export const PropertyGroup: React.FC = (props) => { event: React.MouseEvent | React.KeyboardEvent ) => void = React.useCallback( (event) => { + if (disableCollapse) { + return; + } let shouldToggle = false; const nativeEvent = event.nativeEvent; @@ -39,30 +47,37 @@ export const PropertyGroup: React.FC = (props) => { setCollapsed(!collapsed); } }, - [setCollapsed, collapsed] + [setCollapsed, collapsed, disableCollapse] ); const sectionId = uniqueElementId("property-group-section"); const titleEl = props.title ? (

- + {!disableCollapse && ( + + )} {props.title}

) : undefined; return ( - <> +
{titleEl} = (props) => { style={{ display: collapsed ? "none" : undefined, }} - tokens={{ childrenGap: 8 }} + tokens={{ childrenGap: 10 }} > {props.children} - +
); }; diff --git a/packages/bonito-ui/src/components/property/text-property.tsx b/packages/bonito-ui/src/components/property/text-property.tsx index 3d3374692..d8a81b588 100644 --- a/packages/bonito-ui/src/components/property/text-property.tsx +++ b/packages/bonito-ui/src/components/property/text-property.tsx @@ -1,9 +1,14 @@ import * as React from "react"; import { PropertyField } from "./property-field"; +import { TextField } from "@fluentui/react/lib/TextField"; export interface TextPropertyProps { label?: string; value?: string; + multiline?: boolean; + multilineMaxHeight?: number; + hideCopyButton?: boolean; + labelStyle?: React.CSSProperties; } function getText(value?: string): string { @@ -18,12 +23,36 @@ export const TextProperty: React.FC = (props) => { { return ; }} renderValue={(value) => { const text = getText(value); - return {text !== "" ? text : "-"}; + if (props.multiline) { + return ( + + ); + } + return ( + + {text !== "" ? text : "-"} + + ); }} /> ); diff --git a/packages/bonito-ui/src/test-util/index.ts b/packages/bonito-ui/src/test-util/index.ts index 89db8c697..3a5a34592 100644 --- a/packages/bonito-ui/src/test-util/index.ts +++ b/packages/bonito-ui/src/test-util/index.ts @@ -1 +1,2 @@ export * from "./a11y"; +export * from "./jsdom-mocks"; diff --git a/packages/bonito-ui/src/test-util/jsdom-mocks.ts b/packages/bonito-ui/src/test-util/jsdom-mocks.ts new file mode 100644 index 000000000..2f7c97fca --- /dev/null +++ b/packages/bonito-ui/src/test-util/jsdom-mocks.ts @@ -0,0 +1,27 @@ +/* eslint-disable @typescript-eslint/no-empty-function */ + +import { mockNodeTestMissingAPIs } from "@azure/bonito-core/lib/test-util/test-mocks"; + +// some JSDOM APIs are not implemented, so we need to mock them +// to make UI tests work with JSDOM +export function mockJsdomMissingAPIs() { + // make importing monaco-editor works + // https://jestjs.io/docs/manual-mocks#mocking-methods-which-are-not-implemented-in-jsdom + Object.defineProperty(globalThis, "matchMedia", { + writable: true, + value: (query: string) => ({ + matches: false, + media: query, + onchange: null, + addListener: () => {}, // deprecated + removeListener: () => {}, // deprecated + addEventListener: () => {}, + removeEventListener: () => {}, + dispatchEvent: () => {}, + }), + }); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + globalThis.HTMLCanvasElement.prototype.getContext = () => ({}) as any; + + mockNodeTestMissingAPIs(); +} diff --git a/packages/playground/config/tsconfig.test.json b/packages/playground/config/tsconfig.test.json new file mode 100644 index 000000000..9f6956996 --- /dev/null +++ b/packages/playground/config/tsconfig.test.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.common.json", + "compilerOptions": { + "tsBuildInfoFile": "../build/cache/ts.test.buildinfo", + "allowJs": true + }, + "include": ["../**/__mocks__/**/*", "../**/__tests__/**/*"] +} diff --git a/packages/playground/jest.config.js b/packages/playground/jest.config.js index b59fd2763..c9919c940 100644 --- a/packages/playground/jest.config.js +++ b/packages/playground/jest.config.js @@ -2,7 +2,6 @@ /* eslint-disable @typescript-eslint/no-var-requires */ module.exports = require("@batch/common-config/jest-common").createConfig( "ui-playground", - require("./tsconfig"), { testEnvironment: "jsdom", setupFilesAfterEnv: ["/src/__tests__/setup-tests.tsx"], diff --git a/packages/playground/src/__tests__/setup-tests.tsx b/packages/playground/src/__tests__/setup-tests.tsx index 8365f511b..f0550dfe7 100644 --- a/packages/playground/src/__tests__/setup-tests.tsx +++ b/packages/playground/src/__tests__/setup-tests.tsx @@ -1,8 +1,12 @@ import { destroyEnvironment } from "@azure/bonito-core"; -import { initializeAxe } from "@azure/bonito-ui/lib/test-util/a11y"; +import { + initializeAxe, + mockJsdomMissingAPIs, +} from "@azure/bonito-ui/lib/test-util"; beforeAll(async () => { await initializeAxe(); + mockJsdomMissingAPIs(); }); afterEach(() => { @@ -14,12 +18,5 @@ afterAll(() => { jest.restoreAllMocks(); }); -// KLUDGE: Mock out the monaco API so that imports to MonacoEditor do not error. -// Note that the editor itself currently does not work in a Node.js -// environment regardless -jest.mock("monaco-editor/esm/vs/editor/editor.api", () => { - return {}; -}); - // UI tests can be slow, especially with a11y tests enabled jest.setTimeout(30000); diff --git a/packages/playground/src/demo-routes.tsx b/packages/playground/src/demo-routes.tsx index 542e91caa..a32d47ae9 100644 --- a/packages/playground/src/demo-routes.tsx +++ b/packages/playground/src/demo-routes.tsx @@ -12,6 +12,7 @@ import { NotificationDemo } from "./demo/form/notification-demo"; import { DataGridLoadMoreDemo } from "./demo/display/task-grid/task-data-grid"; import { TabSelectorDemo } from "./demo/form/tab-selector-demo"; import { StringListDemo } from "./demo/form/stringlist/stringlist-demo"; +import { VmExtensionListDemo } from "./demo/display/vm-extension/vm-extension-list-demo"; export const DEMO_MAP = { default: () => , @@ -28,6 +29,7 @@ export const DEMO_MAP = { certificatedisplay: () => , dataGridLoadMore: () => , stringlist: () => , + vmExtensionList: () => , }; export type DemoName = keyof typeof DEMO_MAP; diff --git a/packages/playground/src/demo/display/vm-extension/vm-extension-list-demo.tsx b/packages/playground/src/demo/display/vm-extension/vm-extension-list-demo.tsx new file mode 100644 index 000000000..1d5be1878 --- /dev/null +++ b/packages/playground/src/demo/display/vm-extension/vm-extension-list-demo.tsx @@ -0,0 +1,32 @@ +import React from "react"; +import { + VmExtensionList, + VmExtItem, +} from "@batch/ui-react/lib/vm-extension/vm-extension-list"; +import { DemoPane } from "../../../layout/demo-pane"; +import { VmExtensionDetailsPanel } from "@batch/ui-react"; +import { allExtItems } from "@batch/ui-react/lib/test-util/mock-vm-ext-items"; + +export const VmExtensionListDemo: React.FC = () => { + const [panelOpen, setPanelOpen] = React.useState(false); + const [selectedExtension, setSelectedExtension] = + React.useState(); + + return ( + + { + setSelectedExtension(item); + setPanelOpen(true); + }} + /> + setPanelOpen(false)} + /> + + ); +}; diff --git a/packages/playground/src/layout/demo-nav-menu.tsx b/packages/playground/src/layout/demo-nav-menu.tsx index 2dd8020da..41b4f5ebd 100644 --- a/packages/playground/src/layout/demo-nav-menu.tsx +++ b/packages/playground/src/layout/demo-nav-menu.tsx @@ -85,6 +85,11 @@ export const DemoNavMenu: React.FC = () => { name: "Data Grid: Load More", url: getDemoHash("dataGridLoadMore"), }, + { + key: "VMExtensionList", + name: "VMExtension List Display", + url: getDemoHash("vmExtensionList"), + }, ], }, ]; diff --git a/packages/react/config/tsconfig.test.json b/packages/react/config/tsconfig.test.json new file mode 100644 index 000000000..9f6956996 --- /dev/null +++ b/packages/react/config/tsconfig.test.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.common.json", + "compilerOptions": { + "tsBuildInfoFile": "../build/cache/ts.test.buildinfo", + "allowJs": true + }, + "include": ["../**/__mocks__/**/*", "../**/__tests__/**/*"] +} diff --git a/packages/react/i18n/resources.resjson b/packages/react/i18n/resources.resjson index 45d0f314a..07346a54f 100644 --- a/packages/react/i18n/resources.resjson +++ b/packages/react/i18n/resources.resjson @@ -1,7 +1,32 @@ { "lib.react.account.parameter.name.label": "Account name", + "lib.react.common.close": "Close", + "lib.react.common.disabled": "Disabled", + "lib.react.common.enabled": "Enabled", + "lib.react.common.general": "General", + "lib.react.common.message": "Message", + "lib.react.common.name": "Name", + "lib.react.common.no": "No", + "lib.react.common.search": "Search", + "lib.react.common.time": "Time", + "lib.react.common.yes": "Yes", "lib.react.pool.infoBox.nodeCommsModeDiffers.message": "If the target node communication mode differs from the current mode, Batch will attempt to update the mode the next time the pool is resized down to zero compute nodes and back up.", "lib.react.pool.notFound": "No pool found", "lib.react.pool.parameter.currentNodeCommunicationMode.label": "Current node communication mode", - "lib.react.pool.parameter.targetNodeCommunicationMode.label": "Target node communication mode" + "lib.react.pool.parameter.targetNodeCommunicationMode.label": "Target node communication mode", + "lib.react.vmExtension.autoUpdate": "Automatic upgrade", + "lib.react.vmExtension.detailedStatus": "Detailed status", + "lib.react.vmExtension.extensionProperties": "Extension properties", + "lib.react.vmExtension.latestStatus": "Latest status", + "lib.react.vmExtension.level": "Level", + "lib.react.vmExtension.name": "Name", + "lib.react.vmExtension.noResult": "No VM extensions found", + "lib.react.vmExtension.provisioningState": "Provisioning state", + "lib.react.vmExtension.publisher": "Publisher", + "lib.react.vmExtension.search": "Search to filter extensions...", + "lib.react.vmExtension.settings": "Settings", + "lib.react.vmExtension.status": "Status", + "lib.react.vmExtension.type": "Type", + "lib.react.vmExtension.version": "Version", + "lib.react.vmExtension.viewDetailedStatus": "View detailed status" } \ No newline at end of file diff --git a/packages/react/jest.config.js b/packages/react/jest.config.js index 3d4771e3e..261ad0fdf 100644 --- a/packages/react/jest.config.js +++ b/packages/react/jest.config.js @@ -2,7 +2,6 @@ /* eslint-disable @typescript-eslint/no-var-requires */ module.exports = require("@batch/common-config/jest-common").createConfig( "ui-react", - require("./tsconfig"), { testEnvironment: "jsdom", setupFilesAfterEnv: ["/src/__tests__/setup-tests.ts"], diff --git a/packages/react/src/__tests__/setup-tests.ts b/packages/react/src/__tests__/setup-tests.ts index 220c27a4a..b165d9776 100644 --- a/packages/react/src/__tests__/setup-tests.ts +++ b/packages/react/src/__tests__/setup-tests.ts @@ -1,8 +1,12 @@ import { destroyEnvironment } from "@azure/bonito-core"; -import { initializeAxe } from "@azure/bonito-ui/lib/test-util"; +import { + initializeAxe, + mockJsdomMissingAPIs, +} from "@azure/bonito-ui/lib/test-util"; beforeAll(async () => { await initializeAxe(); + mockJsdomMissingAPIs(); }); afterEach(() => { diff --git a/packages/react/src/common.i18n.yml b/packages/react/src/common.i18n.yml new file mode 100644 index 000000000..653ffe18d --- /dev/null +++ b/packages/react/src/common.i18n.yml @@ -0,0 +1,11 @@ +common: + yes: Yes + no: No + name: Name + time: Time + message: Message + general: General + search: Search + close: Close + enabled: Enabled + disabled: Disabled diff --git a/packages/react/src/index.ts b/packages/react/src/index.ts index e4a025edc..4f6b8b2ff 100644 --- a/packages/react/src/index.ts +++ b/packages/react/src/index.ts @@ -2,3 +2,4 @@ export * from "./account"; export * from "./environment"; export * from "./form"; export * from "./pool"; +export * from "./vm-extension"; diff --git a/packages/react/src/test-util/mock-vm-ext-items.ts b/packages/react/src/test-util/mock-vm-ext-items.ts new file mode 100644 index 000000000..47bf79d28 --- /dev/null +++ b/packages/react/src/test-util/mock-vm-ext-items.ts @@ -0,0 +1,92 @@ +import { VmExtItem } from "../vm-extension/vm-extension-list"; + +export const succeededExtItem: VmExtItem = { + name: "SuccessExtension", + publisher: "Microsoft.Azure.Geneva", + type: "GenevaMonitoring", + typeHandlerVersion: "2.0", + autoUpgradeMinorVersion: true, + enableAutomaticUpgrade: true, + settings: { + applicationId: "settings1", + version: "3.3.3", + version1: "3.3.4", + version2: "3.3.5", + version3: "3.3.6", + }, + provisioningState: "Succeeded", + instanceView: { + name: "SuccessExtension", + statuses: [ + { + code: "ProvisioningState/succeeded", + level: "Info", + displayStatus: "Provisioning succeeded", + message: "Provisioning succeeded", + time: "2021-06-15T21:59:14.0000000Z", + }, + ], + }, +}; + +export const failedExtItem: VmExtItem = { + name: "FailedExtension", + publisher: "Microsoft.Azure.KeyVault", + type: "KeyVaultForLinux", + typeHandlerVersion: "2.0", + autoUpgradeMinorVersion: true, + enableAutomaticUpgrade: true, + settings: { + secretsManagementSettingsKey: "secretsManagementSettingsValue", + authenticationSettingsKey: "authenticationSettingsValue", + }, + provisionAfterExtensions: ["CustomExtension100"], + provisioningState: "Failed", + instanceView: { + name: "FailedExtension", + statuses: [ + { + code: "ProvisioningState/failed", + level: "Error", + displayStatus: "Provisioning failed", + message: "Provisioning failed", + time: "2021-06-15T21:59:14.0000000Z", + }, + ], + subStatuses: [ + { + code: "ProvisioningState/failed", + level: "Error", + displayStatus: "Provisioning failed", + message: "Provisioning failed", + time: "2021-06-15T21:59:14.0000000Z", + }, + { + code: "ProvisioningState/failed", + level: "Error", + displayStatus: "Provisioning failed", + message: "Provisioning failed", + time: "2021-06-15T21:59:14.0000000Z", + }, + ], + }, +}; +export const noProvisioningStateExtItem: VmExtItem = { + name: "batchextension2", + publisher: "Microsoft.Azure.KeyVault", + type: "KeyVaultForLinux", + typeHandlerVersion: "2.0", + autoUpgradeMinorVersion: true, + enableAutomaticUpgrade: false, + settings: {}, + provisionAfterExtensions: ["CustomExtension100"], + instanceView: { + name: "batchextension1", + }, +}; + +export const allExtItems: VmExtItem[] = [ + succeededExtItem, + failedExtItem, + noProvisioningStateExtItem, +]; diff --git a/packages/react/src/vm-extension/__tests__/node-vm-ext-list.spec.tsx b/packages/react/src/vm-extension/__tests__/node-vm-ext-list.spec.tsx new file mode 100644 index 000000000..fadc50270 --- /dev/null +++ b/packages/react/src/vm-extension/__tests__/node-vm-ext-list.spec.tsx @@ -0,0 +1,42 @@ +import { render, waitFor } from "@testing-library/react"; +import React from "react"; +import { translate } from "@azure/bonito-core"; +import { initMockBatchBrowserEnvironment } from "../../environment"; +import { NodeVMExtList } from "../node-vm-ext-list"; +import { dataGridIgnoredA11yRules } from "@azure/bonito-ui/lib/components/data-grid/test-ignore-a11y-rules"; +import { runAxe } from "@azure/bonito-ui/lib/test-util/a11y"; + +describe("NodeVMExtList", () => { + beforeEach(() => { + initMockBatchBrowserEnvironment(); + }); + + it("should render vm extension lists", async () => { + const { getByText, container } = render( + + ); + getByText(translate("lib.react.vmExtension.name")); + await waitFor(() => getByText("CustomExtension100")); + expect( + await runAxe(container, dataGridIgnoredA11yRules) + ).toHaveNoViolations(); + }); + + it("should render vm extension lists with no result", async () => { + const { getByText } = render( + + ); + getByText(translate("lib.react.vmExtension.name")); + await waitFor(() => + getByText(translate("lib.react.vmExtension.noResult")) + ); + }); +}); diff --git a/packages/react/src/vm-extension/__tests__/pool-vm-ext-list.spec.tsx b/packages/react/src/vm-extension/__tests__/pool-vm-ext-list.spec.tsx new file mode 100644 index 000000000..8122810d8 --- /dev/null +++ b/packages/react/src/vm-extension/__tests__/pool-vm-ext-list.spec.tsx @@ -0,0 +1,40 @@ +import { PoolVMExtList } from "../pool-vm-ext-list"; + +import { render, waitFor } from "@testing-library/react"; +import React from "react"; +import { translate } from "@azure/bonito-core"; +import { initMockBatchBrowserEnvironment } from "../../environment"; +import { dataGridIgnoredA11yRules } from "@azure/bonito-ui/lib/components/data-grid/test-ignore-a11y-rules"; +import { runAxe } from "@azure/bonito-ui/lib/test-util/a11y"; + +const poolArmIdWithExt = + "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/supercomputing/providers/microsoft.batch/batchaccounts/hobo/pools/hobopool1"; + +describe("PoolVMExtList", () => { + beforeEach(() => { + initMockBatchBrowserEnvironment(); + }); + + it("should render vm extension lists", async () => { + const { getByText, container } = render( + + ); + getByText(translate("lib.react.vmExtension.name")); + await waitFor(() => getByText("batchextension1")); + expect( + await runAxe(container, dataGridIgnoredA11yRules) + ).toHaveNoViolations(); + }); + + it("should render vm extension lists with no result", async () => { + const { getByText } = render( + + ); + getByText(translate("lib.react.vmExtension.name")); + await waitFor(() => + getByText(translate("lib.react.vmExtension.noResult")) + ); + }); +}); diff --git a/packages/react/src/vm-extension/__tests__/vm-extension-details-panel.spec.tsx b/packages/react/src/vm-extension/__tests__/vm-extension-details-panel.spec.tsx new file mode 100644 index 000000000..0add0bea8 --- /dev/null +++ b/packages/react/src/vm-extension/__tests__/vm-extension-details-panel.spec.tsx @@ -0,0 +1,52 @@ +import { render } from "@testing-library/react"; +import { VmExtensionDetailsPanel } from "../vm-extension-details-panel"; +import { succeededExtItem } from "../../test-util/mock-vm-ext-items"; +import * as React from "react"; +import { initMockBrowserEnvironment } from "@azure/bonito-ui"; +import { runAxe } from "@azure/bonito-ui/lib/test-util/a11y"; +import { translate } from "@azure/bonito-core"; + +describe("VmExtensionDetailsPanel", () => { + beforeEach(() => initMockBrowserEnvironment()); + + it("should render if isOpen", async () => { + const onDismiss = jest.fn(); + const { container, getByText } = render( + + ); + getByText(translate("lib.react.vmExtension.extensionProperties")); + expect(await runAxe(container)).toHaveNoViolations(); + }); + + it("should not render if not isOpen", async () => { + const onDismiss = jest.fn(); + const { getByText } = render( + + ); + expect(() => + getByText(translate("lib.react.vmExtension.extensionProperties")) + ).toThrow(); + }); + + it("should not render if vme is undefined", async () => { + const onDismiss = jest.fn(); + const { getByText } = render( + + ); + expect(() => + getByText(translate("lib.react.vmExtension.extensionProperties")) + ).toThrow(); + }); +}); diff --git a/packages/react/src/vm-extension/__tests__/vm-extension-details.spec.tsx b/packages/react/src/vm-extension/__tests__/vm-extension-details.spec.tsx new file mode 100644 index 000000000..f224dab83 --- /dev/null +++ b/packages/react/src/vm-extension/__tests__/vm-extension-details.spec.tsx @@ -0,0 +1,62 @@ +import { render } from "@testing-library/react"; +import { + failedExtItem, + succeededExtItem, +} from "../../test-util/mock-vm-ext-items"; +import * as React from "react"; +import { initMockBrowserEnvironment } from "@azure/bonito-ui"; +import { runAxe } from "@azure/bonito-ui/lib/test-util/a11y"; +import { translate } from "@azure/bonito-core"; +import { VmExtensionDetails } from "../vm-extension-details"; + +describe("VmExtensionDetails", () => { + beforeEach(() => initMockBrowserEnvironment()); + + it("should render with the required properties", async () => { + const { container, getByText } = render( + + ); + getByText(translate("lib.react.vmExtension.name")); + getByText(succeededExtItem.name); + getByText(translate("lib.react.vmExtension.type")); + getByText(translate("lib.react.vmExtension.version")); + getByText(translate("lib.react.vmExtension.publisher")); + getByText(translate("lib.react.vmExtension.autoUpdate")); + expect(await runAxe(container)).toHaveNoViolations(); + }); + + it("should render status if available", async () => { + const { getAllByText } = render( + + ); + expect( + getAllByText(translate("lib.react.vmExtension.status")) + ).toHaveLength(2); + getAllByText("Provisioning succeeded"); + }); + + it("should detailed status if subStatus avaliable", async () => { + const { getByText } = render( + + ); + expect( + getByText(translate("lib.react.vmExtension.detailedStatus")) + ).toBeTruthy(); + }); + + it("should not render detailed status if subStatus not avaliable", async () => { + const { getByText } = render( + + ); + expect(() => + getByText(translate("lib.react.vmExtension.detailedStatus")) + ).toThrow(); + }); + + it("should render settings if available", async () => { + const { getByText } = render( + + ); + getByText(translate("lib.react.vmExtension.settings")); + }); +}); diff --git a/packages/react/src/vm-extension/__tests__/vm-extension-list.spec.tsx b/packages/react/src/vm-extension/__tests__/vm-extension-list.spec.tsx new file mode 100644 index 000000000..0e98984f9 --- /dev/null +++ b/packages/react/src/vm-extension/__tests__/vm-extension-list.spec.tsx @@ -0,0 +1,88 @@ +import { render } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { VmExtensionList } from "../vm-extension-list"; +import { + allExtItems, + failedExtItem, + noProvisioningStateExtItem, + succeededExtItem, +} from "../../test-util/mock-vm-ext-items"; +import * as React from "react"; +import { initMockBrowserEnvironment } from "@azure/bonito-ui"; +import { runAxe } from "@azure/bonito-ui/lib/test-util/a11y"; +import { translate } from "@azure/bonito-core"; +import { dataGridIgnoredA11yRules } from "@azure/bonito-ui/lib/components/data-grid/test-ignore-a11y-rules"; + +describe("VmExtensionList", () => { + const user = userEvent.setup(); + beforeEach(() => initMockBrowserEnvironment()); + + it("renders search box and table", async () => { + const { container, getByRole, getByText } = render( + + ); + getByRole("searchbox"); + getByRole("grid"); + getByText(translate("lib.react.vmExtension.name")); + getByText(translate("lib.react.vmExtension.type")); + getByText(translate("lib.react.vmExtension.version")); + getByText(translate("lib.react.vmExtension.autoUpdate")); + expect( + await runAxe(container, dataGridIgnoredA11yRules) + ).toHaveNoViolations(); + }); + + it("should filter extensions", async () => { + const { getByRole, getByText } = render( + + ); + + const searchBox = getByRole("searchbox"); + + getByText("SuccessExtension"); + expect(() => + getByText(translate("lib.react.vmExtension.noResult")) + ).toThrow(); + + await user.type(searchBox, "fail"); + + expect(() => getByText("SuccessExtension")).toThrow(); + getByText(translate("lib.react.vmExtension.noResult")); + }); + + it("should display state if available", async () => { + const { getByText } = render( + + ); + getByText(translate("lib.react.vmExtension.provisioningState")); + + getByText("FailedExtension"); + getByText("Failed"); + }); + + it("should not display state if not available", async () => { + const { getByText } = render( + + ); + expect(() => + getByText(translate("lib.react.vmExtension.provisioningState")) + ).toThrow(); + }); + + it("should fire onItemClick", async () => { + const mockOnItemClick = jest.fn(); + const { getByText } = render( + + ); + const link = getByText("SuccessExtension"); + await user.click(link); + expect(mockOnItemClick).toBeCalledWith(succeededExtItem); + }); +}); diff --git a/packages/react/src/vm-extension/index.ts b/packages/react/src/vm-extension/index.ts new file mode 100644 index 000000000..a1abf7920 --- /dev/null +++ b/packages/react/src/vm-extension/index.ts @@ -0,0 +1,5 @@ +export * from "./vm-extension-list"; +export * from "./node-vm-ext-list"; +export * from "./pool-vm-ext-list"; +export * from "./vm-extension-details"; +export * from "./vm-extension-details-panel"; diff --git a/packages/react/src/vm-extension/node-vm-ext-list.tsx b/packages/react/src/vm-extension/node-vm-ext-list.tsx new file mode 100644 index 000000000..c4acbcd6b --- /dev/null +++ b/packages/react/src/vm-extension/node-vm-ext-list.tsx @@ -0,0 +1,64 @@ +import { inject } from "@azure/bonito-core/lib/environment"; +import { NodeService } from "@batch/ui-service"; +import { BatchDependencyName } from "@batch/ui-service/lib/environment"; +import React from "react"; +import { VmExtensionList, VmExtItem } from "./vm-extension-list"; + +interface NodeVmExtensionListProps { + accountEndpoint: string; + poolId: string; + nodeId: string; + onItemClick?: (item: VmExtItem) => void; +} + +export const NodeVMExtList = (props: NodeVmExtensionListProps) => { + const { accountEndpoint, poolId, nodeId, onItemClick } = props; + + const [extensions, setExtensions] = React.useState([]); + const [loading, setLoading] = React.useState(true); + + const nodeService: NodeService = React.useMemo(() => { + return inject(BatchDependencyName.NodeService); + }, []); + + React.useEffect(() => { + let isMounted = true; + setLoading(true); + nodeService + .listBatchNodeExtensions(accountEndpoint, poolId, nodeId) + .then((resList) => { + if (!isMounted) { + return; + } + const exts = []; + if (resList) { + for (const ext of resList) { + ext.vmExtension && + exts.push({ + ...ext.vmExtension, + provisioningState: ext.provisioningState, + instanceView: ext.instanceView, + }); + } + } + setExtensions(exts); + }) + .finally(() => { + if (!isMounted) { + return; + } + setLoading(false); + }); + return () => { + isMounted = false; + }; + }, [accountEndpoint, nodeId, nodeService, poolId]); + + return ( + + ); +}; diff --git a/packages/react/src/vm-extension/pool-vm-ext-list.tsx b/packages/react/src/vm-extension/pool-vm-ext-list.tsx new file mode 100644 index 000000000..2bf28983f --- /dev/null +++ b/packages/react/src/vm-extension/pool-vm-ext-list.tsx @@ -0,0 +1,54 @@ +import { inject } from "@azure/bonito-core/lib/environment"; +import { PoolService } from "@batch/ui-service"; +import { BatchDependencyName } from "@batch/ui-service/lib/environment"; +import React from "react"; +import { VmExtensionList, VmExtItem } from "./vm-extension-list"; + +interface PoolVmExtensionListProps { + poolArmId: string; + onItemClick?: (item: VmExtItem) => void; +} + +export const PoolVMExtList = (props: PoolVmExtensionListProps) => { + const { poolArmId, onItemClick } = props; + + const [extensions, setExtensions] = React.useState([]); + const [loading, setLoading] = React.useState(true); + + const poolService: PoolService = React.useMemo(() => { + return inject(BatchDependencyName.PoolService); + }, []); + + React.useEffect(() => { + let isMounted = true; + setLoading(true); + poolService + .get(poolArmId) + .then((pool) => { + if (!isMounted) { + return; + } + const extensions = + pool?.properties?.deploymentConfiguration + ?.virtualMachineConfiguration?.extensions ?? []; + setExtensions(extensions as VmExtItem[]); + }) + .finally(() => { + if (!isMounted) { + return; + } + setLoading(false); + }); + return () => { + isMounted = false; + }; + }, [poolArmId, poolService]); + + return ( + + ); +}; diff --git a/packages/react/src/vm-extension/vm-extension-details-panel.tsx b/packages/react/src/vm-extension/vm-extension-details-panel.tsx new file mode 100644 index 000000000..60bbe007d --- /dev/null +++ b/packages/react/src/vm-extension/vm-extension-details-panel.tsx @@ -0,0 +1,41 @@ +import React from "react"; +import { Panel } from "@azure/bonito-ui/lib/components/panel"; +import { VmExtItem } from "./vm-extension-list"; +import { VmExtensionDetails } from "./vm-extension-details"; +import { translate } from "@azure/bonito-core"; +interface VmExtensionDetailsPanelProps { + vme?: VmExtItem; + isOpen: boolean; + onDismiss: () => void; +} + +export const VmExtensionDetailsPanel = ( + props: VmExtensionDetailsPanelProps +) => { + const { vme, isOpen, onDismiss } = props; + + const shouldOpen = React.useMemo(() => { + return Boolean(isOpen && vme); + }, [isOpen, vme]); + + return ( + <> + + + + + ); +}; diff --git a/packages/react/src/vm-extension/vm-extension-details.tsx b/packages/react/src/vm-extension/vm-extension-details.tsx new file mode 100644 index 000000000..fc3ef3bd5 --- /dev/null +++ b/packages/react/src/vm-extension/vm-extension-details.tsx @@ -0,0 +1,158 @@ +import React from "react"; +import { TextField } from "@fluentui/react/lib/TextField"; +import { + PropertyList, + PropertyGroup, + TextProperty, + DateProperty, +} from "@azure/bonito-ui/lib/components"; +import { VmExtItem } from "./vm-extension-list"; +import { translate } from "@azure/bonito-core"; +import { useAppTheme } from "@azure/bonito-ui/lib/theme"; +export interface VmExtensionDetailsProps { + vme?: VmExtItem; +} + +export const VmExtensionDetails = (props: VmExtensionDetailsProps) => { + const theme = useAppTheme(); + const { vme } = props; + + const firstStatus = React.useMemo(() => getfirstStatus(vme), [vme]); + const subStatues = vme?.instanceView?.subStatuses; + const titleStyle = React.useMemo(() => { + return { + color: theme.palette.black, + fontSize: "14px", + fontWeight: "600", + marginTop: "0px", + }; + }, [theme.palette.black]); + + const groupStyle = React.useMemo(() => { + return { + paddingBottom: "20px", + }; + }, []); + + if (!vme) { + return null; + } + // TODO: remove hideCopyButton when this is fixed: + // https://msazure.visualstudio.com/One/_workitems/edit/25071199 + return ( + + + + + + + + + {firstStatus && ( + + + + + + {subStatues && subStatues.length > 0 && ( + + )} + + )} + {vme.settings && ( + + + + )} + + ); +}; + +export function getEnableAutomaticUpgradeValue(item: VmExtItem) { + if (item.enableAutomaticUpgrade === undefined) { + return "N/A"; + } + return item.enableAutomaticUpgrade + ? translate("lib.react.common.enabled") + : translate("lib.react.common.disabled"); +} + +export function getfirstStatus(vme?: VmExtItem) { + if (!vme?.instanceView) { + return null; + } + const firstStatus = vme.instanceView.statuses?.[0]; + if (!firstStatus) { + return null; + } + return { + ...firstStatus, + time: firstStatus.time ? new Date(firstStatus.time) : undefined, + }; +} diff --git a/packages/react/src/vm-extension/vm-extension-list.tsx b/packages/react/src/vm-extension/vm-extension-list.tsx new file mode 100644 index 000000000..aecd4bfd7 --- /dev/null +++ b/packages/react/src/vm-extension/vm-extension-list.tsx @@ -0,0 +1,165 @@ +import * as React from "react"; +import { + VMExtensionOutput, + VMExtensionInstanceViewOutput, +} from "@batch/ui-service/lib/batch-models"; +import { + DataGrid, + DataGridColumn, +} from "@azure/bonito-ui/lib/components/data-grid"; +import { getEnableAutomaticUpgradeValue } from "./vm-extension-details"; +import { Link } from "@fluentui/react/lib/Link"; +import { translate } from "@azure/bonito-core"; +import { SearchBox } from "@fluentui/react/lib/SearchBox"; +import { Icon } from "@fluentui/react/lib/Icon"; +import { useAppTheme } from "@azure/bonito-ui/lib/theme"; + +export type VmExtItem = VMExtensionOutput & { + provisioningState?: string; + instanceView?: VMExtensionInstanceViewOutput; +}; + +interface VmExtensionListProps { + loading: boolean; + extensions: VmExtItem[]; + onItemClick?: (item: VmExtItem) => void; +} + +export const VmExtensionList = (props: VmExtensionListProps) => { + const { extensions, loading, onItemClick } = props; + const theme = useAppTheme(); + + const hasProvisioningState = React.useMemo(() => { + return extensions.some((ext) => { + return ext?.provisioningState !== undefined; + }); + }, [extensions]); + + const [filterValue, setFilterValue] = React.useState(""); + + const displayedExtensions = React.useMemo(() => { + if (!filterValue) { + return extensions; + } + const lowerFilter = filterValue.toLowerCase(); + return extensions.filter((ext) => { + return ( + ext.name.toLowerCase().includes(lowerFilter) || + ext.type.toLowerCase().includes(lowerFilter) || + ext.typeHandlerVersion?.toLowerCase().includes(lowerFilter) || + ext.provisioningState?.toLowerCase().includes(lowerFilter) + ); + }); + }, [extensions, filterValue]); + + const columns = React.useMemo(() => { + const cols: DataGridColumn[] = [ + { + label: translate("lib.react.vmExtension.name"), + prop: "name", + minWidth: 200, + onRender: (item) => { + return ( + { + onItemClick?.(item); + }} + > + {item.name} + + ); + }, + }, + { + label: translate("lib.react.vmExtension.type"), + prop: "type", + minWidth: 200, + }, + { + label: translate("lib.react.vmExtension.version"), + prop: "typeHandlerVersion", + }, + { + label: translate("lib.react.vmExtension.autoUpdate"), + prop: "enableAutomaticUpgrade", + minWidth: 160, + onRender: (item) => { + return getEnableAutomaticUpgradeValue(item); + }, + }, + ]; + if (hasProvisioningState) { + cols.splice(cols.findIndex((c) => c.prop === "type") + 1, 0, { + label: translate("lib.react.vmExtension.provisioningState"), + prop: "provisioningState", + minWidth: 200, + onRender: (item: VmExtItem) => { + const provisioningState = item.provisioningState; + + const shouldDisplayIcon = ["Succeeded", "Failed"].includes( + provisioningState || "" + ); + const iconName = + provisioningState === "Succeeded" + ? "SkypeCircleCheck" + : "StatusErrorFull"; + + const iconColor = + provisioningState === "Succeeded" + ? theme.semanticColors.successIcon + : theme.semanticColors.errorIcon; + return ( +
+ {shouldDisplayIcon && ( + + )} + {item.provisioningState} +
+ ); + }, + }); + } + return cols; + }, [ + hasProvisioningState, + onItemClick, + theme.semanticColors.errorIcon, + theme.semanticColors.successIcon, + ]); + + return ( + <> + { + setFilterValue(value || ""); + }} + placeholder={translate("lib.react.vmExtension.search")} + /> + + + ); +}; diff --git a/packages/react/src/vm-extension/vm-extension.i18n.yml b/packages/react/src/vm-extension/vm-extension.i18n.yml new file mode 100644 index 000000000..bc0c3b9b6 --- /dev/null +++ b/packages/react/src/vm-extension/vm-extension.i18n.yml @@ -0,0 +1,16 @@ +vmExtension: + noResult: No VM extensions found + name: Name + type: Type + version: Version + autoUpdate: Automatic upgrade + provisioningState: Provisioning state + publisher: Publisher + settings: Settings + latestStatus: Latest status + status: Status + detailedStatus: Detailed status + viewDetailedStatus: View detailed status + level: Level + extensionProperties: Extension properties + search: Search to filter extensions... diff --git a/packages/service/config/tsconfig.test.json b/packages/service/config/tsconfig.test.json new file mode 100644 index 000000000..9f6956996 --- /dev/null +++ b/packages/service/config/tsconfig.test.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.common.json", + "compilerOptions": { + "tsBuildInfoFile": "../build/cache/ts.test.buildinfo", + "allowJs": true + }, + "include": ["../**/__mocks__/**/*", "../**/__tests__/**/*"] +} diff --git a/packages/service/jest.config.js b/packages/service/jest.config.js index 6bd833630..a79ea5631 100644 --- a/packages/service/jest.config.js +++ b/packages/service/jest.config.js @@ -2,7 +2,6 @@ /* eslint-disable @typescript-eslint/no-var-requires */ module.exports = require("@batch/common-config/jest-common").createConfig( "ui-service", - require("./tsconfig.json"), { setupFilesAfterEnv: ["/src/__tests__/setup-tests.ts"], } diff --git a/packages/service/src/environment/environment-util.ts b/packages/service/src/environment/environment-util.ts index a15508fc0..2dc157201 100644 --- a/packages/service/src/environment/environment-util.ts +++ b/packages/service/src/environment/environment-util.ts @@ -6,6 +6,7 @@ import { mockDependencyFactories, mockEnvironmentConfig, } from "@azure/bonito-core/lib/environment"; +import { FakeNodeService } from "../node"; import { FakePoolService } from "../pool"; import { BatchDependencyFactories, @@ -14,6 +15,7 @@ import { export const mockBatchDepFactories: Partial = { [BatchDependencyName.PoolService]: () => new FakePoolService(), + [BatchDependencyName.NodeService]: () => new FakeNodeService(), }; /** diff --git a/util/bux/config/tsconfig.test.json b/util/bux/config/tsconfig.test.json new file mode 100644 index 000000000..9f6956996 --- /dev/null +++ b/util/bux/config/tsconfig.test.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.common.json", + "compilerOptions": { + "tsBuildInfoFile": "../build/cache/ts.test.buildinfo", + "allowJs": true + }, + "include": ["../**/__mocks__/**/*", "../**/__tests__/**/*"] +} diff --git a/util/bux/jest.config.js b/util/bux/jest.config.js index 12273f9d3..1bb4b3ae1 100644 --- a/util/bux/jest.config.js +++ b/util/bux/jest.config.js @@ -1,11 +1,7 @@ /* eslint-env node */ /* eslint-disable @typescript-eslint/no-var-requires */ -module.exports = require("../common-config/jest-common").createConfig( - "bux", - require("./tsconfig.json"), - { - testMatch: ["/__tests__/**/*.spec.ts"], - modulePathIgnorePatterns: ["/build/"], - moduleFileExtensions: ["js", "ts", "yml", "yaml", "json"], - } -); +module.exports = require("../common-config/jest-common").createConfig("bux", { + testMatch: ["/__tests__/**/*.spec.ts"], + modulePathIgnorePatterns: ["/build/"], + moduleFileExtensions: ["js", "ts", "yml", "yaml", "json"], +}); diff --git a/util/common-config/jest-common.js b/util/common-config/jest-common.js index 71dd1eef2..a83c5ec3e 100644 --- a/util/common-config/jest-common.js +++ b/util/common-config/jest-common.js @@ -24,13 +24,17 @@ module.exports = { * @param overrides Optional jest configuration options which will be * merged into the base config. */ - createConfig: (projectName, tsconfig, overrides) => { + createConfig: (projectName, overrides) => { if (!overrides) { overrides = {}; } const baseConfig = { - preset: "ts-jest", + // use "js-with-ts" preset to to transform some esm modules .js file to cjs + // for example, monaco-editor, which is a esm module, will be transformed to cjs + // so that jest can run it. + // https://stackoverflow.com/questions/61781271/jest-wont-transform-the-module-syntaxerror-cannot-use-import-statement-outsi + preset: "ts-jest/presets/js-with-ts", testEnvironment: "node", maxWorkers: "50%", testMatch: ["/src/**/__tests__/**/*.spec.(ts|tsx|js|jsx)"], @@ -41,6 +45,7 @@ module.exports = { ["cobertura", { file: "cobertura.xml" }], ], moduleDirectories: ["src", "node_modules"], + moduleNameMapper: {}, reporters: [ "default", [ @@ -55,6 +60,14 @@ module.exports = { ], ], globals: { + "ts-jest": { + // js-with-ts preset require "allowJs": true in tsconfig.json + // so making a "tsconfig.test.json" to override it + tsconfig: "config/tsconfig.test.json", + // This is needed to work with the js-with-ts preset and to make + // translation strings work in tests + isolatedModules: true, + }, __TEST_RESOURCE_STRINGS: combinedResourceStrings, }, transform: { @@ -65,27 +78,15 @@ module.exports = { // Squelch a warning with outputting ES6 modules (in tsconfig.json) ignoreCodes: [151001], }, - // Greatly speed up tests at the expense of type checking - isolatedModules: true, }, ], }, + // transform monaco-editor to cjs + transformIgnorePatterns: [ + "node_modules/(?!(monaco-editor)).+\\.js$", + ], }; - if ( - tsconfig && - tsconfig.compilerOptions && - tsconfig.compilerOptions.paths - ) { - // If we were given a tsconfig, use it to generate module mappings - baseConfig.moduleNameMapper = pathsToModuleNameMapper( - tsconfig.compilerOptions.paths, - { prefix: "/" } - ); - } else { - baseConfig.moduleNameMapper = {}; - } - // Force usage of the CommonJS versions since Jest // currently doesn't support ES modules @@ -105,8 +106,15 @@ module.exports = { baseConfig.moduleNameMapper["@batch/ui-service/lib/(.*)$"] = "@batch/ui-service/lib-cjs/$1"; + // needed for importing monaco-editor which imports css files + baseConfig.moduleNameMapper["^.+\\.css$"] = path.join( + __dirname, + "./mock-style.js" + ); + return Object.assign({}, baseConfig, overrides); }, + getCombinedResourceStrings: getCombinedResourceStrings, }; function getCombinedResourceStrings() { diff --git a/util/common-config/mock-style.js b/util/common-config/mock-style.js new file mode 100644 index 000000000..f053ebf79 --- /dev/null +++ b/util/common-config/mock-style.js @@ -0,0 +1 @@ +module.exports = {}; diff --git a/web/config/tsconfig.test.json b/web/config/tsconfig.test.json new file mode 100644 index 000000000..9f6956996 --- /dev/null +++ b/web/config/tsconfig.test.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.common.json", + "compilerOptions": { + "tsBuildInfoFile": "../build/cache/ts.test.buildinfo", + "allowJs": true + }, + "include": ["../**/__mocks__/**/*", "../**/__tests__/**/*"] +} diff --git a/web/jest.config.js b/web/jest.config.js index 8d20ac675..48a7e6a20 100644 --- a/web/jest.config.js +++ b/web/jest.config.js @@ -2,7 +2,6 @@ /* eslint-disable @typescript-eslint/no-var-requires */ module.exports = require("@batch/common-config/jest-common").createConfig( "explorer-web", - require("./tsconfig.json"), { testEnvironment: "jsdom", setupFilesAfterEnv: ["/src/__tests__/setup-tests.ts"], diff --git a/web/src/__tests__/setup-tests.ts b/web/src/__tests__/setup-tests.ts index 89dae4b94..3bdc356a4 100644 --- a/web/src/__tests__/setup-tests.ts +++ b/web/src/__tests__/setup-tests.ts @@ -1,8 +1,12 @@ import { destroyEnvironment } from "@azure/bonito-core"; -import { initializeAxe } from "@azure/bonito-ui/lib/test-util"; +import { + initializeAxe, + mockJsdomMissingAPIs, +} from "@azure/bonito-ui/lib/test-util"; beforeAll(async () => { await initializeAxe(); + mockJsdomMissingAPIs(); }); afterEach(() => { diff --git a/web/webpack.config.js b/web/webpack.config.js index 72083d285..e24addf4f 100644 --- a/web/webpack.config.js +++ b/web/webpack.config.js @@ -159,5 +159,8 @@ module.exports = (env) => { }), ], }, + watchOptions: { + ignored: ["**/packages/**/src", "**/node_modules"], + }, }; }; From e6d7828f5ae82c6b79ddd8818b368976eb723012 Mon Sep 17 00:00:00 2001 From: David Watrous <509299+dpwatrous@users.noreply.github.com> Date: Fri, 5 Apr 2024 15:14:12 -0400 Subject: [PATCH 12/57] Move TypeSpec/Autorest dependencies to root of the repo This works around an issue using the service package inside the Azure portal when `bux link` is active. See AB#27200905 for details. --- package-lock.json | 775 +++++++++++++++++++++++++++- package.json | 3 + packages/service/package-lock.json | 794 ----------------------------- packages/service/package.json | 3 - 4 files changed, 756 insertions(+), 819 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6d9472926..9c7978385 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "tslib": "^2.3.1" }, "devDependencies": { + "@azure-tools/typespec-client-generator-cli": "^0.3.0", "@lerna/legacy-package-management": "7.1.5", "@octokit/core": "^3.5.1", "@testing-library/react": "^12.0.0", @@ -30,6 +31,8 @@ "@types/react-dom": "^17.0.18", "@typescript-eslint/eslint-plugin": "^5.13.0", "@typescript-eslint/parser": "^5.13.0", + "@typespec/compiler": "^0.50.0", + "autorest": "^3.6.3", "cross-env": "^7.0.3", "eslint": "^8.10.0", "eslint-config-prettier": "^8.5.0", @@ -47,36 +50,275 @@ "node": ">=18.0.0" } }, + "node_modules/@azure-tools/typespec-client-generator-cli": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@azure-tools/typespec-client-generator-cli/-/typespec-client-generator-cli-0.3.0.tgz", + "integrity": "sha512-8YZVI6U9fWdz4Wgg0VPyIZP1HGPaqPZtGg90IndzUq/6D8qfPrTvYAxht4ty69Yt4eDpE98QKcAdOm9qjkidlg==", + "dev": true, + "dependencies": { + "@azure/core-rest-pipeline": "^1.12.0", + "chalk": "^5.3.0", + "prompt-sync": "^4.2.0", + "simple-git": "^3.20.0", + "yaml": "^2.3.1" + }, + "bin": { + "tsp-client": "cmd/tsp-client.js" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@typespec/compiler": ">=0.48.1 <1.0.0" + } + }, + "node_modules/@azure-tools/typespec-client-generator-cli/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@azure-tools/typespec-client-generator-cli/node_modules/yaml": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", + "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@azure/abort-controller": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.1.tgz", + "integrity": "sha512-NhzeNm5zu2fPlwGXPUjzsRCRuPx5demaZyNcyNYJDqpa/Sbxzvo/RYt9IwUaAOnDW5+r7J9UOE6f22TQnb9nhQ==", + "dev": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-auth": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.7.1.tgz", + "integrity": "sha512-dyeQwvgthqs/SlPVQbZQetpslXceHd4i5a7M/7z/lGEAVwnSluabnQOjF2/dk/hhWgMISusv1Ytp4mQ8JNy62A==", + "dev": true, + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-util": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-rest-pipeline": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.15.1.tgz", + "integrity": "sha512-ZxS6i3eHxh86u+1eWZJiYywoN2vxvsSoAUx60Mny8cZ4nTwvt7UzVVBJO+m2PW2KIJfNiXMt59xBa59htOWL4g==", + "dev": true, + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.4.0", + "@azure/core-tracing": "^1.0.1", + "@azure/core-util": "^1.3.0", + "@azure/logger": "^1.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-rest-pipeline/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@azure/core-rest-pipeline/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@azure/core-rest-pipeline/node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@azure/core-tracing": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.1.1.tgz", + "integrity": "sha512-qPbYhN1pE5XQ2jPKIHP33x8l3oBu1UqIWnYqZZ3OYnYjzY0xqIHjn49C+ptsPD9yC7uyWI9Zm7iZUZLs2R4DhQ==", + "dev": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-util": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.8.1.tgz", + "integrity": "sha512-L3voj0StUdJ+YKomvwnTv7gHzguJO+a6h30pmmZdRprJCM+RJlGMPxzuh4R7lhQu1jNmEtaHX5wvTgWLDAmbGQ==", + "dev": true, + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/logger": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.1.1.tgz", + "integrity": "sha512-/+4TtokaGgC+MnThdf6HyIH9Wrjp+CnCn3Nx3ggevN7FFjjNyjqg0yLlc2i9S+Z2uAzI8GYOo35Nzb1MhQ89MA==", + "dev": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -669,6 +911,21 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", + "dev": true + }, "node_modules/@lerna/child-process": { "version": "7.1.5", "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-7.1.5.tgz", @@ -3580,6 +3837,167 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typespec/compiler": { + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@typespec/compiler/-/compiler-0.50.0.tgz", + "integrity": "sha512-CLNPxyGahfdxPPvtHdexwFXCPzfjeN7qjCiRjJmUeJV2Qd+nf8Sps+mwyqflw1v7q1GTpgB9kURMsWV/+NgTdw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "~7.22.13", + "ajv": "~8.12.0", + "change-case": "~4.1.2", + "globby": "~13.2.2", + "mustache": "~4.2.0", + "picocolors": "~1.0.0", + "prettier": "~3.0.3", + "prompts": "~2.4.2", + "semver": "^7.5.4", + "vscode-languageserver": "~9.0.0", + "vscode-languageserver-textdocument": "~1.0.8", + "yaml": "~2.3.2", + "yargs": "~17.7.2" + }, + "bin": { + "tsp": "cmd/tsp.js", + "tsp-server": "cmd/tsp-server.js" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@typespec/compiler/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@typespec/compiler/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@typespec/compiler/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@typespec/compiler/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/@typespec/compiler/node_modules/prettier": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", + "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/@typespec/compiler/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typespec/compiler/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@typespec/compiler/node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@typespec/compiler/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@typespec/compiler/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/@uifabric/merge-styles": { "version": "7.20.2", "resolved": "https://registry.npmjs.org/@uifabric/merge-styles/-/merge-styles-7.20.2.tgz", @@ -3979,6 +4397,19 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, + "node_modules/autorest": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/autorest/-/autorest-3.7.1.tgz", + "integrity": "sha512-6q17NtosQZPqBkIOUnaOPedf3PDIBF7Ha1iEGRhTqZF6TG2Q/1E3ID/D+ePIIzZDKvW01p/2pENq/oiBWH9IGQ==", + "dev": true, + "hasInstallScript": true, + "bin": { + "autorest": "entrypoints/app.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -4260,6 +4691,16 @@ "node": ">=6" } }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -4286,6 +4727,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -4302,6 +4754,26 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/change-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", + "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.2", + "capital-case": "^1.0.4", + "constant-case": "^3.0.4", + "dot-case": "^3.0.4", + "header-case": "^2.0.4", + "no-case": "^3.0.4", + "param-case": "^3.0.4", + "pascal-case": "^3.1.2", + "path-case": "^3.0.4", + "sentence-case": "^3.0.4", + "snake-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -4529,6 +5001,17 @@ "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "dev": true }, + "node_modules/constant-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", + "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case": "^2.0.2" + } + }, "node_modules/conventional-changelog-angular": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-6.0.0.tgz", @@ -4971,6 +5454,16 @@ "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -5554,9 +6047,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -6282,6 +6775,16 @@ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true }, + "node_modules/header-case": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", + "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", + "dev": true, + "dependencies": { + "capital-case": "^1.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/hosted-git-info": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", @@ -6378,9 +6881,9 @@ ] }, "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" @@ -7242,6 +7745,15 @@ "node": ">=0.10.0" } }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/lerna": { "version": "7.1.5", "resolved": "https://registry.npmjs.org/lerna/-/lerna-7.1.5.tgz", @@ -7912,6 +8424,15 @@ "loose-envify": "cli.js" } }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -8711,6 +9232,15 @@ "node": ">=8" } }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "dev": true, + "bin": { + "mustache": "bin/mustache" + } + }, "node_modules/mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", @@ -8744,6 +9274,16 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, "node_modules/node-addon-api": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", @@ -9717,6 +10257,16 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -9794,6 +10344,26 @@ "parse-path": "^7.0.0" } }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", + "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -9861,6 +10431,12 @@ "node": ">=8" } }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -10091,6 +10667,49 @@ "node": ">=10" } }, + "node_modules/prompt-sync": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/prompt-sync/-/prompt-sync-4.2.0.tgz", + "integrity": "sha512-BuEzzc5zptP5LsgV5MZETjDaKSWfchl5U9Luiu8SKp7iZWD5tZalOxvNcZRwv+d2phNFr8xlbxmFNcRKfJOzJw==", + "dev": true, + "dependencies": { + "strip-ansi": "^5.0.0" + } + }, + "node_modules/prompt-sync/node_modules/ansi-regex": { + "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" + } + }, + "node_modules/prompt-sync/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/promzard": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/promzard/-/promzard-1.0.0.tgz", @@ -10644,6 +11263,15 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -10838,6 +11466,17 @@ "node": ">=10" } }, + "node_modules/sentence-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", + "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -10922,6 +11561,27 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/simple-git": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.24.0.tgz", + "integrity": "sha512-QqAKee9Twv+3k8IFOFfPB2hnk6as6Y6ACUpwCtQvRYBAes23Wv3SZlHVobAzqcE8gfsisCvPw3HGW3HYM+VYYw==", + "dev": true, + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.3.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -10941,6 +11601,16 @@ "npm": ">= 3.0.0" } }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/socks": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", @@ -11509,9 +12179,9 @@ } }, "node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -11686,6 +12356,24 @@ "yarn": "*" } }, + "node_modules/upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", + "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/upper-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -11738,6 +12426,49 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "dev": true, + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "dev": true, + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz", + "integrity": "sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==", + "dev": true + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "dev": true + }, "node_modules/walk-up-path": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", diff --git a/package.json b/package.json index aca06a1fe..5aa95cacc 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,9 @@ "tslib": "^2.3.1" }, "devDependencies": { + "@azure-tools/typespec-client-generator-cli": "^0.3.0", "@lerna/legacy-package-management": "7.1.5", + "@typespec/compiler": "^0.50.0", "@octokit/core": "^3.5.1", "@testing-library/react": "^12.0.0", "@testing-library/react-hooks": "^8.0.0", @@ -36,6 +38,7 @@ "@types/react-dom": "^17.0.18", "@typescript-eslint/eslint-plugin": "^5.13.0", "@typescript-eslint/parser": "^5.13.0", + "autorest": "^3.6.3", "cross-env": "^7.0.3", "eslint": "^8.10.0", "eslint-config-prettier": "^8.5.0", diff --git a/packages/service/package-lock.json b/packages/service/package-lock.json index ad78e1cc6..fb7e938aa 100644 --- a/packages/service/package-lock.json +++ b/packages/service/package-lock.json @@ -17,11 +17,8 @@ "@azure/logger": "^1.0.0" }, "devDependencies": { - "@azure-tools/typespec-client-generator-cli": "^0.3.0", "@types/jest": "^27.0.1", "@types/node": "20.5.4", - "@typespec/compiler": "^0.50.0", - "autorest": "^3.6.3", "jest": "^27.1.0", "jest-junit": "^12.2.0", "ts-jest": "^27.0.5" @@ -60,40 +57,6 @@ "node": ">=14.0.0" } }, - "node_modules/@azure-tools/typespec-client-generator-cli": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@azure-tools/typespec-client-generator-cli/-/typespec-client-generator-cli-0.3.0.tgz", - "integrity": "sha512-8YZVI6U9fWdz4Wgg0VPyIZP1HGPaqPZtGg90IndzUq/6D8qfPrTvYAxht4ty69Yt4eDpE98QKcAdOm9qjkidlg==", - "dev": true, - "dependencies": { - "@azure/core-rest-pipeline": "^1.12.0", - "chalk": "^5.3.0", - "prompt-sync": "^4.2.0", - "simple-git": "^3.20.0", - "yaml": "^2.3.1" - }, - "bin": { - "tsp-client": "cmd/tsp-client.js" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@typespec/compiler": ">=0.48.1 <1.0.0" - } - }, - "node_modules/@azure-tools/typespec-client-generator-cli/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/@azure/abort-controller": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", @@ -1150,56 +1113,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@kwsites/file-exists": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", - "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1" - } - }, - "node_modules/@kwsites/promise-deferred": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", - "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", - "dev": true - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/@sinonjs/commons": { "version": "1.8.6", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", @@ -1344,192 +1257,6 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, - "node_modules/@typespec/compiler": { - "version": "0.50.0", - "resolved": "https://registry.npmjs.org/@typespec/compiler/-/compiler-0.50.0.tgz", - "integrity": "sha512-CLNPxyGahfdxPPvtHdexwFXCPzfjeN7qjCiRjJmUeJV2Qd+nf8Sps+mwyqflw1v7q1GTpgB9kURMsWV/+NgTdw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "~7.22.13", - "ajv": "~8.12.0", - "change-case": "~4.1.2", - "globby": "~13.2.2", - "mustache": "~4.2.0", - "picocolors": "~1.0.0", - "prettier": "~3.0.3", - "prompts": "~2.4.2", - "semver": "^7.5.4", - "vscode-languageserver": "~9.0.0", - "vscode-languageserver-textdocument": "~1.0.8", - "yaml": "~2.3.2", - "yargs": "~17.7.2" - }, - "bin": { - "tsp": "cmd/tsp.js", - "tsp-server": "cmd/tsp-server.js" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@typespec/compiler/node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@typespec/compiler/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@typespec/compiler/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@typespec/compiler/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@typespec/compiler/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@typespec/compiler/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@typespec/compiler/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@typespec/compiler/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@typespec/compiler/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typespec/compiler/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typespec/compiler/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@typespec/compiler/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typespec/compiler/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@typespec/compiler/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", @@ -1590,22 +1317,6 @@ "node": ">= 6.0.0" } }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -1672,19 +1383,6 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, - "node_modules/autorest": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/autorest/-/autorest-3.6.3.tgz", - "integrity": "sha512-j/Axwk9bniifTNtBLYVxfQZGQIGPKljFaCQCBWOiybVar2j3tkHP1btiC4a/t9pAJXY6IaFgWctoPM3G/Puhyg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "autorest": "entrypoints/app.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/babel-jest": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", @@ -1879,16 +1577,6 @@ "node": ">=6" } }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -1918,17 +1606,6 @@ } ] }, - "node_modules/capital-case": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", - "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1945,26 +1622,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/change-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", - "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", - "dev": true, - "dependencies": { - "camel-case": "^4.1.2", - "capital-case": "^1.0.4", - "constant-case": "^3.0.4", - "dot-case": "^3.0.4", - "header-case": "^2.0.4", - "no-case": "^3.0.4", - "param-case": "^3.0.4", - "pascal-case": "^3.1.2", - "path-case": "^3.0.4", - "sentence-case": "^3.0.4", - "snake-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -2057,17 +1714,6 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "node_modules/constant-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", - "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case": "^2.0.2" - } - }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -2189,18 +1835,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/domexception": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", @@ -2222,16 +1856,6 @@ "node": ">=8" } }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/electron-to-chromium": { "version": "1.4.500", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.500.tgz", @@ -2382,43 +2006,12 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, "node_modules/fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", @@ -2552,18 +2145,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -2573,37 +2154,6 @@ "node": ">=4" } }, - "node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "dev": true, - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -2631,16 +2181,6 @@ "node": ">=8" } }, - "node_modules/header-case": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", - "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", - "dev": true, - "dependencies": { - "capital-case": "^1.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/html-encoding-sniffer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", @@ -2706,15 +2246,6 @@ "node": ">=0.10.0" } }, - "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -2777,15 +2308,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -2804,18 +2326,6 @@ "node": ">=6" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -3686,12 +3196,6 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -3752,15 +3256,6 @@ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -3839,15 +3334,6 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -3918,31 +3404,12 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "dev": true, - "bin": { - "mustache": "bin/mustache" - } - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -4042,16 +3509,6 @@ "node": ">=6" } }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -4076,26 +3533,6 @@ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", - "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", - "dev": true, - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -4129,15 +3566,6 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -4177,21 +3605,6 @@ "node": ">=8" } }, - "node_modules/prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, "node_modules/pretty-format": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", @@ -4218,36 +3631,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/prompt-sync": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/prompt-sync/-/prompt-sync-4.2.0.tgz", - "integrity": "sha512-BuEzzc5zptP5LsgV5MZETjDaKSWfchl5U9Luiu8SKp7iZWD5tZalOxvNcZRwv+d2phNFr8xlbxmFNcRKfJOzJw==", - "dev": true, - "dependencies": { - "strip-ansi": "^5.0.0" - } - }, - "node_modules/prompt-sync/node_modules/ansi-regex": { - "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" - } - }, - "node_modules/prompt-sync/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -4282,26 +3665,6 @@ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "dev": true }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -4317,15 +3680,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -4379,16 +3733,6 @@ "node": ">=10" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -4404,29 +3748,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -4454,17 +3775,6 @@ "semver": "bin/semver.js" } }, - "node_modules/sentence-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", - "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -4492,21 +3802,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "node_modules/simple-git": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.22.0.tgz", - "integrity": "sha512-6JujwSs0ac82jkGjMHiCnTifvf1crOiY/+tfs/Pqih6iow7VrpNKRRNdWm6RtaXpvvv/JGNYhlUtLhGFqHF+Yw==", - "dev": true, - "dependencies": { - "@kwsites/file-exists": "^1.1.1", - "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.3.4" - }, - "funding": { - "type": "github", - "url": "https://github.com/steveukx/git-js?sponsor=1" - } - }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -4522,16 +3817,6 @@ "node": ">=8" } }, - "node_modules/snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "dev": true, - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -4921,33 +4206,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/upper-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", - "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/upper-case-first": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", - "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, "node_modules/url-parse": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", @@ -4990,49 +4248,6 @@ "node": ">= 8" } }, - "node_modules/vscode-jsonrpc": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", - "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/vscode-languageserver": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", - "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", - "dev": true, - "dependencies": { - "vscode-languageserver-protocol": "3.17.5" - }, - "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" - } - }, - "node_modules/vscode-languageserver-protocol": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", - "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", - "dev": true, - "dependencies": { - "vscode-jsonrpc": "8.2.0", - "vscode-languageserver-types": "3.17.5" - } - }, - "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz", - "integrity": "sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==", - "dev": true - }, - "node_modules/vscode-languageserver-types": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", - "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", - "dev": true - }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -5206,15 +4421,6 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, - "node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", diff --git a/packages/service/package.json b/packages/service/package.json index 949c45439..4c3f0d3bd 100644 --- a/packages/service/package.json +++ b/packages/service/package.json @@ -73,12 +73,9 @@ "@azure/logger": "^1.0.0" }, "devDependencies": { - "@azure-tools/typespec-client-generator-cli": "^0.3.0", "@batch/common-config": "^1.0.0", "@types/jest": "^27.0.1", "@types/node": "20.5.4", - "@typespec/compiler": "^0.50.0", - "autorest": "^3.6.3", "jest": "^27.1.0", "jest-junit": "^12.2.0", "ts-jest": "^27.0.5" From e1605c1fc15ab71f2c5026a70364c3e33b4c6998 Mon Sep 17 00:00:00 2001 From: David Watrous <509299+dpwatrous@users.noreply.github.com> Date: Fri, 12 Apr 2024 14:31:01 -0400 Subject: [PATCH 13/57] Make CryptoService tests use a more obviously fake key for tests --- .../src/client/core/secure-data-store/crypto-service.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/desktop/src/client/core/secure-data-store/crypto-service.spec.ts b/desktop/src/client/core/secure-data-store/crypto-service.spec.ts index 171b622f8..3e6eda143 100644 --- a/desktop/src/client/core/secure-data-store/crypto-service.spec.ts +++ b/desktop/src/client/core/secure-data-store/crypto-service.spec.ts @@ -7,7 +7,8 @@ describe("CryptoService", () => { let masterKey: string | null = null; beforeEach(() => { - masterKey = "fbea88f2f4efeb0640cb411aa7df41cb"; + // Fake testing key needs to be 32 characters long + masterKey = "------fake-key-for-testing------"; keytarSpy = { setPassword: jasmine.createSpy("setPassword").and.callFake((x) => { masterKey = x; From 0a8de5e9eaf2edf720f7f4c1d39157d6cb1bd7d4 Mon Sep 17 00:00:00 2001 From: David Watrous Date: Tue, 23 Apr 2024 00:57:52 -0400 Subject: [PATCH 14/57] Update Electron --- desktop/package-lock.json | 597 ++++++++++++++++++++----- desktop/package.json | 6 +- desktop/src/client/client-constants.ts | 2 +- 3 files changed, 480 insertions(+), 125 deletions(-) diff --git a/desktop/package-lock.json b/desktop/package-lock.json index 073654746..81916affe 100644 --- a/desktop/package-lock.json +++ b/desktop/package-lock.json @@ -23,7 +23,7 @@ "@azure/core-util": "1.4.0", "@azure/msal-node": "^1.14.6", "@azure/storage-blob": "^12.11.0", - "@electron/remote": "^2.0.10", + "@electron/remote": "^2.1.2", "applicationinsights": "^1.8.5", "chart.js": "^2.9.3", "chokidar": "^3.4.3", @@ -93,8 +93,8 @@ "concurrently": "^5.3.0", "copy-webpack-plugin": "^6.0.3", "css-loader": "^2.1.1", - "electron": "^26.1.0", - "electron-builder": "^24.3.0", + "electron": "^29.3.1", + "electron-builder": "^24.13.3", "eslint": "^7.19.0", "eslint-config-prettier": "^7.2.0", "eslint-plugin-ban": "^1.5.2", @@ -987,12 +987,11 @@ } }, "node_modules/@electron/asar": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.4.tgz", - "integrity": "sha512-lykfY3TJRRWFeTxccEKdf1I6BLl2Plw81H0bbp4Fc5iEc67foDCa5pjJQULVgo0wF+Dli75f3xVcdb/67FFZ/g==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.9.tgz", + "integrity": "sha512-Vu2P3X2gcZ3MY9W7yH72X9+AMXwUQZEJBrsPIbX0JsdllLtoh62/Q8Wg370/DawIEVKOyfD6KtTLo645ezqxUA==", "dev": true, "dependencies": { - "chromium-pickle-js": "^0.2.0", "commander": "^5.0.0", "glob": "^7.1.6", "minimatch": "^3.0.4" @@ -1071,13 +1070,14 @@ } }, "node_modules/@electron/notarize": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-1.2.4.tgz", - "integrity": "sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.2.1.tgz", + "integrity": "sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg==", "dev": true, "dependencies": { "debug": "^4.1.1", - "fs-extra": "^9.0.1" + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" }, "engines": { "node": ">= 10.0.0" @@ -1111,9 +1111,9 @@ } }, "node_modules/@electron/notarize/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { "node": ">= 10.0.0" @@ -1179,26 +1179,26 @@ } }, "node_modules/@electron/osx-sign/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { "node": ">= 10.0.0" } }, "node_modules/@electron/remote": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@electron/remote/-/remote-2.0.10.tgz", - "integrity": "sha512-3SFKKaQXcyWgwmibud+UqJl/XlHOgLcI3fwtB9pNelPSJAcTxocOJrF6FaxBIQaj1+R05Di6xuAswZpXAW7xhA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@electron/remote/-/remote-2.1.2.tgz", + "integrity": "sha512-EPwNx+nhdrTBxyCqXt/pftoQg/ybtWDW3DUWHafejvnB1ZGGfMpv6e15D8KeempocjXe78T7WreyGGb3mlZxdA==", "peerDependencies": { "electron": ">= 13.0.0" } }, "node_modules/@electron/universal": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.3.4.tgz", - "integrity": "sha512-BdhBgm2ZBnYyYRLRgOjM5VHkyFItsbggJ0MHycOjKWdFGYwK97ZFXH54dTvUWEfha81vfvwr5On6XBjt99uDcg==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz", + "integrity": "sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==", "dev": true, "dependencies": { "@electron/asar": "^3.2.1", @@ -1263,9 +1263,9 @@ } }, "node_modules/@electron/universal/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { "node": ">= 10.0.0" @@ -1414,6 +1414,102 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1561,9 +1657,9 @@ } }, "node_modules/@malept/flatpak-bundler/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { "node": ">= 10.0.0" @@ -1705,6 +1801,16 @@ "node": ">=8.0.0" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@playwright/test": { "version": "1.37.1", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.37.1.tgz", @@ -2082,9 +2188,9 @@ } }, "node_modules/@types/debug": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", - "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dev": true, "dependencies": { "@types/ms": "*" @@ -2200,9 +2306,9 @@ "dev": true }, "node_modules/@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", "dev": true }, "node_modules/@types/node": { @@ -2245,9 +2351,9 @@ "dev": true }, "node_modules/@types/plist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.2.tgz", - "integrity": "sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", "dev": true, "optional": true, "dependencies": { @@ -2339,9 +2445,9 @@ "dev": true }, "node_modules/@types/verror": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.6.tgz", - "integrity": "sha512-NNm+gdePAX1VGvPcGZCDKQZKYSiAWigKhKaz5KF94hG6f2s8de9Ow5+7AbXoeKxL8gavZfk4UquSAygOF2duEQ==", + "version": "1.10.10", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.10.tgz", + "integrity": "sha512-l4MM0Jppn18hb9xmM6wwD1uTdShpf9Pn80aXTStnK1C94gtPvJcV2FrDmbOQUAQfJ1cKZHktkQUDwEqaAKXMMg==", "dev": true, "optional": true }, @@ -2726,9 +2832,9 @@ "dev": true }, "node_modules/7zip-bin": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.1.1.tgz", - "integrity": "sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", + "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", "dev": true }, "node_modules/accepts": { @@ -2923,26 +3029,25 @@ "dev": true }, "node_modules/app-builder-lib": { - "version": "24.6.3", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.6.3.tgz", - "integrity": "sha512-++0Zp7vcCHfXMBGVj7luFxpqvMPk5mcWeTuw7OK0xNAaNtYQTTN0d9YfWRsb1MvviTOOhyHeULWz1CaixrdrDg==", + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.13.3.tgz", + "integrity": "sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig==", "dev": true, "dependencies": { "@develar/schema-utils": "~2.6.5", - "@electron/notarize": "^1.2.3", - "@electron/osx-sign": "^1.0.4", - "@electron/universal": "1.3.4", + "@electron/notarize": "2.2.1", + "@electron/osx-sign": "1.0.5", + "@electron/universal": "1.5.1", "@malept/flatpak-bundler": "^0.4.0", "@types/fs-extra": "9.0.13", - "7zip-bin": "~5.1.1", "async-exit-hook": "^2.0.1", "bluebird-lst": "^1.0.9", - "builder-util": "24.5.0", - "builder-util-runtime": "9.2.1", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", "chromium-pickle-js": "^0.2.0", "debug": "^4.3.4", "ejs": "^3.1.8", - "electron-publish": "24.5.0", + "electron-publish": "24.13.1", "form-data": "^4.0.0", "fs-extra": "^10.1.0", "hosted-git-info": "^4.1.0", @@ -2959,6 +3064,10 @@ }, "engines": { "node": ">=14.0.0" + }, + "peerDependencies": { + "dmg-builder": "24.13.3", + "electron-builder-squirrel-windows": "24.13.3" } }, "node_modules/app-builder-lib/node_modules/argparse": { @@ -3018,9 +3127,9 @@ } }, "node_modules/app-builder-lib/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -3033,9 +3142,9 @@ } }, "node_modules/app-builder-lib/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { "node": ">= 10.0.0" @@ -4178,16 +4287,16 @@ "dev": true }, "node_modules/builder-util": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.5.0.tgz", - "integrity": "sha512-STnBmZN/M5vGcv01u/K8l+H+kplTaq4PAIn3yeuufUKSpcdro0DhJWxPI81k5XcNfC//bjM3+n9nr8F9uV4uAQ==", + "version": "24.13.1", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.13.1.tgz", + "integrity": "sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA==", "dev": true, "dependencies": { "@types/debug": "^4.1.6", - "7zip-bin": "~5.1.1", + "7zip-bin": "~5.2.0", "app-builder-bin": "4.0.0", "bluebird-lst": "^1.0.9", - "builder-util-runtime": "9.2.1", + "builder-util-runtime": "9.2.4", "chalk": "^4.1.2", "cross-spawn": "^7.0.3", "debug": "^4.3.4", @@ -4202,9 +4311,9 @@ } }, "node_modules/builder-util-runtime": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.1.tgz", - "integrity": "sha512-2rLv/uQD2x+dJ0J3xtsmI12AlRyk7p45TEbE/6o/fbb633e/S3pPgm+ct+JHsoY7r39dKHnGEFk/AASRFdnXmA==", + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz", + "integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==", "dev": true, "dependencies": { "debug": "^4.3.4", @@ -4336,9 +4445,9 @@ } }, "node_modules/builder-util/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { "node": ">= 10.0.0" @@ -4717,9 +4826,9 @@ "dev": true }, "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, "funding": [ { @@ -5375,13 +5484,100 @@ } }, "node_modules/config-file-ts": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.4.tgz", - "integrity": "sha512-cKSW0BfrSaAUnxpgvpXPLaaW/umg4bqg4k3GO1JqlRfpx+d5W0GDXznCMkWotJQek5Mmz1MJVChQnz3IVaeMZQ==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.6.tgz", + "integrity": "sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==", "dev": true, "dependencies": { - "glob": "^7.1.6", - "typescript": "^4.0.2" + "glob": "^10.3.10", + "typescript": "^5.3.3" + } + }, + "node_modules/config-file-ts/node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/glob": { + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/config-file-ts/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" } }, "node_modules/connect": { @@ -6676,14 +6872,14 @@ } }, "node_modules/dmg-builder": { - "version": "24.6.3", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.6.3.tgz", - "integrity": "sha512-O7KNT7OKqtV54fMYUpdlyTOCP5DoPuRMLqMTgxxV2PO8Hj/so6zOl5o8GTs8pdDkeAhJzCFOUNB3BDhgXbUbJg==", + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.13.3.tgz", + "integrity": "sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ==", "dev": true, "dependencies": { - "app-builder-lib": "24.6.3", - "builder-util": "24.5.0", - "builder-util-runtime": "9.2.1", + "app-builder-lib": "24.13.3", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", "fs-extra": "^10.1.0", "iconv-lite": "^0.6.2", "js-yaml": "^4.1.0" @@ -6737,9 +6933,9 @@ } }, "node_modules/dmg-builder/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { "node": ">= 10.0.0" @@ -6926,6 +7122,12 @@ "stream-shift": "^1.0.0" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -6941,9 +7143,9 @@ "dev": true }, "node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, "dependencies": { "jake": "^10.8.5" @@ -6956,14 +7158,14 @@ } }, "node_modules/electron": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-26.1.0.tgz", - "integrity": "sha512-qEh19H09Pysn3ibms5nZ0haIh5pFoOd7/5Ww7gzmAwDQOulRi8Sa2naeueOyIb1GKpf+6L4ix3iceYRAuA5r5Q==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/electron/-/electron-29.3.1.tgz", + "integrity": "sha512-auge1/6RVqgUd6TgIq88wKdUCJi2cjESi3jy7d+6X4JzvBGprKBqMJ8JSSFpu/Px1YJrFUKAxfy6SC+TQf1uLw==", "dev": true, "hasInstallScript": true, "dependencies": { "@electron/get": "^2.0.0", - "@types/node": "^18.11.18", + "@types/node": "^20.9.0", "extract-zip": "^2.0.1" }, "bin": { @@ -6974,16 +7176,16 @@ } }, "node_modules/electron-builder": { - "version": "24.6.3", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.6.3.tgz", - "integrity": "sha512-O6PqhRXwfxCNTXI4BlhELSeYYO6/tqlxRuy+4+xKBokQvwDDjDgZMMoSgAmanVSCuzjE7MZldI9XYrKFk+EQDw==", + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.13.3.tgz", + "integrity": "sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg==", "dev": true, "dependencies": { - "app-builder-lib": "24.6.3", - "builder-util": "24.5.0", - "builder-util-runtime": "9.2.1", + "app-builder-lib": "24.13.3", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", "chalk": "^4.1.2", - "dmg-builder": "24.6.3", + "dmg-builder": "24.13.3", "fs-extra": "^10.1.0", "is-ci": "^3.0.0", "lazy-val": "^1.0.5", @@ -7140,14 +7342,14 @@ } }, "node_modules/electron-publish": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.5.0.tgz", - "integrity": "sha512-zwo70suH15L15B4ZWNDoEg27HIYoPsGJUF7xevLJLSI7JUPC8l2yLBdLGwqueJ5XkDL7ucYyRZzxJVR8ElV9BA==", + "version": "24.13.1", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.13.1.tgz", + "integrity": "sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A==", "dev": true, "dependencies": { "@types/fs-extra": "^9.0.11", - "builder-util": "24.5.0", - "builder-util-runtime": "9.2.1", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", "chalk": "^4.1.2", "fs-extra": "^10.1.0", "lazy-val": "^1.0.5", @@ -7245,9 +7447,9 @@ } }, "node_modules/electron-publish/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { "node": ">= 10.0.0" @@ -7365,10 +7567,13 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/electron/node_modules/@types/node": { - "version": "18.17.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.11.tgz", - "integrity": "sha512-r3hjHPBu+3LzbGBa8DHnr/KAeTEEOrahkcL+cZc4MaBMTM+mk8LtXR+zw+nqfjuDZZzYTYgTcpHuP+BEQk069g==", - "dev": true + "version": "20.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", + "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/electron/node_modules/extract-zip": { "version": "2.0.1", @@ -7559,6 +7764,12 @@ "node": ">=6" } }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, "node_modules/errno": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", @@ -11880,12 +12091,12 @@ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/isbinaryfile": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.0.tgz", - "integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.2.tgz", + "integrity": "sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==", "dev": true, "engines": { - "node": ">= 14.0.0" + "node": ">= 18.0.0" }, "funding": { "url": "https://github.com/sponsors/gjtorikian/" @@ -12159,6 +12370,24 @@ "node": ">=8" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -15296,6 +15525,40 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-scurry": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -15885,6 +16148,19 @@ "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "dev": true }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -18293,6 +18569,21 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/string.prototype.trim": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", @@ -18350,6 +18641,19 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -18866,9 +19170,9 @@ } }, "node_modules/temp-file/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { "node": ">= 10.0.0" @@ -19844,6 +20148,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/unified": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", @@ -22105,6 +22415,51 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", diff --git a/desktop/package.json b/desktop/package.json index 39e42b104..1cfab07ca 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -132,8 +132,8 @@ "concurrently": "^5.3.0", "copy-webpack-plugin": "^6.0.3", "css-loader": "^2.1.1", - "electron": "^26.1.0", - "electron-builder": "^24.3.0", + "electron": "^29.3.1", + "electron-builder": "^24.13.3", "eslint": "^7.19.0", "eslint-config-prettier": "^7.2.0", "eslint-plugin-ban": "^1.5.2", @@ -206,7 +206,7 @@ "@batch/ui-playground": "^1.0.0", "@batch/ui-react": "^1.0.0", "@batch/ui-service": "^1.0.0", - "@electron/remote": "^2.0.10", + "@electron/remote": "^2.1.2", "applicationinsights": "^1.8.5", "chart.js": "^2.9.3", "chokidar": "^3.4.3", diff --git a/desktop/src/client/client-constants.ts b/desktop/src/client/client-constants.ts index da5e567f6..5a56b0a1a 100644 --- a/desktop/src/client/client-constants.ts +++ b/desktop/src/client/client-constants.ts @@ -56,7 +56,7 @@ const urls = { icon: __dirname + "/../assets/images/icon.ico", }; -const isAsar = process!.mainModule!.filename.indexOf("app.asar") !== -1; +const isAsar = (process?.mainModule?.filename.indexOf("app.asar") ?? -1) !== -1; const logsFolder = isAsar ? path.join(app.getPath("userData"), "logs") : path.join(root, "logs"); const resourcesFolder = isAsar ? path.normalize(path.join(root, "..")) : root; From f72e8dfd369cac8fc9795ba4688882d910ed7bef Mon Sep 17 00:00:00 2001 From: David Watrous Date: Tue, 23 Apr 2024 08:49:55 -0400 Subject: [PATCH 15/57] Update MSAL.js --- desktop/package-lock.json | 18 +++++++++--------- desktop/package.json | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/desktop/package-lock.json b/desktop/package-lock.json index 81916affe..5506f67ae 100644 --- a/desktop/package-lock.json +++ b/desktop/package-lock.json @@ -21,7 +21,7 @@ "@angular/platform-server": "^11.0.0", "@angular/router": "^11.0.0", "@azure/core-util": "1.4.0", - "@azure/msal-node": "^1.14.6", + "@azure/msal-node": "^2.7.0", "@azure/storage-blob": "^12.11.0", "@electron/remote": "^2.1.2", "applicationinsights": "^1.8.5", @@ -600,24 +600,24 @@ } }, "node_modules/@azure/msal-common": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-13.2.1.tgz", - "integrity": "sha512-9CtyVdDtAOw+raemKg8gdBuE7gleObgSb7p4bzMIlUt8eM69/Gaow7uqr1gK3jLYINSrss32OZW8mBbdgVLiHg==", + "version": "14.9.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.9.0.tgz", + "integrity": "sha512-yzBPRlWPnTBeixxLNI3BBIgF5/bHpbhoRVuuDBnYjCyWRavaPUsKAHUDYLqpGkBLDciA6TCc6GOxN4/S3WiSxg==", "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-node": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.18.1.tgz", - "integrity": "sha512-B4kUOWJoN4vD8b3pGJ9Q9mIZhaDb8EnQM1aN0x1otlQgTfzDvEk6rWc6fy8uGdtXqcNddBtiXdc4oRiItroVkA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.7.0.tgz", + "integrity": "sha512-wXD8LkUvHICeSWZydqg6o8Yvv+grlBEcmLGu+QEI4FcwFendbTEZrlSygnAXXSOCVaGAirWLchca35qrgpO6Jw==", "dependencies": { - "@azure/msal-common": "13.2.1", + "@azure/msal-common": "14.9.0", "jsonwebtoken": "^9.0.0", "uuid": "^8.3.0" }, "engines": { - "node": "10 || 12 || 14 || 16 || 18" + "node": ">=16" } }, "node_modules/@azure/storage-blob": { diff --git a/desktop/package.json b/desktop/package.json index 1cfab07ca..7e9cc21ca 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -201,7 +201,7 @@ "@angular/router": "^11.0.0", "@azure/bonito-core": "^1.0.0", "@azure/bonito-ui": "^1.0.0", - "@azure/msal-node": "^1.14.6", + "@azure/msal-node": "^2.7.0", "@azure/storage-blob": "^12.11.0", "@batch/ui-playground": "^1.0.0", "@batch/ui-react": "^1.0.0", From a02a042332df267f3857103cd5c46b580cce0980 Mon Sep 17 00:00:00 2001 From: David Watrous <509299+dpwatrous@users.noreply.github.com> Date: Tue, 23 Apr 2024 21:08:00 -0400 Subject: [PATCH 16/57] Update playwright --- .gitignore | 1 + desktop/package-lock.json | 34 ++++++++++++++++------------------ desktop/package.json | 4 ++-- 3 files changed, 19 insertions(+), 20 deletions(-) diff --git a/.gitignore b/.gitignore index 904a6a2b1..debec86aa 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ /**/lib-cjs /**/lib-umd /**/build +/**/test-results /desktop/release/ coverage/ env/ diff --git a/desktop/package-lock.json b/desktop/package-lock.json index 5506f67ae..3815b51e6 100644 --- a/desktop/package-lock.json +++ b/desktop/package-lock.json @@ -69,7 +69,7 @@ "@angular-eslint/template-parser": "^13.2.1", "@angular/compiler-cli": "^11.0.0", "@ngtools/webpack": "^11.0.0", - "@playwright/test": "^1.18.1", + "@playwright/test": "^1.43.1", "@types/chart.js": "^2.9.24", "@types/d3": "^7.4.0", "@types/extract-zip": "^1.6.2", @@ -126,7 +126,7 @@ "node-fetch": "^2.6.7", "nyc": "^15.1.0", "patch-package": "^6.5.1", - "playwright": "^1.18.1", + "playwright": "^1.43.1", "prettier": "^2.2.1", "proxyquire": "^2.1.3", "raw-loader": "^1.0.0", @@ -1812,22 +1812,18 @@ } }, "node_modules/@playwright/test": { - "version": "1.37.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.37.1.tgz", - "integrity": "sha512-bq9zTli3vWJo8S3LwB91U0qDNQDpEXnw7knhxLM0nwDvexQAwx9tO8iKDZSqqneVq+URd/WIoz+BALMqUTgdSg==", + "version": "1.43.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.43.1.tgz", + "integrity": "sha512-HgtQzFgNEEo4TE22K/X7sYTYNqEMMTZmFS8kTq6m8hXj+m1D8TgwgIbumHddJa9h4yl4GkKb8/bgAl2+g7eDgA==", "dev": true, "dependencies": { - "@types/node": "*", - "playwright-core": "1.37.1" + "playwright": "1.43.1" }, "bin": { "playwright": "cli.js" }, "engines": { "node": ">=16" - }, - "optionalDependencies": { - "fsevents": "2.3.2" } }, "node_modules/@sindresorhus/is": { @@ -15659,25 +15655,27 @@ } }, "node_modules/playwright": { - "version": "1.37.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.37.1.tgz", - "integrity": "sha512-bgUXRrQKhT48zHdxDYQTpf//0xDfDd5hLeEhjuSw8rXEGoT9YeElpfvs/izonTNY21IQZ7d3s22jLxYaAnubbQ==", + "version": "1.43.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.43.1.tgz", + "integrity": "sha512-V7SoH0ai2kNt1Md9E3Gwas5B9m8KR2GVvwZnAI6Pg0m3sh7UvgiYhRrhsziCmqMJNouPckiOhk8T+9bSAK0VIA==", "dev": true, - "hasInstallScript": true, "dependencies": { - "playwright-core": "1.37.1" + "playwright-core": "1.43.1" }, "bin": { "playwright": "cli.js" }, "engines": { "node": ">=16" + }, + "optionalDependencies": { + "fsevents": "2.3.2" } }, "node_modules/playwright-core": { - "version": "1.37.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.37.1.tgz", - "integrity": "sha512-17EuQxlSIYCmEMwzMqusJ2ztDgJePjrbttaefgdsiqeLWidjYz9BxXaTaZWxH1J95SHGk6tjE+dwgWILJoUZfA==", + "version": "1.43.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.43.1.tgz", + "integrity": "sha512-EI36Mto2Vrx6VF7rm708qSnesVQKbxEWvPrfA1IPY6HgczBplDx7ENtx+K2n4kJ41sLLkuGfmb0ZLSSXlDhqPg==", "dev": true, "bin": { "playwright-core": "cli.js" diff --git a/desktop/package.json b/desktop/package.json index 7e9cc21ca..91d910700 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -108,7 +108,7 @@ "@angular/compiler-cli": "^11.0.0", "@batch/common-config": "^1.0.0", "@ngtools/webpack": "^11.0.0", - "@playwright/test": "^1.18.1", + "@playwright/test": "^1.43.1", "@types/chart.js": "^2.9.24", "@types/d3": "^7.4.0", "@types/extract-zip": "^1.6.2", @@ -165,7 +165,7 @@ "node-fetch": "^2.6.7", "nyc": "^15.1.0", "patch-package": "^6.5.1", - "playwright": "^1.18.1", + "playwright": "^1.43.1", "prettier": "^2.2.1", "proxyquire": "^2.1.3", "raw-loader": "^1.0.0", From 256154ebf9766363730e9f8dbe22e05982df9fe7 Mon Sep 17 00:00:00 2001 From: "CSIGS@microsoft.com" Date: Wed, 8 May 2024 15:46:10 -0700 Subject: [PATCH 17/57] Juno: check in to users/loc/juno/hb_b5190a78-9093-45f2-826d-2cc1e04cb56a_20240427001040736. (#2899) --- .../loc/cs/desktop/i18n/resources.resjson.lcl | 40 +--- .../packages/react/i18n/resources.resjson.lcl | 207 ++++++++++++++++-- .../loc/de/desktop/i18n/resources.resjson.lcl | 38 +--- .../packages/react/i18n/resources.resjson.lcl | 207 ++++++++++++++++-- .../loc/es/desktop/i18n/resources.resjson.lcl | 40 +--- .../packages/react/i18n/resources.resjson.lcl | 207 ++++++++++++++++-- .../loc/fr/desktop/i18n/resources.resjson.lcl | 42 +--- .../packages/react/i18n/resources.resjson.lcl | 207 ++++++++++++++++-- .../loc/hu/desktop/i18n/resources.resjson.lcl | 40 +--- .../packages/react/i18n/resources.resjson.lcl | 207 ++++++++++++++++-- .../loc/id/desktop/i18n/resources.resjson.lcl | 40 +--- .../packages/react/i18n/resources.resjson.lcl | 207 ++++++++++++++++-- .../loc/it/desktop/i18n/resources.resjson.lcl | 42 +--- .../packages/react/i18n/resources.resjson.lcl | 207 ++++++++++++++++-- .../loc/ja/desktop/i18n/resources.resjson.lcl | 44 +--- .../packages/react/i18n/resources.resjson.lcl | 207 ++++++++++++++++-- .../loc/ko/desktop/i18n/resources.resjson.lcl | 44 +--- .../packages/react/i18n/resources.resjson.lcl | 207 ++++++++++++++++-- .../loc/nl/desktop/i18n/resources.resjson.lcl | 40 +--- .../packages/react/i18n/resources.resjson.lcl | 207 ++++++++++++++++-- .../loc/pl/desktop/i18n/resources.resjson.lcl | 40 +--- .../packages/react/i18n/resources.resjson.lcl | 207 ++++++++++++++++-- .../pt-BR/desktop/i18n/resources.resjson.lcl | 44 +--- .../packages/react/i18n/resources.resjson.lcl | 207 ++++++++++++++++-- .../pt-PT/desktop/i18n/resources.resjson.lcl | 40 +--- .../packages/react/i18n/resources.resjson.lcl | 207 ++++++++++++++++-- .../loc/ru/desktop/i18n/resources.resjson.lcl | 40 +--- .../packages/react/i18n/resources.resjson.lcl | 207 ++++++++++++++++-- .../loc/sv/desktop/i18n/resources.resjson.lcl | 40 +--- .../packages/react/i18n/resources.resjson.lcl | 207 ++++++++++++++++-- .../loc/tr/desktop/i18n/resources.resjson.lcl | 40 +--- .../packages/react/i18n/resources.resjson.lcl | 207 ++++++++++++++++-- .../desktop/i18n/resources.resjson.lcl | 44 +--- .../packages/react/i18n/resources.resjson.lcl | 207 ++++++++++++++++-- .../desktop/i18n/resources.resjson.lcl | 40 +--- .../packages/react/i18n/resources.resjson.lcl | 207 ++++++++++++++++-- 36 files changed, 3555 insertions(+), 909 deletions(-) diff --git a/Localize/loc/cs/desktop/i18n/resources.resjson.lcl b/Localize/loc/cs/desktop/i18n/resources.resjson.lcl index 555311f31..f10e985d8 100644 --- a/Localize/loc/cs/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/cs/desktop/i18n/resources.resjson.lcl @@ -21,10 +21,13 @@
- + - + + + + @@ -1459,29 +1462,11 @@ - + - + - - - - - - - - - - - - - - - - - - - + @@ -1495,15 +1480,6 @@ - - - - - - - - - diff --git a/Localize/loc/cs/packages/react/i18n/resources.resjson.lcl b/Localize/loc/cs/packages/react/i18n/resources.resjson.lcl index cfe355ee0..6697d2d30 100644 --- a/Localize/loc/cs/packages/react/i18n/resources.resjson.lcl +++ b/Localize/loc/cs/packages/react/i18n/resources.resjson.lcl @@ -18,56 +18,92 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -108,6 +144,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Localize/loc/de/desktop/i18n/resources.resjson.lcl b/Localize/loc/de/desktop/i18n/resources.resjson.lcl index a71062992..4384001db 100644 --- a/Localize/loc/de/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/de/desktop/i18n/resources.resjson.lcl @@ -21,10 +21,13 @@ - + + + + @@ -1459,29 +1462,11 @@ - + - - - - - - - - - - - - - - - - - - - + - + @@ -1495,15 +1480,6 @@ - - - - - - - - - diff --git a/Localize/loc/de/packages/react/i18n/resources.resjson.lcl b/Localize/loc/de/packages/react/i18n/resources.resjson.lcl index d9f4d04f9..8d8d44d4b 100644 --- a/Localize/loc/de/packages/react/i18n/resources.resjson.lcl +++ b/Localize/loc/de/packages/react/i18n/resources.resjson.lcl @@ -18,56 +18,92 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -108,6 +144,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Localize/loc/es/desktop/i18n/resources.resjson.lcl b/Localize/loc/es/desktop/i18n/resources.resjson.lcl index af70c2846..b49778ba5 100644 --- a/Localize/loc/es/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/es/desktop/i18n/resources.resjson.lcl @@ -21,10 +21,13 @@ - + - + + + + @@ -1459,29 +1462,11 @@ - + - - - - - - - - - - - - - - - - - - - + - + @@ -1495,15 +1480,6 @@ - - - - - - - - - diff --git a/Localize/loc/es/packages/react/i18n/resources.resjson.lcl b/Localize/loc/es/packages/react/i18n/resources.resjson.lcl index 9f2c0014d..075952279 100644 --- a/Localize/loc/es/packages/react/i18n/resources.resjson.lcl +++ b/Localize/loc/es/packages/react/i18n/resources.resjson.lcl @@ -18,56 +18,92 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -108,6 +144,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Localize/loc/fr/desktop/i18n/resources.resjson.lcl b/Localize/loc/fr/desktop/i18n/resources.resjson.lcl index e61abfa4a..625613355 100644 --- a/Localize/loc/fr/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/fr/desktop/i18n/resources.resjson.lcl @@ -21,10 +21,13 @@ - + - + + + + @@ -1459,29 +1462,11 @@ - + - - - - - - - - - - - - - - - - - - - - - + + + @@ -1495,15 +1480,6 @@ - - - - - - - - - diff --git a/Localize/loc/fr/packages/react/i18n/resources.resjson.lcl b/Localize/loc/fr/packages/react/i18n/resources.resjson.lcl index aa9b92b72..b45cad325 100644 --- a/Localize/loc/fr/packages/react/i18n/resources.resjson.lcl +++ b/Localize/loc/fr/packages/react/i18n/resources.resjson.lcl @@ -18,56 +18,92 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -108,6 +144,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Localize/loc/hu/desktop/i18n/resources.resjson.lcl b/Localize/loc/hu/desktop/i18n/resources.resjson.lcl index bcaf67dd3..de4d25992 100644 --- a/Localize/loc/hu/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/hu/desktop/i18n/resources.resjson.lcl @@ -21,10 +21,13 @@ - + - + + + + @@ -1459,29 +1462,11 @@ - + - + - - - - - - - - - - - - - - - - - - - + @@ -1495,15 +1480,6 @@ - - - - - - - - - diff --git a/Localize/loc/hu/packages/react/i18n/resources.resjson.lcl b/Localize/loc/hu/packages/react/i18n/resources.resjson.lcl index bcd9bcc1b..757afb153 100644 --- a/Localize/loc/hu/packages/react/i18n/resources.resjson.lcl +++ b/Localize/loc/hu/packages/react/i18n/resources.resjson.lcl @@ -18,56 +18,92 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -108,6 +144,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Localize/loc/id/desktop/i18n/resources.resjson.lcl b/Localize/loc/id/desktop/i18n/resources.resjson.lcl index fae7e0661..4f756dac3 100644 --- a/Localize/loc/id/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/id/desktop/i18n/resources.resjson.lcl @@ -20,10 +20,13 @@ - + - + + + + @@ -1458,29 +1461,11 @@ - + - + - - - - - - - - - - - - - - - - - - - + @@ -1494,15 +1479,6 @@ - - - - - - - - - diff --git a/Localize/loc/id/packages/react/i18n/resources.resjson.lcl b/Localize/loc/id/packages/react/i18n/resources.resjson.lcl index 41d0eabe8..25785892a 100644 --- a/Localize/loc/id/packages/react/i18n/resources.resjson.lcl +++ b/Localize/loc/id/packages/react/i18n/resources.resjson.lcl @@ -18,56 +18,92 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -108,6 +144,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Localize/loc/it/desktop/i18n/resources.resjson.lcl b/Localize/loc/it/desktop/i18n/resources.resjson.lcl index c2f08791c..aaf7ee24f 100644 --- a/Localize/loc/it/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/it/desktop/i18n/resources.resjson.lcl @@ -21,10 +21,13 @@ - - - + + + + + + @@ -1459,29 +1462,11 @@ - - - - - - - - - - + - + - - - - - - - - - - + @@ -1495,15 +1480,6 @@ - - - - - - - - - diff --git a/Localize/loc/it/packages/react/i18n/resources.resjson.lcl b/Localize/loc/it/packages/react/i18n/resources.resjson.lcl index f8a586514..b10b39574 100644 --- a/Localize/loc/it/packages/react/i18n/resources.resjson.lcl +++ b/Localize/loc/it/packages/react/i18n/resources.resjson.lcl @@ -18,56 +18,92 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -108,6 +144,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Localize/loc/ja/desktop/i18n/resources.resjson.lcl b/Localize/loc/ja/desktop/i18n/resources.resjson.lcl index 2641e9799..454583245 100644 --- a/Localize/loc/ja/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/ja/desktop/i18n/resources.resjson.lcl @@ -21,10 +21,13 @@ - - - + + + + + + @@ -1459,29 +1462,11 @@ - - - - - - - - - - - - - - - - - - - + - - - + + + @@ -1495,15 +1480,6 @@ - - - - - - - - - diff --git a/Localize/loc/ja/packages/react/i18n/resources.resjson.lcl b/Localize/loc/ja/packages/react/i18n/resources.resjson.lcl index 0731d2d75..eac206cfe 100644 --- a/Localize/loc/ja/packages/react/i18n/resources.resjson.lcl +++ b/Localize/loc/ja/packages/react/i18n/resources.resjson.lcl @@ -18,56 +18,92 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -108,6 +144,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Localize/loc/ko/desktop/i18n/resources.resjson.lcl b/Localize/loc/ko/desktop/i18n/resources.resjson.lcl index dc6be2883..412943fc0 100644 --- a/Localize/loc/ko/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/ko/desktop/i18n/resources.resjson.lcl @@ -21,10 +21,13 @@ - - - + + + + + + @@ -1459,29 +1462,11 @@ - - - - - - - - - - - - - - - - - - - + - - - + + + @@ -1495,15 +1480,6 @@ - - - - - - - - - diff --git a/Localize/loc/ko/packages/react/i18n/resources.resjson.lcl b/Localize/loc/ko/packages/react/i18n/resources.resjson.lcl index 08ae36413..87cf90d1b 100644 --- a/Localize/loc/ko/packages/react/i18n/resources.resjson.lcl +++ b/Localize/loc/ko/packages/react/i18n/resources.resjson.lcl @@ -18,56 +18,92 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -108,6 +144,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Localize/loc/nl/desktop/i18n/resources.resjson.lcl b/Localize/loc/nl/desktop/i18n/resources.resjson.lcl index d450e7314..d57acd13b 100644 --- a/Localize/loc/nl/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/nl/desktop/i18n/resources.resjson.lcl @@ -21,10 +21,13 @@ - + - + + + + @@ -1459,29 +1462,11 @@ - + - + - - - - - - - - - - - - - - - - - - - + @@ -1495,15 +1480,6 @@ - - - - - - - - - diff --git a/Localize/loc/nl/packages/react/i18n/resources.resjson.lcl b/Localize/loc/nl/packages/react/i18n/resources.resjson.lcl index 561ba5f66..d3d81113a 100644 --- a/Localize/loc/nl/packages/react/i18n/resources.resjson.lcl +++ b/Localize/loc/nl/packages/react/i18n/resources.resjson.lcl @@ -18,56 +18,92 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -108,6 +144,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Localize/loc/pl/desktop/i18n/resources.resjson.lcl b/Localize/loc/pl/desktop/i18n/resources.resjson.lcl index e4ef99590..956db0d5f 100644 --- a/Localize/loc/pl/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/pl/desktop/i18n/resources.resjson.lcl @@ -21,10 +21,13 @@ - + - + + + + @@ -1459,29 +1462,11 @@ - + - + - - - - - - - - - - - - - - - - - - - + @@ -1495,15 +1480,6 @@ - - - - - - - - - diff --git a/Localize/loc/pl/packages/react/i18n/resources.resjson.lcl b/Localize/loc/pl/packages/react/i18n/resources.resjson.lcl index ed6500c6d..577338814 100644 --- a/Localize/loc/pl/packages/react/i18n/resources.resjson.lcl +++ b/Localize/loc/pl/packages/react/i18n/resources.resjson.lcl @@ -18,56 +18,92 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -108,6 +144,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Localize/loc/pt-BR/desktop/i18n/resources.resjson.lcl b/Localize/loc/pt-BR/desktop/i18n/resources.resjson.lcl index be6c6a4da..8b3da84bc 100644 --- a/Localize/loc/pt-BR/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/pt-BR/desktop/i18n/resources.resjson.lcl @@ -21,10 +21,13 @@ - - - + + + + + + @@ -1459,29 +1462,11 @@ - - - - - - - - - - - - - - - - - - - + - - - + + + @@ -1495,15 +1480,6 @@ - - - - - - - - - diff --git a/Localize/loc/pt-BR/packages/react/i18n/resources.resjson.lcl b/Localize/loc/pt-BR/packages/react/i18n/resources.resjson.lcl index 4453fee42..f530beeea 100644 --- a/Localize/loc/pt-BR/packages/react/i18n/resources.resjson.lcl +++ b/Localize/loc/pt-BR/packages/react/i18n/resources.resjson.lcl @@ -18,56 +18,92 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -108,6 +144,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Localize/loc/pt-PT/desktop/i18n/resources.resjson.lcl b/Localize/loc/pt-PT/desktop/i18n/resources.resjson.lcl index 4b049bbec..a2ce69f3f 100644 --- a/Localize/loc/pt-PT/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/pt-PT/desktop/i18n/resources.resjson.lcl @@ -21,10 +21,13 @@ - + - + + + + @@ -1459,29 +1462,11 @@ - + - + - - - - - - - - - - - - - - - - - - - + @@ -1495,15 +1480,6 @@ - - - - - - - - - diff --git a/Localize/loc/pt-PT/packages/react/i18n/resources.resjson.lcl b/Localize/loc/pt-PT/packages/react/i18n/resources.resjson.lcl index 4237088ce..6e27d96bc 100644 --- a/Localize/loc/pt-PT/packages/react/i18n/resources.resjson.lcl +++ b/Localize/loc/pt-PT/packages/react/i18n/resources.resjson.lcl @@ -18,56 +18,92 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -108,6 +144,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Localize/loc/ru/desktop/i18n/resources.resjson.lcl b/Localize/loc/ru/desktop/i18n/resources.resjson.lcl index b6321bc86..7c2ac6091 100644 --- a/Localize/loc/ru/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/ru/desktop/i18n/resources.resjson.lcl @@ -21,10 +21,13 @@ - + - + + + + @@ -1459,29 +1462,11 @@ - + - - - - - - - - - - - - - - - - - - - + - + @@ -1495,15 +1480,6 @@ - - - - - - - - - diff --git a/Localize/loc/ru/packages/react/i18n/resources.resjson.lcl b/Localize/loc/ru/packages/react/i18n/resources.resjson.lcl index 20e9c542c..ea0717acf 100644 --- a/Localize/loc/ru/packages/react/i18n/resources.resjson.lcl +++ b/Localize/loc/ru/packages/react/i18n/resources.resjson.lcl @@ -18,56 +18,92 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -108,6 +144,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Localize/loc/sv/desktop/i18n/resources.resjson.lcl b/Localize/loc/sv/desktop/i18n/resources.resjson.lcl index 8db571269..6363eb16b 100644 --- a/Localize/loc/sv/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/sv/desktop/i18n/resources.resjson.lcl @@ -21,10 +21,13 @@ - + - + + + + @@ -1459,29 +1462,11 @@ - + - + - - - - - - - - - - - - - - - - - - - + @@ -1495,15 +1480,6 @@ - - - - - - - - - diff --git a/Localize/loc/sv/packages/react/i18n/resources.resjson.lcl b/Localize/loc/sv/packages/react/i18n/resources.resjson.lcl index 008474b7b..83e13afb7 100644 --- a/Localize/loc/sv/packages/react/i18n/resources.resjson.lcl +++ b/Localize/loc/sv/packages/react/i18n/resources.resjson.lcl @@ -18,56 +18,92 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -108,6 +144,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Localize/loc/tr/desktop/i18n/resources.resjson.lcl b/Localize/loc/tr/desktop/i18n/resources.resjson.lcl index 7adcae3c1..19a107bc9 100644 --- a/Localize/loc/tr/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/tr/desktop/i18n/resources.resjson.lcl @@ -21,10 +21,13 @@ - + - + + + + @@ -1459,29 +1462,11 @@ - + - + - - - - - - - - - - - - - - - - - - - + @@ -1495,15 +1480,6 @@ - - - - - - - - - diff --git a/Localize/loc/tr/packages/react/i18n/resources.resjson.lcl b/Localize/loc/tr/packages/react/i18n/resources.resjson.lcl index 56353cf95..ea187e205 100644 --- a/Localize/loc/tr/packages/react/i18n/resources.resjson.lcl +++ b/Localize/loc/tr/packages/react/i18n/resources.resjson.lcl @@ -18,56 +18,92 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -108,6 +144,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Localize/loc/zh-Hans/desktop/i18n/resources.resjson.lcl b/Localize/loc/zh-Hans/desktop/i18n/resources.resjson.lcl index efb027037..4fa4c7c87 100644 --- a/Localize/loc/zh-Hans/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/zh-Hans/desktop/i18n/resources.resjson.lcl @@ -21,10 +21,13 @@ - - - + + + + + + @@ -1459,29 +1462,11 @@ - - - - - - - - - - - - - - - - - - - + - - - + + + @@ -1495,15 +1480,6 @@ - - - - - - - - - diff --git a/Localize/loc/zh-Hans/packages/react/i18n/resources.resjson.lcl b/Localize/loc/zh-Hans/packages/react/i18n/resources.resjson.lcl index b392865ef..a389c172d 100644 --- a/Localize/loc/zh-Hans/packages/react/i18n/resources.resjson.lcl +++ b/Localize/loc/zh-Hans/packages/react/i18n/resources.resjson.lcl @@ -18,56 +18,92 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -108,6 +144,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Localize/loc/zh-Hant/desktop/i18n/resources.resjson.lcl b/Localize/loc/zh-Hant/desktop/i18n/resources.resjson.lcl index ac448d40d..07a76d282 100644 --- a/Localize/loc/zh-Hant/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/zh-Hant/desktop/i18n/resources.resjson.lcl @@ -21,10 +21,13 @@ - + - + + + + @@ -1459,29 +1462,11 @@ - + - - - - - - - - - - - - - - - - - - - + - + @@ -1495,15 +1480,6 @@ - - - - - - - - - diff --git a/Localize/loc/zh-Hant/packages/react/i18n/resources.resjson.lcl b/Localize/loc/zh-Hant/packages/react/i18n/resources.resjson.lcl index a697dc7ad..581bdda65 100644 --- a/Localize/loc/zh-Hant/packages/react/i18n/resources.resjson.lcl +++ b/Localize/loc/zh-Hant/packages/react/i18n/resources.resjson.lcl @@ -18,56 +18,92 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -108,6 +144,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 6981b908029f6a63aa8e602f5c492495d7012bde Mon Sep 17 00:00:00 2001 From: David Watrous <509299+dpwatrous@users.noreply.github.com> Date: Tue, 14 May 2024 18:08:44 -0400 Subject: [PATCH 18/57] Add optional base URL path to environment (#2904) --- .../src/environment/abstract-environment.ts | 9 +++++ .../src/environment/environment.ts | 10 +++++ .../http/__tests__/fetch-http-client.spec.ts | 21 ++++++++++ .../http/__tests__/mock-http-client.spec.ts | 23 +++++++++++ .../bonito-core/src/http/fetch-http-client.ts | 2 + .../bonito-core/src/http/mock-http-client.ts | 2 + packages/bonito-core/src/index.ts | 2 + .../src/util/__tests__/url.spec.ts | 33 +++++++++++++++ packages/bonito-core/src/util/index.ts | 1 + packages/bonito-core/src/util/url.ts | 40 +++++++++++++++++++ 10 files changed, 143 insertions(+) create mode 100644 packages/bonito-core/src/util/__tests__/url.spec.ts create mode 100644 packages/bonito-core/src/util/url.ts diff --git a/packages/bonito-core/src/environment/abstract-environment.ts b/packages/bonito-core/src/environment/abstract-environment.ts index 34ec1b586..596ac79f9 100644 --- a/packages/bonito-core/src/environment/abstract-environment.ts +++ b/packages/bonito-core/src/environment/abstract-environment.ts @@ -13,6 +13,8 @@ import { import { Clock } from "../datetime/clock"; import { Notifier } from "../notification"; +const DEFAULT_BASE_PATH = "/"; + /** * Abstract base class for shared functionality across different environments */ @@ -32,6 +34,13 @@ export abstract class AbstractEnvironment< private _diContainer: DiContainer; + /** + * Get the globally configured base path, or "/" if none is defined. + */ + getBasePath(): string { + return this.config.basePath ?? DEFAULT_BASE_PATH; + } + /** * Get the currently configured clock */ diff --git a/packages/bonito-core/src/environment/environment.ts b/packages/bonito-core/src/environment/environment.ts index 92cf17db4..679fcff79 100644 --- a/packages/bonito-core/src/environment/environment.ts +++ b/packages/bonito-core/src/environment/environment.ts @@ -31,6 +31,11 @@ export interface Environment { */ readonly initialized: boolean; + /** + * Get the global base URI path + */ + getBasePath(): string; + /** * Gets the currently configured clock */ @@ -136,6 +141,11 @@ export interface EnvironmentConfig { */ armUrl: string; + /** + * The base path applied to all relative URIs + */ + basePath?: string; + /** * Environment variables when running in a Node.js process */ diff --git a/packages/bonito-core/src/http/__tests__/fetch-http-client.spec.ts b/packages/bonito-core/src/http/__tests__/fetch-http-client.spec.ts index 1f33916ac..12ababf01 100644 --- a/packages/bonito-core/src/http/__tests__/fetch-http-client.spec.ts +++ b/packages/bonito-core/src/http/__tests__/fetch-http-client.spec.ts @@ -1,3 +1,4 @@ +import { getEnvironment, initMockEnvironment } from "../../environment"; import { FetchHttpClient } from "../fetch-http-client"; import { HttpHeaders } from "../http-client"; import { MapHttpHeaders } from "../map-http-headers"; @@ -7,6 +8,8 @@ const RealHeaders = globalThis.Headers; describe("FetchHttpClient", () => { beforeEach(() => { + initMockEnvironment(); + // KLUDGE: Since JSDom doesn't support the Fetch API, // it doesn't have a Headers object, so define // one just for this test. @@ -43,6 +46,16 @@ describe("FetchHttpClient", () => { } } + if (input.startsWith("/a/b/c")) { + return new MockHttpResponse(input, { + status: 200, + body: "fake response from /a/b/c path", + headers: { + "Content-Type": "text/plain", + }, + }) as unknown as Response; + } + return new MockHttpResponse(input, { status: 200, body: "fake response", @@ -66,6 +79,14 @@ describe("FetchHttpClient", () => { expect(await response.text()).toBe("fake response"); }); + test("url request with base path", async () => { + getEnvironment().config.basePath = "/a/b/c/"; + const client = new FetchHttpClient(); + + const response = await client.fetch("/dogs/parker"); + expect(await response.text()).toBe("fake response from /a/b/c path"); + }); + test("request using object", async () => { const client = new FetchHttpClient(); diff --git a/packages/bonito-core/src/http/__tests__/mock-http-client.spec.ts b/packages/bonito-core/src/http/__tests__/mock-http-client.spec.ts index 7b7e687af..3584ca0cf 100644 --- a/packages/bonito-core/src/http/__tests__/mock-http-client.spec.ts +++ b/packages/bonito-core/src/http/__tests__/mock-http-client.spec.ts @@ -1,3 +1,4 @@ +import { getEnvironment, initMockEnvironment } from "../../environment"; import { MockHttpClient, MockHttpResponse } from "../mock-http-client"; const mockResponses = { @@ -17,9 +18,19 @@ const mockResponses = { "Content-Type": "application/json", }, }), + savannah: () => + new MockHttpResponse("/a/b/c/dogs/savannah", { + status: 200, + body: `{"name": "Savannah", "breed": "Husky"}`, + headers: { + "Content-Type": "application/json", + }, + }), }; describe("MockHttpClient", () => { + beforeEach(() => initMockEnvironment()); + test("can Mock a single GET request", async () => { const client = new MockHttpClient(); client.addExpected(mockResponses.parker()); @@ -30,6 +41,18 @@ describe("MockHttpClient", () => { ); }); + test("can use a non-default base path", async () => { + const client = new MockHttpClient(); + client.addExpected(mockResponses.savannah()); + + getEnvironment().config.basePath = "/a/b/c"; + + const response = await client.get("/dogs/savannah"); + expect(await response.text()).toBe( + `{"name": "Savannah", "breed": "Husky"}` + ); + }); + test("can get response body as JSON", async () => { const client = new MockHttpClient(); client.addExpected(mockResponses.parker()); diff --git a/packages/bonito-core/src/http/fetch-http-client.ts b/packages/bonito-core/src/http/fetch-http-client.ts index 1ef5da731..4d70c6061 100644 --- a/packages/bonito-core/src/http/fetch-http-client.ts +++ b/packages/bonito-core/src/http/fetch-http-client.ts @@ -1,3 +1,4 @@ +import { normalizeUrl } from "../util/url"; import { CustomHttpHeaders } from "./constants"; import { AbstractHttpClient, HttpRequestInit } from "./http-client"; @@ -28,6 +29,7 @@ export class FetchHttpClient extends AbstractHttpClient { } url = req.url; } + url = normalizeUrl(url); let responsePromise: Promise; if (!req) { diff --git a/packages/bonito-core/src/http/mock-http-client.ts b/packages/bonito-core/src/http/mock-http-client.ts index abaf50fb4..6d30eb9fd 100644 --- a/packages/bonito-core/src/http/mock-http-client.ts +++ b/packages/bonito-core/src/http/mock-http-client.ts @@ -1,3 +1,4 @@ +import { normalizeUrl } from "../util/url"; import { HttpRequestMethod } from "./constants"; import { AbstractHttpClient, @@ -34,6 +35,7 @@ export class MockHttpClient extends AbstractHttpClient { } url = urlOrRequest.url; } + url = normalizeUrl(url); const key = this._getKeyFromRequest(url, props); const expected = this._expectedResponses[key]; diff --git a/packages/bonito-core/src/index.ts b/packages/bonito-core/src/index.ts index 9c7413870..a1a8caaf5 100644 --- a/packages/bonito-core/src/index.ts +++ b/packages/bonito-core/src/index.ts @@ -43,8 +43,10 @@ export { debounce, DebouncedFunction, delay, + getNormalizedBasePath, isPromiseLike, mergeDeep, + normalizeUrl, startsWithIgnoreCase, uniqueId, } from "./util"; diff --git a/packages/bonito-core/src/util/__tests__/url.spec.ts b/packages/bonito-core/src/util/__tests__/url.spec.ts new file mode 100644 index 000000000..e5950fc94 --- /dev/null +++ b/packages/bonito-core/src/util/__tests__/url.spec.ts @@ -0,0 +1,33 @@ +import { getEnvironment, initMockEnvironment } from "../../environment"; +import { getNormalizedBasePath, normalizeUrl } from "../url"; + +describe("URL utility functions", () => { + beforeEach(() => initMockEnvironment()); + + test("getNormalizedBasePath() function", () => { + expect(getNormalizedBasePath()).toEqual("/"); + getEnvironment().config.basePath = "a/"; + expect(getNormalizedBasePath()).toEqual("/a/"); + getEnvironment().config.basePath = "/a/b"; + expect(getNormalizedBasePath()).toEqual("/a/b/"); + }); + + test("normalizeUrl() function", () => { + // Relative URLs include leading slashes + expect(normalizeUrl("a")).toEqual("/a"); + getEnvironment().config.basePath = "a/b"; + expect(normalizeUrl("hello")).toEqual("/a/b/hello"); + expect(normalizeUrl("/hello")).toEqual("/a/b/hello"); + expect(normalizeUrl("/hello?param1=value1¶m2=value2")).toEqual( + "/a/b/hello?param1=value1¶m2=value2" + ); + + // External URLs are left untouched + expect(normalizeUrl("https://contoso.net/a/b/c")).toEqual( + "https://contoso.net/a/b/c" + ); + expect(normalizeUrl("http://contoso.net/a/b/c")).toEqual( + "http://contoso.net/a/b/c" + ); + }); +}); diff --git a/packages/bonito-core/src/util/index.ts b/packages/bonito-core/src/util/index.ts index a2634fcec..2e5169b04 100644 --- a/packages/bonito-core/src/util/index.ts +++ b/packages/bonito-core/src/util/index.ts @@ -3,3 +3,4 @@ export * from "./ordered-map"; export * from "./string"; export * from "./deferred"; export * from "./cancellable-promise"; +export * from "./url"; diff --git a/packages/bonito-core/src/util/url.ts b/packages/bonito-core/src/util/url.ts new file mode 100644 index 000000000..36dbf89a6 --- /dev/null +++ b/packages/bonito-core/src/util/url.ts @@ -0,0 +1,40 @@ +import { getEnvironment } from "../environment"; + +/** + * Get the globally configured base path, normalized to always include both + * leading and trailing forward slashes. + * + * For example, if the basePath config property is "foo", this function will + * return "/foo/". + */ +export function getNormalizedBasePath(): string { + let basePath = getEnvironment().getBasePath(); + if (!basePath.endsWith("/")) { + basePath = basePath + "/"; + } + if (!basePath.startsWith("/")) { + basePath = "/" + basePath; + } + return basePath; +} + +/** + * Returns a normalized URL which is either absolute, or if relative + * always includes a leading slash and any configured base path. + * + * @param url A relative or absolute URL string + * @returns A normalized URL string + */ +export function normalizeUrl(url: string): string { + if (!url || typeof url !== "string") { + throw new Error("Cannot normalize invalid URL: " + url); + } + + if (url.indexOf("http") === 0) { + // Absolute URLs are left untouched + return url; + } + + const relPath = url.charAt(0) === "/" ? url.substring(1) : url; + return getNormalizedBasePath() + relPath; +} From a10bb063c0c32af0d089458ee7335139019420d1 Mon Sep 17 00:00:00 2001 From: David Watrous <509299+dpwatrous@users.noreply.github.com> Date: Wed, 22 May 2024 11:52:14 -0400 Subject: [PATCH 19/57] Switch from Windows Powershell to pwsh (#2906) --- .vsts/common/set-dist-vars.yml | 2 +- .vsts/node-setup.yml | 2 +- .vsts/python-setup.yml | 2 +- .vsts/win/ci.yml | 4 ++-- .vsts/win/distribution.yml | 12 ++++++------ .vsts/win/win-dependencies.yml | 2 +- desktop/scripts/docker/windows/Dockerfile | 2 +- desktop/scripts/proxy/virtual-machine.bicep | 2 +- docs/setup.md | 5 +++-- package.json | 4 ++-- 10 files changed, 19 insertions(+), 18 deletions(-) diff --git a/.vsts/common/set-dist-vars.yml b/.vsts/common/set-dist-vars.yml index 84c4f4138..a1f215f63 100644 --- a/.vsts/common/set-dist-vars.yml +++ b/.vsts/common/set-dist-vars.yml @@ -1,3 +1,3 @@ steps: - - powershell: $(Build.SourcesDirectory)/.vsts/common/build-vars.ps1 "$(Build.SourceBranch)" "$(Build.BuildNumber)" + - pwsh: $(Build.SourcesDirectory)/.vsts/common/build-vars.ps1 "$(Build.SourceBranch)" "$(Build.BuildNumber)" displayName: Resolve build info diff --git a/.vsts/node-setup.yml b/.vsts/node-setup.yml index 41b74746a..66491a886 100644 --- a/.vsts/node-setup.yml +++ b/.vsts/node-setup.yml @@ -19,7 +19,7 @@ steps: echo "##vso[task.setvariable variable=npm_config_userconfig]$(Agent.TempDirectory)/.npmrc" condition: ne( variables['Agent.OS'], 'Windows_NT' ) displayName: Set NPM userconfig (Linux/MacOS) - - powershell: | + - pwsh: | Write-Host "##vso[task.setvariable variable=npm_config_userconfig]$env:AGENT_TEMPDIRECTORY\.npmrc" condition: eq( variables['Agent.OS'], 'Windows_NT' ) displayName: Set NPM userconfig (Windows) diff --git a/.vsts/python-setup.yml b/.vsts/python-setup.yml index 7449f633b..ffe0d9a1b 100644 --- a/.vsts/python-setup.yml +++ b/.vsts/python-setup.yml @@ -19,7 +19,7 @@ steps: condition: ne( variables['Agent.OS'], 'Windows_NT' ) displayName: Install Python dependencies (Linux) - - powershell: | + - pwsh: | . .vsts/win/exec.ps1 $ErrorActionPreference = "Stop" $(Agent.WorkFolder)\.venv\batchexplorer\Scripts\Activate.ps1 diff --git a/.vsts/win/ci.yml b/.vsts/win/ci.yml index 3b5c889bc..6c4be757c 100644 --- a/.vsts/win/ci.yml +++ b/.vsts/win/ci.yml @@ -2,12 +2,12 @@ steps: - template: ./credscan.yml - template: ./win-dependencies.yml - - powershell: | + - pwsh: | $(Agent.WorkFolder)\.venv\batchexplorer\Scripts\Activate.ps1 npm run build:package displayName: Build and package - - powershell: | + - pwsh: | . ../.vsts/win/exec.ps1 $ErrorActionPreference = "Stop" $env:BE_TEST_AAD_USER_EMAIL = "$(uiTestingAccountEmail)" diff --git a/.vsts/win/distribution.yml b/.vsts/win/distribution.yml index ced48706d..7d70ea2ed 100644 --- a/.vsts/win/distribution.yml +++ b/.vsts/win/distribution.yml @@ -4,25 +4,25 @@ steps: - template: ./win-dependencies.yml - template: ../common/download-i18n-artifacts.yml - - powershell: | + - pwsh: | $(System.DefaultWorkingDirectory)/Localize/copy-translations.ps1 -artifactsPath "$(Agent.BuildDirectory)/drop/loc" displayName: 'Run copy-translations.ps1 with artifacts path (Windows)' - - powershell: | + - pwsh: | $version = npm run -s ts scripts/package/get-version Write-Host "Updating build number to $version" Write-Host "##vso[build.updatebuildnumber]$version" workingDirectory: desktop displayName: Update build version for packaging - - powershell: | + - pwsh: | . .vsts/win/exec.ps1 $ErrorActionPreference = "Stop" $(Agent.WorkFolder)\.venv\batchexplorer\Scripts\Activate.ps1 exec { npm run build:prod } displayName: Build all packages - - powershell: | + - pwsh: | . ../.vsts/win/exec.ps1 $ErrorActionPreference = "Stop" $(Agent.WorkFolder)\.venv\batchexplorer\Scripts\Activate.ps1 @@ -41,7 +41,7 @@ steps: **/*.dll !**/python36.dll - - powershell: npm run package win-installer + - pwsh: npm run package win-installer workingDirectory: desktop displayName: Build installer @@ -51,7 +51,7 @@ steps: pattern: | **/BatchExplorer*Setup*.exe - - powershell: npm run package win-manifest + - pwsh: npm run package win-manifest workingDirectory: desktop displayName: Create manifest - template: ../common/generate-sbom.yml diff --git a/.vsts/win/win-dependencies.yml b/.vsts/win/win-dependencies.yml index 20756170a..ea5b80d63 100644 --- a/.vsts/win/win-dependencies.yml +++ b/.vsts/win/win-dependencies.yml @@ -1,6 +1,6 @@ steps: - template: ../dependencies.yml - - powershell: | + - pwsh: | . .vsts/win/exec.ps1 $ErrorActionPreference = "Stop" exec { Write-Host "Node.js version" $(node --version) } diff --git a/desktop/scripts/docker/windows/Dockerfile b/desktop/scripts/docker/windows/Dockerfile index d2711d9fb..6c2ba7cf1 100644 --- a/desktop/scripts/docker/windows/Dockerfile +++ b/desktop/scripts/docker/windows/Dockerfile @@ -10,7 +10,7 @@ ENV GIT_VERSION 2.17.1 LABEL Description="BatchLabs image for building for windows" Maintainer="batchexplorer@microsoft.com" Version="${node_version}" -SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"] +SHELL ["pwsh", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"] # Install node ADD https://nodejs.org/dist/v${node_version}/node-v${node_version}-win-x64.zip C:/build/node.zip diff --git a/desktop/scripts/proxy/virtual-machine.bicep b/desktop/scripts/proxy/virtual-machine.bicep index cfe62fda4..0f0037e27 100644 --- a/desktop/scripts/proxy/virtual-machine.bicep +++ b/desktop/scripts/proxy/virtual-machine.bicep @@ -88,7 +88,7 @@ resource windowsVMExtensions 'Microsoft.Compute/virtualMachines/extensions@2020- fileUris: [ 'https://raw.githubusercontent.com/Azure/BatchExplorer/main/scripts/proxy/initVirtualMachine.ps1' ] - commandToExecute: 'powershell -ExecutionPolicy Bypass -File initVirtualMachine.ps1 -Address ${proxyServer} -Port ${proxyPort} -Build ${batchExplorerBuild}' + commandToExecute: 'pwsh -ExecutionPolicy Bypass -File initVirtualMachine.ps1 -Address ${proxyServer} -Port ${proxyPort} -Build ${batchExplorerBuild}' } } } diff --git a/docs/setup.md b/docs/setup.md index ac6af51b6..b040a09fc 100644 --- a/docs/setup.md +++ b/docs/setup.md @@ -6,8 +6,9 @@ The following are instructions for building and running Batch Explorer in a deve Make sure the following are installed: - - Node.js 18 or higher - - Python 3.6 or higher + - Node.js LTS + - Python 3.6+ + - Powershell 7+ **On Windows:** diff --git a/package.json b/package.json index 5aa95cacc..a0aab0069 100644 --- a/package.json +++ b/package.json @@ -72,8 +72,8 @@ "lint": "prettier -c . && lerna run --parallel workspace:lint --stream && npm run -s lint:markdown", "lint:fix": "prettier -w . && lerna run --parallel workspace:lint:fix --stream && npm run -s lint:markdown", "lint:markdown": "markdownlint-cli2 \"**/*.md\" \"#**/node_modules/**/*\" \"#SECURITY.md\"", - "loc:build": "powershell -ExecutionPolicy Bypass -File ./Localize/build.ps1 && powershell -ExecutionPolicy Bypass -File ./Localize/copy-translations.ps1", - "loc:restore": "cd Localize && powershell -ExecutionPolicy Bypass -File restore.ps1", + "loc:build": "pwsh -ExecutionPolicy Bypass -File ./Localize/build.ps1 && pwsh -ExecutionPolicy Bypass -File ./Localize/copy-translations.ps1", + "loc:restore": "cd Localize && pwsh -ExecutionPolicy Bypass -File restore.ps1", "start": "npm run -s start:web", "start:desktop": "lerna run --parallel workspace:start:desktop --stream", "start:web": "lerna run --parallel workspace:start:web --stream", From 165b61f873c7031616a7bdcfec7d8fa92abc7f78 Mon Sep 17 00:00:00 2001 From: David Watrous <509299+dpwatrous@users.noreply.github.com> Date: Fri, 31 May 2024 12:17:11 -0400 Subject: [PATCH 20/57] Use async iterator for node service list (#2907) * Node service refactoring List API now uses async iterator. Also some naming changes, tests. * Add test for listing VM extensions to live-node-service --- .../src/vm-extension/node-vm-ext-list.tsx | 2 +- .../node/__tests__/fake-node-service.spec.ts | 23 +-- .../node/__tests__/live-node-service.spec.ts | 95 +++++++++++ .../service/src/node/fake-node-service.ts | 35 ++-- .../service/src/node/live-node-service.ts | 58 +++++-- packages/service/src/node/node-service.ts | 24 ++- .../__tests__/paging-test-util.spec.ts | 51 ++++++ packages/service/src/test-util/fakes.ts | 150 ++++++++++++------ .../service/src/test-util/paging-test-util.ts | 51 ++++++ 9 files changed, 397 insertions(+), 92 deletions(-) create mode 100644 packages/service/src/node/__tests__/live-node-service.spec.ts create mode 100644 packages/service/src/test-util/__tests__/paging-test-util.spec.ts create mode 100644 packages/service/src/test-util/paging-test-util.ts diff --git a/packages/react/src/vm-extension/node-vm-ext-list.tsx b/packages/react/src/vm-extension/node-vm-ext-list.tsx index c4acbcd6b..01ca49e29 100644 --- a/packages/react/src/vm-extension/node-vm-ext-list.tsx +++ b/packages/react/src/vm-extension/node-vm-ext-list.tsx @@ -25,7 +25,7 @@ export const NodeVMExtList = (props: NodeVmExtensionListProps) => { let isMounted = true; setLoading(true); nodeService - .listBatchNodeExtensions(accountEndpoint, poolId, nodeId) + .listVmExtensions(accountEndpoint, poolId, nodeId) .then((resList) => { if (!isMounted) { return; diff --git a/packages/service/src/node/__tests__/fake-node-service.spec.ts b/packages/service/src/node/__tests__/fake-node-service.spec.ts index deca7f9e1..977e38400 100644 --- a/packages/service/src/node/__tests__/fake-node-service.spec.ts +++ b/packages/service/src/node/__tests__/fake-node-service.spec.ts @@ -3,8 +3,7 @@ import { BatchFakeSet, BasicBatchFakeSet } from "../../test-util/fakes"; import { FakeNodeService } from "../fake-node-service"; describe("FakeNodeService", () => { - const poolId = `/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/supercomputing/providers/Microsoft.Batch/batchAccounts/hobo/pools/hobopool1`; - const nodeId = `tvmps_id1`; + const hoboAcctEndpoint = "mercury.eastus.batch.azure.com"; let service: FakeNodeService; let fakeSet: BatchFakeSet; @@ -17,18 +16,24 @@ describe("FakeNodeService", () => { }); test("List batch nodes", async () => { - const nodes = await service.listBatchNodes("", poolId); - expect(nodes?.map((node) => node.id)).toEqual([nodeId]); + const nodes = await service.listNodes(hoboAcctEndpoint, "hobopool1"); + + const allNodes = []; + for await (const node of nodes) { + allNodes.push(node); + } + + expect(allNodes.map((node) => node.id)).toEqual(["tvmps_id1"]); }); test("List batch node extensions", async () => { - const extensions = await service.listBatchNodeExtensions( - "", - "", - nodeId + const extensions = await service.listVmExtensions( + hoboAcctEndpoint, + "hobopool1", + "tvmps_id1" ); expect( - extensions?.map((extension) => extension?.vmExtension?.name) + extensions.map((extension) => extension?.vmExtension?.name) ).toEqual(["CustomExtension100"]); }); }); diff --git a/packages/service/src/node/__tests__/live-node-service.spec.ts b/packages/service/src/node/__tests__/live-node-service.spec.ts new file mode 100644 index 000000000..9953d2117 --- /dev/null +++ b/packages/service/src/node/__tests__/live-node-service.spec.ts @@ -0,0 +1,95 @@ +import { getMockEnvironment } from "@azure/bonito-core/lib/environment"; +import { MockHttpClient, MockHttpResponse } from "@azure/bonito-core/lib/http"; +import { BatchApiVersion } from "../../constants"; +import { initMockBatchEnvironment } from "../../environment"; +import { BasicBatchFakeSet, BatchFakeSet } from "../../test-util/fakes"; +import { LiveNodeService } from "../live-node-service"; +import { NodeService } from "../node-service"; + +describe("LiveNodeService", () => { + const hoboAcctEndpoint = "mercury.eastus.batch.azure.com"; + + let service: NodeService; + let fakeSet: BatchFakeSet; + + let httpClient: MockHttpClient; + + beforeEach(() => { + initMockBatchEnvironment(); + httpClient = getMockEnvironment().getHttpClient(); + service = new LiveNodeService(); + fakeSet = new BasicBatchFakeSet(); + }); + + test("Simple get", async () => { + httpClient.addExpected( + new MockHttpResponse( + `https://${hoboAcctEndpoint}/pools/hobopool1/nodes/tvmps_id1?api-version=${BatchApiVersion.data}`, + { + status: 200, + body: JSON.stringify( + fakeSet.getNode( + hoboAcctEndpoint, + "hobopool1", + "tvmps_id1" + ) + ), + } + ) + ); + + const node = await service.getNode( + hoboAcctEndpoint, + "hobopool1", + "tvmps_id1" + ); + expect(node).toBeDefined(); + expect(node.id).toEqual("tvmps_id1"); + }); + + test("List by pool", async () => { + httpClient.addExpected( + new MockHttpResponse( + `https://${hoboAcctEndpoint}/pools/hobopool1/nodes?api-version=${BatchApiVersion.data}`, + { + status: 200, + body: JSON.stringify({ + value: fakeSet.listNodes(hoboAcctEndpoint, "hobopool1"), + }), + } + ) + ); + + const nodes = await service.listNodes(hoboAcctEndpoint, "hobopool1"); + const allNodes = []; + for await (const node of nodes) { + allNodes.push(node); + } + expect(allNodes.length).toBe(1); + expect(allNodes.map((node) => node.id)).toEqual(["tvmps_id1"]); + }); + + test("List VM extensions", async () => { + httpClient.addExpected( + new MockHttpResponse( + `https://${hoboAcctEndpoint}/pools/hobopool1/nodes/tvmps_id1/extensions?api-version=${BatchApiVersion.data}`, + { + status: 200, + body: JSON.stringify({ + value: fakeSet.listVmExtensions("tvmps_id1"), + }), + } + ) + ); + + const extensions = await service.listVmExtensions( + hoboAcctEndpoint, + "hobopool1", + "tvmps_id1" + ); + expect(extensions.length).toBe(1); + expect(extensions.map((ext) => ext.vmExtension?.name)).toEqual([ + "CustomExtension100", + ]); + }); +}); diff --git a/packages/service/src/node/fake-node-service.ts b/packages/service/src/node/fake-node-service.ts index 8fb47a6bf..c808964a2 100644 --- a/packages/service/src/node/fake-node-service.ts +++ b/packages/service/src/node/fake-node-service.ts @@ -1,7 +1,9 @@ import { OperationOptions } from "@azure/bonito-core"; import { BatchFakeSet, BasicBatchFakeSet } from "../test-util/fakes"; import { BatchNodeOutput, BatchNodeVMExtensionOutput } from "./node-models"; -import type { NodeService } from "./node-service"; +import type { ListNodesOptions, NodeService } from "./node-service"; +import { PagedAsyncIterableIterator } from "@azure/core-paging"; +import { createPagedArray } from "../test-util/paging-test-util"; export class FakeNodeService implements NodeService { fakeSet: BatchFakeSet = new BasicBatchFakeSet(); @@ -10,20 +12,31 @@ export class FakeNodeService implements NodeService { this.fakeSet = fakeSet; } - async listBatchNodes( + async getNode( accountEndpoint: string, - poolId: string, - opts?: OperationOptions | undefined - ): Promise { - return this.fakeSet.listBatchNodes(poolId); + poolName: string, + nodeId: string, + opts?: OperationOptions + ): Promise { + return this.fakeSet.getNode(accountEndpoint, poolName, nodeId); + } + + async listNodes( + accountEndpoint: string, + poolName: string, + opts?: ListNodesOptions + ): Promise> { + return createPagedArray( + this.fakeSet.listNodes(accountEndpoint, poolName) + ); } - async listBatchNodeExtensions( + async listVmExtensions( accountEndpoint: string, - poolId: string, + poolName: string, nodeId: string, - opts?: OperationOptions | undefined - ): Promise { - return this.fakeSet.listBatchNodeExtensions(nodeId); + opts?: OperationOptions + ): Promise { + return this.fakeSet.listVmExtensions(nodeId); } } diff --git a/packages/service/src/node/live-node-service.ts b/packages/service/src/node/live-node-service.ts index 7199b5c7d..d3e441949 100644 --- a/packages/service/src/node/live-node-service.ts +++ b/packages/service/src/node/live-node-service.ts @@ -1,8 +1,13 @@ import { AbstractHttpService, OperationOptions } from "@azure/bonito-core"; import { BatchNodeOutput, BatchNodeVMExtensionOutput } from "./node-models"; -import { NodeService } from "./node-service"; -import { createBatchClient, isUnexpected } from "../internal/batch-rest"; +import { ListNodesOptions, NodeService } from "./node-service"; +import { + createBatchClient, + isUnexpected, + paginate, +} from "../internal/batch-rest"; import { createBatchUnexpectedStatusCodeError } from "../utils"; +import { PagedAsyncIterableIterator } from "@azure/core-paging"; export class LiveNodeService extends AbstractHttpService @@ -16,43 +21,68 @@ export class LiveNodeService return accountEndpoint; } - async listBatchNodes( + async getNode( accountEndpoint: string, - poolId: string, - opts?: OperationOptions | undefined - ): Promise { + poolName: string, + nodeId: string, + opts?: OperationOptions + ): Promise { + const batchClient = createBatchClient( + this._ensureHttpsEndpoint(accountEndpoint) + ); + + const res = await batchClient + .path("/pools/{poolId}/nodes/{nodeId}", poolName, nodeId) + .get(); + + if (isUnexpected(res)) { + throw createBatchUnexpectedStatusCodeError(res); + } + + return res.body; + } + + async listNodes( + accountEndpoint: string, + poolName: string, + opts?: ListNodesOptions + ): Promise> { const listNodePath = "/pools/{poolId}/nodes"; const batchClient = createBatchClient( this._ensureHttpsEndpoint(accountEndpoint) ); - const res = await batchClient.path(listNodePath, poolId).get(); + const res = await batchClient.path(listNodePath, poolName).get({ + queryParameters: { + $filter: opts?.filter, + }, + }); if (isUnexpected(res)) { throw createBatchUnexpectedStatusCodeError(res); } - return res.body.value; + return paginate(batchClient, res); } - async listBatchNodeExtensions( + async listVmExtensions( accountEndpoint: string, - poolId: string, + poolName: string, nodeId: string, - opts?: OperationOptions | undefined - ): Promise { + opts?: OperationOptions + ): Promise { const listNodeExtensionPath = "/pools/{poolId}/nodes/{nodeId}/extensions"; const batchClient = createBatchClient( this._ensureHttpsEndpoint(accountEndpoint) ); const res = await batchClient - .path(listNodeExtensionPath, poolId, nodeId) + .path(listNodeExtensionPath, poolName, nodeId) .get(); if (isUnexpected(res)) { throw createBatchUnexpectedStatusCodeError(res); } - return res.body.value; + return res.body.value ?? []; } } diff --git a/packages/service/src/node/node-service.ts b/packages/service/src/node/node-service.ts index 899a8f55d..5ad51ff5f 100644 --- a/packages/service/src/node/node-service.ts +++ b/packages/service/src/node/node-service.ts @@ -1,17 +1,29 @@ import { OperationOptions } from "@azure/bonito-core"; import { BatchNodeOutput, BatchNodeVMExtensionOutput } from "./node-models"; +import { PagedAsyncIterableIterator } from "@azure/core-paging"; + +export interface ListNodesOptions extends OperationOptions { + filter: string; +} export interface NodeService { - listBatchNodes( + getNode( accountEndpoint: string, - poolId: string, + poolName: string, + nodeId: string, opts?: OperationOptions - ): Promise; + ): Promise; + + listNodes( + accountEndpoint: string, + poolName: string, + opts?: ListNodesOptions + ): Promise>; - listBatchNodeExtensions( + listVmExtensions( accountEndpoint: string, - poolId: string, + poolName: string, nodeId: string, opts?: OperationOptions - ): Promise; + ): Promise; } diff --git a/packages/service/src/test-util/__tests__/paging-test-util.spec.ts b/packages/service/src/test-util/__tests__/paging-test-util.spec.ts new file mode 100644 index 000000000..021a16757 --- /dev/null +++ b/packages/service/src/test-util/__tests__/paging-test-util.spec.ts @@ -0,0 +1,51 @@ +import { PagedAsyncIterableIterator } from "@azure/core-paging"; +import { createPagedArray } from "../paging-test-util"; + +describe("createPagedArray function", () => { + let result: PagedAsyncIterableIterator; + + beforeEach(() => { + result = createPagedArray([ + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + ]); + }); + + test("Can be used as iterable", async () => { + const resultFromIterable = []; + for await (const num of result) { + resultFromIterable.push(num); + } + expect(resultFromIterable.join(", ")).toEqual( + "one, two, three, four, five, six, seven" + ); + }); + + test("Can be used as iterator", async () => { + expect(await result.next()).toEqual({ value: "one", done: false }); + expect(await result.next()).toEqual({ value: "two", done: false }); + expect(await result.next()).toEqual({ value: "three", done: false }); + expect(await result.next()).toEqual({ value: "four", done: false }); + expect(await result.next()).toEqual({ value: "five", done: false }); + expect(await result.next()).toEqual({ value: "six", done: false }); + expect(await result.next()).toEqual({ value: "seven", done: false }); + expect(await result.next()).toEqual({ value: undefined, done: true }); + }); + + test("Can iterate by page", async () => { + const pages = result.byPage(); + expect((await pages.next()).value.join(", ")).toEqual( + "one, two, three, four, five" + ); + expect((await pages.next()).value.join(", ")).toEqual("six, seven"); + expect(await pages.next()).toEqual({ + value: undefined, + done: true, + }); + }); +}); diff --git a/packages/service/src/test-util/fakes.ts b/packages/service/src/test-util/fakes.ts index 81355500a..e81a803c9 100644 --- a/packages/service/src/test-util/fakes.ts +++ b/packages/service/src/test-util/fakes.ts @@ -43,9 +43,9 @@ export interface BatchFakeSet extends FakeSet { /** * Get a Batch pool by case-insensitive ID * - * @param poolArmId The ARM resource ID of the pool + * @param poolResourceId The ARM resource ID of the pool */ - getPool(poolArmId: string): PoolOutput | undefined; + getPool(poolResourceId: string): PoolOutput | undefined; /** * Patches a pool and returns it @@ -64,9 +64,33 @@ export interface BatchFakeSet extends FakeSet { */ listPoolsByAccount(accountId: string): PoolOutput[]; - listBatchNodes(poolId: string): BatchNodeOutput[]; + /** + * Get a single Batch node + * + * @param accountEndpoint The Batch account endpoint (with no protocol) + * @param poolName The name of the pool (globally unique for fakes) + * @param nodeId The 'id' property of the node + */ + getNode( + accountEndpoint: string, + poolName: string, + nodeId: string + ): BatchNodeOutput; + + /** + * List Batch nodes + * + * @param accountEndpoint The Batch account endpoint (with no protocol) + * @param poolName The name of the pool (globally unique for fakes) + */ + listNodes(accountEndpoint: string, poolName: string): BatchNodeOutput[]; - listBatchNodeExtensions(nodeId: string): BatchNodeVMExtensionOutput[]; + /** + * List VM extensions for a given node + * + * @param nodeId The node ID (currently globally unique for fakes) + */ + listVmExtensions(nodeId: string): BatchNodeVMExtensionOutput[]; } export abstract class AbstractBatchFakeSet @@ -80,7 +104,11 @@ export abstract class AbstractBatchFakeSet }; protected abstract batchPools: { [poolId: string]: PoolOutput }; - protected abstract batchNodes: { [poolId: string]: BatchNodeOutput[] }; + /** + * Node key is the account endpoint, pool name and node ID concatenated, + * colon-separated and lower-cased + */ + protected abstract batchNodes: { [nodeKey: string]: BatchNodeOutput }; protected abstract batchNodeExtensions: { [nodeId: string]: BatchNodeVMExtensionOutput[]; @@ -100,8 +128,8 @@ export abstract class AbstractBatchFakeSet ); } - getPool(poolArmId: string): PoolOutput | undefined { - return this.batchPools[poolArmId.toLowerCase()]; + getPool(poolResourceId: string): PoolOutput | undefined { + return this.batchPools[poolResourceId.toLowerCase()]; } listPoolsByAccount(accountId: string): PoolOutput[] { @@ -144,11 +172,35 @@ export abstract class AbstractBatchFakeSet return this.patchPool(pool); } - listBatchNodes(poolId: string): BatchNodeOutput[] { - return this.batchNodes[poolId] ?? []; + getNode( + accountEndpoint: string, + poolResourceId: string, + nodeId: string + ): BatchNodeOutput { + return this.batchNodes[ + `${accountEndpoint}:${poolResourceId}:${nodeId}`.toLowerCase() + ]; + } + + listNodes( + accountEndpoint: string, + poolResourceId: string + ): BatchNodeOutput[] { + if (!poolResourceId) { + return []; + } + + return Object.entries(this.batchNodes) + .filter((entry) => + startsWithIgnoreCase( + entry[0], + `${accountEndpoint}:${poolResourceId}`.toLowerCase() + ) + ) + .map((entry) => entry[1]); } - listBatchNodeExtensions(nodeId: string): BatchNodeVMExtensionOutput[] { + listVmExtensions(nodeId: string): BatchNodeVMExtensionOutput[] { return this.batchNodeExtensions[nodeId] ?? []; } } @@ -678,49 +730,45 @@ export class BasicBatchFakeSet extends AbstractBatchFakeSet { }, }; - batchNodes: { [poolId: string]: BatchNodeOutput[] } = { - "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/supercomputing/providers/Microsoft.Batch/batchAccounts/hobo/pools/hobopool1": - [ - { - id: "tvmps_id1", - url: "https://account.region.batch.azure.com/pools/hobopool1/nodes/tvmps_id1", - state: "starting", - schedulingState: "enabled", - stateTransitionTime: "2023-11-09T07:20:55.000Z", - allocationTime: "2023-11-09T07:20:45.000Z", - ipAddress: "10.0.0.4", - affinityId: - "TVM:tvmps_7b5797648c5d43f7a15b952e5ada3c082ccac8de5eb95f5518ab1242bc79aa3b_d", - vmSize: "standard_d2_v2", - totalTasksRun: 0, - runningTasksCount: 0, - runningTaskSlotsCount: 0, - totalTasksSucceeded: 0, - isDedicated: true, - endpointConfiguration: { - inboundEndpoints: [ - { - name: "SSHRule.0", - protocol: "tcp", - publicIPAddress: "20.24.241.25", - publicFQDN: - "cloudservice.region.cloudapp.azure.com", - frontendPort: 50000, - backendPort: 3389, - }, - ], - }, - virtualMachineInfo: { - imageReference: { - publisher: "microsoftwindowsserver", - offer: "windowsserver", - sku: "2022-datacenter", - version: "latest", - exactVersion: "20348.2031.231006", - }, + batchNodes: { [nodeKey: string]: BatchNodeOutput } = { + "mercury.eastus.batch.azure.com:hobopool1:tvmps_id1": { + id: "tvmps_id1", + url: "https://account.region.batch.azure.com/pools/hobopool1/nodes/tvmps_id1", + state: "starting", + schedulingState: "enabled", + stateTransitionTime: "2023-11-09T07:20:55.000Z", + allocationTime: "2023-11-09T07:20:45.000Z", + ipAddress: "10.0.0.4", + affinityId: + "TVM:tvmps_7b5797648c5d43f7a15b952e5ada3c082ccac8de5eb95f5518ab1242bc79aa3b_d", + vmSize: "standard_d2_v2", + totalTasksRun: 0, + runningTasksCount: 0, + runningTaskSlotsCount: 0, + totalTasksSucceeded: 0, + isDedicated: true, + endpointConfiguration: { + inboundEndpoints: [ + { + name: "SSHRule.0", + protocol: "tcp", + publicIPAddress: "20.24.241.25", + publicFQDN: "cloudservice.region.cloudapp.azure.com", + frontendPort: 50000, + backendPort: 3389, }, + ], + }, + virtualMachineInfo: { + imageReference: { + publisher: "microsoftwindowsserver", + offer: "windowsserver", + sku: "2022-datacenter", + version: "latest", + exactVersion: "20348.2031.231006", }, - ], + }, + }, }; batchNodeExtensions: { [nodeId: string]: BatchNodeVMExtensionOutput[] } = { diff --git a/packages/service/src/test-util/paging-test-util.ts b/packages/service/src/test-util/paging-test-util.ts new file mode 100644 index 000000000..f7763f09f --- /dev/null +++ b/packages/service/src/test-util/paging-test-util.ts @@ -0,0 +1,51 @@ +import { + PageSettings, + PagedAsyncIterableIterator, + PagedResult, + getPagedAsyncIterator, +} from "@azure/core-paging"; + +export const DEFAULT_FAKE_PAGE_SIZE = 5; + +export interface FakePagingOptions { + pageSize: number; +} + +/** + * Create a paged iterator from a basic array. Useful for simulating a + * paginated list API for testing. + * + * @param arr The array which will back the iterator. + * @param options Paging options. + * @returns A paged async iterator. + */ +export function createPagedArray( + arr: T[], + options?: FakePagingOptions +): PagedAsyncIterableIterator { + const pagedResult: PagedResult = { + firstPageLink: 0, + async getPage(pageIndex, maxPageSize) { + const pageSize = maxPageSize || DEFAULT_FAKE_PAGE_SIZE; + if (pageIndex < arr.length) { + return Promise.resolve({ + page: arr.slice( + pageIndex, + Math.min(pageIndex + pageSize, arr.length) + ), + nextPageLink: + pageSize < arr.length - pageIndex + ? pageIndex + pageSize + : undefined, + }); + } else { + // Should never hit this + throw new Error( + "Unhandled error in createPageArray function. This indicates a bug." + ); + } + }, + }; + + return getPagedAsyncIterator(pagedResult); +} From 807661db7ed185c38ff0a3e7af672a22281cddc5 Mon Sep 17 00:00:00 2001 From: bcoroneliit <115177097+bcoroneliit@users.noreply.github.com> Date: Wed, 5 Jun 2024 13:18:03 -0700 Subject: [PATCH 21/57] Create Task Service (#2909) * Task Service * Modified assertions to use string literals * Generalized task ids --------- Co-authored-by: Brenda Coronel --- .../task/__tests__/fake-task-service.spec.ts | 42 ++++++++ .../service/src/task/fake-task-service.ts | 28 ++++++ .../service/src/task/live-task-service.ts | 55 +++++++++++ packages/service/src/task/task-service.ts | 15 +++ packages/service/src/test-util/fakes.ts | 98 +++++++++++++++++++ 5 files changed, 238 insertions(+) create mode 100644 packages/service/src/task/__tests__/fake-task-service.spec.ts create mode 100644 packages/service/src/task/fake-task-service.ts create mode 100644 packages/service/src/task/live-task-service.ts create mode 100644 packages/service/src/task/task-service.ts diff --git a/packages/service/src/task/__tests__/fake-task-service.spec.ts b/packages/service/src/task/__tests__/fake-task-service.spec.ts new file mode 100644 index 000000000..e1f98ea32 --- /dev/null +++ b/packages/service/src/task/__tests__/fake-task-service.spec.ts @@ -0,0 +1,42 @@ +import { initMockBatchEnvironment } from "../../environment"; +import { BatchFakeSet, BasicBatchFakeSet } from "../../test-util/fakes"; +import { FakeTaskService } from "../fake-task-service"; + +describe("FakeTaskService", () => { + const accountEndpoint = "mercury.eastus.batch.azure.com"; + const jobId = `faketestjob1`; + const taskIds = ["taska", "task1"]; + + let service: FakeTaskService; + let fakeSet: BatchFakeSet; + + beforeEach(() => { + initMockBatchEnvironment(); + fakeSet = new BasicBatchFakeSet(); + service = new FakeTaskService(); + service.setFakes(fakeSet); + }); + + test("List batch tasks", async () => { + const tasks = await service.listTasks(accountEndpoint, jobId); + + const allTasks = []; + + for await (const task of tasks) { + allTasks.push(task); + } + expect(allTasks.map((task) => task.id)).toEqual(taskIds); + }); + + test("Get specific batch task", async () => { + const taskNum = await service.getTask(accountEndpoint, jobId, "task1"); + const taskLetter = await service.getTask( + accountEndpoint, + jobId, + "taska" + ); + + expect(taskNum.id).toEqual("task1"); + expect(taskLetter.id).toEqual("taska"); + }); +}); diff --git a/packages/service/src/task/fake-task-service.ts b/packages/service/src/task/fake-task-service.ts new file mode 100644 index 000000000..d8d37ca5d --- /dev/null +++ b/packages/service/src/task/fake-task-service.ts @@ -0,0 +1,28 @@ +import { BatchFakeSet, BasicBatchFakeSet } from "../test-util/fakes"; +import { BatchTaskOutput } from "../batch-models"; +import type { TaskService } from "./task-service"; +import { PagedAsyncIterableIterator } from "@azure/core-paging"; +import { createPagedArray } from "../test-util/paging-test-util"; + +export class FakeTaskService implements TaskService { + fakeSet: BatchFakeSet = new BasicBatchFakeSet(); + + setFakes(fakeSet: BatchFakeSet): void { + this.fakeSet = fakeSet; + } + + async getTask( + accountEndpoint: string, + jobId: string, + taskId: string + ): Promise { + return this.fakeSet.getTask(accountEndpoint, jobId, taskId); + } + + async listTasks( + accountEndpoint: string, + jobId: string + ): Promise> { + return createPagedArray(this.fakeSet.listTasks(accountEndpoint, jobId)); + } +} diff --git a/packages/service/src/task/live-task-service.ts b/packages/service/src/task/live-task-service.ts new file mode 100644 index 000000000..4d4d318f2 --- /dev/null +++ b/packages/service/src/task/live-task-service.ts @@ -0,0 +1,55 @@ +import { AbstractHttpService } from "@azure/bonito-core"; +import { BatchTaskOutput } from "../batch-models"; +import { createBatchClient, isUnexpected } from "../internal/batch-rest"; +import { createBatchUnexpectedStatusCodeError } from "../utils"; +import { TaskService } from "./task-service"; +import { PagedAsyncIterableIterator } from "@azure/core-paging"; +import { paginate } from "../internal/arm-batch-rest"; + +export class LiveTaskService + extends AbstractHttpService + implements TaskService +{ + private _ensureHttpsEndpoint(accountEndpoint: string): string { + if (!accountEndpoint.startsWith("https://")) { + return `https://${accountEndpoint}`; + } + + return accountEndpoint; + } + + async listTasks( + accountResourceId: string, + jobId: string + ): Promise> { + const listTaskPath = "/jobs/{jobId}/tasks"; + const batchClient = createBatchClient( + this._ensureHttpsEndpoint(accountResourceId) + ); + + const res = await batchClient.path(listTaskPath, jobId).get(); + if (isUnexpected(res)) { + throw createBatchUnexpectedStatusCodeError(res); + } + + return paginate(batchClient, res); + } + + async getTask( + accountResourceId: string, + jobId: string, + taskId: string + ): Promise { + const taskPath = "/jobs/{jobId}/tasks/{taskId}"; + const batchClient = createBatchClient( + this._ensureHttpsEndpoint(accountResourceId) + ); + const res = await batchClient.path(taskPath, jobId, taskId).get(); + + if (isUnexpected(res)) { + throw createBatchUnexpectedStatusCodeError(res); + } + + return res.body; + } +} diff --git a/packages/service/src/task/task-service.ts b/packages/service/src/task/task-service.ts new file mode 100644 index 000000000..791aea71f --- /dev/null +++ b/packages/service/src/task/task-service.ts @@ -0,0 +1,15 @@ +import { BatchTaskOutput } from "../batch-models"; +import { PagedAsyncIterableIterator } from "@azure/core-paging"; + +export interface TaskService { + getTask( + accountResourceId: string, + jobId: string, + taskId: string + ): Promise; + + listTasks( + accountResourceId: string, + jobId: string + ): Promise>; +} diff --git a/packages/service/src/test-util/fakes.ts b/packages/service/src/test-util/fakes.ts index e81a803c9..30e71ee73 100644 --- a/packages/service/src/test-util/fakes.ts +++ b/packages/service/src/test-util/fakes.ts @@ -18,6 +18,7 @@ import { BatchNodeVMExtensionOutput, } from "../node/node-models"; import { Pool, PoolOutput } from "../pool/pool-models"; +import { BatchJobOutput, BatchTaskOutput } from "../batch-models"; /** * A fake dataset which includes Batch accounts, pools, etc. @@ -91,6 +92,27 @@ export interface BatchFakeSet extends FakeSet { * @param nodeId The node ID (currently globally unique for fakes) */ listVmExtensions(nodeId: string): BatchNodeVMExtensionOutput[]; + + /** + * Get a single task + * + * @param accountEndpoint + * @param jobId + * @param taskId + */ + getTask( + accountEndpoint: string, + jobId: string, + taskId: string + ): BatchTaskOutput; + + /** + * List Task for a given job + * + * @param accountEndpoint + * @param jobId + */ + listTasks(accountEndpoint: string, jobId: string): BatchTaskOutput[]; } export abstract class AbstractBatchFakeSet @@ -114,6 +136,8 @@ export abstract class AbstractBatchFakeSet [nodeId: string]: BatchNodeVMExtensionOutput[]; }; + protected abstract batchTasks: { [taskKey: string]: BatchTaskOutput }; + getBatchAccount(batchAccountId: string): BatchAccountOutput | undefined { return this.batchAccounts[batchAccountId.toLowerCase()]; } @@ -203,6 +227,31 @@ export abstract class AbstractBatchFakeSet listVmExtensions(nodeId: string): BatchNodeVMExtensionOutput[] { return this.batchNodeExtensions[nodeId] ?? []; } + + getTask( + accountEndpoint: string, + jobId: string, + taskId: string + ): BatchTaskOutput { + return this.batchTasks[ + `${accountEndpoint}:${jobId}:${taskId}`.toLowerCase() + ]; + } + + listTasks(accountEndpoint: string, jobId: string): BatchTaskOutput[] { + if (!jobId) { + return []; + } + + return Object.entries(this.batchTasks) + .filter((entry) => + startsWithIgnoreCase( + entry[0], + `${accountEndpoint}:${jobId}`.toLowerCase() + ) + ) + .map((entry) => entry[1]); + } } export class BasicBatchFakeSet extends AbstractBatchFakeSet { @@ -771,6 +820,55 @@ export class BasicBatchFakeSet extends AbstractBatchFakeSet { }, }; + batchJobs: { [poolId: string]: BatchJobOutput[] } = { + hobopool1: [ + { + id: "faketestjob1", + usesTaskDependencies: false, + url: "https://batchsyntheticsprod.eastus2euap.batch.azure.com/jobs/faketestjob1", + lastModified: "2024-05-29T08:32:21.000Z", + creationTime: "2024-05-29T08:32:21.000Z", + state: "active", + stateTransitionTime: "2024-05-29T08:32:21.000Z", + priority: 2, + constraints: { + maxWallClockTime: "P10675199DT2H48M5.4775807S", + maxTaskRetryCount: 0, + }, + poolInfo: { + poolId: "hobopool1", + }, + onAllTasksComplete: "noaction", + onTaskFailure: "noaction", + executionInfo: { + startTime: "2024-05-29T08:32:21.000Z", + poolId: "Syn_20240529_a0f9af6251964f449a0b1052b58", + }, + }, + ], + }; + + batchTasks: { [taskKey: string]: BatchTaskOutput } = { + "mercury.eastus.batch.azure.com:faketestjob1:taska": { + url: "https://batchsyntheticsprod.eastus2euap.batch.azure.com/jobs/faketestjob1/tasks/taskA", + id: "taska", + state: "active", + executionInfo: { + retryCount: 0, + requeueCount: 0, + }, + }, + "mercury.eastus.batch.azure.com:faketestjob1:task1": { + url: "https://batchsyntheticsprod.eastus2euap.batch.azure.com/jobs/faketestjob1/tasks/task1", + id: "task1", + state: "completed", + executionInfo: { + retryCount: 0, + requeueCount: 0, + }, + }, + }; + batchNodeExtensions: { [nodeId: string]: BatchNodeVMExtensionOutput[] } = { tvmps_id1: [ { From 74b12fae6f81bdab0b1355b6e621b16db69893b8 Mon Sep 17 00:00:00 2001 From: David Watrous <509299+dpwatrous@users.noreply.github.com> Date: Fri, 14 Jun 2024 10:31:18 -0400 Subject: [PATCH 22/57] Updated MacOS pipeline to macOS-13 image (#2913) --- .vsts/darwin/sign.yml | 6 ++++++ .vsts/distribution.yml | 2 +- .vsts/pipelines.yml | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.vsts/darwin/sign.yml b/.vsts/darwin/sign.yml index 038879175..6a13cd20a 100644 --- a/.vsts/darwin/sign.yml +++ b/.vsts/darwin/sign.yml @@ -1,4 +1,10 @@ steps: + - task: UseDotNet@2 + displayName: 'Use .NET 6' + inputs: + packageType: sdk + version: 6.x + - task: EsrpCodeSigning@2 inputs: ConnectedServiceName: 'ESRP CodeSign' diff --git a/.vsts/distribution.yml b/.vsts/distribution.yml index aa4e9db7e..d6aaa5e34 100644 --- a/.vsts/distribution.yml +++ b/.vsts/distribution.yml @@ -38,7 +38,7 @@ stages: - job: MacOS timeoutInMinutes: 120 # Needed for Codesign + Notarization + CodeQL pool: - vmImage: macOS-11 + vmImage: macOS-13 demands: xcode variables: - group: BatchExplorer-Signing diff --git a/.vsts/pipelines.yml b/.vsts/pipelines.yml index e5277345f..17e8deaa1 100644 --- a/.vsts/pipelines.yml +++ b/.vsts/pipelines.yml @@ -10,7 +10,7 @@ jobs: - job: MacOS pool: - vmImage: macOS-11 + vmImage: macOS-13 demands: xcode variables: - name: EOCompliance-Mac From fe84a1e51ba1e91cfed83b847134a72bfe13607b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 16:45:13 +0000 Subject: [PATCH 23/57] Bump ejs from 3.1.9 to 3.1.10 (#2902) Bumps [ejs](https://github.com/mde/ejs) from 3.1.9 to 3.1.10. - [Release notes](https://github.com/mde/ejs/releases) - [Commits](https://github.com/mde/ejs/compare/v3.1.9...v3.1.10) --- updated-dependencies: - dependency-name: ejs dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9c7978385..d709e6940 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5501,9 +5501,9 @@ "dev": true }, "node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, "dependencies": { "jake": "^10.8.5" From dbb67f01c001d19e07fc0b349e96a3f083251474 Mon Sep 17 00:00:00 2001 From: Haopeng Wang Date: Wed, 19 Jun 2024 15:15:18 -0700 Subject: [PATCH 24/57] Add commandName headers to services & rename poolResourceId (#2911) --- .../src/pool/update-node-comms-action.tsx | 10 ++--- .../__tests__/pool-vm-ext-list.spec.tsx | 9 +++-- .../src/vm-extension/pool-vm-ext-list.tsx | 8 ++-- .../src/__tests__/service-utils.spec.ts | 18 ++++----- .../service/src/node/live-node-service.ts | 24 ++++++++++-- .../pool/__tests__/fake-pool-service.spec.ts | 22 +++++++---- .../pool/__tests__/live-pool-service.spec.ts | 28 ++++++------- .../service/src/pool/fake-pool-service.ts | 11 ++++-- .../service/src/pool/live-pool-service.ts | 39 +++++++++++++------ packages/service/src/pool/pool-service.ts | 6 +-- .../service/src/task/live-task-service.ts | 25 +++++++++--- packages/service/src/utils.ts | 12 +++--- 12 files changed, 137 insertions(+), 75 deletions(-) diff --git a/packages/react/src/pool/update-node-comms-action.tsx b/packages/react/src/pool/update-node-comms-action.tsx index d29b5c264..9db9040e0 100644 --- a/packages/react/src/pool/update-node-comms-action.tsx +++ b/packages/react/src/pool/update-node-comms-action.tsx @@ -34,12 +34,12 @@ export class UpdateNodeCommsAction extends AbstractAction { - this._pool = await this._poolService.get(this._poolArmId, { + this._pool = await this._poolService.get(this._poolResourceId, { commandName: "UpdateNodeCommsAction/GetPool", }); @@ -61,7 +61,7 @@ export class UpdateNodeCommsAction extends AbstractAction { await this._poolService.patch( - this._poolArmId, + this._poolResourceId, { - id: this._poolArmId, + id: this._poolResourceId, properties: { targetNodeCommunicationMode: values.targetNodeCommunicationMode, diff --git a/packages/react/src/vm-extension/__tests__/pool-vm-ext-list.spec.tsx b/packages/react/src/vm-extension/__tests__/pool-vm-ext-list.spec.tsx index 8122810d8..1bfb9166b 100644 --- a/packages/react/src/vm-extension/__tests__/pool-vm-ext-list.spec.tsx +++ b/packages/react/src/vm-extension/__tests__/pool-vm-ext-list.spec.tsx @@ -7,7 +7,7 @@ import { initMockBatchBrowserEnvironment } from "../../environment"; import { dataGridIgnoredA11yRules } from "@azure/bonito-ui/lib/components/data-grid/test-ignore-a11y-rules"; import { runAxe } from "@azure/bonito-ui/lib/test-util/a11y"; -const poolArmIdWithExt = +const poolResourceIdWithExt = "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/supercomputing/providers/microsoft.batch/batchaccounts/hobo/pools/hobopool1"; describe("PoolVMExtList", () => { @@ -17,7 +17,7 @@ describe("PoolVMExtList", () => { it("should render vm extension lists", async () => { const { getByText, container } = render( - + ); getByText(translate("lib.react.vmExtension.name")); await waitFor(() => getByText("batchextension1")); @@ -29,7 +29,10 @@ describe("PoolVMExtList", () => { it("should render vm extension lists with no result", async () => { const { getByText } = render( ); getByText(translate("lib.react.vmExtension.name")); diff --git a/packages/react/src/vm-extension/pool-vm-ext-list.tsx b/packages/react/src/vm-extension/pool-vm-ext-list.tsx index 2bf28983f..f8b652907 100644 --- a/packages/react/src/vm-extension/pool-vm-ext-list.tsx +++ b/packages/react/src/vm-extension/pool-vm-ext-list.tsx @@ -5,12 +5,12 @@ import React from "react"; import { VmExtensionList, VmExtItem } from "./vm-extension-list"; interface PoolVmExtensionListProps { - poolArmId: string; + poolResourceId: string; onItemClick?: (item: VmExtItem) => void; } export const PoolVMExtList = (props: PoolVmExtensionListProps) => { - const { poolArmId, onItemClick } = props; + const { poolResourceId, onItemClick } = props; const [extensions, setExtensions] = React.useState([]); const [loading, setLoading] = React.useState(true); @@ -23,7 +23,7 @@ export const PoolVMExtList = (props: PoolVmExtensionListProps) => { let isMounted = true; setLoading(true); poolService - .get(poolArmId) + .get(poolResourceId) .then((pool) => { if (!isMounted) { return; @@ -42,7 +42,7 @@ export const PoolVMExtList = (props: PoolVmExtensionListProps) => { return () => { isMounted = false; }; - }, [poolArmId, poolService]); + }, [poolResourceId, poolService]); return ( { it("should parse a valid arm id", () => { const batchAccountId = "/subscriptions/123/resourceGroups/rg/providers/Microsoft.Batch/batchAccounts/ba"; - const poolArmId = + const poolResourceId = "/subscriptions/123/resourceGroups/rg/providers/Microsoft.Batch/batchAccounts/ba/pools/pool"; const result1 = parseBatchAccountIdInfo(batchAccountId); @@ -15,7 +15,7 @@ describe("parse arm id", () => { batchAccountName: "ba", }); - const result2 = parsePoolArmIdInfo(poolArmId); + const result2 = parsePoolResourceIdInfo(poolResourceId); expect(result2).toEqual({ subscriptionId: "123", resourceGroupName: "rg", @@ -28,7 +28,7 @@ describe("parse arm id", () => { const batchAccountId = "https://example.com/subscriptions/123/resourceGroups/rg/providers/Microsoft.Batch/batchAccounts/ba"; - const poolArmId = + const poolResourceId = "https://example.com/subscriptions/123/resourceGroups/rg/providers/Microsoft.Batch/batchAccounts/ba/pools/pool"; const result1 = parseBatchAccountIdInfo(batchAccountId); @@ -38,7 +38,7 @@ describe("parse arm id", () => { batchAccountName: "ba", }); - const result2 = parsePoolArmIdInfo(poolArmId); + const result2 = parsePoolResourceIdInfo(poolResourceId); expect(result2).toEqual({ subscriptionId: "123", resourceGroupName: "rg", @@ -51,7 +51,7 @@ describe("parse arm id", () => { const batchAccountId = "/SuBscriptions/123/resourceGroups/rg/providers/Microsoft.Batch/batchAccounts/ba"; - const poolArmId = + const poolResourceId = "/SuBscriptions/123/resourceGroups/rg/providers/Microsoft.Batch/batchAccounts/ba/pools/pool"; const result1 = parseBatchAccountIdInfo(batchAccountId); expect(result1).toEqual({ @@ -60,7 +60,7 @@ describe("parse arm id", () => { batchAccountName: "ba", }); - const result2 = parsePoolArmIdInfo(poolArmId); + const result2 = parsePoolResourceIdInfo(poolResourceId); expect(result2).toEqual({ subscriptionId: "123", resourceGroupName: "rg", @@ -75,8 +75,8 @@ describe("parse arm id", () => { "Unable to parse batch account id: /invalid/batch/account/id" ); - const poolArmId = "/invalid/pool/arm/id"; - expect(() => parsePoolArmIdInfo(poolArmId)).toThrowError( + const poolResourceId = "/invalid/pool/arm/id"; + expect(() => parsePoolResourceIdInfo(poolResourceId)).toThrowError( "Unable to parse pool ARM id: /invalid/pool/arm/id" ); }); diff --git a/packages/service/src/node/live-node-service.ts b/packages/service/src/node/live-node-service.ts index d3e441949..4601a358d 100644 --- a/packages/service/src/node/live-node-service.ts +++ b/packages/service/src/node/live-node-service.ts @@ -1,4 +1,8 @@ -import { AbstractHttpService, OperationOptions } from "@azure/bonito-core"; +import { + AbstractHttpService, + CustomHttpHeaders, + OperationOptions, +} from "@azure/bonito-core"; import { BatchNodeOutput, BatchNodeVMExtensionOutput } from "./node-models"; import { ListNodesOptions, NodeService } from "./node-service"; import { @@ -33,7 +37,12 @@ export class LiveNodeService const res = await batchClient .path("/pools/{poolId}/nodes/{nodeId}", poolName, nodeId) - .get(); + .get({ + headers: { + [CustomHttpHeaders.CommandName]: + opts?.commandName ?? "GetNode", + }, + }); if (isUnexpected(res)) { throw createBatchUnexpectedStatusCodeError(res); @@ -55,6 +64,10 @@ export class LiveNodeService queryParameters: { $filter: opts?.filter, }, + headers: { + [CustomHttpHeaders.CommandName]: + opts?.commandName ?? "ListNodes", + }, }); if (isUnexpected(res)) { @@ -77,7 +90,12 @@ export class LiveNodeService ); const res = await batchClient .path(listNodeExtensionPath, poolName, nodeId) - .get(); + .get({ + headers: { + [CustomHttpHeaders.CommandName]: + opts?.commandName ?? "ListNodeExtensions", + }, + }); if (isUnexpected(res)) { throw createBatchUnexpectedStatusCodeError(res); diff --git a/packages/service/src/pool/__tests__/fake-pool-service.spec.ts b/packages/service/src/pool/__tests__/fake-pool-service.spec.ts index d9678bcec..c30479901 100644 --- a/packages/service/src/pool/__tests__/fake-pool-service.spec.ts +++ b/packages/service/src/pool/__tests__/fake-pool-service.spec.ts @@ -6,12 +6,12 @@ import { initMockBatchEnvironment } from "../../environment"; describe("FakePoolService", () => { const hoboAcctId = "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/supercomputing/providers/Microsoft.Batch/batchAccounts/hobo"; - const hoboPoolArmId = `${hoboAcctId}/pools/hobopool1`; - const newTestPoolArmId = `${hoboAcctId}/pools/newtestpool`; + const hoboPoolResourceId = `${hoboAcctId}/pools/hobopool1`; + const newTestPoolResourceId = `${hoboAcctId}/pools/newtestpool`; const byosAcctId = "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/visualization/providers/Microsoft.Batch/batchAccounts/byos"; - const byosPoolArmId = `${byosAcctId}/pools/byospool1`; + const byosPoolResourceId = `${byosAcctId}/pools/byospool1`; let service: FakePoolService; let fakeSet: BatchFakeSet; @@ -29,10 +29,10 @@ describe("FakePoolService", () => { }); test("Get by resource ID", async () => { - const hoboPool = await service.get(hoboPoolArmId); + const hoboPool = await service.get(hoboPoolResourceId); expect(hoboPool?.name).toEqual("hobopool1"); - const byosPool = await service.get(byosPoolArmId); + const byosPool = await service.get(byosPoolResourceId); expect(byosPool?.name).toEqual("byospool1"); }); @@ -64,7 +64,10 @@ describe("FakePoolService", () => { }, }; - const pool = await service.createOrUpdate(newTestPoolArmId, newPool); + const pool = await service.createOrUpdate( + newTestPoolResourceId, + newPool + ); expect(pool?.name).toEqual("newtestpool"); const pools = await service.listByAccountId(hoboAcctId); @@ -100,7 +103,10 @@ describe("FakePoolService", () => { }, }; - const pool = await service.createOrUpdate(hoboPoolArmId, poolUpdate); + const pool = await service.createOrUpdate( + hoboPoolResourceId, + poolUpdate + ); expect(pool?.name).toEqual("hobopool1"); // Updated an existing pool rather than created a new one @@ -123,7 +129,7 @@ describe("FakePoolService", () => { }, }; - const pool = await service.patch(hoboPoolArmId, update); + const pool = await service.patch(hoboPoolResourceId, update); expect(pool?.name).toEqual("hobopool1"); expect( pool?.properties?.scaleSettings?.fixedScale?.targetDedicatedNodes diff --git a/packages/service/src/pool/__tests__/live-pool-service.spec.ts b/packages/service/src/pool/__tests__/live-pool-service.spec.ts index 5d828a4cf..4a4cd8c88 100644 --- a/packages/service/src/pool/__tests__/live-pool-service.spec.ts +++ b/packages/service/src/pool/__tests__/live-pool-service.spec.ts @@ -11,12 +11,12 @@ import { initMockBatchEnvironment } from "../../environment"; describe("LivePoolService", () => { const hoboAcctId = "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/supercomputing/providers/Microsoft.Batch/batchAccounts/hobo"; - const hoboPoolArmId = `${hoboAcctId}/pools/hobopool1`; - const newTestPoolArmId = `${hoboAcctId}/pools/newtestpool`; + const hoboPoolResourceId = `${hoboAcctId}/pools/hobopool1`; + const newTestPoolResourceId = `${hoboAcctId}/pools/newtestpool`; const byosAcctId = "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/visualization/providers/Microsoft.Batch/batchAccounts/byos"; - const byosPoolArmId = `${byosAcctId}/pools/byospool1`; + const byosPoolResourceId = `${byosAcctId}/pools/byospool1`; let service: PoolService; let fakeSet: BatchFakeSet; @@ -74,39 +74,39 @@ describe("LivePoolService", () => { test("Get by resource ID", async () => { httpClient.addExpected( new MockHttpResponse( - `${getArmUrl()}${hoboPoolArmId}?api-version=${ + `${getArmUrl()}${hoboPoolResourceId}?api-version=${ BatchApiVersion.arm }`, { status: 200, - body: JSON.stringify(fakeSet.getPool(hoboPoolArmId)), + body: JSON.stringify(fakeSet.getPool(hoboPoolResourceId)), } ) ); - const hoboPool = await service.get(hoboPoolArmId); + const hoboPool = await service.get(hoboPoolResourceId); expect(hoboPool?.name).toEqual("hobopool1"); httpClient.addExpected( new MockHttpResponse( - `${getArmUrl()}${byosPoolArmId}?api-version=${ + `${getArmUrl()}${byosPoolResourceId}?api-version=${ BatchApiVersion.arm }`, { status: 200, - body: JSON.stringify(fakeSet.getPool(byosPoolArmId)), + body: JSON.stringify(fakeSet.getPool(byosPoolResourceId)), } ) ); - const byosPool = await service.get(byosPoolArmId); + const byosPool = await service.get(byosPoolResourceId); expect(byosPool?.name).toEqual("byospool1"); }); test("Get by resource ID error", async () => { httpClient.addExpected( new MockHttpResponse( - `${getArmUrl()}${hoboPoolArmId}?api-version=${ + `${getArmUrl()}${hoboPoolResourceId}?api-version=${ BatchApiVersion.arm }`, { @@ -116,7 +116,7 @@ describe("LivePoolService", () => { ) ); - await expect(() => service.get(hoboPoolArmId)).rejects + await expect(() => service.get(hoboPoolResourceId)).rejects .toMatchInlineSnapshot(` [Error: The Batch management plane returned an unexpected status code [unexpected 500 status] Response body: @@ -174,7 +174,7 @@ describe("LivePoolService", () => { ); // Create - let pool = await service.createOrUpdate(newTestPoolArmId, newPool); + let pool = await service.createOrUpdate(newTestPoolResourceId, newPool); expect(pool?.name).toEqual("newtestpool"); if (newPool.properties?.scaleSettings?.fixedScale) { @@ -204,7 +204,7 @@ describe("LivePoolService", () => { ); // Update - pool = await service.createOrUpdate(newTestPoolArmId, newPool); + pool = await service.createOrUpdate(newTestPoolResourceId, newPool); expect(pool?.name).toEqual("newtestpool"); const patch: Pool = { @@ -235,7 +235,7 @@ describe("LivePoolService", () => { ); // Patch - pool = await service.patch(newTestPoolArmId, patch); + pool = await service.patch(newTestPoolResourceId, patch); expect(pool?.name).toEqual("newtestpool"); expect( pool?.properties?.scaleSettings?.fixedScale?.targetDedicatedNodes diff --git a/packages/service/src/pool/fake-pool-service.ts b/packages/service/src/pool/fake-pool-service.ts index 77780713a..fae771aa9 100644 --- a/packages/service/src/pool/fake-pool-service.ts +++ b/packages/service/src/pool/fake-pool-service.ts @@ -9,19 +9,22 @@ export class FakePoolService implements PoolService { this.fakeSet = fakeSet; } - async createOrUpdate(poolArmId: string, pool: Pool): Promise { + async createOrUpdate( + poolResourceId: string, + pool: Pool + ): Promise { return this.fakeSet.putPool(pool); } - async get(poolArmId: string): Promise { - return this.fakeSet.getPool(poolArmId); + async get(poolResourceId: string): Promise { + return this.fakeSet.getPool(poolResourceId); } async listByAccountId(accountId: string): Promise { return this.fakeSet.listPoolsByAccount(accountId); } - async patch(poolArmId: string, pool: Pool): Promise { + async patch(poolResourceId: string, pool: Pool): Promise { return this.fakeSet.patchPool(pool); } } diff --git a/packages/service/src/pool/live-pool-service.ts b/packages/service/src/pool/live-pool-service.ts index 04ba16306..e2089dbb7 100644 --- a/packages/service/src/pool/live-pool-service.ts +++ b/packages/service/src/pool/live-pool-service.ts @@ -3,6 +3,7 @@ import type { Pool, PoolOutput } from "./pool-models"; import type { PoolService } from "./pool-service"; import { AbstractHttpService, + CustomHttpHeaders, OperationOptions, getArmUrl, } from "@azure/bonito-core"; @@ -10,7 +11,7 @@ import { createARMBatchClient, isUnexpected } from "../internal/arm-batch-rest"; import { createArmUnexpectedStatusCodeError, parseBatchAccountIdInfo, - parsePoolArmIdInfo, + parsePoolResourceIdInfo, } from "../utils"; const SINGLE_POOL_PATH = @@ -24,7 +25,7 @@ export class LivePoolService implements PoolService { async createOrUpdate( - poolArmId: string, + poolResourceId: string, pool: Pool, opts?: OperationOptions ): Promise { @@ -37,7 +38,7 @@ export class LivePoolService resourceGroupName, batchAccountName, poolName, - } = parsePoolArmIdInfo(poolArmId); + } = parsePoolResourceIdInfo(poolResourceId); const res = await armBatchClient .path( @@ -49,7 +50,10 @@ export class LivePoolService ) .put({ body: pool, - headers: {}, + headers: { + [CustomHttpHeaders.CommandName]: + opts?.commandName ?? "CreateOrUpdatePool", + }, }); if (isUnexpected(res)) { @@ -60,7 +64,7 @@ export class LivePoolService } async get( - poolArmId: string, + poolResourceId: string, opts?: OperationOptions ): Promise { const armBatchClient = createARMBatchClient({ @@ -72,7 +76,7 @@ export class LivePoolService resourceGroupName, batchAccountName, poolName, - } = parsePoolArmIdInfo(poolArmId); + } = parsePoolResourceIdInfo(poolResourceId); const res = await armBatchClient .path( @@ -82,7 +86,12 @@ export class LivePoolService batchAccountName, poolName ) - .get(); + .get({ + headers: { + [CustomHttpHeaders.CommandName]: + opts?.commandName ?? "GetPool", + }, + }); if (isUnexpected(res)) { throw createArmUnexpectedStatusCodeError(res); @@ -109,7 +118,12 @@ export class LivePoolService resourceGroupName, batchAccountName ) - .get(); + .get({ + headers: { + [CustomHttpHeaders.CommandName]: + opts?.commandName ?? "ListPools", + }, + }); if (isUnexpected(res)) { throw createArmUnexpectedStatusCodeError(res); @@ -119,7 +133,7 @@ export class LivePoolService } async patch( - poolArmId: string, + poolResourceId: string, pool: Pool, opts?: OperationOptions ): Promise { @@ -132,7 +146,7 @@ export class LivePoolService resourceGroupName, batchAccountName, poolName, - } = parsePoolArmIdInfo(poolArmId); + } = parsePoolResourceIdInfo(poolResourceId); const res = await armBatchClient .path( @@ -144,7 +158,10 @@ export class LivePoolService ) .patch({ body: pool, - headers: {}, + headers: { + [CustomHttpHeaders.CommandName]: + opts?.commandName ?? "PatchPool", + }, }); if (isUnexpected(res)) { diff --git a/packages/service/src/pool/pool-service.ts b/packages/service/src/pool/pool-service.ts index ca8ab6500..6f7c17c08 100644 --- a/packages/service/src/pool/pool-service.ts +++ b/packages/service/src/pool/pool-service.ts @@ -2,9 +2,9 @@ import { OperationOptions } from "@azure/bonito-core"; import { Pool, PoolOutput } from "./pool-models"; export interface PoolService { - createOrUpdate(poolArmId: string, pool: Pool): Promise; + createOrUpdate(poolResourceId: string, pool: Pool): Promise; get( - poolArmId: string, + poolResourceId: string, opts?: OperationOptions ): Promise; listByAccountId( @@ -12,7 +12,7 @@ export interface PoolService { opts?: OperationOptions ): Promise; patch( - poolArmId: string, + poolResourceId: string, pool: Pool, opts?: OperationOptions ): Promise; diff --git a/packages/service/src/task/live-task-service.ts b/packages/service/src/task/live-task-service.ts index 4d4d318f2..fca39fb5c 100644 --- a/packages/service/src/task/live-task-service.ts +++ b/packages/service/src/task/live-task-service.ts @@ -1,4 +1,8 @@ -import { AbstractHttpService } from "@azure/bonito-core"; +import { + AbstractHttpService, + CustomHttpHeaders, + OperationOptions, +} from "@azure/bonito-core"; import { BatchTaskOutput } from "../batch-models"; import { createBatchClient, isUnexpected } from "../internal/batch-rest"; import { createBatchUnexpectedStatusCodeError } from "../utils"; @@ -20,14 +24,20 @@ export class LiveTaskService async listTasks( accountResourceId: string, - jobId: string + jobId: string, + opts?: OperationOptions ): Promise> { const listTaskPath = "/jobs/{jobId}/tasks"; const batchClient = createBatchClient( this._ensureHttpsEndpoint(accountResourceId) ); - const res = await batchClient.path(listTaskPath, jobId).get(); + const res = await batchClient.path(listTaskPath, jobId).get({ + headers: { + [CustomHttpHeaders.CommandName]: + opts?.commandName ?? "ListTasks", + }, + }); if (isUnexpected(res)) { throw createBatchUnexpectedStatusCodeError(res); } @@ -38,13 +48,18 @@ export class LiveTaskService async getTask( accountResourceId: string, jobId: string, - taskId: string + taskId: string, + opts?: OperationOptions ): Promise { const taskPath = "/jobs/{jobId}/tasks/{taskId}"; const batchClient = createBatchClient( this._ensureHttpsEndpoint(accountResourceId) ); - const res = await batchClient.path(taskPath, jobId, taskId).get(); + const res = await batchClient.path(taskPath, jobId, taskId).get({ + headers: { + [CustomHttpHeaders.CommandName]: opts?.commandName ?? "GetTask", + }, + }); if (isUnexpected(res)) { throw createBatchUnexpectedStatusCodeError(res); diff --git a/packages/service/src/utils.ts b/packages/service/src/utils.ts index 03b02818d..a4caadc93 100644 --- a/packages/service/src/utils.ts +++ b/packages/service/src/utils.ts @@ -6,7 +6,7 @@ import { BatchErrorOutput } from "./internal/batch-rest"; const batchAccountIdRegex = /\/subscriptions\/(.*)\/resourceGroups\/(.*)\/providers\/Microsoft.Batch\/batchAccounts\/(.*)/i; -const poolArmIdRegex = +const poolResourceIdRegex = /\/subscriptions\/(.*)\/resourceGroups\/(.*)\/providers\/Microsoft.Batch\/batchAccounts\/(.*)\/pools\/(.*)/i; interface ErrorResponse extends AzureCoreHttpResponse { @@ -74,21 +74,21 @@ export function parseBatchAccountIdInfo( /** * - * @param oriPoolArmId is of the form: + * @param oriPoolResourceId is of the form: * /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Batch/batchAccounts/{accountName}/pools/{poolName}F * case-insensitive */ -export function parsePoolArmIdInfo(oriPoolArmId: string): { +export function parsePoolResourceIdInfo(oriPoolResourceId: string): { subscriptionId: string; resourceGroupName: string; batchAccountName: string; poolName: string; } { // use regex to parse the batch account id - const poolArmId = ensureRelativeUrl(oriPoolArmId); - const match = poolArmId.match(poolArmIdRegex); + const poolResourceId = ensureRelativeUrl(oriPoolResourceId); + const match = poolResourceId.match(poolResourceIdRegex); if (!match) { - throw new Error(`Unable to parse pool ARM id: ${poolArmId}`); + throw new Error(`Unable to parse pool ARM id: ${poolResourceId}`); } const [, subscriptionId, resourceGroupName, batchAccountName, poolName] = match; From 3d97364918268347f4f268c58b30b7e0bebd126c Mon Sep 17 00:00:00 2001 From: Haopeng Wang Date: Mon, 24 Jun 2024 14:33:13 -0700 Subject: [PATCH 25/57] Update Batch Dataplane RLC with latest TypeSpec (#2912) * Update batch-rest with the latest TypeSpec & update API version * update @azure packages * upgrade BatchExplorer's TypeScript --- desktop/package-lock.json | 8 +- desktop/package.json | 2 +- desktop/tsconfig.browser.json | 5 +- eng/emitter-package-lock.json | 563 +++++------ eng/emitter-package.json | 18 +- packages/service/package-lock.json | 161 +-- packages/service/package.json | 8 +- packages/service/src/constants.ts | 2 +- .../service/src/internal/batch-rest/client.ts | 2 +- .../batch-rest/generated/src/batchClient.ts | 16 +- .../generated/src/clientDefinitions.ts | 335 ++----- .../batch-rest/generated/src/index.ts | 18 +- .../batch-rest/generated/src/isUnexpected.ts | 214 ++-- .../batch-rest/generated/src/models.ts | 701 ++++++------- .../batch-rest/generated/src/outputModels.ts | 925 +++++++----------- .../generated/src/paginateHelper.ts | 12 +- .../batch-rest/generated/src/parameters.ts | 721 +++----------- .../batch-rest/generated/src/responses.ts | 820 +++++++--------- .../batch-rest/generated/tsp-location.yaml | 4 +- util/common-config/jest-common.js | 5 +- 20 files changed, 1641 insertions(+), 2899 deletions(-) diff --git a/desktop/package-lock.json b/desktop/package-lock.json index 3815b51e6..76067d77f 100644 --- a/desktop/package-lock.json +++ b/desktop/package-lock.json @@ -138,7 +138,7 @@ "to-string-loader": "^1.1.6", "ts-loader": "^5.4.5", "ts-node": "^8.10.2", - "typescript": "~4.1.0", + "typescript": "~4.6.0", "url-loader": "^1.1.2", "webpack": "^4.44.1", "webpack-cli": "^3.3.12", @@ -20078,9 +20078,9 @@ } }, "node_modules/typescript": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.6.tgz", - "integrity": "sha512-pxnwLxeb/Z5SP80JDRzVjh58KsM6jZHRAOtTpS7sXLS4ogXNKC9ANxHHZqLLeVHZN35jCtI4JdmLLbLiC1kBow==", + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", + "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", "dev": true, "bin": { "tsc": "bin/tsc", diff --git a/desktop/package.json b/desktop/package.json index 91d910700..9e38957aa 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -177,7 +177,7 @@ "to-string-loader": "^1.1.6", "ts-loader": "^5.4.5", "ts-node": "^8.10.2", - "typescript": "~4.1.0", + "typescript": "~4.6.0", "url-loader": "^1.1.2", "webpack": "^4.44.1", "webpack-cli": "^3.3.12", diff --git a/desktop/tsconfig.browser.json b/desktop/tsconfig.browser.json index d4de32ffe..0123de454 100644 --- a/desktop/tsconfig.browser.json +++ b/desktop/tsconfig.browser.json @@ -5,5 +5,8 @@ "src/test/**/*.ts", "test/**/*.ts", "**/testing**/*" - ] + ], + "angularCompilerOptions": { + "disableTypeScriptVersionCheck": true + } } diff --git a/eng/emitter-package-lock.json b/eng/emitter-package-lock.json index d35b93521..3969edac8 100644 --- a/eng/emitter-package-lock.json +++ b/eng/emitter-package-lock.json @@ -6,20 +6,22 @@ "": { "name": "typescript-emitter-package", "dependencies": { - "@azure-tools/typespec-autorest": "0.35.0", - "@azure-tools/typespec-azure-core": "0.35.0", - "@azure-tools/typespec-client-generator-core": "0.35.0", - "@azure-tools/typespec-ts": "0.19.0", - "@typespec/compiler": "0.49.0", - "@typespec/http": "0.49.0", - "@typespec/rest": "0.49.0", - "@typespec/versioning": "0.49.0" + "@azure-tools/typespec-autorest": "0.42.1", + "@azure-tools/typespec-azure-core": "0.42.0", + "@azure-tools/typespec-azure-resource-manager": "0.42.1", + "@azure-tools/typespec-azure-rulesets": "0.42.1", + "@azure-tools/typespec-client-generator-core": "0.42.3", + "@azure-tools/typespec-ts": "0.29.0", + "@typespec/compiler": "0.56.0", + "@typespec/http": "0.56.0", + "@typespec/rest": "0.56.0", + "@typespec/versioning": "0.56.0" } }, "node_modules/@azure-tools/rlc-common": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@azure-tools/rlc-common/-/rlc-common-0.19.0.tgz", - "integrity": "sha512-ljfmTt0aCLhCeyamIptBEt1OFg7r4LydMqWqK2esHio2wWzW9JmndiGvnz+hXVi2uXyPlUX4A93tKuHAQq52ug==", + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@azure-tools/rlc-common/-/rlc-common-0.29.0.tgz", + "integrity": "sha512-JAvOAYuNPBAXSMo2bLsglsbBA26oCwUKibXG6iUIdwP5oKITuuCFLnBG0rx28qEV/exvCpO9QHvd7WEDQzTv5g==", "dependencies": { "handlebars": "^4.7.7", "lodash": "^4.17.21", @@ -27,96 +29,138 @@ } }, "node_modules/@azure-tools/typespec-autorest": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@azure-tools/typespec-autorest/-/typespec-autorest-0.35.0.tgz", - "integrity": "sha512-UGiRhgyBc3WWEUgIsSaT44Jgbw6KD2DwYNDr6Oxl2Ig/8ZIInpIB5Eix7mgdqKoN6ifra1wLn0GDAltwVx+idQ==", + "version": "0.42.1", + "resolved": "https://registry.npmjs.org/@azure-tools/typespec-autorest/-/typespec-autorest-0.42.1.tgz", + "integrity": "sha512-egWR2Ljxde5PvyDwuVu/8Rq8cSW6FW+qMbvwHfzrtm/sULdSnA6k+VnGD/PQ+dk+1SmFeKG1b+0MlaFuBVz1Hw==", "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, "peerDependencies": { - "@azure-tools/typespec-azure-core": "~0.35.0", - "@typespec/compiler": "~0.49.0", - "@typespec/http": "~0.49.0", - "@typespec/openapi": "~0.49.0", - "@typespec/rest": "~0.49.0", - "@typespec/versioning": "~0.49.0" + "@azure-tools/typespec-azure-core": "~0.42.0", + "@azure-tools/typespec-client-generator-core": "~0.42.0", + "@typespec/compiler": "~0.56.0", + "@typespec/http": "~0.56.0", + "@typespec/openapi": "~0.56.0", + "@typespec/rest": "~0.56.0", + "@typespec/versioning": "~0.56.0" } }, "node_modules/@azure-tools/typespec-azure-core": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@azure-tools/typespec-azure-core/-/typespec-azure-core-0.35.0.tgz", - "integrity": "sha512-BOzR58O6ZeMcvDD9D1gd9/kZvmJUlyXUiF0BSQUouNVWTlOL9yIMVKZE+zgTiaYm8a3z2uIU9Us6y8CULoWiyw==", + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@azure-tools/typespec-azure-core/-/typespec-azure-core-0.42.0.tgz", + "integrity": "sha512-8C96RkgSWtgqsaHRMWCd2iDltFJZTGmFQiTZazZj/uRy0Wn1ikjSriSN8t1puL5SiUPd0BVJP/YXiwAfjfZYDA==", "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, "peerDependencies": { - "@typespec/compiler": "~0.49.0", - "@typespec/http": "~0.49.0", - "@typespec/rest": "~0.49.0" + "@typespec/compiler": "~0.56.0", + "@typespec/http": "~0.56.0", + "@typespec/rest": "~0.56.0" + } + }, + "node_modules/@azure-tools/typespec-azure-resource-manager": { + "version": "0.42.1", + "resolved": "https://registry.npmjs.org/@azure-tools/typespec-azure-resource-manager/-/typespec-azure-resource-manager-0.42.1.tgz", + "integrity": "sha512-vUqmHWS9OrN+16jXfpgUdUXXa1RLrr8Pkrzb1HFQGmdXuRxMZZtLCRcyyEHZJIMYE4RmmpPoB3JJeqiGWxlegQ==", + "dependencies": { + "change-case": "~5.4.4", + "pluralize": "^8.0.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@azure-tools/typespec-autorest": "~0.42.1", + "@azure-tools/typespec-azure-core": "~0.42.0", + "@typespec/compiler": "~0.56.0", + "@typespec/http": "~0.56.0", + "@typespec/openapi": "~0.56.0", + "@typespec/rest": "~0.56.0", + "@typespec/versioning": "~0.56.0" + } + }, + "node_modules/@azure-tools/typespec-azure-rulesets": { + "version": "0.42.1", + "resolved": "https://registry.npmjs.org/@azure-tools/typespec-azure-rulesets/-/typespec-azure-rulesets-0.42.1.tgz", + "integrity": "sha512-GRiMErWJ96DvDBQMVgGI1sgMTOegXxpx7w6enZyEF0BaodxGfObJyl1TrMb9Pj6NAZfV5Q6uJAfXFbpF1MVDCw==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@azure-tools/typespec-azure-core": "~0.42.0", + "@azure-tools/typespec-azure-resource-manager": "~0.42.1", + "@azure-tools/typespec-client-generator-core": "~0.42.3", + "@typespec/compiler": "~0.56.0" } }, "node_modules/@azure-tools/typespec-client-generator-core": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@azure-tools/typespec-client-generator-core/-/typespec-client-generator-core-0.35.0.tgz", - "integrity": "sha512-3uItmYVhZVmPKCe+s8UZKAubUsjtTbgqVQI4wNayLuAovB9OrWmq09Wq1XEWFHPboGf+4Irehe/feTDnSHA+UA==", + "version": "0.42.3", + "resolved": "https://registry.npmjs.org/@azure-tools/typespec-client-generator-core/-/typespec-client-generator-core-0.42.3.tgz", + "integrity": "sha512-ZDVVIY1uJ8EaI4QhCdQmTdKVACm4xYn/I7ySpwv4oxk9X8kZFhxx+PKNHAlx34mhOf4oF0PW3wCN5DMeU6asYg==", + "dependencies": { + "change-case": "~5.4.4", + "pluralize": "^8.0.0" + }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, "peerDependencies": { - "@typespec/compiler": "~0.49.0", - "@typespec/http": "~0.49.0", - "@typespec/rest": "~0.49.0", - "@typespec/versioning": "~0.49.0" + "@azure-tools/typespec-azure-core": "~0.42.0", + "@typespec/compiler": "~0.56.0", + "@typespec/http": "~0.56.0", + "@typespec/rest": "~0.56.0", + "@typespec/versioning": "~0.56.0" } }, "node_modules/@azure-tools/typespec-ts": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@azure-tools/typespec-ts/-/typespec-ts-0.19.0.tgz", - "integrity": "sha512-kqMYC/69Hrcj0pNs7oVl4hczJ4ewzn89l8Jwh79++zzbDnML/27wZv1Cd5PLqfVxprDOQjZBhPH+eVkHne/ATQ==", + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@azure-tools/typespec-ts/-/typespec-ts-0.29.0.tgz", + "integrity": "sha512-jV+yFduauP68OtN7Xc4v1iFA91yIIDszkcqwGGnHMhLTiypD/hVt96ZEqOoVsWYeUkGt6bGrgPKak+bZD3DYtA==", "dependencies": { - "@azure-tools/rlc-common": "^0.19.0", + "@azure-tools/rlc-common": "^0.29.0", "fs-extra": "^11.1.0", - "prettier": "^2.6.1", + "prettier": "^3.1.0", "ts-morph": "^15.1.0", "tslib": "^2.3.1" }, "peerDependencies": { - "@azure-tools/typespec-azure-core": ">=0.35.0 <1.0.0", - "@azure-tools/typespec-client-generator-core": ">=0.35.0 <1.0.0", - "@typespec/compiler": ">=0.49.0 <1.0.0", - "@typespec/http": ">=0.49.0 <1.0.0", - "@typespec/rest": ">=0.49.0 <1.0.0", - "@typespec/versioning": ">=0.49.0 <1.0.0" + "@azure-tools/typespec-azure-core": ">=0.42.0 <1.0.0", + "@azure-tools/typespec-client-generator-core": ">=0.42.2 <1.0.0", + "@typespec/compiler": ">=0.56.0 <1.0.0", + "@typespec/http": ">=0.56.0 <1.0.0", + "@typespec/rest": ">=0.56.0 <1.0.0", + "@typespec/versioning": ">=0.56.0 <1.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -154,6 +198,17 @@ "node": ">= 8" } }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@ts-morph/common": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.16.0.tgz", @@ -166,22 +221,22 @@ } }, "node_modules/@typespec/compiler": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@typespec/compiler/-/compiler-0.49.0.tgz", - "integrity": "sha512-wu0BzCnG6K8GArO1Mo0UIAVvsGnip+Dce3uBuPcW6mGSAv6Y0NljWBHp8dAJNs+uv45wFWpdkZFQvjr3SNUDJw==", + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@typespec/compiler/-/compiler-0.56.0.tgz", + "integrity": "sha512-K+VhXycoeqcoSGtB0/l1XYco4V2qRsCOOwqklVM4Yew7kTcKVfz7CT7a6a2OKWDMNg5iijZtRBoM5YF50XtQug==", "dependencies": { - "@babel/code-frame": "~7.22.13", + "@babel/code-frame": "~7.24.2", "ajv": "~8.12.0", - "change-case": "~4.1.2", - "globby": "~13.2.2", + "change-case": "~5.4.4", + "globby": "~14.0.1", "mustache": "~4.2.0", "picocolors": "~1.0.0", - "prettier": "~3.0.3", + "prettier": "~3.2.5", "prompts": "~2.4.2", - "semver": "^7.5.4", - "vscode-languageserver": "~9.0.0", - "vscode-languageserver-textdocument": "~1.0.8", - "yaml": "~2.3.2", + "semver": "^7.6.0", + "vscode-languageserver": "~9.0.1", + "vscode-languageserver-textdocument": "~1.0.11", + "yaml": "~2.4.1", "yargs": "~17.7.2" }, "bin": { @@ -189,13 +244,13 @@ "tsp-server": "cmd/tsp-server.js" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@typespec/compiler/node_modules/prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", "bin": { "prettier": "bin/prettier.cjs" }, @@ -207,50 +262,50 @@ } }, "node_modules/@typespec/http": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@typespec/http/-/http-0.49.0.tgz", - "integrity": "sha512-MvDJ0s7CjeA/nmutQ4PSTYOj0Gy+78PNd/xe4W5II5w4Kb32Q1vT/oWI2bVZ9G5MkTugKK9P6jmfzwY7EiHksg==", + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@typespec/http/-/http-0.56.0.tgz", + "integrity": "sha512-f/tpHRWev9bnAtNPFkfCU/5SFou9glA/rPDY0m2W5bK6EG1/6/TKKKz5FoKPA4xvc2dQ5vu/ouGLb4i5UzXvWQ==", "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, "peerDependencies": { - "@typespec/compiler": "~0.49.0" + "@typespec/compiler": "~0.56.0" } }, "node_modules/@typespec/openapi": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@typespec/openapi/-/openapi-0.49.0.tgz", - "integrity": "sha512-2TQfnGKtiiKYD1eMiRAcEwDByaBf5WgvcIlLWpWJk/nmcKr6ZeOzUDj5V1fGiiY+/1sI0C0qGCz8PIxcvLa9kw==", + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@typespec/openapi/-/openapi-0.56.0.tgz", + "integrity": "sha512-q8+IHRglXBm3slvonRLSNYN2fX7plbWA+ugIiMJZTeyc3enqfxPqMGA8BCiAFV3kwP0uPPpIXbCSIVhHgkONbA==", "peer": true, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, "peerDependencies": { - "@typespec/compiler": "~0.49.0", - "@typespec/http": "~0.49.0" + "@typespec/compiler": "~0.56.0", + "@typespec/http": "~0.56.0" } }, "node_modules/@typespec/rest": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@typespec/rest/-/rest-0.49.0.tgz", - "integrity": "sha512-C5Ym3Dal5MzDkDIAzTekLsGtPDzRSC9cbiagq4LQfFtzfUPA8tJlJOnD8txTw/XIaFg0hvAPNgTZSa+xtiXskQ==", + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@typespec/rest/-/rest-0.56.0.tgz", + "integrity": "sha512-8w4WhWDcpEQNW8bB1BHhiBxIQUChDJtyq/n9p2OI/Bm1wncd61y/ZNOtcxmlKq8uB9d+dzHiZdEfqFCR8HF8/Q==", "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, "peerDependencies": { - "@typespec/compiler": "~0.49.0", - "@typespec/http": "~0.49.0" + "@typespec/compiler": "~0.56.0", + "@typespec/http": "~0.56.0" } }, "node_modules/@typespec/versioning": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@typespec/versioning/-/versioning-0.49.0.tgz", - "integrity": "sha512-SuRcEB0yaD/wPwaXweIRr+lNDB4hgZwFxHi84y7De1xlntutRl+NeRgWd+K4yVS6tpyNHzcqK6Z7bBD30yQK/w==", + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@typespec/versioning/-/versioning-0.56.0.tgz", + "integrity": "sha512-j7IN9XFyGn3LH6IOJkinEvk9sDncsxiWPULOAe0VQ+D/dtCfLawDMUALnvklMDRKeD1OOUPSCjjUAp9OB0f7YA==", "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, "peerDependencies": { - "@typespec/compiler": "~0.49.0" + "@typespec/compiler": "~0.56.0" } }, "node_modules/ajv": { @@ -301,35 +356,16 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" } }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/capital-case": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", - "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -344,23 +380,9 @@ } }, "node_modules/change-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", - "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", - "dependencies": { - "camel-case": "^4.1.2", - "capital-case": "^1.0.4", - "constant-case": "^3.0.4", - "dot-case": "^3.0.4", - "header-case": "^2.0.4", - "no-case": "^3.0.4", - "param-case": "^3.0.4", - "pascal-case": "^3.1.2", - "path-case": "^3.0.4", - "sentence-case": "^3.0.4", - "snake-case": "^3.0.4", - "tslib": "^2.0.3" - } + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==" }, "node_modules/cliui": { "version": "8.0.1", @@ -393,45 +415,15 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, - "node_modules/constant-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", - "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case": "^2.0.2" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "engines": { "node": ">=6" } @@ -465,17 +457,17 @@ } }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -484,9 +476,9 @@ } }, "node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -516,18 +508,19 @@ } }, "node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz", + "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==", "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -566,19 +559,10 @@ "node": ">=4" } }, - "node_modules/header-case": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", - "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", - "dependencies": { - "capital-case": "^1.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "engines": { "node": ">= 4" } @@ -652,25 +636,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -680,11 +645,11 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -734,59 +699,26 @@ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" }, - "node_modules/path-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", - "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -799,15 +731,23 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "engines": { + "node": ">=4" + } + }, "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.1.tgz", + "integrity": "sha512-7CAwy5dRsxs8PHXT3twixW9/OEll8MLE0VRPCJyl7CkS6VHGPSlsVaWTiASPTyGyYRyApxlaWTzwUxVNrhcwDg==", "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" @@ -900,12 +840,9 @@ } }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "bin": { "semver": "bin/semver.js" }, @@ -913,41 +850,22 @@ "node": ">=10" } }, - "node_modules/sentence-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", - "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "engines": { - "node": ">=12" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -1012,9 +930,9 @@ } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, "node_modules/uglify-js": { "version": "3.17.4", @@ -1028,6 +946,17 @@ "node": ">=0.8.0" } }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", @@ -1036,22 +965,6 @@ "node": ">= 10.0.0" } }, - "node_modules/upper-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", - "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/upper-case-first": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", - "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", - "dependencies": { - "tslib": "^2.0.3" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -1157,15 +1070,13 @@ "node": ">=10" } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.3.tgz", + "integrity": "sha512-sntgmxj8o7DE7g/Qi60cqpLBA3HG3STcDA0kO+WfB05jEKhZMbY7umNm2rBpQvsmZ16/lPXCJGW2672dgOUkrg==", + "bin": { + "yaml": "bin.mjs" + }, "engines": { "node": ">= 14" } diff --git a/eng/emitter-package.json b/eng/emitter-package.json index 11221c28b..f948f4f1a 100644 --- a/eng/emitter-package.json +++ b/eng/emitter-package.json @@ -2,13 +2,15 @@ "name": "typescript-emitter-package", "main": "dist/src/index.js", "dependencies": { - "@azure-tools/typespec-ts": "0.19.0", - "@azure-tools/typespec-azure-core": "0.35.0", - "@azure-tools/typespec-autorest": "0.35.0", - "@azure-tools/typespec-client-generator-core": "0.35.0", - "@typespec/compiler": "0.49.0", - "@typespec/http": "0.49.0", - "@typespec/rest": "0.49.0", - "@typespec/versioning": "0.49.0" + "@azure-tools/typespec-ts": "0.29.0", + "@azure-tools/typespec-azure-core": "0.42.0", + "@azure-tools/typespec-autorest": "0.42.1", + "@azure-tools/typespec-client-generator-core": "0.42.3", + "@azure-tools/typespec-azure-resource-manager": "0.42.1", + "@azure-tools/typespec-azure-rulesets": "0.42.1", + "@typespec/compiler": "0.56.0", + "@typespec/http": "0.56.0", + "@typespec/rest": "0.56.0", + "@typespec/versioning": "0.56.0" } } diff --git a/packages/service/package-lock.json b/packages/service/package-lock.json index fb7e938aa..9175e527a 100644 --- a/packages/service/package-lock.json +++ b/packages/service/package-lock.json @@ -9,11 +9,11 @@ "version": "1.0.1", "license": "MIT", "dependencies": { - "@azure-rest/core-client": "^1.1.4", - "@azure/core-auth": "^1.3.0", + "@azure-rest/core-client": "^1.4.0", + "@azure/core-auth": "^1.6.0", "@azure/core-lro": "^2.2.0", - "@azure/core-paging": "^1.2.0", - "@azure/core-rest-pipeline": "^1.8.0", + "@azure/core-paging": "^1.5.0", + "@azure/core-rest-pipeline": "^1.16.0", "@azure/logger": "^1.0.0" }, "devDependencies": { @@ -42,19 +42,30 @@ } }, "node_modules/@azure-rest/core-client": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@azure-rest/core-client/-/core-client-1.1.4.tgz", - "integrity": "sha512-RUIQOA8T0WcbNlddr8hjl2MuC5GVRqmMwPXqBVsgvdKesLy+eg3y/6nf3qe2fvcJMI1gF6VtgU5U4hRaR4w4ag==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@azure-rest/core-client/-/core-client-1.4.0.tgz", + "integrity": "sha512-ozTDPBVUDR5eOnMIwhggbnVmOrka4fXCs8n8mvUo4WLLc38kki6bAOByDoVZZPz/pZy2jMt2kwfpvy/UjALj6w==", "dependencies": { - "@azure/abort-controller": "^1.1.0", + "@azure/abort-controller": "^2.0.0", "@azure/core-auth": "^1.3.0", "@azure/core-rest-pipeline": "^1.5.0", "@azure/core-tracing": "^1.0.1", "@azure/core-util": "^1.0.0", - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@azure-rest/core-client/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@azure/abort-controller": { @@ -69,16 +80,27 @@ } }, "node_modules/@azure/core-auth": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.5.0.tgz", - "integrity": "sha512-udzoBuYG1VBoHVohDTrvKjyzel34zt77Bhp7dQntVGGD0ehVq48owENbBG8fIgkHRNUBQH5k1r0hpoMu5L8+kw==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.7.2.tgz", + "integrity": "sha512-Igm/S3fDYmnMq1uKS38Ae1/m37B3zigdlZw+kocwEhh5GjyKjPrXKO2J6rzpC1wAxrNil/jX9BJRqBshyjnF3g==", "dependencies": { - "@azure/abort-controller": "^1.0.0", + "@azure/abort-controller": "^2.0.0", "@azure/core-util": "^1.1.0", - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-auth/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@azure/core-lro": { @@ -107,56 +129,67 @@ } }, "node_modules/@azure/core-rest-pipeline": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.12.2.tgz", - "integrity": "sha512-wLLJQdL4v1yoqYtEtjKNjf8pJ/G/BqVomAWxcKOR1KbZJyCEnCv04yks7Y1NhJ3JzxbDs307W67uX0JzklFdCg==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.16.0.tgz", + "integrity": "sha512-CeuTvsXxCUmEuxH5g/aceuSl6w2EugvNHKAtKKVdiX915EjJJxAwfzNNWZreNnbxHZ2fi0zaM6wwS23x2JVqSQ==", "dependencies": { - "@azure/abort-controller": "^1.0.0", + "@azure/abort-controller": "^2.0.0", "@azure/core-auth": "^1.4.0", "@azure/core-tracing": "^1.0.1", - "@azure/core-util": "^1.3.0", + "@azure/core-util": "^1.9.0", "@azure/logger": "^1.0.0", - "form-data": "^4.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "tslib": "^2.2.0" + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@azure/core-rest-pipeline/node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "node_modules/@azure/core-rest-pipeline/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dependencies": { + "tslib": "^2.6.2" + }, "engines": { - "node": ">= 10" + "node": ">=18.0.0" } }, - "node_modules/@azure/core-rest-pipeline/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "node_modules/@azure/core-rest-pipeline/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/@azure/core-rest-pipeline/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@azure/core-rest-pipeline/node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "dependencies": { + "agent-base": "^7.0.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/@azure/core-tracing": { @@ -171,15 +204,26 @@ } }, "node_modules/@azure/core-util": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.6.1.tgz", - "integrity": "sha512-h5taHeySlsV9qxuK64KZxy4iln1BtMYlNt5jbuEFN3UFSAd1EwKg/Gjl5a6tZ/W8t6li3xPnutOx7zbDyXnPmQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.9.0.tgz", + "integrity": "sha512-AfalUQ1ZppaKuxPPMsFEUdX6GZPB3d9paR9d/TTL7Ow2De8cJaC7ibi7kWVlFAVPCYo31OcnGymc0R89DX8Oaw==", "dependencies": { - "@azure/abort-controller": "^1.0.0", - "tslib": "^2.2.0" + "@azure/abort-controller": "^2.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-util/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@azure/logger": { @@ -1310,6 +1354,7 @@ "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" }, @@ -1381,7 +1426,8 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true }, "node_modules/babel-jest": { "version": "27.5.1", @@ -1701,6 +1747,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -1813,6 +1860,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, "engines": { "node": ">=0.4.0" } @@ -2217,6 +2265,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -3351,6 +3400,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -3359,6 +3409,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -4133,9 +4184,9 @@ "dev": true }, "node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, "node_modules/type-detect": { "version": "4.0.8", diff --git a/packages/service/package.json b/packages/service/package.json index 4c3f0d3bd..b49e105b3 100644 --- a/packages/service/package.json +++ b/packages/service/package.json @@ -64,12 +64,12 @@ "tslib": "~2.3.1" }, "dependencies": { - "@azure-rest/core-client": "^1.1.4", + "@azure-rest/core-client": "^1.4.0", "@azure/bonito-core": "^1.0.0", - "@azure/core-auth": "^1.3.0", + "@azure/core-auth": "^1.6.0", "@azure/core-lro": "^2.2.0", - "@azure/core-paging": "^1.2.0", - "@azure/core-rest-pipeline": "^1.8.0", + "@azure/core-paging": "^1.5.0", + "@azure/core-rest-pipeline": "^1.16.0", "@azure/logger": "^1.0.0" }, "devDependencies": { diff --git a/packages/service/src/constants.ts b/packages/service/src/constants.ts index 873a15960..d8cc7c301 100644 --- a/packages/service/src/constants.ts +++ b/packages/service/src/constants.ts @@ -1,4 +1,4 @@ export const BatchApiVersion = { arm: `2023-11-01`, - data: `2023-05-01.17.0`, + data: `2024-02-01.19.0`, }; diff --git a/packages/service/src/internal/batch-rest/client.ts b/packages/service/src/internal/batch-rest/client.ts index 5718657a6..a1d20f734 100644 --- a/packages/service/src/internal/batch-rest/client.ts +++ b/packages/service/src/internal/batch-rest/client.ts @@ -19,7 +19,7 @@ export function createBatchClient( options = { ...options, httpClient: new BatchHttpClient(), - apiVersion: "2023-05-01.17.0", + apiVersion: "2024-02-01.19.0", }; } // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/packages/service/src/internal/batch-rest/generated/src/batchClient.ts b/packages/service/src/internal/batch-rest/generated/src/batchClient.ts index c2c1b54d9..04831d69b 100644 --- a/packages/service/src/internal/batch-rest/generated/src/batchClient.ts +++ b/packages/service/src/internal/batch-rest/generated/src/batchClient.ts @@ -2,23 +2,23 @@ // Licensed under the MIT license. import { getClient, ClientOptions } from "@azure-rest/core-client"; -import { logger } from "./logger"; +import { logger } from "./logger.js"; import { TokenCredential } from "@azure/core-auth"; -import { BatchClient } from "./clientDefinitions"; +import { BatchClient } from "./clientDefinitions.js"; /** * Initialize a new instance of `BatchClient` - * @param endpoint - Batch account endpoint (for example: https://batchaccount.eastus2.batch.azure.com). + * @param endpointParam - Batch account endpoint (for example: https://batchaccount.eastus2.batch.azure.com). * @param credentials - uniquely identify client credential * @param options - the parameter for all optional parameters */ export default function createClient( - endpoint: string, + endpointParam: string, credentials: TokenCredential, - options: ClientOptions = {} + options: ClientOptions = {}, ): BatchClient { - const baseUrl = options.baseUrl ?? `${endpoint}`; - options.apiVersion = options.apiVersion ?? "2023-11-01.18.0"; + const endpointUrl = options.endpoint ?? options.baseUrl ?? `${endpointParam}`; + options.apiVersion = options.apiVersion ?? "2024-02-01.19.0"; const userAgentInfo = `azsdk-js-batch-rest/1.0.0-beta.1`; const userAgentPrefix = options.userAgentOptions && options.userAgentOptions.userAgentPrefix @@ -44,7 +44,7 @@ export default function createClient( }, }; - const client = getClient(baseUrl, credentials, options) as BatchClient; + const client = getClient(endpointUrl, credentials, options) as BatchClient; return client; } diff --git a/packages/service/src/internal/batch-rest/generated/src/clientDefinitions.ts b/packages/service/src/internal/batch-rest/generated/src/clientDefinitions.ts index a8a57f786..cf6f11b52 100644 --- a/packages/service/src/internal/batch-rest/generated/src/clientDefinitions.ts +++ b/packages/service/src/internal/batch-rest/generated/src/clientDefinitions.ts @@ -32,11 +32,6 @@ import { ListJobsFromScheduleParameters, ListJobPreparationAndReleaseTaskStatusParameters, GetJobTaskCountsParameters, - CreateCertificateParameters, - ListCertificatesParameters, - CancelCertificateDeletionParameters, - DeleteCertificateParameters, - GetCertificateParameters, JobScheduleExistsParameters, DeleteJobScheduleParameters, GetJobScheduleParameters, @@ -65,11 +60,9 @@ import { ReplaceNodeUserParameters, GetNodeParameters, RebootNodeParameters, - ReimageNodeParameters, DisableNodeSchedulingParameters, EnableNodeSchedulingParameters, GetNodeRemoteLoginSettingsParameters, - GetNodeRemoteDesktopFileParameters, UploadNodeLogsParameters, ListNodesParameters, GetNodeExtensionParameters, @@ -78,7 +71,7 @@ import { GetNodeFileParameters, GetNodeFilePropertiesParameters, ListNodeFilesParameters, -} from "./parameters"; +} from "./parameters.js"; import { ListApplications200Response, ListApplicationsDefaultResponse, @@ -141,16 +134,6 @@ import { ListJobPreparationAndReleaseTaskStatusDefaultResponse, GetJobTaskCounts200Response, GetJobTaskCountsDefaultResponse, - CreateCertificate201Response, - CreateCertificateDefaultResponse, - ListCertificates200Response, - ListCertificatesDefaultResponse, - CancelCertificateDeletion204Response, - CancelCertificateDeletionDefaultResponse, - DeleteCertificate202Response, - DeleteCertificateDefaultResponse, - GetCertificate200Response, - GetCertificateDefaultResponse, JobScheduleExists200Response, JobScheduleExists404Response, JobScheduleExistsDefaultResponse, @@ -208,16 +191,12 @@ import { GetNodeDefaultResponse, RebootNode202Response, RebootNodeDefaultResponse, - ReimageNode202Response, - ReimageNodeDefaultResponse, DisableNodeScheduling200Response, DisableNodeSchedulingDefaultResponse, EnableNodeScheduling200Response, EnableNodeSchedulingDefaultResponse, GetNodeRemoteLoginSettings200Response, GetNodeRemoteLoginSettingsDefaultResponse, - GetNodeRemoteDesktopFile200Response, - GetNodeRemoteDesktopFileDefaultResponse, UploadNodeLogs200Response, UploadNodeLogsDefaultResponse, ListNodes200Response, @@ -234,7 +213,7 @@ import { GetNodeFilePropertiesDefaultResponse, ListNodeFiles200Response, ListNodeFilesDefaultResponse, -} from "./responses"; +} from "./responses.js"; import { Client, StreamableMethod } from "@azure-rest/core-client"; export interface ListApplications { @@ -246,7 +225,7 @@ export interface ListApplications { * API. */ get( - options?: ListApplicationsParameters + options?: ListApplicationsParameters, ): StreamableMethod< ListApplications200Response | ListApplicationsDefaultResponse >; @@ -261,7 +240,7 @@ export interface GetApplication { * API. */ get( - options?: GetApplicationParameters + options?: GetApplicationParameters, ): StreamableMethod< GetApplication200Response | GetApplicationDefaultResponse >; @@ -277,7 +256,7 @@ export interface ListPoolUsageMetrics { * last aggregation interval is returned. */ get( - options?: ListPoolUsageMetricsParameters + options?: ListPoolUsageMetricsParameters, ): StreamableMethod< ListPoolUsageMetrics200Response | ListPoolUsageMetricsDefaultResponse >; @@ -290,11 +269,11 @@ export interface CreatePool { * to Microsoft Support engineers. */ post( - options: CreatePoolParameters + options: CreatePoolParameters, ): StreamableMethod; /** Lists all of the Pools in the specified Account. */ get( - options?: ListPoolsParameters + options?: ListPoolsParameters, ): StreamableMethod; } @@ -314,17 +293,17 @@ export interface DeletePool { * error code PoolBeingDeleted. */ delete( - options?: DeletePoolParameters + options?: DeletePoolParameters, ): StreamableMethod; /** Gets basic properties of a Pool. */ head( - options?: PoolExistsParameters + options?: PoolExistsParameters, ): StreamableMethod< PoolExists200Response | PoolExists404Response | PoolExistsDefaultResponse >; /** Gets information about the specified Pool. */ get( - options?: GetPoolParameters + options?: GetPoolParameters, ): StreamableMethod; /** * This only replaces the Pool properties specified in the request. For example, @@ -332,14 +311,14 @@ export interface DeletePool { * a StartTask element, then the Pool keeps the existing StartTask. */ patch( - options: UpdatePoolParameters + options: UpdatePoolParameters, ): StreamableMethod; } export interface DisablePoolAutoScale { /** Disables automatic scaling for a Pool. */ post( - options?: DisablePoolAutoScaleParameters + options?: DisablePoolAutoScaleParameters, ): StreamableMethod< DisablePoolAutoScale200Response | DisablePoolAutoScaleDefaultResponse >; @@ -355,7 +334,7 @@ export interface EnablePoolAutoScale { * more than once every 30 seconds. */ post( - options: EnablePoolAutoScaleParameters + options: EnablePoolAutoScaleParameters, ): StreamableMethod< EnablePoolAutoScale200Response | EnablePoolAutoScaleDefaultResponse >; @@ -368,7 +347,7 @@ export interface EvaluatePoolAutoScale { * scaling enabled in order to evaluate a formula. */ post( - options: EvaluatePoolAutoScaleParameters + options: EvaluatePoolAutoScaleParameters, ): StreamableMethod< EvaluatePoolAutoScale200Response | EvaluatePoolAutoScaleDefaultResponse >; @@ -385,7 +364,7 @@ export interface ResizePool { * Nodes, use the Pool remove Compute Nodes API instead. */ post( - options: ResizePoolParameters + options: ResizePoolParameters, ): StreamableMethod; } @@ -400,7 +379,7 @@ export interface StopPoolResize { * be used to halt the initial sizing of the Pool when it is created. */ post( - options?: StopPoolResizeParameters + options?: StopPoolResizeParameters, ): StreamableMethod< StopPoolResize202Response | StopPoolResizeDefaultResponse >; @@ -413,7 +392,7 @@ export interface ReplacePoolProperties { * with this request, then the Batch service will remove the existing StartTask. */ post( - options: ReplacePoolPropertiesParameters + options: ReplacePoolPropertiesParameters, ): StreamableMethod< ReplacePoolProperties204Response | ReplacePoolPropertiesDefaultResponse >; @@ -426,14 +405,14 @@ export interface RemoveNodes { * Each request may remove up to 100 nodes. */ post( - options: RemoveNodesParameters + options: RemoveNodesParameters, ): StreamableMethod; } export interface ListSupportedImages { /** Lists all Virtual Machine Images supported by the Azure Batch service. */ get( - options?: ListSupportedImagesParameters + options?: ListSupportedImagesParameters, ): StreamableMethod< ListSupportedImages200Response | ListSupportedImagesDefaultResponse >; @@ -446,7 +425,7 @@ export interface ListPoolNodeCounts { * use a list query. */ get( - options?: ListPoolNodeCountsParameters + options?: ListPoolNodeCountsParameters, ): StreamableMethod< ListPoolNodeCounts200Response | ListPoolNodeCountsDefaultResponse >; @@ -464,11 +443,11 @@ export interface DeleteJob { * that the Job is being deleted. */ delete( - options?: DeleteJobParameters + options?: DeleteJobParameters, ): StreamableMethod; /** Gets information about the specified Job. */ get( - options?: GetJobParameters + options?: GetJobParameters, ): StreamableMethod; /** * This replaces only the Job properties specified in the request. For example, if @@ -476,7 +455,7 @@ export interface DeleteJob { * element, then the Job keeps the existing constraints. */ patch( - options: UpdateJobParameters + options: UpdateJobParameters, ): StreamableMethod; /** * This fully replaces all the updatable properties of the Job. For example, if @@ -484,7 +463,7 @@ export interface DeleteJob { * with this request, then the Batch service will remove the existing constraints. */ put( - options: ReplaceJobParameters + options: ReplaceJobParameters, ): StreamableMethod; } @@ -500,7 +479,7 @@ export interface DisableJob { * the request fails with status code 409. */ post( - options: DisableJobParameters + options: DisableJobParameters, ): StreamableMethod; } @@ -514,7 +493,7 @@ export interface EnableJob { * than 180 days ago, those Tasks will not run. */ post( - options?: EnableJobParameters + options?: EnableJobParameters, ): StreamableMethod; } @@ -528,7 +507,7 @@ export interface TerminateJob { * Tasks cannot be added and any remaining active Tasks will not be scheduled. */ post( - options: TerminateJobParameters + options: TerminateJobParameters, ): StreamableMethod; } @@ -545,18 +524,18 @@ export interface CreateJob { * engineers. */ post( - options: CreateJobParameters + options: CreateJobParameters, ): StreamableMethod; /** Lists all of the Jobs in the specified Account. */ get( - options?: ListJobsParameters + options?: ListJobsParameters, ): StreamableMethod; } export interface ListJobsFromSchedule { /** Lists the Jobs that have been created under the specified Job Schedule. */ get( - options?: ListJobsFromScheduleParameters + options?: ListJobsFromScheduleParameters, ): StreamableMethod< ListJobsFromSchedule200Response | ListJobsFromScheduleDefaultResponse >; @@ -572,7 +551,7 @@ export interface ListJobPreparationAndReleaseTaskStatus { * JobPreparationTaskNotSpecified. */ get( - options?: ListJobPreparationAndReleaseTaskStatusParameters + options?: ListJobPreparationAndReleaseTaskStatusParameters, ): StreamableMethod< | ListJobPreparationAndReleaseTaskStatus200Response | ListJobPreparationAndReleaseTaskStatusDefaultResponse @@ -587,74 +566,16 @@ export interface GetJobTaskCounts { * up to date. If you need exact task counts, use a list query. */ get( - options?: GetJobTaskCountsParameters + options?: GetJobTaskCountsParameters, ): StreamableMethod< GetJobTaskCounts200Response | GetJobTaskCountsDefaultResponse >; } -export interface CreateCertificate { - /** Creates a Certificate to the specified Account. */ - post( - options: CreateCertificateParameters - ): StreamableMethod< - CreateCertificate201Response | CreateCertificateDefaultResponse - >; - /** Lists all of the Certificates that have been added to the specified Account. */ - get( - options?: ListCertificatesParameters - ): StreamableMethod< - ListCertificates200Response | ListCertificatesDefaultResponse - >; -} - -export interface CancelCertificateDeletion { - /** - * If you try to delete a Certificate that is being used by a Pool or Compute - * Node, the status of the Certificate changes to deleteFailed. If you decide that - * you want to continue using the Certificate, you can use this operation to set - * the status of the Certificate back to active. If you intend to delete the - * Certificate, you do not need to run this operation after the deletion failed. - * You must make sure that the Certificate is not being used by any resources, and - * then you can try again to delete the Certificate. - */ - post( - options?: CancelCertificateDeletionParameters - ): StreamableMethod< - | CancelCertificateDeletion204Response - | CancelCertificateDeletionDefaultResponse - >; -} - -export interface DeleteCertificate { - /** - * You cannot delete a Certificate if a resource (Pool or Compute Node) is using - * it. Before you can delete a Certificate, you must therefore make sure that the - * Certificate is not associated with any existing Pools, the Certificate is not - * installed on any Nodes (even if you remove a Certificate from a Pool, it is not - * removed from existing Compute Nodes in that Pool until they restart), and no - * running Tasks depend on the Certificate. If you try to delete a Certificate - * that is in use, the deletion fails. The Certificate status changes to - * deleteFailed. You can use Cancel Delete Certificate to set the status back to - * active if you decide that you want to continue using the Certificate. - */ - delete( - options?: DeleteCertificateParameters - ): StreamableMethod< - DeleteCertificate202Response | DeleteCertificateDefaultResponse - >; - /** Gets information about the specified Certificate. */ - get( - options?: GetCertificateParameters - ): StreamableMethod< - GetCertificate200Response | GetCertificateDefaultResponse - >; -} - export interface JobScheduleExists { /** Checks the specified Job Schedule exists. */ head( - options?: JobScheduleExistsParameters + options?: JobScheduleExistsParameters, ): StreamableMethod< | JobScheduleExists200Response | JobScheduleExists404Response @@ -668,13 +589,13 @@ export interface JobScheduleExists { * though they are still counted towards Account lifetime statistics. */ delete( - options?: DeleteJobScheduleParameters + options?: DeleteJobScheduleParameters, ): StreamableMethod< DeleteJobSchedule202Response | DeleteJobScheduleDefaultResponse >; /** Gets information about the specified Job Schedule. */ get( - options?: GetJobScheduleParameters + options?: GetJobScheduleParameters, ): StreamableMethod< GetJobSchedule200Response | GetJobScheduleDefaultResponse >; @@ -686,7 +607,7 @@ export interface JobScheduleExists { * running Jobs are unaffected. */ patch( - options: UpdateJobScheduleParameters + options: UpdateJobScheduleParameters, ): StreamableMethod< UpdateJobSchedule200Response | UpdateJobScheduleDefaultResponse >; @@ -698,7 +619,7 @@ export interface JobScheduleExists { * running Jobs are unaffected. */ put( - options: ReplaceJobScheduleParameters + options: ReplaceJobScheduleParameters, ): StreamableMethod< ReplaceJobSchedule200Response | ReplaceJobScheduleDefaultResponse >; @@ -707,7 +628,7 @@ export interface JobScheduleExists { export interface DisableJobSchedule { /** No new Jobs will be created until the Job Schedule is enabled again. */ post( - options?: DisableJobScheduleParameters + options?: DisableJobScheduleParameters, ): StreamableMethod< DisableJobSchedule204Response | DisableJobScheduleDefaultResponse >; @@ -716,7 +637,7 @@ export interface DisableJobSchedule { export interface EnableJobSchedule { /** Enables a Job Schedule. */ post( - options?: EnableJobScheduleParameters + options?: EnableJobScheduleParameters, ): StreamableMethod< EnableJobSchedule204Response | EnableJobScheduleDefaultResponse >; @@ -725,7 +646,7 @@ export interface EnableJobSchedule { export interface TerminateJobSchedule { /** Terminates a Job Schedule. */ post( - options?: TerminateJobScheduleParameters + options?: TerminateJobScheduleParameters, ): StreamableMethod< TerminateJobSchedule202Response | TerminateJobScheduleDefaultResponse >; @@ -734,13 +655,13 @@ export interface TerminateJobSchedule { export interface CreateJobSchedule { /** Creates a Job Schedule to the specified Account. */ post( - options: CreateJobScheduleParameters + options: CreateJobScheduleParameters, ): StreamableMethod< CreateJobSchedule201Response | CreateJobScheduleDefaultResponse >; /** Lists all of the Job Schedules in the specified Account. */ get( - options?: ListJobSchedulesParameters + options?: ListJobSchedulesParameters, ): StreamableMethod< ListJobSchedules200Response | ListJobSchedulesDefaultResponse >; @@ -753,7 +674,7 @@ export interface CreateTask { * the Batch service and left in whatever state it was in at that time. */ post( - options: CreateTaskParameters + options: CreateTaskParameters, ): StreamableMethod; /** * For multi-instance Tasks, information such as affinityId, executionInfo and @@ -761,7 +682,7 @@ export interface CreateTask { * information about subtasks. */ get( - options?: ListTasksParameters + options?: ListTasksParameters, ): StreamableMethod; } @@ -783,7 +704,7 @@ export interface CreateTaskCollection { * service and left in whatever state it was in at that time. */ post( - options: CreateTaskCollectionParameters + options: CreateTaskCollectionParameters, ): StreamableMethod< CreateTaskCollection200Response | CreateTaskCollectionDefaultResponse >; @@ -798,7 +719,7 @@ export interface DeleteTask { * background. */ delete( - options?: DeleteTaskParameters + options?: DeleteTaskParameters, ): StreamableMethod; /** * For multi-instance Tasks, information such as affinityId, executionInfo and @@ -806,18 +727,18 @@ export interface DeleteTask { * information about subtasks. */ get( - options?: GetTaskParameters + options?: GetTaskParameters, ): StreamableMethod; /** Updates the properties of the specified Task. */ put( - options: ReplaceTaskParameters + options: ReplaceTaskParameters, ): StreamableMethod; } export interface ListSubTasks { /** If the Task is not a multi-instance Task then this returns an empty collection. */ get( - options?: ListSubTasksParameters + options?: ListSubTasksParameters, ): StreamableMethod; } @@ -828,7 +749,7 @@ export interface TerminateTask { * primary task; subtasks are then terminated asynchronously in the background. */ post( - options?: TerminateTaskParameters + options?: TerminateTaskParameters, ): StreamableMethod; } @@ -843,7 +764,7 @@ export interface ReactivateTask { * will fail if the Job has completed (or is terminating or deleting). */ post( - options?: ReactivateTaskParameters + options?: ReactivateTaskParameters, ): StreamableMethod< ReactivateTask204Response | ReactivateTaskDefaultResponse >; @@ -852,17 +773,17 @@ export interface ReactivateTask { export interface DeleteTaskFile { /** Deletes the specified Task file from the Compute Node where the Task ran. */ delete( - options?: DeleteTaskFileParameters + options?: DeleteTaskFileParameters, ): StreamableMethod< DeleteTaskFile200Response | DeleteTaskFileDefaultResponse >; /** Returns the content of the specified Task file. */ get( - options?: GetTaskFileParameters + options?: GetTaskFileParameters, ): StreamableMethod; /** Gets the properties of the specified Task file. */ head( - options?: GetTaskFilePropertiesParameters + options?: GetTaskFilePropertiesParameters, ): StreamableMethod< GetTaskFileProperties200Response | GetTaskFilePropertiesDefaultResponse >; @@ -871,7 +792,7 @@ export interface DeleteTaskFile { export interface ListTaskFiles { /** Lists the files in a Task's directory on its Compute Node. */ get( - options?: ListTaskFilesParameters + options?: ListTaskFilesParameters, ): StreamableMethod; } @@ -881,7 +802,7 @@ export interface CreateNodeUser { * running state. */ post( - options: CreateNodeUserParameters + options: CreateNodeUserParameters, ): StreamableMethod< CreateNodeUser201Response | CreateNodeUserDefaultResponse >; @@ -893,7 +814,7 @@ export interface DeleteNodeUser { * running state. */ delete( - options?: DeleteNodeUserParameters + options?: DeleteNodeUserParameters, ): StreamableMethod< DeleteNodeUser200Response | DeleteNodeUserDefaultResponse >; @@ -904,7 +825,7 @@ export interface DeleteNodeUser { * Account on a Compute Node only when it is in the idle or running state. */ put( - options: ReplaceNodeUserParameters + options: ReplaceNodeUserParameters, ): StreamableMethod< ReplaceNodeUser200Response | ReplaceNodeUserDefaultResponse >; @@ -913,35 +834,24 @@ export interface DeleteNodeUser { export interface GetNode { /** Gets information about the specified Compute Node. */ get( - options?: GetNodeParameters + options?: GetNodeParameters, ): StreamableMethod; } export interface RebootNode { /** You can restart a Compute Node only if it is in an idle or running state. */ post( - options: RebootNodeParameters + options: RebootNodeParameters, ): StreamableMethod; } -export interface ReimageNode { - /** - * You can reinstall the operating system on a Compute Node only if it is in an - * idle or running state. This API can be invoked only on Pools created with the - * cloud service configuration property. - */ - post( - options: ReimageNodeParameters - ): StreamableMethod; -} - export interface DisableNodeScheduling { /** * You can disable Task scheduling on a Compute Node only if its current * scheduling state is enabled. */ post( - options: DisableNodeSchedulingParameters + options: DisableNodeSchedulingParameters, ): StreamableMethod< DisableNodeScheduling200Response | DisableNodeSchedulingDefaultResponse >; @@ -953,7 +863,7 @@ export interface EnableNodeScheduling { * state is disabled */ post( - options?: EnableNodeSchedulingParameters + options?: EnableNodeSchedulingParameters, ): StreamableMethod< EnableNodeScheduling200Response | EnableNodeSchedulingDefaultResponse >; @@ -964,32 +874,15 @@ export interface GetNodeRemoteLoginSettings { * Before you can remotely login to a Compute Node using the remote login * settings, you must create a user Account on the Compute Node. This API can be * invoked only on Pools created with the virtual machine configuration property. - * For Pools created with a cloud service configuration, see the GetRemoteDesktop - * API. */ get( - options?: GetNodeRemoteLoginSettingsParameters + options?: GetNodeRemoteLoginSettingsParameters, ): StreamableMethod< | GetNodeRemoteLoginSettings200Response | GetNodeRemoteLoginSettingsDefaultResponse >; } -export interface GetNodeRemoteDesktopFile { - /** - * Before you can access a Compute Node by using the RDP file, you must create a - * user Account on the Compute Node. This API can only be invoked on Pools created - * with a cloud service configuration. For Pools created with a virtual machine - * configuration, see the GetRemoteLoginSettings API. - */ - get( - options?: GetNodeRemoteDesktopFileParameters - ): StreamableMethod< - | GetNodeRemoteDesktopFile200Response - | GetNodeRemoteDesktopFileDefaultResponse - >; -} - export interface UploadNodeLogs { /** * This is for gathering Azure Batch service log files in an automated fashion @@ -998,7 +891,7 @@ export interface UploadNodeLogs { * support to aid in debugging issues with the Batch service. */ post( - options: UploadNodeLogsParameters + options: UploadNodeLogsParameters, ): StreamableMethod< UploadNodeLogs200Response | UploadNodeLogsDefaultResponse >; @@ -1007,14 +900,14 @@ export interface UploadNodeLogs { export interface ListNodes { /** Lists the Compute Nodes in the specified Pool. */ get( - options?: ListNodesParameters + options?: ListNodesParameters, ): StreamableMethod; } export interface GetNodeExtension { /** Gets information about the specified Compute Node Extension. */ get( - options?: GetNodeExtensionParameters + options?: GetNodeExtensionParameters, ): StreamableMethod< GetNodeExtension200Response | GetNodeExtensionDefaultResponse >; @@ -1023,7 +916,7 @@ export interface GetNodeExtension { export interface ListNodeExtensions { /** Lists the Compute Nodes Extensions in the specified Pool. */ get( - options?: ListNodeExtensionsParameters + options?: ListNodeExtensionsParameters, ): StreamableMethod< ListNodeExtensions200Response | ListNodeExtensionsDefaultResponse >; @@ -1032,17 +925,17 @@ export interface ListNodeExtensions { export interface DeleteNodeFile { /** Deletes the specified file from the Compute Node. */ delete( - options?: DeleteNodeFileParameters + options?: DeleteNodeFileParameters, ): StreamableMethod< DeleteNodeFile200Response | DeleteNodeFileDefaultResponse >; /** Returns the content of the specified Compute Node file. */ get( - options?: GetNodeFileParameters + options?: GetNodeFileParameters, ): StreamableMethod; /** Gets the properties of the specified Compute Node file. */ head( - options?: GetNodeFilePropertiesParameters + options?: GetNodeFilePropertiesParameters, ): StreamableMethod< GetNodeFileProperties200Response | GetNodeFilePropertiesDefaultResponse >; @@ -1051,7 +944,7 @@ export interface DeleteNodeFile { export interface ListNodeFiles { /** Lists all of the files in Task directories on the specified Compute Node. */ get( - options?: ListNodeFilesParameters + options?: ListNodeFilesParameters, ): StreamableMethod; } @@ -1061,7 +954,7 @@ export interface Routes { /** Resource for '/applications/\{applicationId\}' has methods for the following verbs: get */ ( path: "/applications/{applicationId}", - applicationId: string + applicationId: string, ): GetApplication; /** Resource for '/poolusagemetrics' has methods for the following verbs: get */ (path: "/poolusagemetrics"): ListPoolUsageMetrics; @@ -1072,17 +965,17 @@ export interface Routes { /** Resource for '/pools/\{poolId\}/disableautoscale' has methods for the following verbs: post */ ( path: "/pools/{poolId}/disableautoscale", - poolId: string + poolId: string, ): DisablePoolAutoScale; /** Resource for '/pools/\{poolId\}/enableautoscale' has methods for the following verbs: post */ ( path: "/pools/{poolId}/enableautoscale", - poolId: string + poolId: string, ): EnablePoolAutoScale; /** Resource for '/pools/\{poolId\}/evaluateautoscale' has methods for the following verbs: post */ ( path: "/pools/{poolId}/evaluateautoscale", - poolId: string + poolId: string, ): EvaluatePoolAutoScale; /** Resource for '/pools/\{poolId\}/resize' has methods for the following verbs: post */ (path: "/pools/{poolId}/resize", poolId: string): ResizePool; @@ -1091,7 +984,7 @@ export interface Routes { /** Resource for '/pools/\{poolId\}/updateproperties' has methods for the following verbs: post */ ( path: "/pools/{poolId}/updateproperties", - poolId: string + poolId: string, ): ReplacePoolProperties; /** Resource for '/pools/\{poolId\}/removenodes' has methods for the following verbs: post */ (path: "/pools/{poolId}/removenodes", poolId: string): RemoveNodes; @@ -1112,48 +1005,34 @@ export interface Routes { /** Resource for '/jobschedules/\{jobScheduleId\}/jobs' has methods for the following verbs: get */ ( path: "/jobschedules/{jobScheduleId}/jobs", - jobScheduleId: string + jobScheduleId: string, ): ListJobsFromSchedule; /** Resource for '/jobs/\{jobId\}/jobpreparationandreleasetaskstatus' has methods for the following verbs: get */ ( path: "/jobs/{jobId}/jobpreparationandreleasetaskstatus", - jobId: string + jobId: string, ): ListJobPreparationAndReleaseTaskStatus; /** Resource for '/jobs/\{jobId\}/taskcounts' has methods for the following verbs: get */ (path: "/jobs/{jobId}/taskcounts", jobId: string): GetJobTaskCounts; - /** Resource for '/certificates' has methods for the following verbs: post, get */ - (path: "/certificates"): CreateCertificate; - /** Resource for '/certificates(thumbprintAlgorithm=\{thumbprintAlgorithm\},thumbprint=\{thumbprint\})/canceldelete' has methods for the following verbs: post */ - ( - path: "/certificates(thumbprintAlgorithm={thumbprintAlgorithm},thumbprint={thumbprint})/canceldelete", - thumbprintAlgorithm: string, - thumbprint: string - ): CancelCertificateDeletion; - /** Resource for '/certificates(thumbprintAlgorithm=\{thumbprintAlgorithm\},thumbprint=\{thumbprint\})' has methods for the following verbs: delete, get */ - ( - path: "/certificates(thumbprintAlgorithm={thumbprintAlgorithm},thumbprint={thumbprint})", - thumbprintAlgorithm: string, - thumbprint: string - ): DeleteCertificate; /** Resource for '/jobschedules/\{jobScheduleId\}' has methods for the following verbs: head, delete, get, patch, put */ ( path: "/jobschedules/{jobScheduleId}", - jobScheduleId: string + jobScheduleId: string, ): JobScheduleExists; /** Resource for '/jobschedules/\{jobScheduleId\}/disable' has methods for the following verbs: post */ ( path: "/jobschedules/{jobScheduleId}/disable", - jobScheduleId: string + jobScheduleId: string, ): DisableJobSchedule; /** Resource for '/jobschedules/\{jobScheduleId\}/enable' has methods for the following verbs: post */ ( path: "/jobschedules/{jobScheduleId}/enable", - jobScheduleId: string + jobScheduleId: string, ): EnableJobSchedule; /** Resource for '/jobschedules/\{jobScheduleId\}/terminate' has methods for the following verbs: post */ ( path: "/jobschedules/{jobScheduleId}/terminate", - jobScheduleId: string + jobScheduleId: string, ): TerminateJobSchedule; /** Resource for '/jobschedules' has methods for the following verbs: post, get */ (path: "/jobschedules"): CreateJobSchedule; @@ -1162,105 +1041,93 @@ export interface Routes { /** Resource for '/jobs/\{jobId\}/addtaskcollection' has methods for the following verbs: post */ ( path: "/jobs/{jobId}/addtaskcollection", - jobId: string + jobId: string, ): CreateTaskCollection; /** Resource for '/jobs/\{jobId\}/tasks/\{taskId\}' has methods for the following verbs: delete, get, put */ ( path: "/jobs/{jobId}/tasks/{taskId}", jobId: string, - taskId: string + taskId: string, ): DeleteTask; /** Resource for '/jobs/\{jobId\}/tasks/\{taskId\}/subtasksinfo' has methods for the following verbs: get */ ( path: "/jobs/{jobId}/tasks/{taskId}/subtasksinfo", jobId: string, - taskId: string + taskId: string, ): ListSubTasks; /** Resource for '/jobs/\{jobId\}/tasks/\{taskId\}/terminate' has methods for the following verbs: post */ ( path: "/jobs/{jobId}/tasks/{taskId}/terminate", jobId: string, - taskId: string + taskId: string, ): TerminateTask; /** Resource for '/jobs/\{jobId\}/tasks/\{taskId\}/reactivate' has methods for the following verbs: post */ ( path: "/jobs/{jobId}/tasks/{taskId}/reactivate", jobId: string, - taskId: string + taskId: string, ): ReactivateTask; /** Resource for '/jobs/\{jobId\}/tasks/\{taskId\}/files/\{filePath\}' has methods for the following verbs: delete, get, head */ ( path: "/jobs/{jobId}/tasks/{taskId}/files/{filePath}", jobId: string, taskId: string, - filePath: string + filePath: string, ): DeleteTaskFile; /** Resource for '/jobs/\{jobId\}/tasks/\{taskId\}/files' has methods for the following verbs: get */ ( path: "/jobs/{jobId}/tasks/{taskId}/files", jobId: string, - taskId: string + taskId: string, ): ListTaskFiles; /** Resource for '/pools/\{poolId\}/nodes/\{nodeId\}/users' has methods for the following verbs: post */ ( path: "/pools/{poolId}/nodes/{nodeId}/users", poolId: string, - nodeId: string + nodeId: string, ): CreateNodeUser; /** Resource for '/pools/\{poolId\}/nodes/\{nodeId\}/users/\{userName\}' has methods for the following verbs: delete, put */ ( path: "/pools/{poolId}/nodes/{nodeId}/users/{userName}", poolId: string, nodeId: string, - userName: string + userName: string, ): DeleteNodeUser; /** Resource for '/pools/\{poolId\}/nodes/\{nodeId\}' has methods for the following verbs: get */ ( path: "/pools/{poolId}/nodes/{nodeId}", poolId: string, - nodeId: string + nodeId: string, ): GetNode; /** Resource for '/pools/\{poolId\}/nodes/\{nodeId\}/reboot' has methods for the following verbs: post */ ( path: "/pools/{poolId}/nodes/{nodeId}/reboot", poolId: string, - nodeId: string + nodeId: string, ): RebootNode; - /** Resource for '/pools/\{poolId\}/nodes/\{nodeId\}/reimage' has methods for the following verbs: post */ - ( - path: "/pools/{poolId}/nodes/{nodeId}/reimage", - poolId: string, - nodeId: string - ): ReimageNode; /** Resource for '/pools/\{poolId\}/nodes/\{nodeId\}/disablescheduling' has methods for the following verbs: post */ ( path: "/pools/{poolId}/nodes/{nodeId}/disablescheduling", poolId: string, - nodeId: string + nodeId: string, ): DisableNodeScheduling; /** Resource for '/pools/\{poolId\}/nodes/\{nodeId\}/enablescheduling' has methods for the following verbs: post */ ( path: "/pools/{poolId}/nodes/{nodeId}/enablescheduling", poolId: string, - nodeId: string + nodeId: string, ): EnableNodeScheduling; /** Resource for '/pools/\{poolId\}/nodes/\{nodeId\}/remoteloginsettings' has methods for the following verbs: get */ ( path: "/pools/{poolId}/nodes/{nodeId}/remoteloginsettings", poolId: string, - nodeId: string + nodeId: string, ): GetNodeRemoteLoginSettings; - /** Resource for '/pools/\{poolId\}/nodes/\{nodeId\}/rdp' has methods for the following verbs: get */ - ( - path: "/pools/{poolId}/nodes/{nodeId}/rdp", - poolId: string, - nodeId: string - ): GetNodeRemoteDesktopFile; /** Resource for '/pools/\{poolId\}/nodes/\{nodeId\}/uploadbatchservicelogs' has methods for the following verbs: post */ ( path: "/pools/{poolId}/nodes/{nodeId}/uploadbatchservicelogs", poolId: string, - nodeId: string + nodeId: string, ): UploadNodeLogs; /** Resource for '/pools/\{poolId\}/nodes' has methods for the following verbs: get */ (path: "/pools/{poolId}/nodes", poolId: string): ListNodes; @@ -1269,26 +1136,26 @@ export interface Routes { path: "/pools/{poolId}/nodes/{nodeId}/extensions/{extensionName}", poolId: string, nodeId: string, - extensionName: string + extensionName: string, ): GetNodeExtension; /** Resource for '/pools/\{poolId\}/nodes/\{nodeId\}/extensions' has methods for the following verbs: get */ ( path: "/pools/{poolId}/nodes/{nodeId}/extensions", poolId: string, - nodeId: string + nodeId: string, ): ListNodeExtensions; /** Resource for '/pools/\{poolId\}/nodes/\{nodeId\}/files/\{filePath\}' has methods for the following verbs: delete, get, head */ ( path: "/pools/{poolId}/nodes/{nodeId}/files/{filePath}", poolId: string, nodeId: string, - filePath: string + filePath: string, ): DeleteNodeFile; /** Resource for '/pools/\{poolId\}/nodes/\{nodeId\}/files' has methods for the following verbs: get */ ( path: "/pools/{poolId}/nodes/{nodeId}/files", poolId: string, - nodeId: string + nodeId: string, ): ListNodeFiles; } diff --git a/packages/service/src/internal/batch-rest/generated/src/index.ts b/packages/service/src/internal/batch-rest/generated/src/index.ts index 973b06150..93712575e 100644 --- a/packages/service/src/internal/batch-rest/generated/src/index.ts +++ b/packages/service/src/internal/batch-rest/generated/src/index.ts @@ -1,15 +1,15 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. -import BatchClient from "./batchClient"; +import BatchClient from "./batchClient.js"; -export * from "./batchClient"; -export * from "./parameters"; -export * from "./responses"; -export * from "./clientDefinitions"; -export * from "./isUnexpected"; -export * from "./models"; -export * from "./outputModels"; -export * from "./paginateHelper"; +export * from "./batchClient.js"; +export * from "./parameters.js"; +export * from "./responses.js"; +export * from "./clientDefinitions.js"; +export * from "./isUnexpected.js"; +export * from "./models.js"; +export * from "./outputModels.js"; +export * from "./paginateHelper.js"; export default BatchClient; diff --git a/packages/service/src/internal/batch-rest/generated/src/isUnexpected.ts b/packages/service/src/internal/batch-rest/generated/src/isUnexpected.ts index ea7d6cc06..22d1a53b0 100644 --- a/packages/service/src/internal/batch-rest/generated/src/isUnexpected.ts +++ b/packages/service/src/internal/batch-rest/generated/src/isUnexpected.ts @@ -63,16 +63,6 @@ import { ListJobPreparationAndReleaseTaskStatusDefaultResponse, GetJobTaskCounts200Response, GetJobTaskCountsDefaultResponse, - CreateCertificate201Response, - CreateCertificateDefaultResponse, - ListCertificates200Response, - ListCertificatesDefaultResponse, - CancelCertificateDeletion204Response, - CancelCertificateDeletionDefaultResponse, - DeleteCertificate202Response, - DeleteCertificateDefaultResponse, - GetCertificate200Response, - GetCertificateDefaultResponse, JobScheduleExists200Response, JobScheduleExists404Response, JobScheduleExistsDefaultResponse, @@ -130,16 +120,12 @@ import { GetNodeDefaultResponse, RebootNode202Response, RebootNodeDefaultResponse, - ReimageNode202Response, - ReimageNodeDefaultResponse, DisableNodeScheduling200Response, DisableNodeSchedulingDefaultResponse, EnableNodeScheduling200Response, EnableNodeSchedulingDefaultResponse, GetNodeRemoteLoginSettings200Response, GetNodeRemoteLoginSettingsDefaultResponse, - GetNodeRemoteDesktopFile200Response, - GetNodeRemoteDesktopFileDefaultResponse, UploadNodeLogs200Response, UploadNodeLogsDefaultResponse, ListNodes200Response, @@ -156,7 +142,7 @@ import { GetNodeFilePropertiesDefaultResponse, ListNodeFiles200Response, ListNodeFilesDefaultResponse, -} from "./responses"; +} from "./responses.js"; const responseMap: Record = { "GET /applications": ["200"], @@ -189,14 +175,6 @@ const responseMap: Record = { "GET /jobschedules/{jobScheduleId}/jobs": ["200"], "GET /jobs/{jobId}/jobpreparationandreleasetaskstatus": ["200"], "GET /jobs/{jobId}/taskcounts": ["200"], - "POST /certificates": ["201"], - "GET /certificates": ["200"], - "POST /certificates(thumbprintAlgorithm={thumbprintAlgorithm},thumbprint={thumbprint})/canceldelete": - ["204"], - "DELETE /certificates(thumbprintAlgorithm={thumbprintAlgorithm},thumbprint={thumbprint})": - ["202"], - "GET /certificates(thumbprintAlgorithm={thumbprintAlgorithm},thumbprint={thumbprint})": - ["200"], "HEAD /jobschedules/{jobScheduleId}": ["200", "404"], "DELETE /jobschedules/{jobScheduleId}": ["202"], "GET /jobschedules/{jobScheduleId}": ["200"], @@ -225,11 +203,9 @@ const responseMap: Record = { "PUT /pools/{poolId}/nodes/{nodeId}/users/{userName}": ["200"], "GET /pools/{poolId}/nodes/{nodeId}": ["200"], "POST /pools/{poolId}/nodes/{nodeId}/reboot": ["202"], - "POST /pools/{poolId}/nodes/{nodeId}/reimage": ["202"], "POST /pools/{poolId}/nodes/{nodeId}/disablescheduling": ["200"], "POST /pools/{poolId}/nodes/{nodeId}/enablescheduling": ["200"], "GET /pools/{poolId}/nodes/{nodeId}/remoteloginsettings": ["200"], - "GET /pools/{poolId}/nodes/{nodeId}/rdp": ["200"], "POST /pools/{poolId}/nodes/{nodeId}/uploadbatchservicelogs": ["200"], "GET /pools/{poolId}/nodes": ["200"], "GET /pools/{poolId}/nodes/{nodeId}/extensions/{extensionName}": ["200"], @@ -241,268 +217,243 @@ const responseMap: Record = { }; export function isUnexpected( - response: ListApplications200Response | ListApplicationsDefaultResponse + response: ListApplications200Response | ListApplicationsDefaultResponse, ): response is ListApplicationsDefaultResponse; export function isUnexpected( - response: GetApplication200Response | GetApplicationDefaultResponse + response: GetApplication200Response | GetApplicationDefaultResponse, ): response is GetApplicationDefaultResponse; export function isUnexpected( response: | ListPoolUsageMetrics200Response - | ListPoolUsageMetricsDefaultResponse + | ListPoolUsageMetricsDefaultResponse, ): response is ListPoolUsageMetricsDefaultResponse; export function isUnexpected( - response: CreatePool201Response | CreatePoolDefaultResponse + response: CreatePool201Response | CreatePoolDefaultResponse, ): response is CreatePoolDefaultResponse; export function isUnexpected( - response: ListPools200Response | ListPoolsDefaultResponse + response: ListPools200Response | ListPoolsDefaultResponse, ): response is ListPoolsDefaultResponse; export function isUnexpected( - response: DeletePool202Response | DeletePoolDefaultResponse + response: DeletePool202Response | DeletePoolDefaultResponse, ): response is DeletePoolDefaultResponse; export function isUnexpected( response: | PoolExists200Response | PoolExists404Response - | PoolExistsDefaultResponse + | PoolExistsDefaultResponse, ): response is PoolExistsDefaultResponse; export function isUnexpected( - response: GetPool200Response | GetPoolDefaultResponse + response: GetPool200Response | GetPoolDefaultResponse, ): response is GetPoolDefaultResponse; export function isUnexpected( - response: UpdatePool200Response | UpdatePoolDefaultResponse + response: UpdatePool200Response | UpdatePoolDefaultResponse, ): response is UpdatePoolDefaultResponse; export function isUnexpected( response: | DisablePoolAutoScale200Response - | DisablePoolAutoScaleDefaultResponse + | DisablePoolAutoScaleDefaultResponse, ): response is DisablePoolAutoScaleDefaultResponse; export function isUnexpected( - response: EnablePoolAutoScale200Response | EnablePoolAutoScaleDefaultResponse + response: EnablePoolAutoScale200Response | EnablePoolAutoScaleDefaultResponse, ): response is EnablePoolAutoScaleDefaultResponse; export function isUnexpected( response: | EvaluatePoolAutoScale200Response - | EvaluatePoolAutoScaleDefaultResponse + | EvaluatePoolAutoScaleDefaultResponse, ): response is EvaluatePoolAutoScaleDefaultResponse; export function isUnexpected( - response: ResizePool202Response | ResizePoolDefaultResponse + response: ResizePool202Response | ResizePoolDefaultResponse, ): response is ResizePoolDefaultResponse; export function isUnexpected( - response: StopPoolResize202Response | StopPoolResizeDefaultResponse + response: StopPoolResize202Response | StopPoolResizeDefaultResponse, ): response is StopPoolResizeDefaultResponse; export function isUnexpected( response: | ReplacePoolProperties204Response - | ReplacePoolPropertiesDefaultResponse + | ReplacePoolPropertiesDefaultResponse, ): response is ReplacePoolPropertiesDefaultResponse; export function isUnexpected( - response: RemoveNodes202Response | RemoveNodesDefaultResponse + response: RemoveNodes202Response | RemoveNodesDefaultResponse, ): response is RemoveNodesDefaultResponse; export function isUnexpected( - response: ListSupportedImages200Response | ListSupportedImagesDefaultResponse + response: ListSupportedImages200Response | ListSupportedImagesDefaultResponse, ): response is ListSupportedImagesDefaultResponse; export function isUnexpected( - response: ListPoolNodeCounts200Response | ListPoolNodeCountsDefaultResponse + response: ListPoolNodeCounts200Response | ListPoolNodeCountsDefaultResponse, ): response is ListPoolNodeCountsDefaultResponse; export function isUnexpected( - response: DeleteJob202Response | DeleteJobDefaultResponse + response: DeleteJob202Response | DeleteJobDefaultResponse, ): response is DeleteJobDefaultResponse; export function isUnexpected( - response: GetJob200Response | GetJobDefaultResponse + response: GetJob200Response | GetJobDefaultResponse, ): response is GetJobDefaultResponse; export function isUnexpected( - response: UpdateJob200Response | UpdateJobDefaultResponse + response: UpdateJob200Response | UpdateJobDefaultResponse, ): response is UpdateJobDefaultResponse; export function isUnexpected( - response: ReplaceJob200Response | ReplaceJobDefaultResponse + response: ReplaceJob200Response | ReplaceJobDefaultResponse, ): response is ReplaceJobDefaultResponse; export function isUnexpected( - response: DisableJob202Response | DisableJobDefaultResponse + response: DisableJob202Response | DisableJobDefaultResponse, ): response is DisableJobDefaultResponse; export function isUnexpected( - response: EnableJob202Response | EnableJobDefaultResponse + response: EnableJob202Response | EnableJobDefaultResponse, ): response is EnableJobDefaultResponse; export function isUnexpected( - response: TerminateJob202Response | TerminateJobDefaultResponse + response: TerminateJob202Response | TerminateJobDefaultResponse, ): response is TerminateJobDefaultResponse; export function isUnexpected( - response: CreateJob201Response | CreateJobDefaultResponse + response: CreateJob201Response | CreateJobDefaultResponse, ): response is CreateJobDefaultResponse; export function isUnexpected( - response: ListJobs200Response | ListJobsDefaultResponse + response: ListJobs200Response | ListJobsDefaultResponse, ): response is ListJobsDefaultResponse; export function isUnexpected( response: | ListJobsFromSchedule200Response - | ListJobsFromScheduleDefaultResponse + | ListJobsFromScheduleDefaultResponse, ): response is ListJobsFromScheduleDefaultResponse; export function isUnexpected( response: | ListJobPreparationAndReleaseTaskStatus200Response - | ListJobPreparationAndReleaseTaskStatusDefaultResponse + | ListJobPreparationAndReleaseTaskStatusDefaultResponse, ): response is ListJobPreparationAndReleaseTaskStatusDefaultResponse; export function isUnexpected( - response: GetJobTaskCounts200Response | GetJobTaskCountsDefaultResponse + response: GetJobTaskCounts200Response | GetJobTaskCountsDefaultResponse, ): response is GetJobTaskCountsDefaultResponse; -export function isUnexpected( - response: CreateCertificate201Response | CreateCertificateDefaultResponse -): response is CreateCertificateDefaultResponse; -export function isUnexpected( - response: ListCertificates200Response | ListCertificatesDefaultResponse -): response is ListCertificatesDefaultResponse; -export function isUnexpected( - response: - | CancelCertificateDeletion204Response - | CancelCertificateDeletionDefaultResponse -): response is CancelCertificateDeletionDefaultResponse; -export function isUnexpected( - response: DeleteCertificate202Response | DeleteCertificateDefaultResponse -): response is DeleteCertificateDefaultResponse; -export function isUnexpected( - response: GetCertificate200Response | GetCertificateDefaultResponse -): response is GetCertificateDefaultResponse; export function isUnexpected( response: | JobScheduleExists200Response | JobScheduleExists404Response - | JobScheduleExistsDefaultResponse + | JobScheduleExistsDefaultResponse, ): response is JobScheduleExistsDefaultResponse; export function isUnexpected( - response: DeleteJobSchedule202Response | DeleteJobScheduleDefaultResponse + response: DeleteJobSchedule202Response | DeleteJobScheduleDefaultResponse, ): response is DeleteJobScheduleDefaultResponse; export function isUnexpected( - response: GetJobSchedule200Response | GetJobScheduleDefaultResponse + response: GetJobSchedule200Response | GetJobScheduleDefaultResponse, ): response is GetJobScheduleDefaultResponse; export function isUnexpected( - response: UpdateJobSchedule200Response | UpdateJobScheduleDefaultResponse + response: UpdateJobSchedule200Response | UpdateJobScheduleDefaultResponse, ): response is UpdateJobScheduleDefaultResponse; export function isUnexpected( - response: ReplaceJobSchedule200Response | ReplaceJobScheduleDefaultResponse + response: ReplaceJobSchedule200Response | ReplaceJobScheduleDefaultResponse, ): response is ReplaceJobScheduleDefaultResponse; export function isUnexpected( - response: DisableJobSchedule204Response | DisableJobScheduleDefaultResponse + response: DisableJobSchedule204Response | DisableJobScheduleDefaultResponse, ): response is DisableJobScheduleDefaultResponse; export function isUnexpected( - response: EnableJobSchedule204Response | EnableJobScheduleDefaultResponse + response: EnableJobSchedule204Response | EnableJobScheduleDefaultResponse, ): response is EnableJobScheduleDefaultResponse; export function isUnexpected( response: | TerminateJobSchedule202Response - | TerminateJobScheduleDefaultResponse + | TerminateJobScheduleDefaultResponse, ): response is TerminateJobScheduleDefaultResponse; export function isUnexpected( - response: CreateJobSchedule201Response | CreateJobScheduleDefaultResponse + response: CreateJobSchedule201Response | CreateJobScheduleDefaultResponse, ): response is CreateJobScheduleDefaultResponse; export function isUnexpected( - response: ListJobSchedules200Response | ListJobSchedulesDefaultResponse + response: ListJobSchedules200Response | ListJobSchedulesDefaultResponse, ): response is ListJobSchedulesDefaultResponse; export function isUnexpected( - response: CreateTask201Response | CreateTaskDefaultResponse + response: CreateTask201Response | CreateTaskDefaultResponse, ): response is CreateTaskDefaultResponse; export function isUnexpected( - response: ListTasks200Response | ListTasksDefaultResponse + response: ListTasks200Response | ListTasksDefaultResponse, ): response is ListTasksDefaultResponse; export function isUnexpected( response: | CreateTaskCollection200Response - | CreateTaskCollectionDefaultResponse + | CreateTaskCollectionDefaultResponse, ): response is CreateTaskCollectionDefaultResponse; export function isUnexpected( - response: DeleteTask200Response | DeleteTaskDefaultResponse + response: DeleteTask200Response | DeleteTaskDefaultResponse, ): response is DeleteTaskDefaultResponse; export function isUnexpected( - response: GetTask200Response | GetTaskDefaultResponse + response: GetTask200Response | GetTaskDefaultResponse, ): response is GetTaskDefaultResponse; export function isUnexpected( - response: ReplaceTask200Response | ReplaceTaskDefaultResponse + response: ReplaceTask200Response | ReplaceTaskDefaultResponse, ): response is ReplaceTaskDefaultResponse; export function isUnexpected( - response: ListSubTasks200Response | ListSubTasksDefaultResponse + response: ListSubTasks200Response | ListSubTasksDefaultResponse, ): response is ListSubTasksDefaultResponse; export function isUnexpected( - response: TerminateTask204Response | TerminateTaskDefaultResponse + response: TerminateTask204Response | TerminateTaskDefaultResponse, ): response is TerminateTaskDefaultResponse; export function isUnexpected( - response: ReactivateTask204Response | ReactivateTaskDefaultResponse + response: ReactivateTask204Response | ReactivateTaskDefaultResponse, ): response is ReactivateTaskDefaultResponse; export function isUnexpected( - response: DeleteTaskFile200Response | DeleteTaskFileDefaultResponse + response: DeleteTaskFile200Response | DeleteTaskFileDefaultResponse, ): response is DeleteTaskFileDefaultResponse; export function isUnexpected( - response: GetTaskFile200Response | GetTaskFileDefaultResponse + response: GetTaskFile200Response | GetTaskFileDefaultResponse, ): response is GetTaskFileDefaultResponse; export function isUnexpected( response: | GetTaskFileProperties200Response - | GetTaskFilePropertiesDefaultResponse + | GetTaskFilePropertiesDefaultResponse, ): response is GetTaskFilePropertiesDefaultResponse; export function isUnexpected( - response: ListTaskFiles200Response | ListTaskFilesDefaultResponse + response: ListTaskFiles200Response | ListTaskFilesDefaultResponse, ): response is ListTaskFilesDefaultResponse; export function isUnexpected( - response: CreateNodeUser201Response | CreateNodeUserDefaultResponse + response: CreateNodeUser201Response | CreateNodeUserDefaultResponse, ): response is CreateNodeUserDefaultResponse; export function isUnexpected( - response: DeleteNodeUser200Response | DeleteNodeUserDefaultResponse + response: DeleteNodeUser200Response | DeleteNodeUserDefaultResponse, ): response is DeleteNodeUserDefaultResponse; export function isUnexpected( - response: ReplaceNodeUser200Response | ReplaceNodeUserDefaultResponse + response: ReplaceNodeUser200Response | ReplaceNodeUserDefaultResponse, ): response is ReplaceNodeUserDefaultResponse; export function isUnexpected( - response: GetNode200Response | GetNodeDefaultResponse + response: GetNode200Response | GetNodeDefaultResponse, ): response is GetNodeDefaultResponse; export function isUnexpected( - response: RebootNode202Response | RebootNodeDefaultResponse + response: RebootNode202Response | RebootNodeDefaultResponse, ): response is RebootNodeDefaultResponse; -export function isUnexpected( - response: ReimageNode202Response | ReimageNodeDefaultResponse -): response is ReimageNodeDefaultResponse; export function isUnexpected( response: | DisableNodeScheduling200Response - | DisableNodeSchedulingDefaultResponse + | DisableNodeSchedulingDefaultResponse, ): response is DisableNodeSchedulingDefaultResponse; export function isUnexpected( response: | EnableNodeScheduling200Response - | EnableNodeSchedulingDefaultResponse + | EnableNodeSchedulingDefaultResponse, ): response is EnableNodeSchedulingDefaultResponse; export function isUnexpected( response: | GetNodeRemoteLoginSettings200Response - | GetNodeRemoteLoginSettingsDefaultResponse + | GetNodeRemoteLoginSettingsDefaultResponse, ): response is GetNodeRemoteLoginSettingsDefaultResponse; export function isUnexpected( - response: - | GetNodeRemoteDesktopFile200Response - | GetNodeRemoteDesktopFileDefaultResponse -): response is GetNodeRemoteDesktopFileDefaultResponse; -export function isUnexpected( - response: UploadNodeLogs200Response | UploadNodeLogsDefaultResponse + response: UploadNodeLogs200Response | UploadNodeLogsDefaultResponse, ): response is UploadNodeLogsDefaultResponse; export function isUnexpected( - response: ListNodes200Response | ListNodesDefaultResponse + response: ListNodes200Response | ListNodesDefaultResponse, ): response is ListNodesDefaultResponse; export function isUnexpected( - response: GetNodeExtension200Response | GetNodeExtensionDefaultResponse + response: GetNodeExtension200Response | GetNodeExtensionDefaultResponse, ): response is GetNodeExtensionDefaultResponse; export function isUnexpected( - response: ListNodeExtensions200Response | ListNodeExtensionsDefaultResponse + response: ListNodeExtensions200Response | ListNodeExtensionsDefaultResponse, ): response is ListNodeExtensionsDefaultResponse; export function isUnexpected( - response: DeleteNodeFile200Response | DeleteNodeFileDefaultResponse + response: DeleteNodeFile200Response | DeleteNodeFileDefaultResponse, ): response is DeleteNodeFileDefaultResponse; export function isUnexpected( - response: GetNodeFile200Response | GetNodeFileDefaultResponse + response: GetNodeFile200Response | GetNodeFileDefaultResponse, ): response is GetNodeFileDefaultResponse; export function isUnexpected( response: | GetNodeFileProperties200Response - | GetNodeFilePropertiesDefaultResponse + | GetNodeFilePropertiesDefaultResponse, ): response is GetNodeFilePropertiesDefaultResponse; export function isUnexpected( - response: ListNodeFiles200Response | ListNodeFilesDefaultResponse + response: ListNodeFiles200Response | ListNodeFilesDefaultResponse, ): response is ListNodeFilesDefaultResponse; export function isUnexpected( response: @@ -567,16 +518,6 @@ export function isUnexpected( | ListJobPreparationAndReleaseTaskStatusDefaultResponse | GetJobTaskCounts200Response | GetJobTaskCountsDefaultResponse - | CreateCertificate201Response - | CreateCertificateDefaultResponse - | ListCertificates200Response - | ListCertificatesDefaultResponse - | CancelCertificateDeletion204Response - | CancelCertificateDeletionDefaultResponse - | DeleteCertificate202Response - | DeleteCertificateDefaultResponse - | GetCertificate200Response - | GetCertificateDefaultResponse | JobScheduleExists200Response | JobScheduleExists404Response | JobScheduleExistsDefaultResponse @@ -634,16 +575,12 @@ export function isUnexpected( | GetNodeDefaultResponse | RebootNode202Response | RebootNodeDefaultResponse - | ReimageNode202Response - | ReimageNodeDefaultResponse | DisableNodeScheduling200Response | DisableNodeSchedulingDefaultResponse | EnableNodeScheduling200Response | EnableNodeSchedulingDefaultResponse | GetNodeRemoteLoginSettings200Response | GetNodeRemoteLoginSettingsDefaultResponse - | GetNodeRemoteDesktopFile200Response - | GetNodeRemoteDesktopFileDefaultResponse | UploadNodeLogs200Response | UploadNodeLogsDefaultResponse | ListNodes200Response @@ -659,7 +596,7 @@ export function isUnexpected( | GetNodeFileProperties200Response | GetNodeFilePropertiesDefaultResponse | ListNodeFiles200Response - | ListNodeFilesDefaultResponse + | ListNodeFilesDefaultResponse, ): response is | ListApplicationsDefaultResponse | GetApplicationDefaultResponse @@ -691,11 +628,6 @@ export function isUnexpected( | ListJobsFromScheduleDefaultResponse | ListJobPreparationAndReleaseTaskStatusDefaultResponse | GetJobTaskCountsDefaultResponse - | CreateCertificateDefaultResponse - | ListCertificatesDefaultResponse - | CancelCertificateDeletionDefaultResponse - | DeleteCertificateDefaultResponse - | GetCertificateDefaultResponse | JobScheduleExistsDefaultResponse | DeleteJobScheduleDefaultResponse | GetJobScheduleDefaultResponse @@ -724,11 +656,9 @@ export function isUnexpected( | ReplaceNodeUserDefaultResponse | GetNodeDefaultResponse | RebootNodeDefaultResponse - | ReimageNodeDefaultResponse | DisableNodeSchedulingDefaultResponse | EnableNodeSchedulingDefaultResponse | GetNodeRemoteLoginSettingsDefaultResponse - | GetNodeRemoteDesktopFileDefaultResponse | UploadNodeLogsDefaultResponse | ListNodesDefaultResponse | GetNodeExtensionDefaultResponse @@ -785,7 +715,7 @@ function getParametrizedPathSuccess(method: string, path: string): string[] { // {guid} ==> $ // {guid}:export ==> :export$ const isMatched = new RegExp( - `${candidateParts[i]?.slice(start, end)}` + `${candidateParts[i]?.slice(start, end)}`, ).test(pathParts[j] || ""); if (!isMatched) { diff --git a/packages/service/src/internal/batch-rest/generated/src/models.ts b/packages/service/src/internal/batch-rest/generated/src/models.ts index affe1e5bf..e10f7a10d 100644 --- a/packages/service/src/internal/batch-rest/generated/src/models.ts +++ b/packages/service/src/internal/batch-rest/generated/src/models.ts @@ -2,16 +2,14 @@ // Licensed under the MIT license. /** Parameters for creating an Azure Batch Pool. */ -export interface BatchPoolCreateParameters { +export interface BatchPoolCreateContent { /** A string that uniquely identifies the Pool within the Account. The ID can contain any combination of alphanumeric characters including hyphens and underscores, and cannot contain more than 64 characters. The ID is case-preserving and case-insensitive (that is, you may not have two Pool IDs within an Account that differ only by case). */ id: string; /** The display name for the Pool. The display name need not be unique and can contain any Unicode characters up to a maximum length of 1024. */ displayName?: string; - /** The size of virtual machines in the Pool. All virtual machines in a Pool are the same size. For information about available sizes of virtual machines for Cloud Services Pools (pools created with cloudServiceConfiguration), see Sizes for Cloud Services (https://azure.microsoft.com/documentation/articles/cloud-services-sizes-specs/). Batch supports all Cloud Services VM sizes except ExtraSmall, A1V2 and A2V2. For information about available VM sizes for Pools using Images from the Virtual Machines Marketplace (pools created with virtualMachineConfiguration) see Sizes for Virtual Machines (Linux) (https://azure.microsoft.com/documentation/articles/virtual-machines-linux-sizes/) or Sizes for Virtual Machines (Windows) (https://azure.microsoft.com/documentation/articles/virtual-machines-windows-sizes/). Batch supports all Azure VM sizes except STANDARD_A0 and those with premium storage (STANDARD_GS, STANDARD_DS, and STANDARD_DSV2 series). */ + /** The size of virtual machines in the Pool. All virtual machines in a Pool are the same size. For information about available VM sizes for Pools using Images from the Virtual Machines Marketplace (pools created with virtualMachineConfiguration), see Sizes for Virtual Machines (Linux) (https://azure.microsoft.com/documentation/articles/virtual-machines-linux-sizes/) or Sizes for Virtual Machines (Windows) (https://azure.microsoft.com/documentation/articles/virtual-machines-windows-sizes/). Batch supports all Azure VM sizes except STANDARD_A0 and those with premium storage (STANDARD_GS, STANDARD_DS, and STANDARD_DSV2 series). */ vmSize: string; - /** The cloud service configuration for the Pool. This property and virtualMachineConfiguration are mutually exclusive and one of the properties must be specified. This property cannot be specified if the Batch Account was created with its poolAllocationMode property set to 'UserSubscription'. */ - cloudServiceConfiguration?: CloudServiceConfiguration; - /** The virtual machine configuration for the Pool. This property and cloudServiceConfiguration are mutually exclusive and one of the properties must be specified. */ + /** The virtual machine configuration for the Pool. This property must be specified. */ virtualMachineConfiguration?: VirtualMachineConfiguration; /** The timeout for allocation of Compute Nodes to the Pool. This timeout applies only to manual scaling; it has no effect when enableAutoScale is set to true. The default value is 15 minutes. The minimum value is 5 minutes. If you specify a value less than 5 minutes, the Batch service returns an error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). */ resizeTimeout?: string; @@ -33,17 +31,8 @@ export interface BatchPoolCreateParameters { networkConfiguration?: NetworkConfiguration; /** A Task specified to run on each Compute Node as it joins the Pool. The Task runs when the Compute Node is added to the Pool or when the Compute Node is restarted. */ startTask?: BatchStartTask; - /** - * For Windows Nodes, the Batch service installs the Certificates to the specified Certificate store and location. - * For Linux Compute Nodes, the Certificates are stored in a directory inside the Task working directory and an environment variable AZ_BATCH_CERTIFICATES_DIR is supplied to the Task to query for this location. - * For Certificates with visibility of 'remoteUser', a 'certs' directory is created in the user's home directory (e.g., /home/{user-name}/certs) and Certificates are placed in that directory. - * Warning: This property is deprecated and will be removed after February, 2024. Please use the [Azure KeyVault Extension](https://learn.microsoft.com/azure/batch/batch-certificate-migration-guide) instead. - */ - certificateReferences?: Array; /** The list of Packages to be installed on each Compute Node in the Pool. When creating a pool, the package's application ID must be fully qualified (/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Batch/batchAccounts/{accountName}/applications/{applicationName}). Changes to Package references affect all new Nodes joining the Pool, but do not affect Compute Nodes that are already in the Pool until they are rebooted or reimaged. There is a maximum of 10 Package references on any given Pool. */ applicationPackageReferences?: Array; - /** The list of application licenses the Batch service will make available on each Compute Node in the Pool. The list of application licenses must be a subset of available Batch service application licenses. If a license is requested which is not supported, Pool creation will fail. */ - applicationLicenses?: string[]; /** The number of task slots that can be used to run concurrent tasks on a single compute node in the pool. The default value is 1. The maximum value is the smaller of 4 times the number of cores of the vmSize of the pool or 256. */ taskSlotsPerNode?: number; /** How Tasks are distributed across Compute Nodes in a Pool. If not specified, the default is spread. */ @@ -54,35 +43,10 @@ export interface BatchPoolCreateParameters { metadata?: Array; /** Mount storage using specified file system for the entire lifetime of the pool. Mount the storage using Azure fileshare, NFS, CIFS or Blobfuse based file system. */ mountConfiguration?: Array; - /** - * The desired node communication mode for the pool. If omitted, the default value is Default. - * - * Possible values: default, classic, simplified - */ - targetNodeCommunicationMode?: string; -} - -/** - * The configuration for Compute Nodes in a Pool based on the Azure Cloud Services - * platform. - */ -export interface CloudServiceConfiguration { - /** - * Possible values are: - * 2 - OS Family 2, equivalent to Windows Server 2008 R2 - * SP1. - * 3 - OS Family 3, equivalent to Windows Server 2012. - * 4 - OS Family 4, - * equivalent to Windows Server 2012 R2. - * 5 - OS Family 5, equivalent to Windows - * Server 2016. - * 6 - OS Family 6, equivalent to Windows Server 2019. For more - * information, see Azure Guest OS Releases - * (https://azure.microsoft.com/documentation/articles/cloud-services-guestos-update-matrix/#releases). - */ - osFamily: string; - /** The Azure Guest OS version to be installed on the virtual machines in the Pool. The default value is * which specifies the latest operating system version for the specified OS family. */ - osVersion?: string; + /** The desired node communication mode for the pool. If omitted, the default value is Default. */ + targetNodeCommunicationMode?: BatchNodeCommunicationMode; + /** The upgrade policy for the Pool. Describes an upgrade policy - automatic, manual, or rolling. */ + upgradePolicy?: UpgradePolicy; } /** @@ -156,40 +120,28 @@ export interface WindowsConfiguration { * disks from within a VM to use them. */ export interface DataDisk { - /** The logical unit number. The lun is used to uniquely identify each data disk. If attaching multiple disks, each should have a distinct lun. The value must be between 0 and 63, inclusive. */ + /** The logical unit number. The logicalUnitNumber is used to uniquely identify each data disk. If attaching multiple disks, each should have a distinct logicalUnitNumber. The value must be between 0 and 63, inclusive. */ lun: number; - /** - * The type of caching to be enabled for the data disks. The default value for caching is readwrite. For information about the caching options see: https://blogs.msdn.microsoft.com/windowsazurestorage/2012/06/27/exploring-windows-azure-drives-disks-and-images/. - * - * Possible values: none, readonly, readwrite - */ - caching?: string; + /** The type of caching to be enabled for the data disks. The default value for caching is readwrite. For information about the caching options see: https://blogs.msdn.microsoft.com/windowsazurestorage/2012/06/27/exploring-windows-azure-drives-disks-and-images/. */ + caching?: CachingType; /** The initial disk size in gigabytes. */ diskSizeGB: number; - /** - * The storage Account type to be used for the data disk. If omitted, the default is "standard_lrs". - * - * Possible values: standard_lrs, premium_lrs, standardssd_lrs - */ - storageAccountType?: string; + /** The storage Account type to be used for the data disk. If omitted, the default is "standard_lrs". */ + storageAccountType?: StorageAccountType; } /** The configuration for container-enabled Pools. */ export interface ContainerConfiguration { - /** - * The container technology to be used. - * - * Possible values: dockerCompatible, criCompatible - */ - type: string; + /** The container technology to be used. */ + type: ContainerType; /** The collection of container Image names. This is the full Image reference, as would be specified to "docker pull". An Image will be sourced from the default Docker registry unless the Image is fully qualified with an alternative registry. */ containerImageNames?: string[]; /** Additional private registries from which containers can be pulled. If any Images must be downloaded from a private registry which requires credentials, then those credentials must be provided here. */ - containerRegistries?: Array; + containerRegistries?: Array; } /** A private container registry. */ -export interface ContainerRegistry { +export interface ContainerRegistryReference { /** The user name to log into the registry server. */ username?: string; /** The password to log into the registry server. */ @@ -216,7 +168,7 @@ export interface BatchNodeIdentityReference { */ export interface DiskEncryptionConfiguration { /** The list of disk targets Batch Service will encrypt on the compute node. If omitted, no disks on the compute nodes in the pool will be encrypted. On Linux pool, only "TemporaryDisk" is supported; on Windows pool, "OsDisk" and "TemporaryDisk" must be specified. */ - targets?: string[]; + targets?: DiskEncryptionTarget[]; } /** @@ -225,12 +177,8 @@ export interface DiskEncryptionConfiguration { * with best effort balancing. */ export interface BatchNodePlacementConfiguration { - /** - * Node placement Policy type on Batch Pools. Allocation policy used by Batch Service to provision the nodes. If not specified, Batch will use the regional policy. - * - * Possible values: regional, zonal - */ - policy?: string; + /** Node placement Policy type on Batch Pools. Allocation policy used by Batch Service to provision the nodes. If not specified, Batch will use the regional policy. */ + policy?: BatchNodePlacementPolicyType; } /** The configuration for virtual machine extensions. */ @@ -259,12 +207,8 @@ export interface VMExtension { export interface OSDisk { /** Specifies the ephemeral Disk Settings for the operating system disk used by the compute node (VM). */ ephemeralOSDiskSettings?: DiffDiskSettings; - /** - * Specifies the caching requirements. Possible values are: None, ReadOnly, ReadWrite. The default values are: None for Standard storage. ReadOnly for Premium storage. - * - * Possible values: none, readonly, readwrite - */ - caching?: string; + /** Specifies the caching requirements. Possible values are: None, ReadOnly, ReadWrite. The default values are: None for Standard storage. ReadOnly for Premium storage. */ + caching?: CachingType; /** The initial disk size in GB when creating new OS disk. */ diskSizeGB?: number; /** The managed disk parameters. */ @@ -278,34 +222,22 @@ export interface OSDisk { * compute node (VM). */ export interface DiffDiskSettings { - /** - * Specifies the ephemeral disk placement for operating system disk for all VMs in the pool. This property can be used by user in the request to choose the location e.g., cache disk space for Ephemeral OS disk provisioning. For more information on Ephemeral OS disk size requirements, please refer to Ephemeral OS disk size requirements for Windows VMs at https://docs.microsoft.com/en-us/azure/virtual-machines/windows/ephemeral-os-disks#size-requirements and Linux VMs at https://docs.microsoft.com/en-us/azure/virtual-machines/linux/ephemeral-os-disks#size-requirements. - * - * Possible values: cachedisk - */ - placement?: string; + /** Specifies the ephemeral disk placement for operating system disk for all VMs in the pool. This property can be used by user in the request to choose the location e.g., cache disk space for Ephemeral OS disk provisioning. For more information on Ephemeral OS disk size requirements, please refer to Ephemeral OS disk size requirements for Windows VMs at https://docs.microsoft.com/en-us/azure/virtual-machines/windows/ephemeral-os-disks#size-requirements and Linux VMs at https://docs.microsoft.com/en-us/azure/virtual-machines/linux/ephemeral-os-disks#size-requirements. */ + placement?: DiffDiskPlacement; } /** The managed disk parameters. */ export interface ManagedDisk { - /** - * The storage account type for managed disk. - * - * Possible values: standard_lrs, premium_lrs, standardssd_lrs - */ - storageAccountType: string; + /** The storage account type for managed disk. */ + storageAccountType: StorageAccountType; } /** Specifies the security profile settings for the virtual machine or virtual machine scale set. */ export interface SecurityProfile { /** This property can be used by user in the request to enable or disable the Host Encryption for the virtual machine or virtual machine scale set. This will enable the encryption for all the disks including Resource/Temp disk at host itself. */ encryptionAtHost: boolean; - /** - * Specifies the SecurityType of the virtual machine. It has to be set to any specified value to enable UefiSettings. - * - * Possible values: trustedLaunch - */ - securityType: string; + /** Specifies the SecurityType of the virtual machine. It has to be set to any specified value to enable UefiSettings. */ + securityType: SecurityTypes; /** Specifies the security settings like secure boot and vTPM used while creating the virtual machine. Specifies the security settings like secure boot and vTPM used while creating the virtual machine. */ uefiSettings: UefiSettings; } @@ -329,18 +261,14 @@ export interface ServiceArtifactReference { /** The network configuration for a Pool. */ export interface NetworkConfiguration { - /** The ARM resource identifier of the virtual network subnet which the Compute Nodes of the Pool will join. This is of the form /subscriptions/{subscription}/resourceGroups/{group}/providers/{provider}/virtualNetworks/{network}/subnets/{subnet}. The virtual network must be in the same region and subscription as the Azure Batch Account. The specified subnet should have enough free IP addresses to accommodate the number of Compute Nodes in the Pool. If the subnet doesn't have enough free IP addresses, the Pool will partially allocate Nodes and a resize error will occur. The 'MicrosoftAzureBatch' service principal must have the 'Classic Virtual Machine Contributor' Role-Based Access Control (RBAC) role for the specified VNet. The specified subnet must allow communication from the Azure Batch service to be able to schedule Tasks on the Nodes. This can be verified by checking if the specified VNet has any associated Network Security Groups (NSG). If communication to the Nodes in the specified subnet is denied by an NSG, then the Batch service will set the state of the Compute Nodes to unusable. For Pools created with virtualMachineConfiguration only ARM virtual networks ('Microsoft.Network/virtualNetworks') are supported, but for Pools created with cloudServiceConfiguration both ARM and classic virtual networks are supported. If the specified VNet has any associated Network Security Groups (NSG), then a few reserved system ports must be enabled for inbound communication. For Pools created with a virtual machine configuration, enable ports 29876 and 29877, as well as port 22 for Linux and port 3389 for Windows. For Pools created with a cloud service configuration, enable ports 10100, 20100, and 30100. Also enable outbound connections to Azure Storage on port 443. For more details see: https://docs.microsoft.com/en-us/azure/batch/batch-api-basics#virtual-network-vnet-and-firewall-configuration. */ + /** The ARM resource identifier of the virtual network subnet which the Compute Nodes of the Pool will join. This is of the form /subscriptions/{subscription}/resourceGroups/{group}/providers/{provider}/virtualNetworks/{network}/subnets/{subnet}. The virtual network must be in the same region and subscription as the Azure Batch Account. The specified subnet should have enough free IP addresses to accommodate the number of Compute Nodes in the Pool. If the subnet doesn't have enough free IP addresses, the Pool will partially allocate Nodes and a resize error will occur. The 'MicrosoftAzureBatch' service principal must have the 'Classic Virtual Machine Contributor' Role-Based Access Control (RBAC) role for the specified VNet. The specified subnet must allow communication from the Azure Batch service to be able to schedule Tasks on the Nodes. This can be verified by checking if the specified VNet has any associated Network Security Groups (NSG). If communication to the Nodes in the specified subnet is denied by an NSG, then the Batch service will set the state of the Compute Nodes to unusable. For Pools created with virtualMachineConfiguration only ARM virtual networks ('Microsoft.Network/virtualNetworks') are supported. If the specified VNet has any associated Network Security Groups (NSG), then a few reserved system ports must be enabled for inbound communication. For Pools created with a virtual machine configuration, enable ports 29876 and 29877, as well as port 22 for Linux and port 3389 for Windows. Also enable outbound connections to Azure Storage on port 443. For more details see: https://docs.microsoft.com/en-us/azure/batch/batch-api-basics#virtual-network-vnet-and-firewall-configuration. */ subnetId?: string; - /** - * The scope of dynamic vnet assignment. - * - * Possible values: none, job - */ - dynamicVNetAssignmentScope?: string; + /** The scope of dynamic vnet assignment. */ + dynamicVNetAssignmentScope?: DynamicVNetAssignmentScope; /** The configuration for endpoints on Compute Nodes in the Batch Pool. Pool endpoint configuration is only supported on Pools with the virtualMachineConfiguration property. */ endpointConfiguration?: BatchPoolEndpointConfiguration; /** The Public IPAddress configuration for Compute Nodes in the Batch Pool. Public IP configuration property is only supported on Pools with the virtualMachineConfiguration property. */ - publicIPAddressConfiguration?: PublicIPAddressConfiguration; + publicIPAddressConfiguration?: PublicIpAddressConfiguration; /** Whether this pool should enable accelerated networking. Accelerated networking enables single root I/O virtualization (SR-IOV) to a VM, which may lead to improved networking performance. For more details, see: https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview. */ enableAcceleratedNetworking?: boolean; } @@ -348,22 +276,18 @@ export interface NetworkConfiguration { /** The endpoint configuration for a Pool. */ export interface BatchPoolEndpointConfiguration { /** A list of inbound NAT Pools that can be used to address specific ports on an individual Compute Node externally. The maximum number of inbound NAT Pools per Batch Pool is 5. If the maximum number of inbound NAT Pools is exceeded the request fails with HTTP status code 400. This cannot be specified if the IPAddressProvisioningType is NoPublicIPAddresses. */ - inboundNATPools: Array; + inboundNATPools: Array; } /** * A inbound NAT Pool that can be used to address specific ports on Compute Nodes * in a Batch Pool externally. */ -export interface InboundNATPool { +export interface InboundNatPool { /** The name of the endpoint. The name must be unique within a Batch Pool, can contain letters, numbers, underscores, periods, and hyphens. Names must start with a letter or number, must end with a letter, number, or underscore, and cannot exceed 77 characters. If any invalid values are provided the request fails with HTTP status code 400. */ name: string; - /** - * The protocol of the endpoint. - * - * Possible values: tcp, udp - */ - protocol: string; + /** The protocol of the endpoint. */ + protocol: InboundEndpointProtocol; /** The port number on the Compute Node. This must be unique within a Batch Pool. Acceptable values are between 1 and 65535 except for 22, 3389, 29876 and 29877 as these are reserved. If any reserved values are provided the request fails with HTTP status code 400. */ backendPort: number; /** The first port number in the range of external ports that will be used to provide inbound access to the backendPort on individual Compute Nodes. Acceptable values range between 1 and 65534 except ports from 50000 to 55000 which are reserved. All ranges within a Pool must be distinct and cannot overlap. Each range must contain at least 40 ports. If any reserved or overlapping values are provided the request fails with HTTP status code 400. */ @@ -378,12 +302,8 @@ export interface InboundNATPool { export interface NetworkSecurityGroupRule { /** The priority for this rule. Priorities within a Pool must be unique and are evaluated in order of priority. The lower the number the higher the priority. For example, rules could be specified with order numbers of 150, 250, and 350. The rule with the order number of 150 takes precedence over the rule that has an order of 250. Allowed priorities are 150 to 4096. If any reserved or duplicate values are provided the request fails with HTTP status code 400. */ priority: number; - /** - * The action that should be taken for a specified IP address, subnet range or tag. - * - * Possible values: allow, deny - */ - access: string; + /** The action that should be taken for a specified IP address, subnet range or tag. */ + access: NetworkSecurityGroupRuleAccess; /** The source address prefix or tag to match for the rule. Valid values are a single IP address (i.e. 10.10.10.10), IP subnet (i.e. 192.168.1.0/24), default tag, or * (for all addresses). If any other values are provided the request fails with HTTP status code 400. */ sourceAddressPrefix: string; /** The source port ranges to match for the rule. Valid values are '*' (for all ports 0 - 65535), a specific port (i.e. 22), or a port range (i.e. 100-200). The ports must be in the range of 0 to 65535. Each entry in this collection must not overlap any other entry (either a range or an individual port). If any other values are provided the request fails with HTTP status code 400. The default value is '*'. */ @@ -391,13 +311,9 @@ export interface NetworkSecurityGroupRule { } /** The public IP Address configuration of the networking configuration of a Pool. */ -export interface PublicIPAddressConfiguration { - /** - * The provisioning type for Public IP Addresses for the Pool. The default value is BatchManaged. - * - * Possible values: batchmanaged, usermanaged, nopublicipaddresses - */ - provision?: string; +export interface PublicIpAddressConfiguration { + /** The provisioning type for Public IP Addresses for the Pool. The default value is BatchManaged. */ + provision?: IpAddressProvisioningType; /** The list of public IPs which the Batch service will use when provisioning Compute Nodes. The number of IPs specified here limits the maximum size of the Pool - 100 dedicated nodes or 100 Spot/Low-priority nodes can be allocated for each public IP. For example, a pool needing 250 dedicated VMs would need at least 3 public IPs specified. Each element of this collection is of the form: /subscriptions/{subscription}/resourceGroups/{group}/providers/Microsoft.Network/publicIPAddresses/{ip}. */ ipAddressIds?: string[]; } @@ -441,13 +357,9 @@ export interface BatchTaskContainerSettings { /** The Image to use to create the container in which the Task will run. This is the full Image reference, as would be specified to "docker pull". If no tag is provided as part of the Image name, the tag ":latest" is used as a default. */ imageName: string; /** The private registry which contains the container Image. This setting can be omitted if was already provided at Pool creation. */ - registry?: ContainerRegistry; - /** - * The location of the container Task working directory. The default is 'taskWorkingDirectory'. - * - * Possible values: taskWorkingDirectory, containerImageDefault - */ - workingDirectory?: string; + registry?: ContainerRegistryReference; + /** The location of the container Task working directory. The default is 'taskWorkingDirectory'. */ + workingDirectory?: ContainerWorkingDirectory; } /** A single file or multiple files to be downloaded to a Compute Node. */ @@ -486,36 +398,10 @@ export interface UserIdentity { /** Specifies the options for the auto user that runs an Azure Batch Task. */ export interface AutoUserSpecification { - /** - * The scope for the auto user. The default value is pool. If the pool is running Windows a value of Task should be specified if stricter isolation between tasks is required. For example, if the task mutates the registry in a way which could impact other tasks, or if certificates have been specified on the pool which should not be accessible by normal tasks but should be accessible by StartTasks. - * - * Possible values: task, pool - */ - scope?: string; - /** - * The elevation level of the auto user. The default value is nonAdmin. - * - * Possible values: nonadmin, admin - */ - elevationLevel?: string; -} - -/** A reference to a Certificate to be installed on Compute Nodes in a Pool. Warning: This object is deprecated and will be removed after February, 2024. Please use the [Azure KeyVault Extension](https://learn.microsoft.com/azure/batch/batch-certificate-migration-guide) instead. */ -export interface BatchCertificateReference { - /** The thumbprint of the Certificate. */ - thumbprint: string; - /** The algorithm with which the thumbprint is associated. This must be sha1. */ - thumbprintAlgorithm: string; - /** - * The location of the Certificate store on the Compute Node into which to install the Certificate. The default value is currentuser. This property is applicable only for Pools configured with Windows Compute Nodes (that is, created with cloudServiceConfiguration, or with virtualMachineConfiguration using a Windows Image reference). For Linux Compute Nodes, the Certificates are stored in a directory inside the Task working directory and an environment variable AZ_BATCH_CERTIFICATES_DIR is supplied to the Task to query for this location. For Certificates with visibility of 'remoteUser', a 'certs' directory is created in the user's home directory (e.g., /home/{user-name}/certs) and Certificates are placed in that directory. - * - * Possible values: currentuser, localmachine - */ - storeLocation?: string; - /** The name of the Certificate store on the Compute Node into which to install the Certificate. This property is applicable only for Pools configured with Windows Compute Nodes (that is, created with cloudServiceConfiguration, or with virtualMachineConfiguration using a Windows Image reference). Common store names include: My, Root, CA, Trust, Disallowed, TrustedPeople, TrustedPublisher, AuthRoot, AddressBook, but any custom store name can also be used. The default value is My. */ - storeName?: string; - /** Which user Accounts on the Compute Node should have access to the private data of the Certificate. You can specify more than one visibility in this collection. The default is all Accounts. */ - visibility?: string[]; + /** The scope for the auto user. The default value is pool. If the pool is running Windows, a value of Task should be specified if stricter isolation between tasks is required, such as if the task mutates the registry in a way which could impact other tasks. */ + scope?: AutoUserScope; + /** The elevation level of the auto user. The default value is nonAdmin. */ + elevationLevel?: ElevationLevel; } /** A reference to an Package to be deployed to Compute Nodes. */ @@ -528,12 +414,8 @@ export interface BatchApplicationPackageReference { /** Specifies how Tasks should be distributed across Compute Nodes. */ export interface BatchTaskSchedulingPolicy { - /** - * How Tasks are distributed across Compute Nodes in a Pool. If not specified, the default is spread. - * - * Possible values: spread, pack - */ - nodeFillType: string; + /** How Tasks are distributed across Compute Nodes in a Pool. If not specified, the default is spread. */ + nodeFillType: BatchNodeFillType; } /** @@ -545,12 +427,8 @@ export interface UserAccount { name: string; /** The password for the user Account. */ password: string; - /** - * The elevation level of the user Account. The default value is nonAdmin. - * - * Possible values: nonadmin, admin - */ - elevationLevel?: string; + /** The elevation level of the user Account. The default value is nonAdmin. */ + elevationLevel?: ElevationLevel; /** The Linux-specific user configuration for the user Account. This property is ignored if specified on a Windows Pool. If not specified, the user is created with the default options. */ linuxUserConfiguration?: LinuxUserConfiguration; /** The Windows-specific user configuration for the user Account. This property can only be specified if the user is on a Windows Pool. If not specified and on a Windows Pool, the user is created with the default options. */ @@ -569,12 +447,8 @@ export interface LinuxUserConfiguration { /** Properties used to create a user Account on a Windows Compute Node. */ export interface WindowsUserConfiguration { - /** - * The login mode for the user. The default value for VirtualMachineConfiguration Pools is 'batch' and for CloudServiceConfiguration Pools is 'interactive'. - * - * Possible values: batch, interactive - */ - loginMode?: string; + /** The login mode for the user. The default value for VirtualMachineConfiguration Pools is 'batch'. */ + loginMode?: LoginMode; } /** @@ -593,7 +467,7 @@ export interface MountConfiguration { /** The Azure Storage Container to mount using blob FUSE on each node. This property is mutually exclusive with all other properties. */ azureBlobFileSystemConfiguration?: AzureBlobFileSystemConfiguration; /** The NFS file system to mount on each node. This property is mutually exclusive with all other properties. */ - nfsMountConfiguration?: NFSMountConfiguration; + nfsMountConfiguration?: NfsMountConfiguration; /** The CIFS/SMB file system to mount on each node. This property is mutually exclusive with all other properties. */ cifsMountConfiguration?: CifsMountConfiguration; /** The Azure File Share to mount on each node. This property is mutually exclusive with all other properties. */ @@ -619,7 +493,7 @@ export interface AzureBlobFileSystemConfiguration { } /** Information used to connect to an NFS file system. */ -export interface NFSMountConfiguration { +export interface NfsMountConfiguration { /** The URI of the file system to mount. */ source: string; /** The relative path on the compute node where the file system will be mounted. All file systems are mounted relative to the Batch mounts directory, accessible via the AZ_BATCH_NODE_MOUNTS_DIR environment variable. */ @@ -656,6 +530,46 @@ export interface AzureFileShareConfiguration { mountOptions?: string; } +/** Describes an upgrade policy - automatic, manual, or rolling. */ +export interface UpgradePolicy { + /** Specifies the mode of an upgrade to virtual machines in the scale set.

Possible values are:

**Manual** - You control the application of updates to virtual machines in the scale set. You do this by using the manualUpgrade action.

**Automatic** - All virtual machines in the scale set are automatically updated at the same time.

**Rolling** - Scale set performs updates in batches with an optional pause time in between. */ + mode: UpgradeMode; + /** Configuration parameters used for performing automatic OS Upgrade. The configuration parameters used for performing automatic OS upgrade. */ + automaticOSUpgradePolicy?: AutomaticOsUpgradePolicy; + /** The configuration parameters used while performing a rolling upgrade. This property is only supported on Pools with the virtualMachineConfiguration property. */ + rollingUpgradePolicy?: RollingUpgradePolicy; +} + +/** The configuration parameters used for performing automatic OS upgrade. */ +export interface AutomaticOsUpgradePolicy { + /** Whether OS image rollback feature should be disabled. */ + disableAutomaticRollback?: boolean; + /** Indicates whether OS upgrades should automatically be applied to scale set instances in a rolling fashion when a newer version of the OS image becomes available.

If this is set to true for Windows based pools, [WindowsConfiguration.enableAutomaticUpdates](https://learn.microsoft.com/en-us/rest/api/batchservice/pool/add?tabs=HTTP#windowsconfiguration) cannot be set to true. */ + enableAutomaticOSUpgrade?: boolean; + /** Indicates whether rolling upgrade policy should be used during Auto OS Upgrade. Auto OS Upgrade will fallback to the default policy if no policy is defined on the VMSS. */ + useRollingUpgradePolicy?: boolean; + /** Defer OS upgrades on the TVMs if they are running tasks. */ + osRollingUpgradeDeferral?: boolean; +} + +/** The configuration parameters used while performing a rolling upgrade. */ +export interface RollingUpgradePolicy { + /** Allow VMSS to ignore AZ boundaries when constructing upgrade batches. Take into consideration the Update Domain and maxBatchInstancePercent to determine the batch size. This field is able to be set to true or false only when using NodePlacementConfiguration as Zonal. */ + enableCrossZoneUpgrade?: boolean; + /** The maximum percent of total virtual machine instances that will be upgraded simultaneously by the rolling upgrade in one batch. As this is a maximum, unhealthy instances in previous or future batches can cause the percentage of instances in a batch to decrease to ensure higher reliability. The value of this field should be between 5 and 100, inclusive. If both maxBatchInstancePercent and maxUnhealthyInstancePercent are assigned with value, the value of maxBatchInstancePercent should not be more than maxUnhealthyInstancePercent. */ + maxBatchInstancePercent?: number; + /** The maximum percentage of the total virtual machine instances in the scale set that can be simultaneously unhealthy, either as a result of being upgraded, or by being found in an unhealthy state by the virtual machine health checks before the rolling upgrade aborts. This constraint will be checked prior to starting any batch. The value of this field should be between 5 and 100, inclusive. If both maxBatchInstancePercent and maxUnhealthyInstancePercent are assigned with value, the value of maxBatchInstancePercent should not be more than maxUnhealthyInstancePercent. */ + maxUnhealthyInstancePercent?: number; + /** The maximum percentage of upgraded virtual machine instances that can be found to be in an unhealthy state. This check will happen after each batch is upgraded. If this percentage is ever exceeded, the rolling update aborts. The value of this field should be between 0 and 100, inclusive. */ + maxUnhealthyUpgradedInstancePercent?: number; + /** The wait time between completing the update for all virtual machines in one batch and starting the next batch. The time duration should be specified in ISO 8601 format.. */ + pauseTimeBetweenBatches?: string; + /** Upgrade all unhealthy instances in a scale set before any healthy instances. */ + prioritizeUnhealthyInstances?: boolean; + /** Rollback failed instances to previous model if the Rolling Upgrade policy is violated. */ + rollbackFailedInstancesOnPolicyBreach?: boolean; +} + /** Represents a name-value pair. */ export interface NameValuePair { /** The name in the name-value pair. */ @@ -665,32 +579,19 @@ export interface NameValuePair { } /** Parameters for updating an Azure Batch Pool. */ -export interface BatchPoolUpdateParameters { +export interface BatchPoolUpdateContent { /** A Task to run on each Compute Node as it joins the Pool. The Task runs when the Compute Node is added to the Pool or when the Compute Node is restarted. If this element is present, it overwrites any existing StartTask. If omitted, any existing StartTask is left unchanged. */ startTask?: BatchStartTask; - /** - * If this element is present, it replaces any existing Certificate references configured on the Pool. - * If omitted, any existing Certificate references are left unchanged. - * For Windows Nodes, the Batch service installs the Certificates to the specified Certificate store and location. - * For Linux Compute Nodes, the Certificates are stored in a directory inside the Task working directory and an environment variable AZ_BATCH_CERTIFICATES_DIR is supplied to the Task to query for this location. - * For Certificates with visibility of 'remoteUser', a 'certs' directory is created in the user's home directory (e.g., /home/{user-name}/certs) and Certificates are placed in that directory. - * Warning: This property is deprecated and will be removed after February, 2024. Please use the [Azure KeyVault Extension](https://learn.microsoft.com/azure/batch/batch-certificate-migration-guide) instead. - */ - certificateReferences?: Array; /** A list of Packages to be installed on each Compute Node in the Pool. Changes to Package references affect all new Nodes joining the Pool, but do not affect Compute Nodes that are already in the Pool until they are rebooted or reimaged. If this element is present, it replaces any existing Package references. If you specify an empty collection, then all Package references are removed from the Pool. If omitted, any existing Package references are left unchanged. */ applicationPackageReferences?: Array; /** A list of name-value pairs associated with the Pool as metadata. If this element is present, it replaces any existing metadata configured on the Pool. If you specify an empty collection, any metadata is removed from the Pool. If omitted, any existing metadata is left unchanged. */ metadata?: Array; - /** - * The desired node communication mode for the pool. If this element is present, it replaces the existing targetNodeCommunicationMode configured on the Pool. If omitted, any existing metadata is left unchanged. - * - * Possible values: default, classic, simplified - */ - targetNodeCommunicationMode?: string; + /** The desired node communication mode for the pool. If this element is present, it replaces the existing targetNodeCommunicationMode configured on the Pool. If omitted, any existing metadata is left unchanged. */ + targetNodeCommunicationMode?: BatchNodeCommunicationMode; } /** Parameters for enabling automatic scaling on an Azure Batch Pool. */ -export interface BatchPoolEnableAutoScaleParameters { +export interface BatchPoolEnableAutoScaleContent { /** The formula for the desired number of Compute Nodes in the Pool. The formula is checked for validity before it is applied to the Pool. If the formula is not valid, the Batch service rejects the request with detailed error information. For more information about specifying this formula, see Automatically scale Compute Nodes in an Azure Batch Pool (https://azure.microsoft.com/en-us/documentation/articles/batch-automatic-scaling). */ autoScaleFormula?: string; /** The time interval at which to automatically adjust the Pool size according to the autoscale formula. The default value is 15 minutes. The minimum and maximum value are 5 minutes and 168 hours respectively. If you specify a value less than 5 minutes or greater than 168 hours, the Batch service rejects the request with an invalid property value error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). If you specify a new interval, then the existing autoscale evaluation schedule will be stopped and a new autoscale evaluation schedule will be started, with its starting time being the time when this request was issued. */ @@ -698,64 +599,43 @@ export interface BatchPoolEnableAutoScaleParameters { } /** Parameters for evaluating an automatic scaling formula on an Azure Batch Pool. */ -export interface BatchPoolEvaluateAutoScaleParameters { +export interface BatchPoolEvaluateAutoScaleContent { /** The formula for the desired number of Compute Nodes in the Pool. The formula is validated and its results calculated, but it is not applied to the Pool. To apply the formula to the Pool, 'Enable automatic scaling on a Pool'. For more information about specifying this formula, see Automatically scale Compute Nodes in an Azure Batch Pool (https://azure.microsoft.com/en-us/documentation/articles/batch-automatic-scaling). */ autoScaleFormula: string; } /** Parameters for changing the size of an Azure Batch Pool. */ -export interface BatchPoolResizeParameters { +export interface BatchPoolResizeContent { /** The desired number of dedicated Compute Nodes in the Pool. */ targetDedicatedNodes?: number; /** The desired number of Spot/Low-priority Compute Nodes in the Pool. */ targetLowPriorityNodes?: number; /** The timeout for allocation of Nodes to the Pool or removal of Compute Nodes from the Pool. The default value is 15 minutes. The minimum value is 5 minutes. If you specify a value less than 5 minutes, the Batch service returns an error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). */ resizeTimeout?: string; - /** - * Determines what to do with a Compute Node and its running task(s) if the Pool size is decreasing. The default value is requeue. - * - * Possible values: requeue, terminate, taskcompletion, retaineddata - */ - nodeDeallocationOption?: string; + /** Determines what to do with a Compute Node and its running task(s) if the Pool size is decreasing. The default value is requeue. */ + nodeDeallocationOption?: BatchNodeDeallocationOption; } /** Parameters for replacing properties on an Azure Batch Pool. */ -export interface BatchPoolReplaceParameters { +export interface BatchPoolReplaceContent { /** A Task to run on each Compute Node as it joins the Pool. The Task runs when the Compute Node is added to the Pool or when the Compute Node is restarted. If this element is present, it overwrites any existing StartTask. If omitted, any existing StartTask is removed from the Pool. */ startTask?: BatchStartTask; - /** - * This list replaces any existing Certificate references configured on the Pool. - * If you specify an empty collection, any existing Certificate references are removed from the Pool. - * For Windows Nodes, the Batch service installs the Certificates to the specified Certificate store and location. - * For Linux Compute Nodes, the Certificates are stored in a directory inside the Task working directory and an environment variable AZ_BATCH_CERTIFICATES_DIR is supplied to the Task to query for this location. - * For Certificates with visibility of 'remoteUser', a 'certs' directory is created in the user's home directory (e.g., /home/{user-name}/certs) and Certificates are placed in that directory. - * Warning: This property is deprecated and will be removed after February, 2024. Please use the [Azure KeyVault Extension](https://learn.microsoft.com/azure/batch/batch-certificate-migration-guide) instead. - */ - certificateReferences: Array; /** The list of Application Packages to be installed on each Compute Node in the Pool. The list replaces any existing Application Package references on the Pool. Changes to Application Package references affect all new Compute Nodes joining the Pool, but do not affect Compute Nodes that are already in the Pool until they are rebooted or reimaged. There is a maximum of 10 Application Package references on any given Pool. If omitted, or if you specify an empty collection, any existing Application Packages references are removed from the Pool. A maximum of 10 references may be specified on a given Pool. */ applicationPackageReferences: Array; /** A list of name-value pairs associated with the Pool as metadata. This list replaces any existing metadata configured on the Pool. If omitted, or if you specify an empty collection, any existing metadata is removed from the Pool. */ metadata: Array; - /** - * The desired node communication mode for the pool. This setting replaces any existing targetNodeCommunication setting on the Pool. If omitted, the existing setting is default. - * - * Possible values: default, classic, simplified - */ - targetNodeCommunicationMode?: string; + /** The desired node communication mode for the pool. This setting replaces any existing targetNodeCommunication setting on the Pool. If omitted, the existing setting is default. */ + targetNodeCommunicationMode?: BatchNodeCommunicationMode; } /** Parameters for removing nodes from an Azure Batch Pool. */ -export interface BatchNodeRemoveParameters { +export interface BatchNodeRemoveContent { /** A list containing the IDs of the Compute Nodes to be removed from the specified Pool. A maximum of 100 nodes may be removed per request. */ nodeList: string[]; /** The timeout for removal of Compute Nodes to the Pool. The default value is 15 minutes. The minimum value is 5 minutes. If you specify a value less than 5 minutes, the Batch service returns an error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). */ resizeTimeout?: string; - /** - * Determines what to do with a Compute Node and its running task(s) after it has been selected for deallocation. The default value is requeue. - * - * Possible values: requeue, terminate, taskcompletion, retaineddata - */ - nodeDeallocationOption?: string; + /** Determines what to do with a Compute Node and its running task(s) after it has been selected for deallocation. The default value is requeue. */ + nodeDeallocationOption?: BatchNodeDeallocationOption; } /** An Azure Batch Job. */ @@ -770,12 +650,8 @@ export interface BatchJob { constraints?: BatchJobConstraints; /** The Pool settings associated with the Job. */ poolInfo: BatchPoolInfo; - /** - * The action the Batch service should take when all Tasks in the Job are in the completed state. The default is noaction. - * - * Possible values: noaction, terminatejob - */ - onAllTasksComplete?: string; + /** The action the Batch service should take when all Tasks in the Job are in the completed state. The default is noaction. */ + onAllTasksComplete?: OnAllBatchTasksComplete; /** A list of name-value pairs associated with the Job as metadata. The Batch service does not assign any meaning to metadata; it is solely for the use of user code. */ metadata?: Array; } @@ -862,7 +738,7 @@ export interface OutputFile { /** The destination for the output file(s). */ destination: OutputFileDestination; /** Additional options for the upload operation, including under what conditions to perform the upload. */ - uploadOptions: OutputFileUploadOptions; + uploadOptions: OutputFileUploadConfig; } /** The destination to which a file should be uploaded. */ @@ -895,13 +771,9 @@ export interface HttpHeader { * Options for an output file upload operation, including under what conditions * to perform the upload. */ -export interface OutputFileUploadOptions { - /** - * The conditions under which the Task output file or set of files should be uploaded. The default is taskcompletion. - * - * Possible values: tasksuccess, taskfailure, taskcompletion - */ - uploadCondition: string; +export interface OutputFileUploadConfig { + /** The conditions under which the Task output file or set of files should be uploaded. The default is taskcompletion. */ + uploadCondition: OutputFileUploadCondition; } /** Execution constraints to apply to a Task. */ @@ -920,7 +792,7 @@ export interface BatchTaskConstraints { */ export interface AuthenticationTokenSettings { /** The Batch resources to which the token grants access. The authentication token grants access to a limited set of Batch service operations. Currently the only supported value for the access property is 'job', which grants access to all operations related to the Job which contains the Task. */ - access?: string[]; + access?: AccessScope[]; } /** @@ -1024,12 +896,8 @@ export interface BatchPoolInfo { export interface BatchAutoPoolSpecification { /** A prefix to be added to the unique identifier when a Pool is automatically created. The Batch service assigns each auto Pool a unique identifier on creation. To distinguish between Pools created for different purposes, you can specify this element to add a prefix to the ID that is assigned. The prefix can be up to 20 characters long. */ autoPoolIdPrefix?: string; - /** - * The minimum lifetime of created auto Pools, and how multiple Jobs on a schedule are assigned to Pools. - * - * Possible values: jobschedule, job - */ - poolLifetimeOption: string; + /** The minimum lifetime of created auto Pools, and how multiple Jobs on a schedule are assigned to Pools. */ + poolLifetimeOption: BatchPoolLifetimeOption; /** Whether to keep an auto Pool alive after its lifetime expires. If false, the Batch service deletes the Pool once its lifetime (as determined by the poolLifetimeOption setting) expires; that is, when the Job or Job Schedule completes. If true, the Batch service does not delete the Pool automatically. It is up to the user to delete auto Pools created with this option. */ keepAlive?: boolean; /** The Pool specification for the auto Pool. */ @@ -1042,9 +910,7 @@ export interface BatchPoolSpecification { displayName?: string; /** The size of the virtual machines in the Pool. All virtual machines in a Pool are the same size. For information about available sizes of virtual machines in Pools, see Choose a VM size for Compute Nodes in an Azure Batch Pool (https://docs.microsoft.com/azure/batch/batch-pool-vm-sizes). */ vmSize: string; - /** The cloud service configuration for the Pool. This property must be specified if the Pool needs to be created with Azure PaaS VMs. This property and virtualMachineConfiguration are mutually exclusive and one of the properties must be specified. If neither is specified then the Batch service returns an error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). This property cannot be specified if the Batch Account was created with its poolAllocationMode property set to 'UserSubscription'. */ - cloudServiceConfiguration?: CloudServiceConfiguration; - /** The virtual machine configuration for the Pool. This property must be specified if the Pool needs to be created with Azure IaaS VMs. This property and cloudServiceConfiguration are mutually exclusive and one of the properties must be specified. If neither is specified then the Batch service returns an error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). */ + /** The virtual machine configuration for the Pool. This property must be specified if the Pool needs to be created with Azure IaaS VMs. If it is not specified then the Batch service returns an error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). */ virtualMachineConfiguration?: VirtualMachineConfiguration; /** The number of task slots that can be used to run concurrent tasks on a single compute node in the pool. The default value is 1. The maximum value is the smaller of 4 times the number of cores of the vmSize of the pool or 256. */ taskSlotsPerNode?: number; @@ -1070,28 +936,18 @@ export interface BatchPoolSpecification { networkConfiguration?: NetworkConfiguration; /** A Task to run on each Compute Node as it joins the Pool. The Task runs when the Compute Node is added to the Pool or when the Compute Node is restarted. */ startTask?: BatchStartTask; - /** - * For Windows Nodes, the Batch service installs the Certificates to the specified Certificate store and location. For Linux Compute Nodes, the Certificates are stored in a directory inside the Task working directory and an environment variable AZ_BATCH_CERTIFICATES_DIR is supplied to the Task to query for this location. For Certificates with visibility of 'remoteUser', a 'certs' directory is created in the user's home directory (e.g., /home/{user-name}/certs) and Certificates are placed in that directory. - * Warning: This property is deprecated and will be removed after February, 2024. - * Please use the [Azure KeyVault Extension](https://learn.microsoft.com/azure/batch/batch-certificate-migration-guide) instead. - */ - certificateReferences?: Array; /** The list of Packages to be installed on each Compute Node in the Pool. When creating a pool, the package's application ID must be fully qualified (/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Batch/batchAccounts/{accountName}/applications/{applicationName}). Changes to Package references affect all new Nodes joining the Pool, but do not affect Compute Nodes that are already in the Pool until they are rebooted or reimaged. There is a maximum of 10 Package references on any given Pool. */ applicationPackageReferences?: Array; - /** The list of application licenses the Batch service will make available on each Compute Node in the Pool. The list of application licenses must be a subset of available Batch service application licenses. If a license is requested which is not supported, Pool creation will fail. The permitted licenses available on the Pool are 'maya', 'vray', '3dsmax', 'arnold'. An additional charge applies for each application license added to the Pool. */ - applicationLicenses?: string[]; /** The list of user Accounts to be created on each Compute Node in the Pool. */ userAccounts?: Array; /** A list of name-value pairs associated with the Pool as metadata. The Batch service does not assign any meaning to metadata; it is solely for the use of user code. */ metadata?: Array; /** A list of file systems to mount on each node in the pool. This supports Azure Files, NFS, CIFS/SMB, and Blobfuse. */ mountConfiguration?: Array; - /** - * The desired node communication mode for the pool. If omitted, the default value is Default. - * - * Possible values: default, classic, simplified - */ - targetNodeCommunicationMode?: string; + /** The desired node communication mode for the pool. If omitted, the default value is Default. */ + targetNodeCommunicationMode?: BatchNodeCommunicationMode; + /** The upgrade policy for the Pool. Describes an upgrade policy - automatic, manual, or rolling. */ + upgradePolicy?: UpgradePolicy; } /** The network configuration for the Job. */ @@ -1116,12 +972,8 @@ export interface BatchJobExecutionInfo { /** An error encountered by the Batch service when scheduling a Job. */ export interface BatchJobSchedulingError { - /** - * The category of the Job scheduling error. - * - * Possible values: usererror, servererror - */ - category: string; + /** The category of the Job scheduling error. */ + category: ErrorCategory; /** An identifier for the Job scheduling error. Codes are invariant and are intended to be consumed programmatically. */ code?: string; /** A message describing the Job scheduling error, intended to be suitable for display in a user interface. */ @@ -1163,7 +1015,7 @@ export interface BatchJobStatistics { } /** Parameters for updating an Azure Batch Job. */ -export interface BatchJobUpdateParameters { +export interface BatchJobUpdateContent { /** The priority of the Job. Priority values can range from -1000 to 1000, with -1000 being the lowest priority and 1000 being the highest priority. If omitted, the priority of the Job is left unchanged. */ priority?: number; /** Whether Tasks in this job can be preempted by other high priority jobs. If the value is set to True, other high priority jobs submitted to the system will take precedence and will be able requeue tasks from this job. You can update a job's allowTaskPreemption after it has been created using the update job API. */ @@ -1174,34 +1026,26 @@ export interface BatchJobUpdateParameters { constraints?: BatchJobConstraints; /** The Pool on which the Batch service runs the Job's Tasks. You may change the Pool for a Job only when the Job is disabled. The Patch Job call will fail if you include the poolInfo element and the Job is not disabled. If you specify an autoPoolSpecification in the poolInfo, only the keepAlive property of the autoPoolSpecification can be updated, and then only if the autoPoolSpecification has a poolLifetimeOption of Job (other job properties can be updated as normal). If omitted, the Job continues to run on its current Pool. */ poolInfo?: BatchPoolInfo; - /** - * The action the Batch service should take when all Tasks in the Job are in the completed state. If omitted, the completion behavior is left unchanged. You may not change the value from terminatejob to noaction - that is, once you have engaged automatic Job termination, you cannot turn it off again. If you try to do this, the request fails with an 'invalid property value' error response; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). - * - * Possible values: noaction, terminatejob - */ - onAllTasksComplete?: string; + /** The action the Batch service should take when all Tasks in the Job are in the completed state. If omitted, the completion behavior is left unchanged. You may not change the value from terminatejob to noaction - that is, once you have engaged automatic Job termination, you cannot turn it off again. If you try to do this, the request fails with an 'invalid property value' error response; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). */ + onAllTasksComplete?: OnAllBatchTasksComplete; /** A list of name-value pairs associated with the Job as metadata. If omitted, the existing Job metadata is left unchanged. */ metadata?: Array; } /** Parameters for disabling an Azure Batch Job. */ -export interface BatchJobDisableParameters { - /** - * What to do with active Tasks associated with the Job. - * - * Possible values: requeue, terminate, wait - */ - disableTasks: string; +export interface BatchJobDisableContent { + /** What to do with active Tasks associated with the Job. */ + disableTasks: DisableBatchJobOption; } /** Parameters for terminating an Azure Batch Job. */ -export interface BatchJobTerminateParameters { - /** The text you want to appear as the Job's TerminateReason. The default is 'UserTerminate'. */ +export interface BatchJobTerminateContent { + /** The text you want to appear as the Job's TerminationReason. The default is 'UserTerminate'. */ terminateReason?: string; } /** Parameters for creating an Azure Batch Job. */ -export interface BatchJobCreateParameters { +export interface BatchJobCreateContent { /** A string that uniquely identifies the Job within the Account. The ID can contain any combination of alphanumeric characters including hyphens and underscores, and cannot contain more than 64 characters. The ID is case-preserving and case-insensitive (that is, you may not have two IDs within an Account that differ only by case). */ id: string; /** The display name for the Job. The display name need not be unique and can contain any Unicode characters up to a maximum length of 1024. */ @@ -1226,18 +1070,10 @@ export interface BatchJobCreateParameters { commonEnvironmentSettings?: Array; /** The Pool on which the Batch service runs the Job's Tasks. */ poolInfo: BatchPoolInfo; - /** - * The action the Batch service should take when all Tasks in the Job are in the completed state. Note that if a Job contains no Tasks, then all Tasks are considered complete. This option is therefore most commonly used with a Job Manager task; if you want to use automatic Job termination without a Job Manager, you should initially set onAllTasksComplete to noaction and update the Job properties to set onAllTasksComplete to terminatejob once you have finished adding Tasks. The default is noaction. - * - * Possible values: noaction, terminatejob - */ - onAllTasksComplete?: string; - /** - * The action the Batch service should take when any Task in the Job fails. A Task is considered to have failed if has a failureInfo. A failureInfo is set if the Task completes with a non-zero exit code after exhausting its retry count, or if there was an error starting the Task, for example due to a resource file download error. The default is noaction. - * - * Possible values: noaction, performexitoptionsjobaction - */ - onTaskFailure?: string; + /** The action the Batch service should take when all Tasks in the Job are in the completed state. Note that if a Job contains no Tasks, then all Tasks are considered complete. This option is therefore most commonly used with a Job Manager task; if you want to use automatic Job termination without a Job Manager, you should initially set onAllTasksComplete to noaction and update the Job properties to set onAllTasksComplete to terminatejob once you have finished adding Tasks. The default is noaction. */ + onAllTasksComplete?: OnAllBatchTasksComplete; + /** The action the Batch service should take when any Task in the Job fails. A Task is considered to have failed if has a failureInfo. A failureInfo is set if the Task completes with a non-zero exit code after exhausting its retry count, or if there was an error starting the Task, for example due to a resource file download error. The default is noaction. */ + onTaskFailure?: OnBatchTaskFailure; /** The network configuration for the Job. */ networkConfiguration?: BatchJobNetworkConfiguration; /** A list of name-value pairs associated with the Job as metadata. The Batch service does not assign any meaning to metadata; it is solely for the use of user code. */ @@ -1256,12 +1092,8 @@ export interface BatchTaskContainerExecutionInfo { /** Information about a Task failure. */ export interface BatchTaskFailureInfo { - /** - * The category of the Task error. - * - * Possible values: usererror, servererror - */ - category: string; + /** The category of the Task error. */ + category: ErrorCategory; /** An identifier for the Task error. Codes are invariant and are intended to be consumed programmatically. */ code?: string; /** A message describing the Task error, intended to be suitable for display in a user interface. */ @@ -1270,44 +1102,13 @@ export interface BatchTaskFailureInfo { details?: Array; } -/** - * A Certificate that can be installed on Compute Nodes and can be used to - * authenticate operations on the machine. - */ -export interface BatchCertificate { - /** The X.509 thumbprint of the Certificate. This is a sequence of up to 40 hex digits (it may include spaces but these are removed). */ - thumbprint: string; - /** The algorithm used to derive the thumbprint. This must be sha1. */ - thumbprintAlgorithm: string; - /** The base64-encoded contents of the Certificate. The maximum size is 10KB. */ - data: string; - /** - * The format of the Certificate data. - * - * Possible values: pfx, cer - */ - certificateFormat?: string; - /** The password to access the Certificate's private key. This must be omitted if the Certificate format is cer. */ - password?: string; -} - -/** An error encountered by the Batch service when deleting a Certificate. */ -export interface DeleteBatchCertificateError { - /** An identifier for the Certificate deletion error. Codes are invariant and are intended to be consumed programmatically. */ - code?: string; - /** A message describing the Certificate deletion error, intended to be suitable for display in a user interface. */ - message?: string; - /** A list of additional error details related to the Certificate deletion error. This list includes details such as the active Pools and Compute Nodes referencing this Certificate. However, if a large number of resources reference the Certificate, the list contains only about the first hundred. */ - values?: Array; -} - /** * A Job Schedule that allows recurring Jobs by specifying when to run Jobs and a * specification used to create each Job. */ export interface BatchJobSchedule { /** The schedule according to which Jobs will be created. All times are fixed respective to UTC and are not impacted by daylight saving time. */ - schedule?: Schedule; + schedule?: BatchJobScheduleConfiguration; /** The details of the Jobs to be created on this schedule. */ jobSpecification: BatchJobSpecification; /** A list of name-value pairs associated with the schedule as metadata. The Batch service does not assign any meaning to metadata; it is solely for the use of user code. */ @@ -1318,7 +1119,7 @@ export interface BatchJobSchedule { * The schedule according to which Jobs will be created. All times are fixed * respective to UTC and are not impacted by daylight saving time. */ -export interface Schedule { +export interface BatchJobScheduleConfiguration { /** The earliest time at which any Job may be created under this Job Schedule. If you do not specify a doNotRunUntil time, the schedule becomes ready to create Jobs immediately. */ doNotRunUntil?: Date | string; /** A time after which no Job will be created under this Job Schedule. The schedule will move to the completed state as soon as this deadline is past and there is no active Job under this Job Schedule. If you do not specify a doNotRunAfter time, and you are creating a recurring Job Schedule, the Job Schedule will remain active until you explicitly terminate it. */ @@ -1341,18 +1142,10 @@ export interface BatchJobSpecification { displayName?: string; /** Whether Tasks in the Job can define dependencies on each other. The default is false. */ usesTaskDependencies?: boolean; - /** - * The action the Batch service should take when all Tasks in a Job created under this schedule are in the completed state. Note that if a Job contains no Tasks, then all Tasks are considered complete. This option is therefore most commonly used with a Job Manager task; if you want to use automatic Job termination without a Job Manager, you should initially set onAllTasksComplete to noaction and update the Job properties to set onAllTasksComplete to terminatejob once you have finished adding Tasks. The default is noaction. - * - * Possible values: noaction, terminatejob - */ - onAllTasksComplete?: string; - /** - * The action the Batch service should take when any Task fails in a Job created under this schedule. A Task is considered to have failed if it have failed if has a failureInfo. A failureInfo is set if the Task completes with a non-zero exit code after exhausting its retry count, or if there was an error starting the Task, for example due to a resource file download error. The default is noaction. - * - * Possible values: noaction, performexitoptionsjobaction - */ - onTaskFailure?: string; + /** The action the Batch service should take when all Tasks in a Job created under this schedule are in the completed state. Note that if a Job contains no Tasks, then all Tasks are considered complete. This option is therefore most commonly used with a Job Manager task; if you want to use automatic Job termination without a Job Manager, you should initially set onAllTasksComplete to noaction and update the Job properties to set onAllTasksComplete to terminatejob once you have finished adding Tasks. The default is noaction. */ + onAllTasksComplete?: OnAllBatchTasksComplete; + /** The action the Batch service should take when any Task fails in a Job created under this schedule. A Task is considered to have failed if it have failed if has a failureInfo. A failureInfo is set if the Task completes with a non-zero exit code after exhausting its retry count, or if there was an error starting the Task, for example due to a resource file download error. The default is noaction. */ + onTaskFailure?: OnBatchTaskFailure; /** The network configuration for the Job. */ networkConfiguration?: BatchJobNetworkConfiguration; /** The execution constraints for Jobs created under this schedule. */ @@ -1425,9 +1218,9 @@ export interface BatchJobScheduleStatistics { } /** Parameters for updating an Azure Batch Job Schedule. */ -export interface BatchJobScheduleUpdateParameters { +export interface BatchJobScheduleUpdateContent { /** The schedule according to which Jobs will be created. All times are fixed respective to UTC and are not impacted by daylight saving time. If you do not specify this element, the existing schedule is left unchanged. */ - schedule?: Schedule; + schedule?: BatchJobScheduleConfiguration; /** The details of the Jobs to be created on this schedule. Updates affect only Jobs that are started after the update has taken place. Any currently active Job continues with the older specification. */ jobSpecification?: BatchJobSpecification; /** A list of name-value pairs associated with the Job Schedule as metadata. If you do not specify this element, existing metadata is left unchanged. */ @@ -1435,13 +1228,13 @@ export interface BatchJobScheduleUpdateParameters { } /** Parameters for creating an Azure Batch Job Schedule */ -export interface BatchJobScheduleCreateParameters { +export interface BatchJobScheduleCreateContent { /** A string that uniquely identifies the schedule within the Account. The ID can contain any combination of alphanumeric characters including hyphens and underscores, and cannot contain more than 64 characters. The ID is case-preserving and case-insensitive (that is, you may not have two IDs within an Account that differ only by case). */ id: string; /** The display name for the schedule. The display name need not be unique and can contain any Unicode characters up to a maximum length of 1024. */ displayName?: string; /** The schedule according to which Jobs will be created. All times are fixed respective to UTC and are not impacted by daylight saving time. */ - schedule: Schedule; + schedule: BatchJobScheduleConfiguration; /** The details of the Jobs to be created on this schedule. */ jobSpecification: BatchJobSpecification; /** A list of name-value pairs associated with the schedule as metadata. The Batch service does not assign any meaning to metadata; it is solely for the use of user code. */ @@ -1449,7 +1242,7 @@ export interface BatchJobScheduleCreateParameters { } /** Parameters for creating an Azure Batch Task. */ -export interface BatchTaskCreateParameters { +export interface BatchTaskCreateContent { /** A string that uniquely identifies the Task within the Job. The ID can contain any combination of alphanumeric characters including hyphens and underscores, and cannot contain more than 64 characters. The ID is case-preserving and case-insensitive (that is, you may not have two IDs within a Job that differ only by case). */ id: string; /** A display name for the Task. The display name need not be unique and can contain any Unicode characters up to a maximum length of 1024. */ @@ -1511,18 +1304,10 @@ export interface ExitCodeMapping { /** Specifies how the Batch service responds to a particular exit condition. */ export interface ExitOptions { - /** - * An action to take on the Job containing the Task, if the Task completes with the given exit condition and the Job's onTaskFailed property is 'performExitOptionsJobAction'. The default is none for exit code 0 and terminate for all other exit conditions. If the Job's onTaskFailed property is noaction, then specifying this property returns an error and the add Task request fails with an invalid property value error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). - * - * Possible values: none, disable, terminate - */ - jobAction?: string; - /** - * An action that the Batch service performs on Tasks that depend on this Task. Possible values are 'satisfy' (allowing dependent tasks to progress) and 'block' (dependent tasks continue to wait). Batch does not yet support cancellation of dependent tasks. - * - * Possible values: satisfy, block - */ - dependencyAction?: string; + /** An action to take on the Job containing the Task, if the Task completes with the given exit condition and the Job's onTaskFailed property is 'performExitOptionsJobAction'. The default is none for exit code 0 and terminate for all other exit conditions. If the Job's onTaskFailed property is noaction, then specifying this property returns an error and the add Task request fails with an invalid property value error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). */ + jobAction?: BatchJobAction; + /** An action that the Batch service performs on Tasks that depend on this Task. Possible values are 'satisfy' (allowing dependent tasks to progress) and 'block' (dependent tasks continue to wait). Batch does not yet support cancellation of dependent tasks. */ + dependencyAction?: DependencyAction; } /** @@ -1621,12 +1406,8 @@ export interface BatchTaskExecutionInfo { requeueCount: number; /** The most recent time at which the Task has been requeued by the Batch service as the result of a user request. This property is set only if the requeueCount is nonzero. */ lastRequeueTime?: Date | string; - /** - * The result of the Task execution. If the value is 'failed', then the details of the failure can be found in the failureInfo property. - * - * Possible values: success, failure - */ - result?: string; + /** The result of the Task execution. If the value is 'failed', then the details of the failure can be found in the failureInfo property. */ + result?: BatchTaskExecutionResult; } /** Information about the Compute Node on which a Task ran. */ @@ -1672,28 +1453,28 @@ export interface BatchTaskStatistics { } /** A collection of Azure Batch Tasks to add. */ -export interface BatchTaskCollection { +export interface BatchTaskGroup { /** The collection of Tasks to add. The maximum count of Tasks is 100. The total serialized size of this collection must be less than 1MB. If it is greater than 1MB (for example if each Task has 100's of resource files or environment variables), the request will fail with code 'RequestBodyTooLarge' and should be retried again with fewer Tasks. */ - value: Array; + value: Array; } /** Parameters for creating a user account for RDP or SSH access on an Azure Batch Compute Node. */ -export interface BatchNodeUserCreateParameters { +export interface BatchNodeUserCreateContent { /** The user name of the Account. */ name: string; /** Whether the Account should be an administrator on the Compute Node. The default value is false. */ isAdmin?: boolean; /** The time at which the Account should expire. If omitted, the default is 1 day from the current time. For Linux Compute Nodes, the expiryTime has a precision up to a day. */ expiryTime?: Date | string; - /** The password of the Account. The password is required for Windows Compute Nodes (those created with 'cloudServiceConfiguration', or created with 'virtualMachineConfiguration' using a Windows Image reference). For Linux Compute Nodes, the password can optionally be specified along with the sshPublicKey property. */ + /** The password of the Account. The password is required for Windows Compute Nodes (those created with 'virtualMachineConfiguration' using a Windows Image reference). For Linux Compute Nodes, the password can optionally be specified along with the sshPublicKey property. */ password?: string; /** The SSH public key that can be used for remote login to the Compute Node. The public key should be compatible with OpenSSH encoding and should be base 64 encoded. This property can be specified only for Linux Compute Nodes. If this is specified for a Windows Compute Node, then the Batch service rejects the request; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). */ sshPublicKey?: string; } /** Parameters for updating a user account for RDP or SSH access on an Azure Batch Compute Node. */ -export interface BatchNodeUserUpdateParameters { - /** The password of the Account. The password is required for Windows Compute Nodes (those created with 'cloudServiceConfiguration', or created with 'virtualMachineConfiguration' using a Windows Image reference). For Linux Compute Nodes, the password can optionally be specified along with the sshPublicKey property. If omitted, any existing password is removed. */ +export interface BatchNodeUserUpdateContent { + /** The password of the Account. The password is required for Windows Compute Nodes (those created with 'virtualMachineConfiguration' using a Windows Image reference). For Linux Compute Nodes, the password can optionally be specified along with the sshPublicKey property. If omitted, any existing password is removed. */ password?: string; /** The time at which the Account should expire. If omitted, the default is 1 day from the current time. For Linux Compute Nodes, the expiryTime has a precision up to a day. */ expiryTime?: Date | string; @@ -1702,37 +1483,19 @@ export interface BatchNodeUserUpdateParameters { } /** Parameters for rebooting an Azure Batch Compute Node. */ -export interface BatchNodeRebootParameters { - /** - * When to reboot the Compute Node and what to do with currently running Tasks. The default value is requeue. - * - * Possible values: requeue, terminate, taskcompletion, retaineddata - */ - nodeRebootOption?: string; -} - -/** Parameters for reimaging an Azure Batch Compute Node. */ -export interface BatchNodeReimageParameters { - /** - * When to reimage the Compute Node and what to do with currently running Tasks. The default value is requeue. - * - * Possible values: requeue, terminate, taskcompletion, retaineddata - */ - nodeReimageOption?: string; +export interface BatchNodeRebootContent { + /** When to reboot the Compute Node and what to do with currently running Tasks. The default value is requeue. */ + nodeRebootOption?: BatchNodeRebootOption; } /** Parameters for disabling scheduling on an Azure Batch Compute Node. */ -export interface BatchNodeDisableSchedulingParameters { - /** - * What to do with currently running Tasks when disabling Task scheduling on the Compute Node. The default value is requeue. - * - * Possible values: requeue, terminate, taskcompletion - */ - nodeDisableSchedulingOption?: string; +export interface BatchNodeDisableSchedulingContent { + /** What to do with currently running Tasks when disabling Task scheduling on the Compute Node. The default value is requeue. */ + nodeDisableSchedulingOption?: BatchNodeDisableSchedulingOption; } /** The Azure Batch service log files upload parameters for a Compute Node. */ -export interface UploadBatchServiceLogsParameters { +export interface UploadBatchServiceLogsContent { /** The URL of the container within Azure Blob Storage to which to upload the Batch Service log file(s). If a user assigned managed identity is not being used, the URL must include a Shared Access Signature (SAS) granting write permissions to the container. The SAS duration must allow enough time for the upload to finish. The start time for SAS is optional and recommended to not be specified. */ containerUrl: string; /** The start of the time range from which to upload Batch Service log file(s). Any log file containing a log message in the time range will be uploaded. This means that the operation might retrieve more logs than have been requested since the entire log file is always uploaded, but the operation should not retrieve fewer logs than have been requested. */ @@ -1742,3 +1505,127 @@ export interface UploadBatchServiceLogsParameters { /** The reference to the user assigned identity to use to access Azure Blob Storage specified by containerUrl. The identity must have write access to the Azure Blob Storage container. */ identityReference?: BatchNodeIdentityReference; } + +/** Alias for CachingType */ +export type CachingType = string | "none" | "readonly" | "readwrite"; +/** Alias for StorageAccountType */ +export type StorageAccountType = + | string + | "standard_lrs" + | "premium_lrs" + | "standardssd_lrs"; +/** Alias for ContainerType */ +export type ContainerType = string | "dockerCompatible" | "criCompatible"; +/** Alias for DiskEncryptionTarget */ +export type DiskEncryptionTarget = string | "osdisk" | "temporarydisk"; +/** Alias for BatchNodePlacementPolicyType */ +export type BatchNodePlacementPolicyType = string | "regional" | "zonal"; +/** Alias for DiffDiskPlacement */ +export type DiffDiskPlacement = string | "cachedisk"; +/** Alias for SecurityTypes */ +export type SecurityTypes = string | "trustedLaunch"; +/** Alias for DynamicVNetAssignmentScope */ +export type DynamicVNetAssignmentScope = string | "none" | "job"; +/** Alias for InboundEndpointProtocol */ +export type InboundEndpointProtocol = string | "tcp" | "udp"; +/** Alias for NetworkSecurityGroupRuleAccess */ +export type NetworkSecurityGroupRuleAccess = string | "allow" | "deny"; +/** Alias for IpAddressProvisioningType */ +export type IpAddressProvisioningType = + | string + | "batchmanaged" + | "usermanaged" + | "nopublicipaddresses"; +/** Alias for ContainerWorkingDirectory */ +export type ContainerWorkingDirectory = + | string + | "taskWorkingDirectory" + | "containerImageDefault"; +/** Alias for AutoUserScope */ +export type AutoUserScope = string | "task" | "pool"; +/** Alias for ElevationLevel */ +export type ElevationLevel = string | "nonadmin" | "admin"; +/** Alias for BatchNodeFillType */ +export type BatchNodeFillType = string | "spread" | "pack"; +/** Alias for LoginMode */ +export type LoginMode = string | "batch" | "interactive"; +/** Alias for BatchNodeCommunicationMode */ +export type BatchNodeCommunicationMode = + | string + | "default" + | "classic" + | "simplified"; +/** Alias for UpgradeMode */ +export type UpgradeMode = string | "automatic" | "manual" | "rolling"; +/** Alias for BatchNodeDeallocationOption */ +export type BatchNodeDeallocationOption = + | string + | "requeue" + | "terminate" + | "taskcompletion" + | "retaineddata"; +/** Alias for BatchJobState */ +export type BatchJobState = + | string + | "active" + | "disabling" + | "disabled" + | "enabling" + | "terminating" + | "completed" + | "deleting"; +/** Alias for OutputFileUploadCondition */ +export type OutputFileUploadCondition = + | string + | "tasksuccess" + | "taskfailure" + | "taskcompletion"; +/** Alias for AccessScope */ +export type AccessScope = string | "job"; +/** Alias for BatchPoolLifetimeOption */ +export type BatchPoolLifetimeOption = string | "jobschedule" | "job"; +/** Alias for OnAllBatchTasksComplete */ +export type OnAllBatchTasksComplete = string | "noaction" | "terminatejob"; +/** Alias for OnBatchTaskFailure */ +export type OnBatchTaskFailure = + | string + | "noaction" + | "performexitoptionsjobaction"; +/** Alias for ErrorCategory */ +export type ErrorCategory = string | "usererror" | "servererror"; +/** Alias for DisableBatchJobOption */ +export type DisableBatchJobOption = string | "requeue" | "terminate" | "wait"; +/** Alias for BatchTaskExecutionResult */ +export type BatchTaskExecutionResult = string | "success" | "failure"; +/** Alias for BatchJobScheduleState */ +export type BatchJobScheduleState = + | string + | "active" + | "completed" + | "disabled" + | "terminating" + | "deleting"; +/** Alias for BatchJobAction */ +export type BatchJobAction = string | "none" | "disable" | "terminate"; +/** Alias for DependencyAction */ +export type DependencyAction = string | "satisfy" | "block"; +/** Alias for BatchTaskState */ +export type BatchTaskState = + | string + | "active" + | "preparing" + | "running" + | "completed"; +/** Alias for BatchNodeRebootOption */ +export type BatchNodeRebootOption = + | string + | "requeue" + | "terminate" + | "taskcompletion" + | "retaineddata"; +/** Alias for BatchNodeDisableSchedulingOption */ +export type BatchNodeDisableSchedulingOption = + | string + | "requeue" + | "terminate" + | "taskcompletion"; diff --git a/packages/service/src/internal/batch-rest/generated/src/outputModels.ts b/packages/service/src/internal/batch-rest/generated/src/outputModels.ts index 9fff150a7..f42982008 100644 --- a/packages/service/src/internal/batch-rest/generated/src/outputModels.ts +++ b/packages/service/src/internal/batch-rest/generated/src/outputModels.ts @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. -export interface BatchApplicationListResultListOutput {} - /** The result of listing the applications available in an Account. */ export interface BatchApplicationListResultOutput { /** The list of applications available in the Account. */ @@ -47,8 +45,6 @@ export interface BatchErrorDetailOutput { value?: string; } -export interface BatchPoolListUsageMetricsResultListOutput {} - /** The result of a listing the usage metrics for an Account. */ export interface BatchPoolListUsageMetricsResultOutput { /** The Pool usage metrics data. */ @@ -71,29 +67,6 @@ export interface BatchPoolUsageMetricsOutput { totalCoreHours: number; } -/** - * The configuration for Compute Nodes in a Pool based on the Azure Cloud Services - * platform. - */ -export interface CloudServiceConfigurationOutput { - /** - * Possible values are: - * 2 - OS Family 2, equivalent to Windows Server 2008 R2 - * SP1. - * 3 - OS Family 3, equivalent to Windows Server 2012. - * 4 - OS Family 4, - * equivalent to Windows Server 2012 R2. - * 5 - OS Family 5, equivalent to Windows - * Server 2016. - * 6 - OS Family 6, equivalent to Windows Server 2019. For more - * information, see Azure Guest OS Releases - * (https://azure.microsoft.com/documentation/articles/cloud-services-guestos-update-matrix/#releases). - */ - osFamily: string; - /** The Azure Guest OS version to be installed on the virtual machines in the Pool. The default value is * which specifies the latest operating system version for the specified OS family. */ - osVersion?: string; -} - /** * The configuration for Compute Nodes in a Pool based on the Azure Virtual * Machines infrastructure. @@ -167,40 +140,28 @@ export interface WindowsConfigurationOutput { * disks from within a VM to use them. */ export interface DataDiskOutput { - /** The logical unit number. The lun is used to uniquely identify each data disk. If attaching multiple disks, each should have a distinct lun. The value must be between 0 and 63, inclusive. */ + /** The logical unit number. The logicalUnitNumber is used to uniquely identify each data disk. If attaching multiple disks, each should have a distinct logicalUnitNumber. The value must be between 0 and 63, inclusive. */ lun: number; - /** - * The type of caching to be enabled for the data disks. The default value for caching is readwrite. For information about the caching options see: https://blogs.msdn.microsoft.com/windowsazurestorage/2012/06/27/exploring-windows-azure-drives-disks-and-images/. - * - * Possible values: none, readonly, readwrite - */ - caching?: string; + /** The type of caching to be enabled for the data disks. The default value for caching is readwrite. For information about the caching options see: https://blogs.msdn.microsoft.com/windowsazurestorage/2012/06/27/exploring-windows-azure-drives-disks-and-images/. */ + caching?: CachingTypeOutput; /** The initial disk size in gigabytes. */ diskSizeGB: number; - /** - * The storage Account type to be used for the data disk. If omitted, the default is "standard_lrs". - * - * Possible values: standard_lrs, premium_lrs, standardssd_lrs - */ - storageAccountType?: string; + /** The storage Account type to be used for the data disk. If omitted, the default is "standard_lrs". */ + storageAccountType?: StorageAccountTypeOutput; } /** The configuration for container-enabled Pools. */ export interface ContainerConfigurationOutput { - /** - * The container technology to be used. - * - * Possible values: dockerCompatible, criCompatible - */ - type: string; + /** The container technology to be used. */ + type: ContainerTypeOutput; /** The collection of container Image names. This is the full Image reference, as would be specified to "docker pull". An Image will be sourced from the default Docker registry unless the Image is fully qualified with an alternative registry. */ containerImageNames?: string[]; /** Additional private registries from which containers can be pulled. If any Images must be downloaded from a private registry which requires credentials, then those credentials must be provided here. */ - containerRegistries?: Array; + containerRegistries?: Array; } /** A private container registry. */ -export interface ContainerRegistryOutput { +export interface ContainerRegistryReferenceOutput { /** The user name to log into the registry server. */ username?: string; /** The password to log into the registry server. */ @@ -227,7 +188,7 @@ export interface BatchNodeIdentityReferenceOutput { */ export interface DiskEncryptionConfigurationOutput { /** The list of disk targets Batch Service will encrypt on the compute node. If omitted, no disks on the compute nodes in the pool will be encrypted. On Linux pool, only "TemporaryDisk" is supported; on Windows pool, "OsDisk" and "TemporaryDisk" must be specified. */ - targets?: string[]; + targets?: DiskEncryptionTargetOutput[]; } /** @@ -236,12 +197,8 @@ export interface DiskEncryptionConfigurationOutput { * with best effort balancing. */ export interface BatchNodePlacementConfigurationOutput { - /** - * Node placement Policy type on Batch Pools. Allocation policy used by Batch Service to provision the nodes. If not specified, Batch will use the regional policy. - * - * Possible values: regional, zonal - */ - policy?: string; + /** Node placement Policy type on Batch Pools. Allocation policy used by Batch Service to provision the nodes. If not specified, Batch will use the regional policy. */ + policy?: BatchNodePlacementPolicyTypeOutput; } /** The configuration for virtual machine extensions. */ @@ -270,12 +227,8 @@ export interface VMExtensionOutput { export interface OSDiskOutput { /** Specifies the ephemeral Disk Settings for the operating system disk used by the compute node (VM). */ ephemeralOSDiskSettings?: DiffDiskSettingsOutput; - /** - * Specifies the caching requirements. Possible values are: None, ReadOnly, ReadWrite. The default values are: None for Standard storage. ReadOnly for Premium storage. - * - * Possible values: none, readonly, readwrite - */ - caching?: string; + /** Specifies the caching requirements. Possible values are: None, ReadOnly, ReadWrite. The default values are: None for Standard storage. ReadOnly for Premium storage. */ + caching?: CachingTypeOutput; /** The initial disk size in GB when creating new OS disk. */ diskSizeGB?: number; /** The managed disk parameters. */ @@ -289,34 +242,22 @@ export interface OSDiskOutput { * compute node (VM). */ export interface DiffDiskSettingsOutput { - /** - * Specifies the ephemeral disk placement for operating system disk for all VMs in the pool. This property can be used by user in the request to choose the location e.g., cache disk space for Ephemeral OS disk provisioning. For more information on Ephemeral OS disk size requirements, please refer to Ephemeral OS disk size requirements for Windows VMs at https://docs.microsoft.com/en-us/azure/virtual-machines/windows/ephemeral-os-disks#size-requirements and Linux VMs at https://docs.microsoft.com/en-us/azure/virtual-machines/linux/ephemeral-os-disks#size-requirements. - * - * Possible values: cachedisk - */ - placement?: string; + /** Specifies the ephemeral disk placement for operating system disk for all VMs in the pool. This property can be used by user in the request to choose the location e.g., cache disk space for Ephemeral OS disk provisioning. For more information on Ephemeral OS disk size requirements, please refer to Ephemeral OS disk size requirements for Windows VMs at https://docs.microsoft.com/en-us/azure/virtual-machines/windows/ephemeral-os-disks#size-requirements and Linux VMs at https://docs.microsoft.com/en-us/azure/virtual-machines/linux/ephemeral-os-disks#size-requirements. */ + placement?: DiffDiskPlacementOutput; } /** The managed disk parameters. */ export interface ManagedDiskOutput { - /** - * The storage account type for managed disk. - * - * Possible values: standard_lrs, premium_lrs, standardssd_lrs - */ - storageAccountType: string; + /** The storage account type for managed disk. */ + storageAccountType: StorageAccountTypeOutput; } /** Specifies the security profile settings for the virtual machine or virtual machine scale set. */ export interface SecurityProfileOutput { /** This property can be used by user in the request to enable or disable the Host Encryption for the virtual machine or virtual machine scale set. This will enable the encryption for all the disks including Resource/Temp disk at host itself. */ encryptionAtHost: boolean; - /** - * Specifies the SecurityType of the virtual machine. It has to be set to any specified value to enable UefiSettings. - * - * Possible values: trustedLaunch - */ - securityType: string; + /** Specifies the SecurityType of the virtual machine. It has to be set to any specified value to enable UefiSettings. */ + securityType: SecurityTypesOutput; /** Specifies the security settings like secure boot and vTPM used while creating the virtual machine. Specifies the security settings like secure boot and vTPM used while creating the virtual machine. */ uefiSettings: UefiSettingsOutput; } @@ -340,18 +281,14 @@ export interface ServiceArtifactReferenceOutput { /** The network configuration for a Pool. */ export interface NetworkConfigurationOutput { - /** The ARM resource identifier of the virtual network subnet which the Compute Nodes of the Pool will join. This is of the form /subscriptions/{subscription}/resourceGroups/{group}/providers/{provider}/virtualNetworks/{network}/subnets/{subnet}. The virtual network must be in the same region and subscription as the Azure Batch Account. The specified subnet should have enough free IP addresses to accommodate the number of Compute Nodes in the Pool. If the subnet doesn't have enough free IP addresses, the Pool will partially allocate Nodes and a resize error will occur. The 'MicrosoftAzureBatch' service principal must have the 'Classic Virtual Machine Contributor' Role-Based Access Control (RBAC) role for the specified VNet. The specified subnet must allow communication from the Azure Batch service to be able to schedule Tasks on the Nodes. This can be verified by checking if the specified VNet has any associated Network Security Groups (NSG). If communication to the Nodes in the specified subnet is denied by an NSG, then the Batch service will set the state of the Compute Nodes to unusable. For Pools created with virtualMachineConfiguration only ARM virtual networks ('Microsoft.Network/virtualNetworks') are supported, but for Pools created with cloudServiceConfiguration both ARM and classic virtual networks are supported. If the specified VNet has any associated Network Security Groups (NSG), then a few reserved system ports must be enabled for inbound communication. For Pools created with a virtual machine configuration, enable ports 29876 and 29877, as well as port 22 for Linux and port 3389 for Windows. For Pools created with a cloud service configuration, enable ports 10100, 20100, and 30100. Also enable outbound connections to Azure Storage on port 443. For more details see: https://docs.microsoft.com/en-us/azure/batch/batch-api-basics#virtual-network-vnet-and-firewall-configuration. */ + /** The ARM resource identifier of the virtual network subnet which the Compute Nodes of the Pool will join. This is of the form /subscriptions/{subscription}/resourceGroups/{group}/providers/{provider}/virtualNetworks/{network}/subnets/{subnet}. The virtual network must be in the same region and subscription as the Azure Batch Account. The specified subnet should have enough free IP addresses to accommodate the number of Compute Nodes in the Pool. If the subnet doesn't have enough free IP addresses, the Pool will partially allocate Nodes and a resize error will occur. The 'MicrosoftAzureBatch' service principal must have the 'Classic Virtual Machine Contributor' Role-Based Access Control (RBAC) role for the specified VNet. The specified subnet must allow communication from the Azure Batch service to be able to schedule Tasks on the Nodes. This can be verified by checking if the specified VNet has any associated Network Security Groups (NSG). If communication to the Nodes in the specified subnet is denied by an NSG, then the Batch service will set the state of the Compute Nodes to unusable. For Pools created with virtualMachineConfiguration only ARM virtual networks ('Microsoft.Network/virtualNetworks') are supported. If the specified VNet has any associated Network Security Groups (NSG), then a few reserved system ports must be enabled for inbound communication. For Pools created with a virtual machine configuration, enable ports 29876 and 29877, as well as port 22 for Linux and port 3389 for Windows. Also enable outbound connections to Azure Storage on port 443. For more details see: https://docs.microsoft.com/en-us/azure/batch/batch-api-basics#virtual-network-vnet-and-firewall-configuration. */ subnetId?: string; - /** - * The scope of dynamic vnet assignment. - * - * Possible values: none, job - */ - dynamicVNetAssignmentScope?: string; + /** The scope of dynamic vnet assignment. */ + dynamicVNetAssignmentScope?: DynamicVNetAssignmentScopeOutput; /** The configuration for endpoints on Compute Nodes in the Batch Pool. Pool endpoint configuration is only supported on Pools with the virtualMachineConfiguration property. */ endpointConfiguration?: BatchPoolEndpointConfigurationOutput; /** The Public IPAddress configuration for Compute Nodes in the Batch Pool. Public IP configuration property is only supported on Pools with the virtualMachineConfiguration property. */ - publicIPAddressConfiguration?: PublicIPAddressConfigurationOutput; + publicIPAddressConfiguration?: PublicIpAddressConfigurationOutput; /** Whether this pool should enable accelerated networking. Accelerated networking enables single root I/O virtualization (SR-IOV) to a VM, which may lead to improved networking performance. For more details, see: https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview. */ enableAcceleratedNetworking?: boolean; } @@ -359,22 +296,18 @@ export interface NetworkConfigurationOutput { /** The endpoint configuration for a Pool. */ export interface BatchPoolEndpointConfigurationOutput { /** A list of inbound NAT Pools that can be used to address specific ports on an individual Compute Node externally. The maximum number of inbound NAT Pools per Batch Pool is 5. If the maximum number of inbound NAT Pools is exceeded the request fails with HTTP status code 400. This cannot be specified if the IPAddressProvisioningType is NoPublicIPAddresses. */ - inboundNATPools: Array; + inboundNATPools: Array; } /** * A inbound NAT Pool that can be used to address specific ports on Compute Nodes * in a Batch Pool externally. */ -export interface InboundNATPoolOutput { +export interface InboundNatPoolOutput { /** The name of the endpoint. The name must be unique within a Batch Pool, can contain letters, numbers, underscores, periods, and hyphens. Names must start with a letter or number, must end with a letter, number, or underscore, and cannot exceed 77 characters. If any invalid values are provided the request fails with HTTP status code 400. */ name: string; - /** - * The protocol of the endpoint. - * - * Possible values: tcp, udp - */ - protocol: string; + /** The protocol of the endpoint. */ + protocol: InboundEndpointProtocolOutput; /** The port number on the Compute Node. This must be unique within a Batch Pool. Acceptable values are between 1 and 65535 except for 22, 3389, 29876 and 29877 as these are reserved. If any reserved values are provided the request fails with HTTP status code 400. */ backendPort: number; /** The first port number in the range of external ports that will be used to provide inbound access to the backendPort on individual Compute Nodes. Acceptable values range between 1 and 65534 except ports from 50000 to 55000 which are reserved. All ranges within a Pool must be distinct and cannot overlap. Each range must contain at least 40 ports. If any reserved or overlapping values are provided the request fails with HTTP status code 400. */ @@ -389,12 +322,8 @@ export interface InboundNATPoolOutput { export interface NetworkSecurityGroupRuleOutput { /** The priority for this rule. Priorities within a Pool must be unique and are evaluated in order of priority. The lower the number the higher the priority. For example, rules could be specified with order numbers of 150, 250, and 350. The rule with the order number of 150 takes precedence over the rule that has an order of 250. Allowed priorities are 150 to 4096. If any reserved or duplicate values are provided the request fails with HTTP status code 400. */ priority: number; - /** - * The action that should be taken for a specified IP address, subnet range or tag. - * - * Possible values: allow, deny - */ - access: string; + /** The action that should be taken for a specified IP address, subnet range or tag. */ + access: NetworkSecurityGroupRuleAccessOutput; /** The source address prefix or tag to match for the rule. Valid values are a single IP address (i.e. 10.10.10.10), IP subnet (i.e. 192.168.1.0/24), default tag, or * (for all addresses). If any other values are provided the request fails with HTTP status code 400. */ sourceAddressPrefix: string; /** The source port ranges to match for the rule. Valid values are '*' (for all ports 0 - 65535), a specific port (i.e. 22), or a port range (i.e. 100-200). The ports must be in the range of 0 to 65535. Each entry in this collection must not overlap any other entry (either a range or an individual port). If any other values are provided the request fails with HTTP status code 400. The default value is '*'. */ @@ -402,13 +331,9 @@ export interface NetworkSecurityGroupRuleOutput { } /** The public IP Address configuration of the networking configuration of a Pool. */ -export interface PublicIPAddressConfigurationOutput { - /** - * The provisioning type for Public IP Addresses for the Pool. The default value is BatchManaged. - * - * Possible values: batchmanaged, usermanaged, nopublicipaddresses - */ - provision?: string; +export interface PublicIpAddressConfigurationOutput { + /** The provisioning type for Public IP Addresses for the Pool. The default value is BatchManaged. */ + provision?: IpAddressProvisioningTypeOutput; /** The list of public IPs which the Batch service will use when provisioning Compute Nodes. The number of IPs specified here limits the maximum size of the Pool - 100 dedicated nodes or 100 Spot/Low-priority nodes can be allocated for each public IP. For example, a pool needing 250 dedicated VMs would need at least 3 public IPs specified. Each element of this collection is of the form: /subscriptions/{subscription}/resourceGroups/{group}/providers/Microsoft.Network/publicIPAddresses/{ip}. */ ipAddressIds?: string[]; } @@ -452,13 +377,9 @@ export interface BatchTaskContainerSettingsOutput { /** The Image to use to create the container in which the Task will run. This is the full Image reference, as would be specified to "docker pull". If no tag is provided as part of the Image name, the tag ":latest" is used as a default. */ imageName: string; /** The private registry which contains the container Image. This setting can be omitted if was already provided at Pool creation. */ - registry?: ContainerRegistryOutput; - /** - * The location of the container Task working directory. The default is 'taskWorkingDirectory'. - * - * Possible values: taskWorkingDirectory, containerImageDefault - */ - workingDirectory?: string; + registry?: ContainerRegistryReferenceOutput; + /** The location of the container Task working directory. The default is 'taskWorkingDirectory'. */ + workingDirectory?: ContainerWorkingDirectoryOutput; } /** A single file or multiple files to be downloaded to a Compute Node. */ @@ -497,36 +418,10 @@ export interface UserIdentityOutput { /** Specifies the options for the auto user that runs an Azure Batch Task. */ export interface AutoUserSpecificationOutput { - /** - * The scope for the auto user. The default value is pool. If the pool is running Windows a value of Task should be specified if stricter isolation between tasks is required. For example, if the task mutates the registry in a way which could impact other tasks, or if certificates have been specified on the pool which should not be accessible by normal tasks but should be accessible by StartTasks. - * - * Possible values: task, pool - */ - scope?: string; - /** - * The elevation level of the auto user. The default value is nonAdmin. - * - * Possible values: nonadmin, admin - */ - elevationLevel?: string; -} - -/** A reference to a Certificate to be installed on Compute Nodes in a Pool. Warning: This object is deprecated and will be removed after February, 2024. Please use the [Azure KeyVault Extension](https://learn.microsoft.com/azure/batch/batch-certificate-migration-guide) instead. */ -export interface BatchCertificateReferenceOutput { - /** The thumbprint of the Certificate. */ - thumbprint: string; - /** The algorithm with which the thumbprint is associated. This must be sha1. */ - thumbprintAlgorithm: string; - /** - * The location of the Certificate store on the Compute Node into which to install the Certificate. The default value is currentuser. This property is applicable only for Pools configured with Windows Compute Nodes (that is, created with cloudServiceConfiguration, or with virtualMachineConfiguration using a Windows Image reference). For Linux Compute Nodes, the Certificates are stored in a directory inside the Task working directory and an environment variable AZ_BATCH_CERTIFICATES_DIR is supplied to the Task to query for this location. For Certificates with visibility of 'remoteUser', a 'certs' directory is created in the user's home directory (e.g., /home/{user-name}/certs) and Certificates are placed in that directory. - * - * Possible values: currentuser, localmachine - */ - storeLocation?: string; - /** The name of the Certificate store on the Compute Node into which to install the Certificate. This property is applicable only for Pools configured with Windows Compute Nodes (that is, created with cloudServiceConfiguration, or with virtualMachineConfiguration using a Windows Image reference). Common store names include: My, Root, CA, Trust, Disallowed, TrustedPeople, TrustedPublisher, AuthRoot, AddressBook, but any custom store name can also be used. The default value is My. */ - storeName?: string; - /** Which user Accounts on the Compute Node should have access to the private data of the Certificate. You can specify more than one visibility in this collection. The default is all Accounts. */ - visibility?: string[]; + /** The scope for the auto user. The default value is pool. If the pool is running Windows, a value of Task should be specified if stricter isolation between tasks is required, such as if the task mutates the registry in a way which could impact other tasks. */ + scope?: AutoUserScopeOutput; + /** The elevation level of the auto user. The default value is nonAdmin. */ + elevationLevel?: ElevationLevelOutput; } /** A reference to an Package to be deployed to Compute Nodes. */ @@ -539,12 +434,8 @@ export interface BatchApplicationPackageReferenceOutput { /** Specifies how Tasks should be distributed across Compute Nodes. */ export interface BatchTaskSchedulingPolicyOutput { - /** - * How Tasks are distributed across Compute Nodes in a Pool. If not specified, the default is spread. - * - * Possible values: spread, pack - */ - nodeFillType: string; + /** How Tasks are distributed across Compute Nodes in a Pool. If not specified, the default is spread. */ + nodeFillType: BatchNodeFillTypeOutput; } /** @@ -556,12 +447,8 @@ export interface UserAccountOutput { name: string; /** The password for the user Account. */ password: string; - /** - * The elevation level of the user Account. The default value is nonAdmin. - * - * Possible values: nonadmin, admin - */ - elevationLevel?: string; + /** The elevation level of the user Account. The default value is nonAdmin. */ + elevationLevel?: ElevationLevelOutput; /** The Linux-specific user configuration for the user Account. This property is ignored if specified on a Windows Pool. If not specified, the user is created with the default options. */ linuxUserConfiguration?: LinuxUserConfigurationOutput; /** The Windows-specific user configuration for the user Account. This property can only be specified if the user is on a Windows Pool. If not specified and on a Windows Pool, the user is created with the default options. */ @@ -580,12 +467,8 @@ export interface LinuxUserConfigurationOutput { /** Properties used to create a user Account on a Windows Compute Node. */ export interface WindowsUserConfigurationOutput { - /** - * The login mode for the user. The default value for VirtualMachineConfiguration Pools is 'batch' and for CloudServiceConfiguration Pools is 'interactive'. - * - * Possible values: batch, interactive - */ - loginMode?: string; + /** The login mode for the user. The default value for VirtualMachineConfiguration Pools is 'batch'. */ + loginMode?: LoginModeOutput; } /** @@ -604,7 +487,7 @@ export interface MountConfigurationOutput { /** The Azure Storage Container to mount using blob FUSE on each node. This property is mutually exclusive with all other properties. */ azureBlobFileSystemConfiguration?: AzureBlobFileSystemConfigurationOutput; /** The NFS file system to mount on each node. This property is mutually exclusive with all other properties. */ - nfsMountConfiguration?: NFSMountConfigurationOutput; + nfsMountConfiguration?: NfsMountConfigurationOutput; /** The CIFS/SMB file system to mount on each node. This property is mutually exclusive with all other properties. */ cifsMountConfiguration?: CifsMountConfigurationOutput; /** The Azure File Share to mount on each node. This property is mutually exclusive with all other properties. */ @@ -630,7 +513,7 @@ export interface AzureBlobFileSystemConfigurationOutput { } /** Information used to connect to an NFS file system. */ -export interface NFSMountConfigurationOutput { +export interface NfsMountConfigurationOutput { /** The URI of the file system to mount. */ source: string; /** The relative path on the compute node where the file system will be mounted. All file systems are mounted relative to the Batch mounts directory, accessible via the AZ_BATCH_NODE_MOUNTS_DIR environment variable. */ @@ -667,7 +550,45 @@ export interface AzureFileShareConfigurationOutput { mountOptions?: string; } -export interface BatchPoolListResultListOutput {} +/** Describes an upgrade policy - automatic, manual, or rolling. */ +export interface UpgradePolicyOutput { + /** Specifies the mode of an upgrade to virtual machines in the scale set.

Possible values are:

**Manual** - You control the application of updates to virtual machines in the scale set. You do this by using the manualUpgrade action.

**Automatic** - All virtual machines in the scale set are automatically updated at the same time.

**Rolling** - Scale set performs updates in batches with an optional pause time in between. */ + mode: UpgradeModeOutput; + /** Configuration parameters used for performing automatic OS Upgrade. The configuration parameters used for performing automatic OS upgrade. */ + automaticOSUpgradePolicy?: AutomaticOsUpgradePolicyOutput; + /** The configuration parameters used while performing a rolling upgrade. This property is only supported on Pools with the virtualMachineConfiguration property. */ + rollingUpgradePolicy?: RollingUpgradePolicyOutput; +} + +/** The configuration parameters used for performing automatic OS upgrade. */ +export interface AutomaticOsUpgradePolicyOutput { + /** Whether OS image rollback feature should be disabled. */ + disableAutomaticRollback?: boolean; + /** Indicates whether OS upgrades should automatically be applied to scale set instances in a rolling fashion when a newer version of the OS image becomes available.

If this is set to true for Windows based pools, [WindowsConfiguration.enableAutomaticUpdates](https://learn.microsoft.com/en-us/rest/api/batchservice/pool/add?tabs=HTTP#windowsconfiguration) cannot be set to true. */ + enableAutomaticOSUpgrade?: boolean; + /** Indicates whether rolling upgrade policy should be used during Auto OS Upgrade. Auto OS Upgrade will fallback to the default policy if no policy is defined on the VMSS. */ + useRollingUpgradePolicy?: boolean; + /** Defer OS upgrades on the TVMs if they are running tasks. */ + osRollingUpgradeDeferral?: boolean; +} + +/** The configuration parameters used while performing a rolling upgrade. */ +export interface RollingUpgradePolicyOutput { + /** Allow VMSS to ignore AZ boundaries when constructing upgrade batches. Take into consideration the Update Domain and maxBatchInstancePercent to determine the batch size. This field is able to be set to true or false only when using NodePlacementConfiguration as Zonal. */ + enableCrossZoneUpgrade?: boolean; + /** The maximum percent of total virtual machine instances that will be upgraded simultaneously by the rolling upgrade in one batch. As this is a maximum, unhealthy instances in previous or future batches can cause the percentage of instances in a batch to decrease to ensure higher reliability. The value of this field should be between 5 and 100, inclusive. If both maxBatchInstancePercent and maxUnhealthyInstancePercent are assigned with value, the value of maxBatchInstancePercent should not be more than maxUnhealthyInstancePercent. */ + maxBatchInstancePercent?: number; + /** The maximum percentage of the total virtual machine instances in the scale set that can be simultaneously unhealthy, either as a result of being upgraded, or by being found in an unhealthy state by the virtual machine health checks before the rolling upgrade aborts. This constraint will be checked prior to starting any batch. The value of this field should be between 5 and 100, inclusive. If both maxBatchInstancePercent and maxUnhealthyInstancePercent are assigned with value, the value of maxBatchInstancePercent should not be more than maxUnhealthyInstancePercent. */ + maxUnhealthyInstancePercent?: number; + /** The maximum percentage of upgraded virtual machine instances that can be found to be in an unhealthy state. This check will happen after each batch is upgraded. If this percentage is ever exceeded, the rolling update aborts. The value of this field should be between 0 and 100, inclusive. */ + maxUnhealthyUpgradedInstancePercent?: number; + /** The wait time between completing the update for all virtual machines in one batch and starting the next batch. The time duration should be specified in ISO 8601 format.. */ + pauseTimeBetweenBatches?: string; + /** Upgrade all unhealthy instances in a scale set before any healthy instances. */ + prioritizeUnhealthyInstances?: boolean; + /** Rollback failed instances to previous model if the Rolling Upgrade policy is violated. */ + rollbackFailedInstancesOnPolicyBreach?: boolean; +} /** The result of listing the Pools in an Account. */ export interface BatchPoolListResultOutput { @@ -691,27 +612,17 @@ export interface BatchPoolOutput { readonly lastModified?: string; /** The creation time of the Pool. */ readonly creationTime?: string; - /** - * The current state of the Pool. - * - * Possible values: active, deleting - */ - readonly state?: string; + /** The current state of the Pool. */ + readonly state?: BatchPoolStateOutput; /** The time at which the Pool entered its current state. */ readonly stateTransitionTime?: string; - /** - * Whether the Pool is resizing. - * - * Possible values: steady, resizing, stopping - */ - readonly allocationState?: string; + /** Whether the Pool is resizing. */ + readonly allocationState?: AllocationStateOutput; /** The time at which the Pool entered its current allocation state. */ readonly allocationStateTransitionTime?: string; /** The size of virtual machines in the Pool. All virtual machines in a Pool are the same size. For information about available sizes of virtual machines in Pools, see Choose a VM size for Compute Nodes in an Azure Batch Pool (https://docs.microsoft.com/azure/batch/batch-pool-vm-sizes). */ readonly vmSize?: string; - /** The cloud service configuration for the Pool. This property and virtualMachineConfiguration are mutually exclusive and one of the properties must be specified. This property cannot be specified if the Batch Account was created with its poolAllocationMode property set to 'UserSubscription'. */ - readonly cloudServiceConfiguration?: CloudServiceConfigurationOutput; - /** The virtual machine configuration for the Pool. This property and cloudServiceConfiguration are mutually exclusive and one of the properties must be specified. */ + /** The virtual machine configuration for the Pool. This property must be specified. */ readonly virtualMachineConfiguration?: VirtualMachineConfigurationOutput; /** The timeout for allocation of Compute Nodes to the Pool. This is the timeout for the most recent resize operation. (The initial sizing when the Pool is created counts as a resize.) The default value is 15 minutes. */ readonly resizeTimeout?: string; @@ -741,17 +652,8 @@ export interface BatchPoolOutput { readonly networkConfiguration?: NetworkConfigurationOutput; /** A Task specified to run on each Compute Node as it joins the Pool. */ startTask?: BatchStartTaskOutput; - /** - * For Windows Nodes, the Batch service installs the Certificates to the specified Certificate store and location. - * For Linux Compute Nodes, the Certificates are stored in a directory inside the Task working directory and an environment variable AZ_BATCH_CERTIFICATES_DIR is supplied to the Task to query for this location. - * For Certificates with visibility of 'remoteUser', a 'certs' directory is created in the user's home directory (e.g., /home/{user-name}/certs) and Certificates are placed in that directory. - * Warning: This property is deprecated and will be removed after February, 2024. Please use the [Azure KeyVault Extension](https://learn.microsoft.com/azure/batch/batch-certificate-migration-guide) instead. - */ - readonly certificateReferences?: Array; /** The list of Packages to be installed on each Compute Node in the Pool. Changes to Package references affect all new Nodes joining the Pool, but do not affect Compute Nodes that are already in the Pool until they are rebooted or reimaged. There is a maximum of 10 Package references on any given Pool. */ readonly applicationPackageReferences?: Array; - /** The list of application licenses the Batch service will make available on each Compute Node in the Pool. The list of application licenses must be a subset of available Batch service application licenses. If a license is requested which is not supported, Pool creation will fail. */ - readonly applicationLicenses?: string[]; /** The number of task slots that can be used to run concurrent tasks on a single compute node in the pool. The default value is 1. The maximum value is the smaller of 4 times the number of cores of the vmSize of the pool or 256. */ readonly taskSlotsPerNode?: number; /** How Tasks are distributed across Compute Nodes in a Pool. If not specified, the default is spread. */ @@ -766,18 +668,12 @@ export interface BatchPoolOutput { readonly mountConfiguration?: Array; /** The identity of the Batch pool, if configured. The list of user identities associated with the Batch pool. The user identity dictionary key references will be ARM resource ids in the form: '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}'. */ readonly identity?: BatchPoolIdentityOutput; - /** - * The desired node communication mode for the pool. If omitted, the default value is Default. - * - * Possible values: default, classic, simplified - */ - targetNodeCommunicationMode?: string; - /** - * The current state of the pool communication mode. - * - * Possible values: default, classic, simplified - */ - readonly currentNodeCommunicationMode?: string; + /** The desired node communication mode for the pool. If omitted, the default value is Default. */ + targetNodeCommunicationMode?: BatchNodeCommunicationModeOutput; + /** The current state of the pool communication mode. */ + readonly currentNodeCommunicationMode?: BatchNodeCommunicationModeOutput; + /** The upgrade policy for the Pool. Describes an upgrade policy - automatic, manual, or rolling. */ + upgradePolicy?: UpgradePolicyOutput; } /** An error that occurred when resizing a Pool. */ @@ -874,12 +770,8 @@ export interface BatchPoolResourceStatisticsOutput { /** The identity of the Batch pool, if configured. */ export interface BatchPoolIdentityOutput { - /** - * The identity of the Batch pool, if configured. The list of user identities associated with the Batch pool. The user identity dictionary key references will be ARM resource ids in the form: '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}'. - * - * Possible values: UserAssigned, None - */ - type: string; + /** The identity of the Batch pool, if configured. The list of user identities associated with the Batch pool. The user identity dictionary key references will be ARM resource ids in the form: '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}'. */ + type: BatchPoolIdentityTypeOutput; /** The list of user identities associated with the Batch account. The user identity dictionary key references will be ARM resource ids in the form: '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}'. */ userAssignedIdentities?: Array; } @@ -894,18 +786,10 @@ export interface UserAssignedIdentityOutput { readonly principalId?: string; } -/** Parameters for evaluating an automatic scaling formula on an Azure Batch Pool. */ -export interface BatchPoolEvaluateAutoScaleParametersOutput { - /** The formula for the desired number of Compute Nodes in the Pool. The formula is validated and its results calculated, but it is not applied to the Pool. To apply the formula to the Pool, 'Enable automatic scaling on a Pool'. For more information about specifying this formula, see Automatically scale Compute Nodes in an Azure Batch Pool (https://azure.microsoft.com/en-us/documentation/articles/batch-automatic-scaling). */ - autoScaleFormula: string; -} - -export interface BatchAccountListSupportedImagesResultListOutput {} - /** The result of listing the supported Virtual Machine Images. */ export interface BatchAccountListSupportedImagesResultOutput { /** The list of supported Virtual Machine Images. */ - value?: Array; + value?: Array; /** The URL to get the next set of results. */ "odata.nextLink"?: string; } @@ -914,31 +798,21 @@ export interface BatchAccountListSupportedImagesResultOutput { * A reference to the Azure Virtual Machines Marketplace Image and additional * information about the Image. */ -export interface ImageInfoOutput { +export interface BatchSupportedImageOutput { /** The ID of the Compute Node agent SKU which the Image supports. */ nodeAgentSKUId: string; /** The reference to the Azure Virtual Machine's Marketplace Image. */ imageReference: ImageReferenceOutput; - /** - * The type of operating system (e.g. Windows or Linux) of the Image. - * - * Possible values: linux, windows - */ - osType: string; + /** The type of operating system (e.g. Windows or Linux) of the Image. */ + osType: OSTypeOutput; /** The capabilities or features which the Image supports. Not every capability of the Image is listed. Capabilities in this list are considered of special interest and are generally related to integration with other features in the Azure Batch service. */ capabilities?: string[]; /** The time when the Azure Batch service will stop accepting create Pool requests for the Image. */ batchSupportEndOfLife?: string; - /** - * Whether the Azure Batch service actively verifies that the Image is compatible with the associated Compute Node agent SKU. - * - * Possible values: verified, unverified - */ - verificationType: string; + /** Whether the Azure Batch service actively verifies that the Image is compatible with the associated Compute Node agent SKU. */ + verificationType: ImageVerificationTypeOutput; } -export interface BatchPoolNodeCountsListResultListOutput {} - /** The result of listing the Compute Node counts in the Account. */ export interface BatchPoolNodeCountsListResultOutput { /** A list of Compute Node counts by Pool. */ @@ -987,6 +861,8 @@ export interface BatchNodeCountsOutput { waitingForStartTask: number; /** The total number of Compute Nodes. */ total: number; + /** The number of Compute Nodes in the upgradingOS state. */ + upgradingOS: number; } /** An Azure Batch Job. */ @@ -1005,20 +881,12 @@ export interface BatchJobOutput { readonly lastModified?: string; /** The creation time of the Job. */ readonly creationTime?: string; - /** - * The current state of the Job. - * - * Possible values: active, disabling, disabled, enabling, terminating, completed, deleting - */ - readonly state?: string; + /** The current state of the Job. */ + readonly state?: BatchJobStateOutput; /** The time at which the Job entered its current state. */ readonly stateTransitionTime?: string; - /** - * The previous state of the Job. This property is not set if the Job is in its initial Active state. - * - * Possible values: active, disabling, disabled, enabling, terminating, completed, deleting - */ - readonly previousState?: string; + /** The previous state of the Job. This property is not set if the Job is in its initial Active state. */ + readonly previousState?: BatchJobStateOutput; /** The time at which the Job entered its previous state. This property is not set if the Job is in its initial Active state. */ readonly previousStateTransitionTime?: string; /** The priority of the Job. Priority values can range from -1000 to 1000, with -1000 being the lowest priority and 1000 being the highest priority. The default value is 0. */ @@ -1039,18 +907,10 @@ export interface BatchJobOutput { readonly commonEnvironmentSettings?: Array; /** The Pool settings associated with the Job. */ poolInfo: BatchPoolInfoOutput; - /** - * The action the Batch service should take when all Tasks in the Job are in the completed state. The default is noaction. - * - * Possible values: noaction, terminatejob - */ - onAllTasksComplete?: string; - /** - * The action the Batch service should take when any Task in the Job fails. A Task is considered to have failed if has a failureInfo. A failureInfo is set if the Task completes with a non-zero exit code after exhausting its retry count, or if there was an error starting the Task, for example due to a resource file download error. The default is noaction. - * - * Possible values: noaction, performexitoptionsjobaction - */ - readonly onTaskFailure?: string; + /** The action the Batch service should take when all Tasks in the Job are in the completed state. The default is noaction. */ + onAllTasksComplete?: OnAllBatchTasksCompleteOutput; + /** The action the Batch service should take when any Task in the Job fails. A Task is considered to have failed if has a failureInfo. A failureInfo is set if the Task completes with a non-zero exit code after exhausting its retry count, or if there was an error starting the Task, for example due to a resource file download error. The default is noaction. */ + readonly onTaskFailure?: OnBatchTaskFailureOutput; /** The network configuration for the Job. */ readonly networkConfiguration?: BatchJobNetworkConfigurationOutput; /** A list of name-value pairs associated with the Job as metadata. The Batch service does not assign any meaning to metadata; it is solely for the use of user code. */ @@ -1143,7 +1003,7 @@ export interface OutputFileOutput { /** The destination for the output file(s). */ destination: OutputFileDestinationOutput; /** Additional options for the upload operation, including under what conditions to perform the upload. */ - uploadOptions: OutputFileUploadOptionsOutput; + uploadOptions: OutputFileUploadConfigOutput; } /** The destination to which a file should be uploaded. */ @@ -1176,13 +1036,9 @@ export interface HttpHeaderOutput { * Options for an output file upload operation, including under what conditions * to perform the upload. */ -export interface OutputFileUploadOptionsOutput { - /** - * The conditions under which the Task output file or set of files should be uploaded. The default is taskcompletion. - * - * Possible values: tasksuccess, taskfailure, taskcompletion - */ - uploadCondition: string; +export interface OutputFileUploadConfigOutput { + /** The conditions under which the Task output file or set of files should be uploaded. The default is taskcompletion. */ + uploadCondition: OutputFileUploadConditionOutput; } /** Execution constraints to apply to a Task. */ @@ -1201,7 +1057,7 @@ export interface BatchTaskConstraintsOutput { */ export interface AuthenticationTokenSettingsOutput { /** The Batch resources to which the token grants access. The authentication token grants access to a limited set of Batch service operations. Currently the only supported value for the access property is 'job', which grants access to all operations related to the Job which contains the Task. */ - access?: string[]; + access?: AccessScopeOutput[]; } /** @@ -1305,12 +1161,8 @@ export interface BatchPoolInfoOutput { export interface BatchAutoPoolSpecificationOutput { /** A prefix to be added to the unique identifier when a Pool is automatically created. The Batch service assigns each auto Pool a unique identifier on creation. To distinguish between Pools created for different purposes, you can specify this element to add a prefix to the ID that is assigned. The prefix can be up to 20 characters long. */ autoPoolIdPrefix?: string; - /** - * The minimum lifetime of created auto Pools, and how multiple Jobs on a schedule are assigned to Pools. - * - * Possible values: jobschedule, job - */ - poolLifetimeOption: string; + /** The minimum lifetime of created auto Pools, and how multiple Jobs on a schedule are assigned to Pools. */ + poolLifetimeOption: BatchPoolLifetimeOptionOutput; /** Whether to keep an auto Pool alive after its lifetime expires. If false, the Batch service deletes the Pool once its lifetime (as determined by the poolLifetimeOption setting) expires; that is, when the Job or Job Schedule completes. If true, the Batch service does not delete the Pool automatically. It is up to the user to delete auto Pools created with this option. */ keepAlive?: boolean; /** The Pool specification for the auto Pool. */ @@ -1323,9 +1175,7 @@ export interface BatchPoolSpecificationOutput { displayName?: string; /** The size of the virtual machines in the Pool. All virtual machines in a Pool are the same size. For information about available sizes of virtual machines in Pools, see Choose a VM size for Compute Nodes in an Azure Batch Pool (https://docs.microsoft.com/azure/batch/batch-pool-vm-sizes). */ vmSize: string; - /** The cloud service configuration for the Pool. This property must be specified if the Pool needs to be created with Azure PaaS VMs. This property and virtualMachineConfiguration are mutually exclusive and one of the properties must be specified. If neither is specified then the Batch service returns an error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). This property cannot be specified if the Batch Account was created with its poolAllocationMode property set to 'UserSubscription'. */ - cloudServiceConfiguration?: CloudServiceConfigurationOutput; - /** The virtual machine configuration for the Pool. This property must be specified if the Pool needs to be created with Azure IaaS VMs. This property and cloudServiceConfiguration are mutually exclusive and one of the properties must be specified. If neither is specified then the Batch service returns an error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). */ + /** The virtual machine configuration for the Pool. This property must be specified if the Pool needs to be created with Azure IaaS VMs. If it is not specified then the Batch service returns an error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). */ virtualMachineConfiguration?: VirtualMachineConfigurationOutput; /** The number of task slots that can be used to run concurrent tasks on a single compute node in the pool. The default value is 1. The maximum value is the smaller of 4 times the number of cores of the vmSize of the pool or 256. */ taskSlotsPerNode?: number; @@ -1351,28 +1201,18 @@ export interface BatchPoolSpecificationOutput { networkConfiguration?: NetworkConfigurationOutput; /** A Task to run on each Compute Node as it joins the Pool. The Task runs when the Compute Node is added to the Pool or when the Compute Node is restarted. */ startTask?: BatchStartTaskOutput; - /** - * For Windows Nodes, the Batch service installs the Certificates to the specified Certificate store and location. For Linux Compute Nodes, the Certificates are stored in a directory inside the Task working directory and an environment variable AZ_BATCH_CERTIFICATES_DIR is supplied to the Task to query for this location. For Certificates with visibility of 'remoteUser', a 'certs' directory is created in the user's home directory (e.g., /home/{user-name}/certs) and Certificates are placed in that directory. - * Warning: This property is deprecated and will be removed after February, 2024. - * Please use the [Azure KeyVault Extension](https://learn.microsoft.com/azure/batch/batch-certificate-migration-guide) instead. - */ - certificateReferences?: Array; /** The list of Packages to be installed on each Compute Node in the Pool. When creating a pool, the package's application ID must be fully qualified (/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Batch/batchAccounts/{accountName}/applications/{applicationName}). Changes to Package references affect all new Nodes joining the Pool, but do not affect Compute Nodes that are already in the Pool until they are rebooted or reimaged. There is a maximum of 10 Package references on any given Pool. */ applicationPackageReferences?: Array; - /** The list of application licenses the Batch service will make available on each Compute Node in the Pool. The list of application licenses must be a subset of available Batch service application licenses. If a license is requested which is not supported, Pool creation will fail. The permitted licenses available on the Pool are 'maya', 'vray', '3dsmax', 'arnold'. An additional charge applies for each application license added to the Pool. */ - applicationLicenses?: string[]; /** The list of user Accounts to be created on each Compute Node in the Pool. */ userAccounts?: Array; /** A list of name-value pairs associated with the Pool as metadata. The Batch service does not assign any meaning to metadata; it is solely for the use of user code. */ metadata?: Array; /** A list of file systems to mount on each node in the pool. This supports Azure Files, NFS, CIFS/SMB, and Blobfuse. */ mountConfiguration?: Array; - /** - * The desired node communication mode for the pool. If omitted, the default value is Default. - * - * Possible values: default, classic, simplified - */ - targetNodeCommunicationMode?: string; + /** The desired node communication mode for the pool. If omitted, the default value is Default. */ + targetNodeCommunicationMode?: BatchNodeCommunicationModeOutput; + /** The upgrade policy for the Pool. Describes an upgrade policy - automatic, manual, or rolling. */ + upgradePolicy?: UpgradePolicyOutput; } /** The network configuration for the Job. */ @@ -1397,12 +1237,8 @@ export interface BatchJobExecutionInfoOutput { /** An error encountered by the Batch service when scheduling a Job. */ export interface BatchJobSchedulingErrorOutput { - /** - * The category of the Job scheduling error. - * - * Possible values: usererror, servererror - */ - category: string; + /** The category of the Job scheduling error. */ + category: ErrorCategoryOutput; /** An identifier for the Job scheduling error. Codes are invariant and are intended to be consumed programmatically. */ code?: string; /** A message describing the Job scheduling error, intended to be suitable for display in a user interface. */ @@ -1443,8 +1279,6 @@ export interface BatchJobStatisticsOutput { waitTime: string; } -export interface BatchJobListResultListOutput {} - /** The result of listing the Jobs in an Account. */ export interface BatchJobListResultOutput { /** The list of Jobs. */ @@ -1453,8 +1287,6 @@ export interface BatchJobListResultOutput { "odata.nextLink"?: string; } -export interface BatchJobPreparationAndReleaseTaskStatusListResultListOutput {} - /** * The result of listing the status of the Job Preparation and Job Release Tasks * for a Job. @@ -1489,12 +1321,8 @@ export interface BatchJobPreparationTaskExecutionInfoOutput { startTime: string; /** The time at which the Job Preparation Task completed. This property is set only if the Task is in the Completed state. */ endTime?: string; - /** - * The current state of the Job Preparation Task on the Compute Node. - * - * Possible values: running, completed - */ - state: string; + /** The current state of the Job Preparation Task on the Compute Node. */ + state: BatchJobPreparationTaskStateOutput; /** The root directory of the Job Preparation Task on the Compute Node. You can use this path to retrieve files created by the Task, such as log files. */ taskRootDirectory?: string; /** The URL to the root directory of the Job Preparation Task on the Compute Node. */ @@ -1509,12 +1337,8 @@ export interface BatchJobPreparationTaskExecutionInfoOutput { retryCount: number; /** The most recent time at which a retry of the Job Preparation Task started running. This property is set only if the Task was retried (i.e. retryCount is nonzero). If present, this is typically the same as startTime, but may be different if the Task has been restarted for reasons other than retry; for example, if the Compute Node was rebooted during a retry, then the startTime is updated but the lastRetryTime is not. */ lastRetryTime?: string; - /** - * The result of the Task execution. If the value is 'failed', then the details of the failure can be found in the failureInfo property. - * - * Possible values: success, failure - */ - result?: string; + /** The result of the Task execution. If the value is 'failed', then the details of the failure can be found in the failureInfo property. */ + result?: BatchTaskExecutionResultOutput; } /** Contains information about the container which a Task is executing. */ @@ -1529,12 +1353,8 @@ export interface BatchTaskContainerExecutionInfoOutput { /** Information about a Task failure. */ export interface BatchTaskFailureInfoOutput { - /** - * The category of the Task error. - * - * Possible values: usererror, servererror - */ - category: string; + /** The category of the Task error. */ + category: ErrorCategoryOutput; /** An identifier for the Task error. Codes are invariant and are intended to be consumed programmatically. */ code?: string; /** A message describing the Task error, intended to be suitable for display in a user interface. */ @@ -1552,12 +1372,8 @@ export interface BatchJobReleaseTaskExecutionInfoOutput { startTime: string; /** The time at which the Job Release Task completed. This property is set only if the Task is in the Completed state. */ endTime?: string; - /** - * The current state of the Job Release Task on the Compute Node. - * - * Possible values: running, completed - */ - state: string; + /** The current state of the Job Release Task on the Compute Node. */ + state: BatchJobReleaseTaskStateOutput; /** The root directory of the Job Release Task on the Compute Node. You can use this path to retrieve files created by the Task, such as log files. */ taskRootDirectory?: string; /** The URL to the root directory of the Job Release Task on the Compute Node. */ @@ -1568,12 +1384,8 @@ export interface BatchJobReleaseTaskExecutionInfoOutput { containerInfo?: BatchTaskContainerExecutionInfoOutput; /** Information describing the Task failure, if any. This property is set only if the Task is in the completed state and encountered a failure. */ failureInfo?: BatchTaskFailureInfoOutput; - /** - * The result of the Task execution. If the value is 'failed', then the details of the failure can be found in the failureInfo property. - * - * Possible values: success, failure - */ - result?: string; + /** The result of the Task execution. If the value is 'failed', then the details of the failure can be found in the failureInfo property. */ + result?: BatchTaskExecutionResultOutput; } /** The Task and TaskSlot counts for a Job. */ @@ -1612,69 +1424,6 @@ export interface BatchTaskSlotCountsOutput { failed: number; } -/** - * A Certificate that can be installed on Compute Nodes and can be used to - * authenticate operations on the machine. - */ -export interface BatchCertificateOutput { - /** The X.509 thumbprint of the Certificate. This is a sequence of up to 40 hex digits (it may include spaces but these are removed). */ - thumbprint: string; - /** The algorithm used to derive the thumbprint. This must be sha1. */ - thumbprintAlgorithm: string; - /** The URL of the Certificate. */ - readonly url?: string; - /** - * The state of the Certificate. - * - * Possible values: active, deleting, deletefailed - */ - readonly state?: string; - /** The time at which the Certificate entered its current state. */ - readonly stateTransitionTime?: string; - /** - * The previous state of the Certificate. This property is not set if the Certificate is in its initial active state. - * - * Possible values: active, deleting, deletefailed - */ - readonly previousState?: string; - /** The time at which the Certificate entered its previous state. This property is not set if the Certificate is in its initial Active state. */ - readonly previousStateTransitionTime?: string; - /** The public part of the Certificate as a base-64 encoded .cer file. */ - readonly publicData?: string; - /** The error that occurred on the last attempt to delete this Certificate. This property is set only if the Certificate is in the DeleteFailed state. */ - readonly deleteCertificateError?: DeleteBatchCertificateErrorOutput; - /** The base64-encoded contents of the Certificate. The maximum size is 10KB. */ - data: string; - /** - * The format of the Certificate data. - * - * Possible values: pfx, cer - */ - certificateFormat?: string; - /** The password to access the Certificate's private key. This must be omitted if the Certificate format is cer. */ - password?: string; -} - -/** An error encountered by the Batch service when deleting a Certificate. */ -export interface DeleteBatchCertificateErrorOutput { - /** An identifier for the Certificate deletion error. Codes are invariant and are intended to be consumed programmatically. */ - code?: string; - /** A message describing the Certificate deletion error, intended to be suitable for display in a user interface. */ - message?: string; - /** A list of additional error details related to the Certificate deletion error. This list includes details such as the active Pools and Compute Nodes referencing this Certificate. However, if a large number of resources reference the Certificate, the list contains only about the first hundred. */ - values?: Array; -} - -export interface BatchCertificateListResultListOutput {} - -/** The result of listing the Certificates in the Account. */ -export interface BatchCertificateListResultOutput { - /** The list of Certificates. */ - value?: Array; - /** The URL to get the next set of results. */ - "odata.nextLink"?: string; -} - /** * A Job Schedule that allows recurring Jobs by specifying when to run Jobs and a * specification used to create each Job. @@ -1692,24 +1441,16 @@ export interface BatchJobScheduleOutput { readonly lastModified?: string; /** The creation time of the Job Schedule. */ readonly creationTime?: string; - /** - * The current state of the Job Schedule. - * - * Possible values: active, completed, disabled, terminating, deleting - */ - readonly state?: string; + /** The current state of the Job Schedule. */ + readonly state?: BatchJobScheduleStateOutput; /** The time at which the Job Schedule entered the current state. */ readonly stateTransitionTime?: string; - /** - * The previous state of the Job Schedule. This property is not present if the Job Schedule is in its initial active state. - * - * Possible values: active, completed, disabled, terminating, deleting - */ - readonly previousState?: string; + /** The previous state of the Job Schedule. This property is not present if the Job Schedule is in its initial active state. */ + readonly previousState?: BatchJobScheduleStateOutput; /** The time at which the Job Schedule entered its previous state. This property is not present if the Job Schedule is in its initial active state. */ readonly previousStateTransitionTime?: string; /** The schedule according to which Jobs will be created. All times are fixed respective to UTC and are not impacted by daylight saving time. */ - schedule?: ScheduleOutput; + schedule?: BatchJobScheduleConfigurationOutput; /** The details of the Jobs to be created on this schedule. */ jobSpecification: BatchJobSpecificationOutput; /** Information about Jobs that have been and will be run under this schedule. */ @@ -1724,7 +1465,7 @@ export interface BatchJobScheduleOutput { * The schedule according to which Jobs will be created. All times are fixed * respective to UTC and are not impacted by daylight saving time. */ -export interface ScheduleOutput { +export interface BatchJobScheduleConfigurationOutput { /** The earliest time at which any Job may be created under this Job Schedule. If you do not specify a doNotRunUntil time, the schedule becomes ready to create Jobs immediately. */ doNotRunUntil?: string; /** A time after which no Job will be created under this Job Schedule. The schedule will move to the completed state as soon as this deadline is past and there is no active Job under this Job Schedule. If you do not specify a doNotRunAfter time, and you are creating a recurring Job Schedule, the Job Schedule will remain active until you explicitly terminate it. */ @@ -1747,18 +1488,10 @@ export interface BatchJobSpecificationOutput { displayName?: string; /** Whether Tasks in the Job can define dependencies on each other. The default is false. */ usesTaskDependencies?: boolean; - /** - * The action the Batch service should take when all Tasks in a Job created under this schedule are in the completed state. Note that if a Job contains no Tasks, then all Tasks are considered complete. This option is therefore most commonly used with a Job Manager task; if you want to use automatic Job termination without a Job Manager, you should initially set onAllTasksComplete to noaction and update the Job properties to set onAllTasksComplete to terminatejob once you have finished adding Tasks. The default is noaction. - * - * Possible values: noaction, terminatejob - */ - onAllTasksComplete?: string; - /** - * The action the Batch service should take when any Task fails in a Job created under this schedule. A Task is considered to have failed if it have failed if has a failureInfo. A failureInfo is set if the Task completes with a non-zero exit code after exhausting its retry count, or if there was an error starting the Task, for example due to a resource file download error. The default is noaction. - * - * Possible values: noaction, performexitoptionsjobaction - */ - onTaskFailure?: string; + /** The action the Batch service should take when all Tasks in a Job created under this schedule are in the completed state. Note that if a Job contains no Tasks, then all Tasks are considered complete. This option is therefore most commonly used with a Job Manager task; if you want to use automatic Job termination without a Job Manager, you should initially set onAllTasksComplete to noaction and update the Job properties to set onAllTasksComplete to terminatejob once you have finished adding Tasks. The default is noaction. */ + onAllTasksComplete?: OnAllBatchTasksCompleteOutput; + /** The action the Batch service should take when any Task fails in a Job created under this schedule. A Task is considered to have failed if it have failed if has a failureInfo. A failureInfo is set if the Task completes with a non-zero exit code after exhausting its retry count, or if there was an error starting the Task, for example due to a resource file download error. The default is noaction. */ + onTaskFailure?: OnBatchTaskFailureOutput; /** The network configuration for the Job. */ networkConfiguration?: BatchJobNetworkConfigurationOutput; /** The execution constraints for Jobs created under this schedule. */ @@ -1830,8 +1563,6 @@ export interface BatchJobScheduleStatisticsOutput { waitTime: string; } -export interface BatchJobScheduleListResultListOutput {} - /** The result of listing the Job Schedules in an Account. */ export interface BatchJobScheduleListResultOutput { /** The list of Job Schedules. */ @@ -1840,42 +1571,6 @@ export interface BatchJobScheduleListResultOutput { "odata.nextLink"?: string; } -/** Parameters for creating an Azure Batch Task. */ -export interface BatchTaskCreateParametersOutput { - /** A string that uniquely identifies the Task within the Job. The ID can contain any combination of alphanumeric characters including hyphens and underscores, and cannot contain more than 64 characters. The ID is case-preserving and case-insensitive (that is, you may not have two IDs within a Job that differ only by case). */ - id: string; - /** A display name for the Task. The display name need not be unique and can contain any Unicode characters up to a maximum length of 1024. */ - displayName?: string; - /** How the Batch service should respond when the Task completes. */ - exitConditions?: ExitConditionsOutput; - /** The command line of the Task. For multi-instance Tasks, the command line is executed as the primary Task, after the primary Task and all subtasks have finished executing the coordination command line. The command line does not run under a shell, and therefore cannot take advantage of shell features such as environment variable expansion. If you want to take advantage of such features, you should invoke the shell in the command line, for example using "cmd /c MyCommand" in Windows or "/bin/sh -c MyCommand" in Linux. If the command line refers to file paths, it should use a relative path (relative to the Task working directory), or use the Batch provided environment variable (https://docs.microsoft.com/en-us/azure/batch/batch-compute-node-environment-variables). */ - commandLine: string; - /** The settings for the container under which the Task runs. If the Pool that will run this Task has containerConfiguration set, this must be set as well. If the Pool that will run this Task doesn't have containerConfiguration set, this must not be set. When this is specified, all directories recursively below the AZ_BATCH_NODE_ROOT_DIR (the root of Azure Batch directories on the node) are mapped into the container, all Task environment variables are mapped into the container, and the Task command line is executed in the container. Files produced in the container outside of AZ_BATCH_NODE_ROOT_DIR might not be reflected to the host disk, meaning that Batch file APIs will not be able to access those files. */ - containerSettings?: BatchTaskContainerSettingsOutput; - /** A list of files that the Batch service will download to the Compute Node before running the command line. For multi-instance Tasks, the resource files will only be downloaded to the Compute Node on which the primary Task is executed. There is a maximum size for the list of resource files. When the max size is exceeded, the request will fail and the response error code will be RequestEntityTooLarge. If this occurs, the collection of ResourceFiles must be reduced in size. This can be achieved using .zip files, Application Packages, or Docker Containers. */ - resourceFiles?: Array; - /** A list of files that the Batch service will upload from the Compute Node after running the command line. For multi-instance Tasks, the files will only be uploaded from the Compute Node on which the primary Task is executed. */ - outputFiles?: Array; - /** A list of environment variable settings for the Task. */ - environmentSettings?: Array; - /** A locality hint that can be used by the Batch service to select a Compute Node on which to start the new Task. */ - affinityInfo?: AffinityInfoOutput; - /** The execution constraints that apply to this Task. If you do not specify constraints, the maxTaskRetryCount is the maxTaskRetryCount specified for the Job, the maxWallClockTime is infinite, and the retentionTime is 7 days. */ - constraints?: BatchTaskConstraintsOutput; - /** The number of scheduling slots that the Task required to run. The default is 1. A Task can only be scheduled to run on a compute node if the node has enough free scheduling slots available. For multi-instance Tasks, this must be 1. */ - requiredSlots?: number; - /** The user identity under which the Task runs. If omitted, the Task runs as a non-administrative user unique to the Task. */ - userIdentity?: UserIdentityOutput; - /** An object that indicates that the Task is a multi-instance Task, and contains information about how to run the multi-instance Task. */ - multiInstanceSettings?: MultiInstanceSettingsOutput; - /** The Tasks that this Task depends on. This Task will not be scheduled until all Tasks that it depends on have completed successfully. If any of those Tasks fail and exhaust their retry counts, this Task will never be scheduled. If the Job does not have usesTaskDependencies set to true, and this element is present, the request fails with error code TaskDependenciesNotSpecifiedOnJob. */ - dependsOn?: BatchTaskDependenciesOutput; - /** A list of Packages that the Batch service will deploy to the Compute Node before running the command line. Application packages are downloaded and deployed to a shared directory, not the Task working directory. Therefore, if a referenced package is already on the Node, and is up to date, then it is not re-downloaded; the existing copy on the Compute Node is used. If a referenced Package cannot be installed, for example because the package has been deleted or because download failed, the Task fails. */ - applicationPackageReferences?: Array; - /** The settings for an authentication token that the Task can use to perform Batch service operations. If this property is set, the Batch service provides the Task with an authentication token which can be used to authenticate Batch service operations without requiring an Account access key. The token is provided via the AZ_BATCH_AUTHENTICATION_TOKEN environment variable. The operations that the Task can carry out using the token depend on the settings. For example, a Task can request Job permissions in order to add other Tasks to the Job, or check the status of the Job or of other Tasks under the Job. */ - authenticationTokenSettings?: AuthenticationTokenSettingsOutput; -} - /** Specifies how the Batch service should respond when the Task completes. */ export interface ExitConditionsOutput { /** A list of individual Task exit codes and how the Batch service should respond to them. */ @@ -1903,18 +1598,10 @@ export interface ExitCodeMappingOutput { /** Specifies how the Batch service responds to a particular exit condition. */ export interface ExitOptionsOutput { - /** - * An action to take on the Job containing the Task, if the Task completes with the given exit condition and the Job's onTaskFailed property is 'performExitOptionsJobAction'. The default is none for exit code 0 and terminate for all other exit conditions. If the Job's onTaskFailed property is noaction, then specifying this property returns an error and the add Task request fails with an invalid property value error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). - * - * Possible values: none, disable, terminate - */ - jobAction?: string; - /** - * An action that the Batch service performs on Tasks that depend on this Task. Possible values are 'satisfy' (allowing dependent tasks to progress) and 'block' (dependent tasks continue to wait). Batch does not yet support cancellation of dependent tasks. - * - * Possible values: satisfy, block - */ - dependencyAction?: string; + /** An action to take on the Job containing the Task, if the Task completes with the given exit condition and the Job's onTaskFailed property is 'performExitOptionsJobAction'. The default is none for exit code 0 and terminate for all other exit conditions. If the Job's onTaskFailed property is noaction, then specifying this property returns an error and the add Task request fails with an invalid property value error; if you are calling the REST API directly, the HTTP status code is 400 (Bad Request). */ + jobAction?: BatchJobActionOutput; + /** An action that the Batch service performs on Tasks that depend on this Task. Possible values are 'satisfy' (allowing dependent tasks to progress) and 'block' (dependent tasks continue to wait). Batch does not yet support cancellation of dependent tasks. */ + dependencyAction?: DependencyActionOutput; } /** @@ -1977,8 +1664,6 @@ export interface BatchTaskIdRangeOutput { end: number; } -export interface BatchTaskListResultListOutput {} - /** The result of listing the Tasks in a Job. */ export interface BatchTaskListResultOutput { /** The list of Tasks. */ @@ -2013,20 +1698,12 @@ export interface BatchTaskOutput { readonly creationTime?: string; /** How the Batch service should respond when the Task completes. */ readonly exitConditions?: ExitConditionsOutput; - /** - * The current state of the Task. - * - * Possible values: active, preparing, running, completed - */ - readonly state?: string; + /** The current state of the Task. */ + readonly state?: BatchTaskStateOutput; /** The time at which the Task entered its current state. */ readonly stateTransitionTime?: string; - /** - * The previous state of the Task. This property is not set if the Task is in its initial Active state. - * - * Possible values: active, preparing, running, completed - */ - readonly previousState?: string; + /** The previous state of the Task. This property is not set if the Task is in its initial Active state. */ + readonly previousState?: BatchTaskStateOutput; /** The time at which the Task entered its previous state. This property is not set if the Task is in its initial Active state. */ readonly previousStateTransitionTime?: string; /** The command line of the Task. For multi-instance Tasks, the command line is executed as the primary Task, after the primary Task and all subtasks have finished executing the coordination command line. The command line does not run under a shell, and therefore cannot take advantage of shell features such as environment variable expansion. If you want to take advantage of such features, you should invoke the shell in the command line, for example using "cmd /c MyCommand" in Windows or "/bin/sh -c MyCommand" in Linux. If the command line refers to file paths, it should use a relative path (relative to the Task working directory), or use the Batch provided environment variable (https://docs.microsoft.com/en-us/azure/batch/batch-compute-node-environment-variables). */ @@ -2083,12 +1760,8 @@ export interface BatchTaskExecutionInfoOutput { requeueCount: number; /** The most recent time at which the Task has been requeued by the Batch service as the result of a user request. This property is set only if the requeueCount is nonzero. */ lastRequeueTime?: string; - /** - * The result of the Task execution. If the value is 'failed', then the details of the failure can be found in the failureInfo property. - * - * Possible values: success, failure - */ - result?: string; + /** The result of the Task execution. If the value is 'failed', then the details of the failure can be found in the failureInfo property. */ + result?: BatchTaskExecutionResultOutput; } /** Information about the Compute Node on which a Task ran. */ @@ -2133,12 +1806,6 @@ export interface BatchTaskStatisticsOutput { waitTime: string; } -/** A collection of Azure Batch Tasks to add. */ -export interface BatchTaskCollectionOutput { - /** The collection of Tasks to add. The maximum count of Tasks is 100. The total serialized size of this collection must be less than 1MB. If it is greater than 1MB (for example if each Task has 100's of resource files or environment variables), the request will fail with code 'RequestBodyTooLarge' and should be retried again with fewer Tasks. */ - value: Array; -} - /** The result of adding a collection of Tasks to a Job. */ export interface BatchTaskAddCollectionResultOutput { /** The results of the add Task collection operation. */ @@ -2147,12 +1814,8 @@ export interface BatchTaskAddCollectionResultOutput { /** Result for a single Task added as part of an add Task collection operation. */ export interface BatchTaskAddResultOutput { - /** - * The status of the add Task request. - * - * Possible values: success, clienterror, servererror - */ - status: string; + /** The status of the add Task request. */ + status: BatchTaskAddStatusOutput; /** The ID of the Task for which this is the result. */ taskId: string; /** The ETag of the Task, if the Task was successfully added. You can use this to detect whether the Task has changed between requests. In particular, you can be pass the ETag with an Update Task request to specify that your changes should take effect only if nobody else has modified the Job in the meantime. */ @@ -2165,8 +1828,6 @@ export interface BatchTaskAddResultOutput { error?: BatchErrorOutput; } -export interface BatchTaskListSubtasksResultListOutput {} - /** The result of listing the subtasks of a Task. */ export interface BatchTaskListSubtasksResultOutput { /** The list of subtasks. */ @@ -2191,32 +1852,18 @@ export interface BatchSubtaskOutput { containerInfo?: BatchTaskContainerExecutionInfoOutput; /** Information describing the Task failure, if any. This property is set only if the Task is in the completed state and encountered a failure. */ failureInfo?: BatchTaskFailureInfoOutput; - /** - * The current state of the subtask. - * - * Possible values: preparing, running, completed - */ - state?: string; + /** The current state of the subtask. */ + state?: BatchSubtaskStateOutput; /** The time at which the subtask entered its current state. */ stateTransitionTime?: string; - /** - * The previous state of the subtask. This property is not set if the subtask is in its initial running state. - * - * Possible values: preparing, running, completed - */ - previousState?: string; + /** The previous state of the subtask. This property is not set if the subtask is in its initial running state. */ + previousState?: BatchSubtaskStateOutput; /** The time at which the subtask entered its previous state. This property is not set if the subtask is in its initial running state. */ previousStateTransitionTime?: string; - /** - * The result of the Task execution. If the value is 'failed', then the details of the failure can be found in the failureInfo property. - * - * Possible values: success, failure - */ - result?: string; + /** The result of the Task execution. If the value is 'failed', then the details of the failure can be found in the failureInfo property. */ + result?: BatchTaskExecutionResultOutput; } -export interface BatchNodeFileListResultListOutput {} - /** * The result of listing the files on a Compute Node, or the files associated with * a Task on a Compute Node. @@ -2260,18 +1907,10 @@ export interface BatchNodeOutput { id?: string; /** The URL of the Compute Node. */ url?: string; - /** - * The current state of the Compute Node. The Spot/Low-priority Compute Node has been preempted. Tasks which were running on the Compute Node when it was preempted will be rescheduled when another Compute Node becomes available. - * - * Possible values: idle, rebooting, reimaging, running, unusable, creating, starting, waitingforstarttask, starttaskfailed, unknown, leavingpool, offline, preempted - */ - state?: string; - /** - * Whether the Compute Node is available for Task scheduling. - * - * Possible values: enabled, disabled - */ - schedulingState?: string; + /** The current state of the Compute Node. The Spot/Low-priority Compute Node has been preempted. Tasks which were running on the Compute Node when it was preempted will be rescheduled when another Compute Node becomes available. */ + state?: BatchNodeStateOutput; + /** Whether the Compute Node is available for Task scheduling. */ + schedulingState?: SchedulingStateOutput; /** The time at which the Compute Node entered its current state. */ stateTransitionTime?: string; /** The last time at which the Compute Node was started. This property may not be present if the Compute Node state is unusable. */ @@ -2298,13 +1937,6 @@ export interface BatchNodeOutput { startTask?: BatchStartTaskOutput; /** Runtime information about the execution of the StartTask on the Compute Node. */ startTaskInfo?: BatchStartTaskInfoOutput; - /** - * For Windows Nodes, the Batch service installs the Certificates to the specified Certificate store and location. - * For Linux Compute Nodes, the Certificates are stored in a directory inside the Task working directory and an environment variable AZ_BATCH_CERTIFICATES_DIR is supplied to the Task to query for this location. - * For Certificates with visibility of 'remoteUser', a 'certs' directory is created in the user's home directory (e.g., /home/{user-name}/certs) and Certificates are placed in that directory. - * Warning: This property is deprecated and will be removed after February, 2024. Please use the [Azure KeyVault Extension](https://learn.microsoft.com/azure/batch/batch-certificate-migration-guide) instead. - */ - certificateReferences?: Array; /** The list of errors that are currently being encountered by the Compute Node. */ errors?: Array; /** Whether this Compute Node is a dedicated Compute Node. If false, the Compute Node is a Spot/Low-priority Compute Node. */ @@ -2327,24 +1959,16 @@ export interface BatchTaskInfoOutput { taskId?: string; /** The ID of the subtask if the Task is a multi-instance Task. */ subtaskId?: number; - /** - * The current state of the Task. - * - * Possible values: active, preparing, running, completed - */ - taskState: string; + /** The current state of the Task. */ + taskState: BatchTaskStateOutput; /** Information about the execution of the Task. */ executionInfo?: BatchTaskExecutionInfoOutput; } /** Information about a StartTask running on a Compute Node. */ export interface BatchStartTaskInfoOutput { - /** - * The state of the StartTask on the Compute Node. - * - * Possible values: running, completed - */ - state: string; + /** The state of the StartTask on the Compute Node. */ + state: BatchStartTaskStateOutput; /** The time at which the StartTask started running. This value is reset every time the Task is restarted or retried (that is, this is the most recent time at which the StartTask started running). */ startTime: string; /** The time at which the StartTask stopped running. This is the end time of the most recent run of the StartTask, if that run has completed (even if that run failed and a retry is pending). This element is not present if the StartTask is currently running. */ @@ -2359,12 +1983,8 @@ export interface BatchStartTaskInfoOutput { retryCount: number; /** The most recent time at which a retry of the Task started running. This element is present only if the Task was retried (i.e. retryCount is nonzero). If present, this is typically the same as startTime, but may be different if the Task has been restarted for reasons other than retry; for example, if the Compute Node was rebooted during a retry, then the startTime is updated but the lastRetryTime is not. */ lastRetryTime?: string; - /** - * The result of the Task execution. If the value is 'failed', then the details of the failure can be found in the failureInfo property. - * - * Possible values: success, failure - */ - result?: string; + /** The result of the Task execution. If the value is 'failed', then the details of the failure can be found in the failureInfo property. */ + result?: BatchTaskExecutionResultOutput; } /** An error encountered by a Compute Node. */ @@ -2387,12 +2007,8 @@ export interface BatchNodeEndpointConfigurationOutput { export interface InboundEndpointOutput { /** The name of the endpoint. */ name: string; - /** - * The protocol of the endpoint. - * - * Possible values: tcp, udp - */ - protocol: string; + /** The protocol of the endpoint. */ + protocol: InboundEndpointProtocolOutput; /** The public IP address of the Compute Node. */ publicIPAddress: string; /** The public fully qualified domain name for the Compute Node. */ @@ -2430,18 +2046,6 @@ export interface BatchNodeRemoteLoginSettingsOutput { remoteLoginPort: number; } -/** The Azure Batch service log files upload parameters for a Compute Node. */ -export interface UploadBatchServiceLogsParametersOutput { - /** The URL of the container within Azure Blob Storage to which to upload the Batch Service log file(s). If a user assigned managed identity is not being used, the URL must include a Shared Access Signature (SAS) granting write permissions to the container. The SAS duration must allow enough time for the upload to finish. The start time for SAS is optional and recommended to not be specified. */ - containerUrl: string; - /** The start of the time range from which to upload Batch Service log file(s). Any log file containing a log message in the time range will be uploaded. This means that the operation might retrieve more logs than have been requested since the entire log file is always uploaded, but the operation should not retrieve fewer logs than have been requested. */ - startTime: string; - /** The end of the time range from which to upload Batch Service log file(s). Any log file containing a log message in the time range will be uploaded. This means that the operation might retrieve more logs than have been requested since the entire log file is always uploaded, but the operation should not retrieve fewer logs than have been requested. If omitted, the default is to upload all logs available after the startTime. */ - endTime?: string; - /** The reference to the user assigned identity to use to access Azure Blob Storage specified by containerUrl. The identity must have write access to the Azure Blob Storage container. */ - identityReference?: BatchNodeIdentityReferenceOutput; -} - /** The result of uploading Batch service log files from a specific Compute Node. */ export interface UploadBatchServiceLogsResultOutput { /** The virtual directory within Azure Blob Storage container to which the Batch Service log file(s) will be uploaded. The virtual directory name is part of the blob name for each log file uploaded, and it is built based poolId, nodeId and a unique identifier. */ @@ -2450,8 +2054,6 @@ export interface UploadBatchServiceLogsResultOutput { numberOfFilesUploaded: number; } -export interface BatchNodeListResultListOutput {} - /** The result of listing the Compute Nodes in a Pool. */ export interface BatchNodeListResultOutput { /** The list of Compute Nodes. */ @@ -2486,20 +2088,14 @@ export interface InstanceViewStatusOutput { code?: string; /** The localized label for the status. */ displayStatus?: string; - /** - * Level code. - * - * Possible values: Error, Info, Warning - */ - level?: string; + /** Level code. */ + level?: StatusLevelTypesOutput; /** The detailed status message. */ message?: string; /** The time of the status. */ time?: string; } -export interface BatchNodeVMExtensionListResultListOutput {} - /** The result of listing the Compute Node extensions in a Node. */ export interface BatchNodeVMExtensionListResultOutput { /** The list of Compute Node extensions. */ @@ -2507,3 +2103,160 @@ export interface BatchNodeVMExtensionListResultOutput { /** The URL to get the next set of results. */ "odata.nextLink"?: string; } + +/** Alias for CachingTypeOutput */ +export type CachingTypeOutput = string | "none" | "readonly" | "readwrite"; +/** Alias for StorageAccountTypeOutput */ +export type StorageAccountTypeOutput = + | string + | "standard_lrs" + | "premium_lrs" + | "standardssd_lrs"; +/** Alias for ContainerTypeOutput */ +export type ContainerTypeOutput = string | "dockerCompatible" | "criCompatible"; +/** Alias for DiskEncryptionTargetOutput */ +export type DiskEncryptionTargetOutput = string | "osdisk" | "temporarydisk"; +/** Alias for BatchNodePlacementPolicyTypeOutput */ +export type BatchNodePlacementPolicyTypeOutput = string | "regional" | "zonal"; +/** Alias for DiffDiskPlacementOutput */ +export type DiffDiskPlacementOutput = string | "cachedisk"; +/** Alias for SecurityTypesOutput */ +export type SecurityTypesOutput = string | "trustedLaunch"; +/** Alias for DynamicVNetAssignmentScopeOutput */ +export type DynamicVNetAssignmentScopeOutput = string | "none" | "job"; +/** Alias for InboundEndpointProtocolOutput */ +export type InboundEndpointProtocolOutput = string | "tcp" | "udp"; +/** Alias for NetworkSecurityGroupRuleAccessOutput */ +export type NetworkSecurityGroupRuleAccessOutput = string | "allow" | "deny"; +/** Alias for IpAddressProvisioningTypeOutput */ +export type IpAddressProvisioningTypeOutput = + | string + | "batchmanaged" + | "usermanaged" + | "nopublicipaddresses"; +/** Alias for ContainerWorkingDirectoryOutput */ +export type ContainerWorkingDirectoryOutput = + | string + | "taskWorkingDirectory" + | "containerImageDefault"; +/** Alias for AutoUserScopeOutput */ +export type AutoUserScopeOutput = string | "task" | "pool"; +/** Alias for ElevationLevelOutput */ +export type ElevationLevelOutput = string | "nonadmin" | "admin"; +/** Alias for BatchNodeFillTypeOutput */ +export type BatchNodeFillTypeOutput = string | "spread" | "pack"; +/** Alias for LoginModeOutput */ +export type LoginModeOutput = string | "batch" | "interactive"; +/** Alias for BatchNodeCommunicationModeOutput */ +export type BatchNodeCommunicationModeOutput = + | string + | "default" + | "classic" + | "simplified"; +/** Alias for UpgradeModeOutput */ +export type UpgradeModeOutput = string | "automatic" | "manual" | "rolling"; +/** Alias for BatchPoolStateOutput */ +export type BatchPoolStateOutput = string | "active" | "deleting"; +/** Alias for AllocationStateOutput */ +export type AllocationStateOutput = string | "steady" | "resizing" | "stopping"; +/** Alias for BatchPoolIdentityTypeOutput */ +export type BatchPoolIdentityTypeOutput = string | "UserAssigned" | "None"; +/** Alias for OSTypeOutput */ +export type OSTypeOutput = string | "linux" | "windows"; +/** Alias for ImageVerificationTypeOutput */ +export type ImageVerificationTypeOutput = string | "verified" | "unverified"; +/** Alias for BatchJobStateOutput */ +export type BatchJobStateOutput = + | string + | "active" + | "disabling" + | "disabled" + | "enabling" + | "terminating" + | "completed" + | "deleting"; +/** Alias for OutputFileUploadConditionOutput */ +export type OutputFileUploadConditionOutput = + | string + | "tasksuccess" + | "taskfailure" + | "taskcompletion"; +/** Alias for AccessScopeOutput */ +export type AccessScopeOutput = string | "job"; +/** Alias for BatchPoolLifetimeOptionOutput */ +export type BatchPoolLifetimeOptionOutput = string | "jobschedule" | "job"; +/** Alias for OnAllBatchTasksCompleteOutput */ +export type OnAllBatchTasksCompleteOutput = + | string + | "noaction" + | "terminatejob"; +/** Alias for OnBatchTaskFailureOutput */ +export type OnBatchTaskFailureOutput = + | string + | "noaction" + | "performexitoptionsjobaction"; +/** Alias for ErrorCategoryOutput */ +export type ErrorCategoryOutput = string | "usererror" | "servererror"; +/** Alias for BatchJobPreparationTaskStateOutput */ +export type BatchJobPreparationTaskStateOutput = + | string + | "running" + | "completed"; +/** Alias for BatchTaskExecutionResultOutput */ +export type BatchTaskExecutionResultOutput = string | "success" | "failure"; +/** Alias for BatchJobReleaseTaskStateOutput */ +export type BatchJobReleaseTaskStateOutput = string | "running" | "completed"; +/** Alias for BatchJobScheduleStateOutput */ +export type BatchJobScheduleStateOutput = + | string + | "active" + | "completed" + | "disabled" + | "terminating" + | "deleting"; +/** Alias for BatchJobActionOutput */ +export type BatchJobActionOutput = string | "none" | "disable" | "terminate"; +/** Alias for DependencyActionOutput */ +export type DependencyActionOutput = string | "satisfy" | "block"; +/** Alias for BatchTaskStateOutput */ +export type BatchTaskStateOutput = + | string + | "active" + | "preparing" + | "running" + | "completed"; +/** Alias for BatchTaskAddStatusOutput */ +export type BatchTaskAddStatusOutput = + | string + | "success" + | "clienterror" + | "servererror"; +/** Alias for BatchSubtaskStateOutput */ +export type BatchSubtaskStateOutput = + | string + | "preparing" + | "running" + | "completed"; +/** Alias for BatchNodeStateOutput */ +export type BatchNodeStateOutput = + | string + | "idle" + | "rebooting" + | "reimaging" + | "running" + | "unusable" + | "creating" + | "starting" + | "waitingforstarttask" + | "starttaskfailed" + | "unknown" + | "leavingpool" + | "offline" + | "preempted" + | "upgradingos"; +/** Alias for SchedulingStateOutput */ +export type SchedulingStateOutput = string | "enabled" | "disabled"; +/** Alias for BatchStartTaskStateOutput */ +export type BatchStartTaskStateOutput = string | "running" | "completed"; +/** Alias for StatusLevelTypesOutput */ +export type StatusLevelTypesOutput = string | "Error" | "Info" | "Warning"; diff --git a/packages/service/src/internal/batch-rest/generated/src/paginateHelper.ts b/packages/service/src/internal/batch-rest/generated/src/paginateHelper.ts index 95baa6a40..3fde5021f 100644 --- a/packages/service/src/internal/batch-rest/generated/src/paginateHelper.ts +++ b/packages/service/src/internal/batch-rest/generated/src/paginateHelper.ts @@ -22,7 +22,7 @@ export type GetArrayType = T extends Array ? TData : never; */ export type GetPage = ( pageLink: string, - maxPageSize?: number + maxPageSize?: number, ) => Promise<{ page: TPage; nextPageLink?: string; @@ -61,7 +61,7 @@ export type PaginateReturn = TResult extends { export function paginate( client: Client, initialResponse: TResponse, - options: PagingOptions = {} + options: PagingOptions = {}, ): PagedAsyncIterableIterator> { // Extract element type from initial response type TElement = PaginateReturn; @@ -106,7 +106,7 @@ function getNextLink(body: unknown, nextLinkName?: string): string | undefined { if (typeof nextLink !== "string" && typeof nextLink !== "undefined") { throw new Error( - `Body Property ${nextLinkName} should be a string or undefined` + `Body Property ${nextLinkName} should be a string or undefined`, ); } @@ -124,7 +124,7 @@ function getElements(body: unknown, itemName: string): T[] { // type of elements in the page in PaginateReturn if (!Array.isArray(value)) { throw new Error( - `Couldn't paginate response\n Body doesn't contain an array property with name: ${itemName}` + `Couldn't paginate response\n Body doesn't contain an array property with name: ${itemName}`, ); } @@ -150,7 +150,7 @@ function checkPagingRequest(response: PathUncheckedResponse): void { if (!Http2xxStatusCodes.includes(response.status)) { throw createRestError( `Pagination failed with unexpected statusCode ${response.status}`, - response + response, ); } } @@ -192,7 +192,7 @@ function getPaginationProperties(initialResponse: PathUncheckedResponse) { throw new Error( `Couldn't paginate response\n Body doesn't contain an array property with name: ${[ ...itemNames, - ].join(" OR ")}` + ].join(" OR ")}`, ); } diff --git a/packages/service/src/internal/batch-rest/generated/src/parameters.ts b/packages/service/src/internal/batch-rest/generated/src/parameters.ts index 06b251179..8020b6f69 100644 --- a/packages/service/src/internal/batch-rest/generated/src/parameters.ts +++ b/packages/service/src/internal/batch-rest/generated/src/parameters.ts @@ -4,32 +4,30 @@ import { RawHttpHeadersInput } from "@azure/core-rest-pipeline"; import { RequestParameters } from "@azure-rest/core-client"; import { - BatchPoolCreateParameters, - BatchPoolUpdateParameters, - BatchPoolEnableAutoScaleParameters, - BatchPoolEvaluateAutoScaleParameters, - BatchPoolResizeParameters, - BatchPoolReplaceParameters, - BatchNodeRemoveParameters, - BatchJobUpdateParameters, + BatchPoolCreateContent, + BatchPoolUpdateContent, + BatchPoolEnableAutoScaleContent, + BatchPoolEvaluateAutoScaleContent, + BatchPoolResizeContent, + BatchPoolReplaceContent, + BatchNodeRemoveContent, + BatchJobUpdateContent, BatchJob, - BatchJobDisableParameters, - BatchJobTerminateParameters, - BatchJobCreateParameters, - BatchCertificate, - BatchJobScheduleUpdateParameters, + BatchJobDisableContent, + BatchJobTerminateContent, + BatchJobCreateContent, + BatchJobScheduleUpdateContent, BatchJobSchedule, - BatchJobScheduleCreateParameters, - BatchTaskCreateParameters, - BatchTaskCollection, + BatchJobScheduleCreateContent, + BatchTaskCreateContent, + BatchTaskGroup, BatchTask, - BatchNodeUserCreateParameters, - BatchNodeUserUpdateParameters, - BatchNodeRebootParameters, - BatchNodeReimageParameters, - BatchNodeDisableSchedulingParameters, - UploadBatchServiceLogsParameters, -} from "./models"; + BatchNodeUserCreateContent, + BatchNodeUserUpdateContent, + BatchNodeRebootContent, + BatchNodeDisableSchedulingContent, + UploadBatchServiceLogsContent, +} from "./models.js"; export interface ListApplicationsHeaders { /** @@ -48,10 +46,7 @@ export interface ListApplicationsHeaders { } export interface ListApplicationsQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; /** * The maximum number of items to return in the response. A maximum of 1000 @@ -89,10 +84,7 @@ export interface GetApplicationHeaders { } export interface GetApplicationQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -125,10 +117,7 @@ export interface ListPoolUsageMetricsHeaders { } export interface ListPoolUsageMetricsQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; /** * The maximum number of items to return in the response. A maximum of 1000 @@ -184,14 +173,11 @@ export interface CreatePoolHeaders { export interface CreatePoolBodyParam { /** The Pool to be created. */ - body: BatchPoolCreateParameters; + body: BatchPoolCreateContent; } export interface CreatePoolQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -231,10 +217,7 @@ export interface ListPoolsHeaders { } export interface ListPoolsQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; /** * The maximum number of items to return in the response. A maximum of 1000 @@ -305,10 +288,7 @@ export interface DeletePoolHeaders { } export interface DeletePoolQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -365,10 +345,7 @@ export interface PoolExistsHeaders { } export interface PoolExistsQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -425,10 +402,7 @@ export interface GetPoolHeaders { } export interface GetPoolQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; /** An OData $select clause. */ $select?: string[]; @@ -490,14 +464,11 @@ export interface UpdatePoolHeaders { export interface UpdatePoolBodyParam { /** The pool properties to update. */ - body: BatchPoolUpdateParameters; + body: BatchPoolUpdateContent; } export interface UpdatePoolQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -537,10 +508,7 @@ export interface DisablePoolAutoScaleHeaders { } export interface DisablePoolAutoScaleQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -598,14 +566,11 @@ export interface EnablePoolAutoScaleHeaders { export interface EnablePoolAutoScaleBodyParam { /** The options to use for enabling automatic scaling. */ - body: BatchPoolEnableAutoScaleParameters; + body: BatchPoolEnableAutoScaleContent; } export interface EnablePoolAutoScaleQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -646,14 +611,11 @@ export interface EvaluatePoolAutoScaleHeaders { export interface EvaluatePoolAutoScaleBodyParam { /** The options to use for evaluating the automatic scaling formula. */ - body: BatchPoolEvaluateAutoScaleParameters; + body: BatchPoolEvaluateAutoScaleContent; } export interface EvaluatePoolAutoScaleQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -718,14 +680,11 @@ export interface ResizePoolHeaders { export interface ResizePoolBodyParam { /** The options to use for resizing the pool. */ - body: BatchPoolResizeParameters; + body: BatchPoolResizeContent; } export interface ResizePoolQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -789,10 +748,7 @@ export interface StopPoolResizeHeaders { } export interface StopPoolResizeQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -826,14 +782,11 @@ export interface ReplacePoolPropertiesHeaders { export interface ReplacePoolPropertiesBodyParam { /** The options to use for replacing properties on the pool. */ - body: BatchPoolReplaceParameters; + body: BatchPoolReplaceContent; } export interface ReplacePoolPropertiesQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -898,14 +851,11 @@ export interface RemoveNodesHeaders { export interface RemoveNodesBodyParam { /** The options to use for removing the node. */ - body: BatchNodeRemoveParameters; + body: BatchNodeRemoveContent; } export interface RemoveNodesQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -945,10 +895,7 @@ export interface ListSupportedImagesHeaders { } export interface ListSupportedImagesQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; /** * The maximum number of items to return in the response. A maximum of 1000 @@ -991,10 +938,7 @@ export interface ListPoolNodeCountsHeaders { } export interface ListPoolNodeCountsQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; /** * The maximum number of items to return in the response. A maximum of 1000 @@ -1061,10 +1005,7 @@ export interface DeleteJobHeaders { } export interface DeleteJobQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -1121,10 +1062,7 @@ export interface GetJobHeaders { } export interface GetJobQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; /** An OData $select clause. */ $select?: string[]; @@ -1186,14 +1124,11 @@ export interface UpdateJobHeaders { export interface UpdateJobBodyParam { /** The options to use for updating the Job. */ - body: BatchJobUpdateParameters; + body: BatchJobUpdateContent; } export interface UpdateJobQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -1262,10 +1197,7 @@ export interface ReplaceJobBodyParam { } export interface ReplaceJobQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -1330,14 +1262,11 @@ export interface DisableJobHeaders { export interface DisableJobBodyParam { /** The options to use for disabling the Job. */ - body: BatchJobDisableParameters; + body: BatchJobDisableContent; } export interface DisableJobQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -1401,10 +1330,7 @@ export interface EnableJobHeaders { } export interface EnableJobQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -1462,14 +1388,11 @@ export interface TerminateJobHeaders { export interface TerminateJobBodyParam { /** The options to use for terminating the Job. */ - body?: BatchJobTerminateParameters; + body?: BatchJobTerminateContent; } export interface TerminateJobQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -1510,14 +1433,11 @@ export interface CreateJobHeaders { export interface CreateJobBodyParam { /** The Job to be created. */ - body: BatchJobCreateParameters; + body: BatchJobCreateContent; } export interface CreateJobQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -1557,10 +1477,7 @@ export interface ListJobsHeaders { } export interface ListJobsQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; /** * The maximum number of items to return in the response. A maximum of 1000 @@ -1607,10 +1524,7 @@ export interface ListJobsFromScheduleHeaders { } export interface ListJobsFromScheduleQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; /** * The maximum number of items to return in the response. A maximum of 1000 @@ -1657,10 +1571,7 @@ export interface ListJobPreparationAndReleaseTaskStatusHeaders { } export interface ListJobPreparationAndReleaseTaskStatusQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; /** * The maximum number of items to return in the response. A maximum of 1000 @@ -1706,10 +1617,7 @@ export interface GetJobTaskCountsHeaders { } export interface GetJobTaskCountsQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -1725,213 +1633,6 @@ export type GetJobTaskCountsParameters = GetJobTaskCountsQueryParam & GetJobTaskCountsHeaderParam & RequestParameters; -export interface CreateCertificateHeaders { - /** - * The caller-generated request identity, in the form of a GUID with no decoration - * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. - */ - "client-request-id"?: string; - /** Whether the server should return the client-request-id in the response. */ - "return-client-request-id"?: boolean; - /** - * The time the request was issued. Client libraries typically set this to the - * current system clock time; set it explicitly if you are calling the REST API - * directly. - */ - "ocp-date"?: string; -} - -export interface CreateCertificateBodyParam { - /** The Certificate to be created. */ - body: BatchCertificate; -} - -export interface CreateCertificateQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ - timeOut?: number; -} - -export interface CreateCertificateQueryParam { - queryParameters?: CreateCertificateQueryParamProperties; -} - -export interface CreateCertificateHeaderParam { - headers?: RawHttpHeadersInput & CreateCertificateHeaders; -} - -export interface CreateCertificateMediaTypesParam { - /** Type of content */ - contentType: "application/json; odata=minimalmetadata"; -} - -export type CreateCertificateParameters = CreateCertificateQueryParam & - CreateCertificateHeaderParam & - CreateCertificateMediaTypesParam & - CreateCertificateBodyParam & - RequestParameters; - -export interface ListCertificatesHeaders { - /** - * The caller-generated request identity, in the form of a GUID with no decoration - * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. - */ - "client-request-id"?: string; - /** Whether the server should return the client-request-id in the response. */ - "return-client-request-id"?: boolean; - /** - * The time the request was issued. Client libraries typically set this to the - * current system clock time; set it explicitly if you are calling the REST API - * directly. - */ - "ocp-date"?: string; -} - -export interface ListCertificatesQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ - timeOut?: number; - /** - * The maximum number of items to return in the response. A maximum of 1000 - * applications can be returned. - */ - maxresults?: number; - /** - * An OData $filter clause. For more information on constructing this filter, see - * https://docs.microsoft.com/en-us/rest/api/batchservice/odata-filters-in-batch#list-certificates. - */ - $filter?: string; - /** An OData $select clause. */ - $select?: string[]; -} - -export interface ListCertificatesQueryParam { - queryParameters?: ListCertificatesQueryParamProperties; -} - -export interface ListCertificatesHeaderParam { - headers?: RawHttpHeadersInput & ListCertificatesHeaders; -} - -export type ListCertificatesParameters = ListCertificatesQueryParam & - ListCertificatesHeaderParam & - RequestParameters; - -export interface CancelCertificateDeletionHeaders { - /** - * The caller-generated request identity, in the form of a GUID with no decoration - * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. - */ - "client-request-id"?: string; - /** Whether the server should return the client-request-id in the response. */ - "return-client-request-id"?: boolean; - /** - * The time the request was issued. Client libraries typically set this to the - * current system clock time; set it explicitly if you are calling the REST API - * directly. - */ - "ocp-date"?: string; -} - -export interface CancelCertificateDeletionQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ - timeOut?: number; -} - -export interface CancelCertificateDeletionQueryParam { - queryParameters?: CancelCertificateDeletionQueryParamProperties; -} - -export interface CancelCertificateDeletionHeaderParam { - headers?: RawHttpHeadersInput & CancelCertificateDeletionHeaders; -} - -export type CancelCertificateDeletionParameters = - CancelCertificateDeletionQueryParam & - CancelCertificateDeletionHeaderParam & - RequestParameters; - -export interface DeleteCertificateHeaders { - /** - * The caller-generated request identity, in the form of a GUID with no decoration - * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. - */ - "client-request-id"?: string; - /** Whether the server should return the client-request-id in the response. */ - "return-client-request-id"?: boolean; - /** - * The time the request was issued. Client libraries typically set this to the - * current system clock time; set it explicitly if you are calling the REST API - * directly. - */ - "ocp-date"?: string; -} - -export interface DeleteCertificateQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ - timeOut?: number; -} - -export interface DeleteCertificateQueryParam { - queryParameters?: DeleteCertificateQueryParamProperties; -} - -export interface DeleteCertificateHeaderParam { - headers?: RawHttpHeadersInput & DeleteCertificateHeaders; -} - -export type DeleteCertificateParameters = DeleteCertificateQueryParam & - DeleteCertificateHeaderParam & - RequestParameters; - -export interface GetCertificateHeaders { - /** - * The caller-generated request identity, in the form of a GUID with no decoration - * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. - */ - "client-request-id"?: string; - /** Whether the server should return the client-request-id in the response. */ - "return-client-request-id"?: boolean; - /** - * The time the request was issued. Client libraries typically set this to the - * current system clock time; set it explicitly if you are calling the REST API - * directly. - */ - "ocp-date"?: string; -} - -export interface GetCertificateQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ - timeOut?: number; - /** An OData $select clause. */ - $select?: string[]; -} - -export interface GetCertificateQueryParam { - queryParameters?: GetCertificateQueryParamProperties; -} - -export interface GetCertificateHeaderParam { - headers?: RawHttpHeadersInput & GetCertificateHeaders; -} - -export type GetCertificateParameters = GetCertificateQueryParam & - GetCertificateHeaderParam & - RequestParameters; - export interface JobScheduleExistsHeaders { /** * The caller-generated request identity, in the form of a GUID with no decoration @@ -1973,10 +1674,7 @@ export interface JobScheduleExistsHeaders { } export interface JobScheduleExistsQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -2033,10 +1731,7 @@ export interface DeleteJobScheduleHeaders { } export interface DeleteJobScheduleQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -2093,10 +1788,7 @@ export interface GetJobScheduleHeaders { } export interface GetJobScheduleQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; /** An OData $select clause. */ $select?: string[]; @@ -2158,14 +1850,11 @@ export interface UpdateJobScheduleHeaders { export interface UpdateJobScheduleBodyParam { /** The options to use for updating the Job Schedule. */ - body: BatchJobScheduleUpdateParameters; + body: BatchJobScheduleUpdateContent; } export interface UpdateJobScheduleQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -2234,10 +1923,7 @@ export interface ReplaceJobScheduleBodyParam { } export interface ReplaceJobScheduleQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -2301,10 +1987,7 @@ export interface DisableJobScheduleHeaders { } export interface DisableJobScheduleQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -2361,10 +2044,7 @@ export interface EnableJobScheduleHeaders { } export interface EnableJobScheduleQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -2421,10 +2101,7 @@ export interface TerminateJobScheduleHeaders { } export interface TerminateJobScheduleQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -2458,14 +2135,11 @@ export interface CreateJobScheduleHeaders { export interface CreateJobScheduleBodyParam { /** The Job Schedule to be created. */ - body: BatchJobScheduleCreateParameters; + body: BatchJobScheduleCreateContent; } export interface CreateJobScheduleQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -2505,10 +2179,7 @@ export interface ListJobSchedulesHeaders { } export interface ListJobSchedulesQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; /** * The maximum number of items to return in the response. A maximum of 1000 @@ -2556,14 +2227,11 @@ export interface CreateTaskHeaders { export interface CreateTaskBodyParam { /** The Task to be created. */ - body: BatchTaskCreateParameters; + body: BatchTaskCreateContent; } export interface CreateTaskQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -2603,10 +2271,7 @@ export interface ListTasksHeaders { } export interface ListTasksQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; /** * The maximum number of items to return in the response. A maximum of 1000 @@ -2654,14 +2319,11 @@ export interface CreateTaskCollectionHeaders { export interface CreateTaskCollectionBodyParam { /** The Tasks to be added. */ - body: BatchTaskCollection; + body: BatchTaskGroup; } export interface CreateTaskCollectionQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -2725,10 +2387,7 @@ export interface DeleteTaskHeaders { } export interface DeleteTaskQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -2785,10 +2444,7 @@ export interface GetTaskHeaders { } export interface GetTaskQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; /** An OData $select clause. */ $select?: string[]; @@ -2854,10 +2510,7 @@ export interface ReplaceTaskBodyParam { } export interface ReplaceTaskQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -2897,10 +2550,7 @@ export interface ListSubTasksHeaders { } export interface ListSubTasksQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; /** An OData $select clause. */ $select?: string[]; @@ -2959,10 +2609,7 @@ export interface TerminateTaskHeaders { } export interface TerminateTaskQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -3019,10 +2666,7 @@ export interface ReactivateTaskHeaders { } export interface ReactivateTaskQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -3055,10 +2699,7 @@ export interface DeleteTaskFileHeaders { } export interface DeleteTaskFileQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; /** * Whether to delete children of a directory. If the filePath parameter represents @@ -3115,10 +2756,7 @@ export interface GetTaskFileHeaders { } export interface GetTaskFileQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -3163,10 +2801,7 @@ export interface GetTaskFilePropertiesHeaders { } export interface GetTaskFilePropertiesQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -3199,10 +2834,7 @@ export interface ListTaskFilesHeaders { } export interface ListTaskFilesQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; /** * The maximum number of items to return in the response. A maximum of 1000 @@ -3251,14 +2883,11 @@ export interface CreateNodeUserHeaders { export interface CreateNodeUserBodyParam { /** The options to use for creating the user. */ - body: BatchNodeUserCreateParameters; + body: BatchNodeUserCreateContent; } export interface CreateNodeUserQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -3298,10 +2927,7 @@ export interface DeleteNodeUserHeaders { } export interface DeleteNodeUserQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -3335,14 +2961,11 @@ export interface ReplaceNodeUserHeaders { export interface ReplaceNodeUserBodyParam { /** The options to use for updating the user. */ - body: BatchNodeUserUpdateParameters; + body: BatchNodeUserUpdateContent; } export interface ReplaceNodeUserQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -3382,10 +3005,7 @@ export interface GetNodeHeaders { } export interface GetNodeQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; /** An OData $select clause. */ $select?: string[]; @@ -3421,14 +3041,11 @@ export interface RebootNodeHeaders { export interface RebootNodeBodyParam { /** The options to use for rebooting the Compute Node. */ - body?: BatchNodeRebootParameters; + body?: BatchNodeRebootContent; } export interface RebootNodeQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -3451,54 +3068,6 @@ export type RebootNodeParameters = RebootNodeQueryParam & RebootNodeBodyParam & RequestParameters; -export interface ReimageNodeHeaders { - /** - * The caller-generated request identity, in the form of a GUID with no decoration - * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. - */ - "client-request-id"?: string; - /** Whether the server should return the client-request-id in the response. */ - "return-client-request-id"?: boolean; - /** - * The time the request was issued. Client libraries typically set this to the - * current system clock time; set it explicitly if you are calling the REST API - * directly. - */ - "ocp-date"?: string; -} - -export interface ReimageNodeBodyParam { - /** The options to use for reimaging the Compute Node. */ - body?: BatchNodeReimageParameters; -} - -export interface ReimageNodeQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ - timeOut?: number; -} - -export interface ReimageNodeQueryParam { - queryParameters?: ReimageNodeQueryParamProperties; -} - -export interface ReimageNodeHeaderParam { - headers?: RawHttpHeadersInput & ReimageNodeHeaders; -} - -export interface ReimageNodeMediaTypesParam { - /** Type of content */ - contentType: "application/json; odata=minimalmetadata"; -} - -export type ReimageNodeParameters = ReimageNodeQueryParam & - ReimageNodeHeaderParam & - ReimageNodeMediaTypesParam & - ReimageNodeBodyParam & - RequestParameters; - export interface DisableNodeSchedulingHeaders { /** * The caller-generated request identity, in the form of a GUID with no decoration @@ -3517,14 +3086,11 @@ export interface DisableNodeSchedulingHeaders { export interface DisableNodeSchedulingBodyParam { /** The options to use for disabling scheduling on the Compute Node. */ - body?: BatchNodeDisableSchedulingParameters; + body?: BatchNodeDisableSchedulingContent; } export interface DisableNodeSchedulingQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -3564,10 +3130,7 @@ export interface EnableNodeSchedulingHeaders { } export interface EnableNodeSchedulingQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -3600,10 +3163,7 @@ export interface GetNodeRemoteLoginSettingsHeaders { } export interface GetNodeRemoteLoginSettingsQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -3620,43 +3180,6 @@ export type GetNodeRemoteLoginSettingsParameters = GetNodeRemoteLoginSettingsHeaderParam & RequestParameters; -export interface GetNodeRemoteDesktopFileHeaders { - /** - * The caller-generated request identity, in the form of a GUID with no decoration - * such as curly braces, e.g. 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0. - */ - "client-request-id"?: string; - /** Whether the server should return the client-request-id in the response. */ - "return-client-request-id"?: boolean; - /** - * The time the request was issued. Client libraries typically set this to the - * current system clock time; set it explicitly if you are calling the REST API - * directly. - */ - "ocp-date"?: string; -} - -export interface GetNodeRemoteDesktopFileQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ - timeOut?: number; -} - -export interface GetNodeRemoteDesktopFileQueryParam { - queryParameters?: GetNodeRemoteDesktopFileQueryParamProperties; -} - -export interface GetNodeRemoteDesktopFileHeaderParam { - headers?: RawHttpHeadersInput & GetNodeRemoteDesktopFileHeaders; -} - -export type GetNodeRemoteDesktopFileParameters = - GetNodeRemoteDesktopFileQueryParam & - GetNodeRemoteDesktopFileHeaderParam & - RequestParameters; - export interface UploadNodeLogsHeaders { /** * The caller-generated request identity, in the form of a GUID with no decoration @@ -3675,14 +3198,11 @@ export interface UploadNodeLogsHeaders { export interface UploadNodeLogsBodyParam { /** The Azure Batch service log files upload options. */ - body: UploadBatchServiceLogsParameters; + body: UploadBatchServiceLogsContent; } export interface UploadNodeLogsQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -3722,10 +3242,7 @@ export interface ListNodesHeaders { } export interface ListNodesQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; /** * The maximum number of items to return in the response. A maximum of 1000 @@ -3770,10 +3287,7 @@ export interface GetNodeExtensionHeaders { } export interface GetNodeExtensionQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; /** An OData $select clause. */ $select?: string[]; @@ -3808,10 +3322,7 @@ export interface ListNodeExtensionsHeaders { } export interface ListNodeExtensionsQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; /** * The maximum number of items to return in the response. A maximum of 1000 @@ -3851,10 +3362,7 @@ export interface DeleteNodeFileHeaders { } export interface DeleteNodeFileQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; /** * Whether to delete children of a directory. If the filePath parameter represents @@ -3911,10 +3419,7 @@ export interface GetNodeFileHeaders { } export interface GetNodeFileQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -3959,10 +3464,7 @@ export interface GetNodeFilePropertiesHeaders { } export interface GetNodeFilePropertiesQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; } @@ -3995,10 +3497,7 @@ export interface ListNodeFilesHeaders { } export interface ListNodeFilesQueryParamProperties { - /** - * Sets the maximum time that the server can spend processing the request, - * in seconds. The default is 30 seconds. - */ + /** The maximum time that the server can spend processing the request, in seconds. The default is 30 seconds. If the value is larger than 30, the default will be used instead.". */ timeOut?: number; /** * The maximum number of items to return in the response. A maximum of 1000 diff --git a/packages/service/src/internal/batch-rest/generated/src/responses.ts b/packages/service/src/internal/batch-rest/generated/src/responses.ts index 0a835fa2e..693ba8239 100644 --- a/packages/service/src/internal/batch-rest/generated/src/responses.ts +++ b/packages/service/src/internal/batch-rest/generated/src/responses.ts @@ -17,8 +17,6 @@ import { BatchJobListResultOutput, BatchJobPreparationAndReleaseTaskStatusListResultOutput, BatchTaskCountsResultOutput, - BatchCertificateListResultOutput, - BatchCertificateOutput, BatchJobScheduleOutput, BatchJobScheduleListResultOutput, BatchTaskListResultOutput, @@ -32,17 +30,17 @@ import { BatchNodeListResultOutput, BatchNodeVMExtensionOutput, BatchNodeVMExtensionListResultOutput, -} from "./outputModels"; +} from "./outputModels.js"; export interface ListApplications200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -58,14 +56,14 @@ export interface ListApplicationsDefaultResponse extends HttpResponse { } export interface GetApplication200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -81,14 +79,14 @@ export interface GetApplicationDefaultResponse extends HttpResponse { } export interface ListPoolUsageMetrics200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -104,16 +102,16 @@ export interface ListPoolUsageMetricsDefaultResponse extends HttpResponse { } export interface CreatePool201Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded and a new resource has been created as a result. */ @@ -128,14 +126,14 @@ export interface CreatePoolDefaultResponse extends HttpResponse { } export interface ListPools200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -169,14 +167,14 @@ export interface DeletePoolDefaultResponse extends HttpResponse { } export interface PoolExists200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -196,14 +194,14 @@ export interface PoolExistsDefaultResponse extends HttpResponse { } export interface GetPool200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -219,16 +217,16 @@ export interface GetPoolDefaultResponse extends HttpResponse { } export interface UpdatePool200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -243,16 +241,16 @@ export interface UpdatePoolDefaultResponse extends HttpResponse { } export interface DisablePoolAutoScale200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -267,16 +265,16 @@ export interface DisablePoolAutoScaleDefaultResponse extends HttpResponse { } export interface EnablePoolAutoScale200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -291,16 +289,16 @@ export interface EnablePoolAutoScaleDefaultResponse extends HttpResponse { } export interface EvaluatePoolAutoScale200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -316,16 +314,16 @@ export interface EvaluatePoolAutoScaleDefaultResponse extends HttpResponse { } export interface ResizePool202Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has been accepted for processing, but processing has not yet completed. */ @@ -340,16 +338,16 @@ export interface ResizePoolDefaultResponse extends HttpResponse { } export interface StopPoolResize202Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has been accepted for processing, but processing has not yet completed. */ @@ -364,16 +362,16 @@ export interface StopPoolResizeDefaultResponse extends HttpResponse { } export interface ReplacePoolProperties204Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** There is no content to send for this request, but the headers may be useful. */ @@ -388,16 +386,16 @@ export interface ReplacePoolPropertiesDefaultResponse extends HttpResponse { } export interface RemoveNodes202Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has been accepted for processing, but processing has not yet completed. */ @@ -412,14 +410,14 @@ export interface RemoveNodesDefaultResponse extends HttpResponse { } export interface ListSupportedImages200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -435,14 +433,14 @@ export interface ListSupportedImagesDefaultResponse extends HttpResponse { } export interface ListPoolNodeCounts200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -476,14 +474,14 @@ export interface DeleteJobDefaultResponse extends HttpResponse { } export interface GetJob200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -499,16 +497,16 @@ export interface GetJobDefaultResponse extends HttpResponse { } export interface UpdateJob200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -523,16 +521,16 @@ export interface UpdateJobDefaultResponse extends HttpResponse { } export interface ReplaceJob200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -547,16 +545,16 @@ export interface ReplaceJobDefaultResponse extends HttpResponse { } export interface DisableJob202Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has been accepted for processing, but processing has not yet completed. */ @@ -571,16 +569,16 @@ export interface DisableJobDefaultResponse extends HttpResponse { } export interface EnableJob202Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has been accepted for processing, but processing has not yet completed. */ @@ -595,16 +593,16 @@ export interface EnableJobDefaultResponse extends HttpResponse { } export interface TerminateJob202Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has been accepted for processing, but processing has not yet completed. */ @@ -619,16 +617,16 @@ export interface TerminateJobDefaultResponse extends HttpResponse { } export interface CreateJob201Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded and a new resource has been created as a result. */ @@ -643,14 +641,14 @@ export interface CreateJobDefaultResponse extends HttpResponse { } export interface ListJobs200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -666,14 +664,14 @@ export interface ListJobsDefaultResponse extends HttpResponse { } export interface ListJobsFromSchedule200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -689,14 +687,14 @@ export interface ListJobsFromScheduleDefaultResponse extends HttpResponse { } export interface ListJobPreparationAndReleaseTaskStatus200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -714,153 +712,37 @@ export interface ListJobPreparationAndReleaseTaskStatusDefaultResponse } export interface GetJobTaskCounts200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; - /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ - etag?: string; - /** The time at which the resource was last modified. */ - "last-modified"?: string; -} - -/** The request has succeeded. */ -export interface GetJobTaskCounts200Response extends HttpResponse { - status: "200"; - body: BatchTaskCountsResultOutput; - headers: RawHttpHeaders & GetJobTaskCounts200Headers; -} - -export interface GetJobTaskCountsDefaultResponse extends HttpResponse { - status: string; - body: BatchErrorOutput; -} - -export interface CreateCertificate201Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; -} - -/** The request has succeeded and a new resource has been created as a result. */ -export interface CreateCertificate201Response extends HttpResponse { - status: "201"; - headers: RawHttpHeaders & CreateCertificate201Headers; -} - -export interface CreateCertificateDefaultResponse extends HttpResponse { - status: string; - body: BatchErrorOutput; -} - -export interface ListCertificates200Headers { /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ "client-request-id"?: string; /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ "request-id"?: string; - /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ - etag?: string; - /** The time at which the resource was last modified. */ - "last-modified"?: string; } /** The request has succeeded. */ -export interface ListCertificates200Response extends HttpResponse { +export interface GetJobTaskCounts200Response extends HttpResponse { status: "200"; - body: BatchCertificateListResultOutput; - headers: RawHttpHeaders & ListCertificates200Headers; -} - -export interface ListCertificatesDefaultResponse extends HttpResponse { - status: string; - body: BatchErrorOutput; -} - -export interface CancelCertificateDeletion204Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; - /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ - etag?: string; - /** The time at which the resource was last modified. */ - "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; -} - -/** There is no content to send for this request, but the headers may be useful. */ -export interface CancelCertificateDeletion204Response extends HttpResponse { - status: "204"; - headers: RawHttpHeaders & CancelCertificateDeletion204Headers; -} - -export interface CancelCertificateDeletionDefaultResponse extends HttpResponse { - status: string; - body: BatchErrorOutput; -} - -export interface DeleteCertificate202Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; - /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ - etag?: string; - /** The time at which the resource was last modified. */ - "last-modified"?: string; -} - -/** The request has been accepted for processing, but processing has not yet completed. */ -export interface DeleteCertificate202Response extends HttpResponse { - status: "202"; - headers: RawHttpHeaders & DeleteCertificate202Headers; + body: BatchTaskCountsResultOutput; + headers: RawHttpHeaders & GetJobTaskCounts200Headers; } -export interface DeleteCertificateDefaultResponse extends HttpResponse { +export interface GetJobTaskCountsDefaultResponse extends HttpResponse { status: string; body: BatchErrorOutput; } -export interface GetCertificate200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; +export interface JobScheduleExists200Headers { /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; -} - -/** The request has succeeded. */ -export interface GetCertificate200Response extends HttpResponse { - status: "200"; - body: BatchCertificateOutput; - headers: RawHttpHeaders & GetCertificate200Headers; -} - -export interface GetCertificateDefaultResponse extends HttpResponse { - status: string; - body: BatchErrorOutput; -} - -export interface JobScheduleExists200Headers { /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ "client-request-id"?: string; /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ "request-id"?: string; - /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ - etag?: string; - /** The time at which the resource was last modified. */ - "last-modified"?: string; } /** The request has succeeded. */ @@ -898,14 +780,14 @@ export interface DeleteJobScheduleDefaultResponse extends HttpResponse { } export interface GetJobSchedule200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -921,16 +803,16 @@ export interface GetJobScheduleDefaultResponse extends HttpResponse { } export interface UpdateJobSchedule200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -945,16 +827,16 @@ export interface UpdateJobScheduleDefaultResponse extends HttpResponse { } export interface ReplaceJobSchedule200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -969,16 +851,16 @@ export interface ReplaceJobScheduleDefaultResponse extends HttpResponse { } export interface DisableJobSchedule204Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** There is no content to send for this request, but the headers may be useful. */ @@ -993,16 +875,16 @@ export interface DisableJobScheduleDefaultResponse extends HttpResponse { } export interface EnableJobSchedule204Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** There is no content to send for this request, but the headers may be useful. */ @@ -1017,16 +899,16 @@ export interface EnableJobScheduleDefaultResponse extends HttpResponse { } export interface TerminateJobSchedule202Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has been accepted for processing, but processing has not yet completed. */ @@ -1041,16 +923,16 @@ export interface TerminateJobScheduleDefaultResponse extends HttpResponse { } export interface CreateJobSchedule201Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded and a new resource has been created as a result. */ @@ -1065,14 +947,14 @@ export interface CreateJobScheduleDefaultResponse extends HttpResponse { } export interface ListJobSchedules200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -1088,16 +970,16 @@ export interface ListJobSchedulesDefaultResponse extends HttpResponse { } export interface CreateTask201Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded and a new resource has been created as a result. */ @@ -1112,14 +994,14 @@ export interface CreateTaskDefaultResponse extends HttpResponse { } export interface ListTasks200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -1135,14 +1017,14 @@ export interface ListTasksDefaultResponse extends HttpResponse { } export interface CreateTaskCollection200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -1176,16 +1058,16 @@ export interface DeleteTaskDefaultResponse extends HttpResponse { } export interface GetTask200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -1201,16 +1083,16 @@ export interface GetTaskDefaultResponse extends HttpResponse { } export interface ReplaceTask200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -1225,14 +1107,14 @@ export interface ReplaceTaskDefaultResponse extends HttpResponse { } export interface ListSubTasks200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -1248,16 +1130,16 @@ export interface ListSubTasksDefaultResponse extends HttpResponse { } export interface TerminateTask204Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** There is no content to send for this request, but the headers may be useful. */ @@ -1272,16 +1154,16 @@ export interface TerminateTaskDefaultResponse extends HttpResponse { } export interface ReactivateTask204Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** There is no content to send for this request, but the headers may be useful. */ @@ -1314,24 +1196,24 @@ export interface DeleteTaskFileDefaultResponse extends HttpResponse { } export interface GetTaskFile200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The length of the file. */ + "content-length": number; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The file creation time. */ - "ocp-creation-time"?: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; /** Whether the object represents a directory. */ "ocp-batch-file-isdirectory": boolean; - /** The URL of the file. */ - "ocp-batch-file-url": string; /** The file mode attribute in octal format. */ "ocp-batch-file-mode": string; - /** The length of the file. */ - "content-length": number; + /** The URL of the file. */ + "ocp-batch-file-url": string; + /** The file creation time. */ + "ocp-creation-time"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -1348,24 +1230,24 @@ export interface GetTaskFileDefaultResponse extends HttpResponse { } export interface GetTaskFileProperties200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The length of the file. */ + "content-length": number; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The file creation time. */ - "ocp-creation-time"?: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; /** Whether the object represents a directory. */ "ocp-batch-file-isdirectory": boolean; - /** The URL of the file. */ - "ocp-batch-file-url": string; /** The file mode attribute in octal format. */ "ocp-batch-file-mode": string; - /** The length of the file. */ - "content-length": number; + /** The URL of the file. */ + "ocp-batch-file-url": string; + /** The file creation time. */ + "ocp-creation-time"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -1380,14 +1262,14 @@ export interface GetTaskFilePropertiesDefaultResponse extends HttpResponse { } export interface ListTaskFiles200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -1403,16 +1285,16 @@ export interface ListTaskFilesDefaultResponse extends HttpResponse { } export interface CreateNodeUser201Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded and a new resource has been created as a result. */ @@ -1445,16 +1327,16 @@ export interface DeleteNodeUserDefaultResponse extends HttpResponse { } export interface ReplaceNodeUser200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -1469,14 +1351,14 @@ export interface ReplaceNodeUserDefaultResponse extends HttpResponse { } export interface GetNode200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -1492,16 +1374,16 @@ export interface GetNodeDefaultResponse extends HttpResponse { } export interface RebootNode202Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has been accepted for processing, but processing has not yet completed. */ @@ -1515,41 +1397,17 @@ export interface RebootNodeDefaultResponse extends HttpResponse { body: BatchErrorOutput; } -export interface ReimageNode202Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; +export interface DisableNodeScheduling200Headers { + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; -} - -/** The request has been accepted for processing, but processing has not yet completed. */ -export interface ReimageNode202Response extends HttpResponse { - status: "202"; - headers: RawHttpHeaders & ReimageNode202Headers; -} - -export interface ReimageNodeDefaultResponse extends HttpResponse { - status: string; - body: BatchErrorOutput; -} - -export interface DisableNodeScheduling200Headers { /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ "client-request-id"?: string; /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ "request-id"?: string; - /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ - etag?: string; - /** The time at which the resource was last modified. */ - "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; } /** The request has succeeded. */ @@ -1564,16 +1422,16 @@ export interface DisableNodeSchedulingDefaultResponse extends HttpResponse { } export interface EnableNodeScheduling200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The OData ID of the resource to which the request applied. */ + dataserviceid: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The OData ID of the resource to which the request applied. */ - dataserviceid: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -1588,14 +1446,14 @@ export interface EnableNodeSchedulingDefaultResponse extends HttpResponse { } export interface GetNodeRemoteLoginSettings200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -1611,38 +1469,15 @@ export interface GetNodeRemoteLoginSettingsDefaultResponse body: BatchErrorOutput; } -export interface GetNodeRemoteDesktopFile200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; +export interface UploadNodeLogs200Headers { /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; -} - -/** The request has succeeded. */ -export interface GetNodeRemoteDesktopFile200Response extends HttpResponse { - status: "200"; - body: string; - headers: RawHttpHeaders & GetNodeRemoteDesktopFile200Headers; -} - -export interface GetNodeRemoteDesktopFileDefaultResponse extends HttpResponse { - status: string; - body: BatchErrorOutput; -} - -export interface UploadNodeLogs200Headers { /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ "client-request-id"?: string; /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ "request-id"?: string; - /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ - etag?: string; - /** The time at which the resource was last modified. */ - "last-modified"?: string; } /** The request has succeeded. */ @@ -1658,14 +1493,14 @@ export interface UploadNodeLogsDefaultResponse extends HttpResponse { } export interface ListNodes200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -1681,14 +1516,14 @@ export interface ListNodesDefaultResponse extends HttpResponse { } export interface GetNodeExtension200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -1704,14 +1539,14 @@ export interface GetNodeExtensionDefaultResponse extends HttpResponse { } export interface ListNodeExtensions200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -1745,30 +1580,31 @@ export interface DeleteNodeFileDefaultResponse extends HttpResponse { } export interface GetNodeFile200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The length of the file. */ + "content-length": number; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The file creation time. */ - "ocp-creation-time"?: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; /** Whether the object represents a directory. */ "ocp-batch-file-isdirectory": boolean; - /** The URL of the file. */ - "ocp-batch-file-url": string; /** The file mode attribute in octal format. */ "ocp-batch-file-mode": string; - /** The length of the file. */ - "content-length": number; + /** The URL of the file. */ + "ocp-batch-file-url": string; + /** The file creation time. */ + "ocp-creation-time"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ export interface GetNodeFile200Response extends HttpResponse { status: "200"; - body: string; + /** Value may contain any sequence of octets */ + body: Uint8Array; headers: RawHttpHeaders & GetNodeFile200Headers; } @@ -1778,24 +1614,24 @@ export interface GetNodeFileDefaultResponse extends HttpResponse { } export interface GetNodeFileProperties200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; + /** The length of the file. */ + "content-length": number; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; - /** The file creation time. */ - "ocp-creation-time"?: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; /** Whether the object represents a directory. */ "ocp-batch-file-isdirectory": boolean; - /** The URL of the file. */ - "ocp-batch-file-url": string; /** The file mode attribute in octal format. */ "ocp-batch-file-mode": string; - /** The length of the file. */ - "content-length": number; + /** The URL of the file. */ + "ocp-batch-file-url": string; + /** The file creation time. */ + "ocp-creation-time"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ @@ -1810,14 +1646,14 @@ export interface GetNodeFilePropertiesDefaultResponse extends HttpResponse { } export interface ListNodeFiles200Headers { - /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ - "client-request-id"?: string; - /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ - "request-id"?: string; /** The ETag HTTP response header. This is an opaque string. You can use it to detect whether the resource has changed between requests. In particular, you can pass the ETag to one of the If-Modified-Since, If-Unmodified-Since, If-Match or If-None-Match headers. */ etag?: string; /** The time at which the resource was last modified. */ "last-modified"?: string; + /** The client-request-id provided by the client during the request. This will be returned only if the return-client-request-id parameter was set to true. */ + "client-request-id"?: string; + /** A unique identifier for the request that was made to the Batch service. If a request is consistently failing and you have verified that the request is properly formulated, you may use this value to report the error to Microsoft. In your report, include the value of this request ID, the approximate time that the request was made, the Batch Account against which the request was made, and the region that Account resides in. */ + "request-id"?: string; } /** The request has succeeded. */ diff --git a/packages/service/src/internal/batch-rest/generated/tsp-location.yaml b/packages/service/src/internal/batch-rest/generated/tsp-location.yaml index 520084cd7..ed5de1e9e 100644 --- a/packages/service/src/internal/batch-rest/generated/tsp-location.yaml +++ b/packages/service/src/internal/batch-rest/generated/tsp-location.yaml @@ -1,4 +1,4 @@ directory: specification/batch/Azure.Batch -commit: e4b9c403b879114eabb38f23071161e5a6cd508e -repo: wiboris/azure-rest-api-specs +commit: 0f8dd4b5c25cb379c87b85a97ddac2e4969da604 +repo: Azure/azure-rest-api-specs additionalDirectories: diff --git a/util/common-config/jest-common.js b/util/common-config/jest-common.js index a83c5ec3e..ab92df244 100644 --- a/util/common-config/jest-common.js +++ b/util/common-config/jest-common.js @@ -45,7 +45,10 @@ module.exports = { ["cobertura", { file: "cobertura.xml" }], ], moduleDirectories: ["src", "node_modules"], - moduleNameMapper: {}, + moduleNameMapper: { + // batch RLC generates import has .js extension, so we need to remove it in test + "(.+)\\.js": "$1", + }, reporters: [ "default", [ From 9fc57587b05ad3db6dc73c3728a683ce3372a940 Mon Sep 17 00:00:00 2001 From: David Watrous <509299+dpwatrous@users.noreply.github.com> Date: Wed, 26 Jun 2024 13:05:45 -0400 Subject: [PATCH 26/57] Update top-level build dir to include all tests & app (#2918) --- util/bux/util.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/util/bux/util.ts b/util/bux/util.ts index cf0016867..98389052d 100644 --- a/util/bux/util.ts +++ b/util/bux/util.ts @@ -322,10 +322,22 @@ export async function gatherBuildResults(basePath: string) { path.join(basePath, "packages", "bonito-core", "build"), path.join(baseBuildDir, "bonito-core") ); + doCopy( + path.join(basePath, "packages", "bonito-ui", "build"), + path.join(baseBuildDir, "bonito-ui") + ); + doCopy( + path.join(basePath, "packages", "playground", "build"), + path.join(baseBuildDir, "playground") + ); doCopy( path.join(basePath, "packages", "react", "build"), path.join(baseBuildDir, "react") ); + doCopy( + path.join(basePath, "packages", "service", "build"), + path.join(baseBuildDir, "service") + ); // web doCopy(path.join(basePath, "web", "build"), path.join(baseBuildDir, "web")); @@ -335,6 +347,10 @@ export async function gatherBuildResults(basePath: string) { path.join(basePath, "desktop", "coverage"), path.join(baseBuildDir, "desktop", "coverage") ); + doCopy( + path.join(basePath, "desktop", "release"), + path.join(baseBuildDir, "desktop", "release") + ); } export async function linkLocalProjects() { From 225ef88fea2f63eda72438955e8a5a50b530f957 Mon Sep 17 00:00:00 2001 From: David Watrous <509299+dpwatrous@users.noreply.github.com> Date: Thu, 27 Jun 2024 16:52:04 -0400 Subject: [PATCH 27/57] Add --no-sandbox flag to Electron when running tests (#2919) This allows tests to run as root in the CI container --- desktop/karma.conf.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desktop/karma.conf.js b/desktop/karma.conf.js index 8a3763a99..62d76ded5 100644 --- a/desktop/karma.conf.js +++ b/desktop/karma.conf.js @@ -51,7 +51,7 @@ module.exports = function(config) { customLaunchers: { CustomElectron: { base: "Electron", - flags: ["--enable-precise-memory-info"], + flags: ["--enable-precise-memory-info", "--no-sandbox"], browserWindowOptions: { show: true, webPreferences: { From 6e52e2991b9f9bd9c2e6a551ce3d26658c15cbeb Mon Sep 17 00:00:00 2001 From: Haopeng Wang Date: Wed, 10 Jul 2024 17:23:20 -0700 Subject: [PATCH 28/57] Add AccountService and CacheManager (#2920) * add LruCahe * return undefined for get account when not found --- .../app/environment/desktop-environment.ts | 5 +- .../src/cache/__tests__/lru-cache.spec.ts | 102 +++++++++++++++ .../__tests__/memory-cache-manager.spec.ts | 105 +++++++++++++++ .../bonito-core/src/cache/cache-manager.ts | 98 ++++++++++++++ packages/bonito-core/src/cache/cache-utils.ts | 11 ++ packages/bonito-core/src/cache/index.ts | 3 + packages/bonito-core/src/cache/lru-cache.ts | 123 ++++++++++++++++++ .../src/cache/memory-cache-manager.ts | 24 ++++ .../src/environment/abstract-environment.ts | 16 +++ .../src/environment/environment.ts | 8 ++ .../src/environment/mock-environment.ts | 2 + packages/bonito-core/src/index.ts | 1 + .../bonito-core/src/service/operations.ts | 6 + .../__tests__/node-vm-ext-list.spec.tsx | 7 +- .../src/vm-extension/node-vm-ext-list.tsx | 82 +++++++----- .../__tests__/fake-account-service.spec.ts | 29 +++++ .../__tests__/live-account-service.spec.ts | 99 ++++++++++++++ .../service/src/account/account-service.ts | 14 ++ .../src/account/fake-account-service.ts | 20 +++ packages/service/src/account/index.ts | 3 + .../src/account/live-account-service.ts | 56 ++++++++ .../src/environment/batch-dependencies.ts | 3 + .../src/environment/environment-util.ts | 2 + .../service/src/pool/live-pool-service.ts | 6 +- web/src/index.tsx | 5 + 25 files changed, 790 insertions(+), 40 deletions(-) create mode 100644 packages/bonito-core/src/cache/__tests__/lru-cache.spec.ts create mode 100644 packages/bonito-core/src/cache/__tests__/memory-cache-manager.spec.ts create mode 100644 packages/bonito-core/src/cache/cache-manager.ts create mode 100644 packages/bonito-core/src/cache/cache-utils.ts create mode 100644 packages/bonito-core/src/cache/index.ts create mode 100644 packages/bonito-core/src/cache/lru-cache.ts create mode 100644 packages/bonito-core/src/cache/memory-cache-manager.ts create mode 100644 packages/service/src/account/__tests__/fake-account-service.spec.ts create mode 100644 packages/service/src/account/__tests__/live-account-service.spec.ts create mode 100644 packages/service/src/account/account-service.ts create mode 100644 packages/service/src/account/fake-account-service.ts create mode 100644 packages/service/src/account/live-account-service.ts diff --git a/desktop/src/app/environment/desktop-environment.ts b/desktop/src/app/environment/desktop-environment.ts index 9b0bb3bad..e85914883 100644 --- a/desktop/src/app/environment/desktop-environment.ts +++ b/desktop/src/app/environment/desktop-environment.ts @@ -7,6 +7,7 @@ import { LiveSubscriptionService, initEnvironment } from "@azure/bonito-core"; +import { MemoryCacheManager } from "@azure/bonito-core/lib/cache"; import { StandardClock } from "@azure/bonito-core/lib/datetime"; import { createConsoleLogger } from "@azure/bonito-core/lib/logging"; import { AlertNotifier } from "@azure/bonito-core/lib/notification/alert-notifier"; @@ -14,7 +15,7 @@ import { DefaultFormLayoutProvider } from "@azure/bonito-ui/lib/components/form" import { BrowserDependencyName, BrowserEnvironmentConfig, DefaultBrowserEnvironment } from "@azure/bonito-ui/lib/environment"; import BatchExplorerHttpClient from "@batch-flask/core/batch-explorer-http-client"; import { BatchBrowserDependencyFactories, BatchFormControlResolver } from "@batch/ui-react"; -import { LiveNodeService, LivePoolService } from "@batch/ui-service"; +import { LiveAccountService, LiveNodeService, LivePoolService } from "@batch/ui-service"; import { BatchDependencyName } from "@batch/ui-service/lib/environment"; import { DesktopLocalizer } from "app/localizer/desktop-localizer"; import { AppTranslationsLoaderService, AuthService, BatchExplorerService } from "app/services"; @@ -42,10 +43,12 @@ export function initDesktopEnvironment( () => new BatchExplorerHttpClient(authService), [DependencyName.LocationService]: () => new LiveLocationService(), + [DependencyName.CacheManager]: () => new MemoryCacheManager(), [BatchDependencyName.PoolService]: () => new LivePoolService(), [BatchDependencyName.NodeService]: () => new LiveNodeService(), + [BatchDependencyName.AccountService]: () => new LiveAccountService(), [DependencyName.Notifier]: () => new AlertNotifier(), // TODO: update with real notification implementation [DependencyName.ResourceGroupService]: () => diff --git a/packages/bonito-core/src/cache/__tests__/lru-cache.spec.ts b/packages/bonito-core/src/cache/__tests__/lru-cache.spec.ts new file mode 100644 index 000000000..a06531c3d --- /dev/null +++ b/packages/bonito-core/src/cache/__tests__/lru-cache.spec.ts @@ -0,0 +1,102 @@ +import { getCacheManager } from "../cache-utils"; +import { initMockEnvironment } from "../../environment"; +import { LruCache } from "../lru-cache"; + +describe("Lru Cache Test", () => { + beforeEach(() => { + initMockEnvironment(); + }); + + test("recordSet works as expected", async () => { + const lruCache = new LruCache(getCacheManager(), 3); + expect(lruCache.capacity).toBe(3); + lruCache.recordSet("key1"); + lruCache.recordSet("key2"); + lruCache.recordSet("key3"); + + const head = lruCache.getHead(); + expect(head?.key).toBe("key3"); + expect(head?.next?.key).toBe("key2"); + expect(head?.next?.next?.key).toBe("key1"); + + lruCache.recordSet("key2"); + const head2 = lruCache.getHead(); + expect(head2?.key).toBe("key2"); + + lruCache.recordSet("key4"); + const head3 = lruCache.getHead(); + expect(head3?.key).toBe("key4"); + expect(head3?.next?.key).toBe("key2"); + expect(head3?.next?.next?.key).toBe("key3"); + expect(lruCache.getSize()).toBe(3); + }); + + test("should call cacheManager's remove when capacity is exceeded", async () => { + const lruCache = new LruCache(getCacheManager(), 1); + jest.spyOn(lruCache, "recordRemove"); + const cacheManager = lruCache.cacheManager; + jest.spyOn(cacheManager, "remove"); + + const head = lruCache.getHead(); + expect(head).toBeNull(); + expect(lruCache.getSize()).toBe(0); + + lruCache.recordSet("key1"); + lruCache.recordSet("key2"); + expect(lruCache.getSize()).toBe(1); + expect(cacheManager.remove).toHaveBeenNthCalledWith(1, "key1"); + }); + + test("recordGet works as expected", async () => { + const lruCache = new LruCache(getCacheManager(), 3); + lruCache.recordSet("key1"); + lruCache.recordSet("key2"); + lruCache.recordSet("key3"); + + lruCache.recordGet("key1"); + const head = lruCache.getHead(); + expect(head?.key).toBe("key1"); + expect(head?.next?.key).toBe("key3"); + expect(head?.next?.next?.key).toBe("key2"); + + lruCache.recordGet("key3"); + const head2 = lruCache.getHead(); + expect(head2?.key).toBe("key3"); + + lruCache.recordGet("key4"); + const head3 = lruCache.getHead(); + expect(head3?.key).toBe("key3"); + }); + + test("recordRemove works as expected", async () => { + const lruCache = new LruCache(getCacheManager(), 3); + lruCache.recordSet("key1"); + lruCache.recordSet("key2"); + lruCache.recordSet("key3"); + + lruCache.recordRemove("key2"); + const head = lruCache.getHead(); + expect(head?.key).toBe("key3"); + expect(head?.next?.key).toBe("key1"); + expect(lruCache.getSize()).toBe(2); + }); + + test("recordClear works as expected", async () => { + const lruCache = new LruCache(getCacheManager(), 3); + lruCache.recordSet("key1"); + lruCache.recordSet("key2"); + lruCache.recordSet("key3"); + expect(lruCache.getSize()).toBe(3); + + lruCache.recordClear(); + const head = lruCache.getHead(); + expect(head).toBeNull(); + expect(lruCache.getSize()).toBe(0); + }); + + test("should throw error if capacity is invalid", async () => { + expect(() => new LruCache(getCacheManager(), 0)).toThrowError( + "Invalid capacity: 0" + ); + }); +}); diff --git a/packages/bonito-core/src/cache/__tests__/memory-cache-manager.spec.ts b/packages/bonito-core/src/cache/__tests__/memory-cache-manager.spec.ts new file mode 100644 index 000000000..18a5bccd6 --- /dev/null +++ b/packages/bonito-core/src/cache/__tests__/memory-cache-manager.spec.ts @@ -0,0 +1,105 @@ +import { initMockEnvironment } from "../../environment"; +import { MemoryCacheManager } from "../memory-cache-manager"; + +const setup = (capacity = 100) => { + initMockEnvironment(); + const cacheManager = new MemoryCacheManager(capacity); + jest.spyOn(cacheManager.lruCache, "recordGet"); + jest.spyOn(cacheManager.lruCache, "recordSet"); + jest.spyOn(cacheManager.lruCache, "recordRemove"); + jest.spyOn(cacheManager.lruCache, "recordClear"); + return { cacheManager, lruCache: cacheManager.lruCache }; +}; + +describe("Memory Cache Manager Test", () => { + test("Memory cache manager works as expected", async () => { + const { cacheManager, lruCache } = setup(); + const key = "test-key"; + const value = "test-value"; + + await cacheManager.set(key, value); + expect(lruCache.recordSet).toBeCalledWith(key); + + const result = await cacheManager.get(key, null); + expect(result).toBe(value); + expect(lruCache.recordGet).toBeCalledWith(key); + + await cacheManager.remove(key); + const result2 = await cacheManager.get(key, null); + expect(result2).toBeNull(); + expect(lruCache.recordRemove).toBeCalledWith(key); + }); + + test("clear should clear all cache", async () => { + const { cacheManager, lruCache } = setup(); + const key = "test-key"; + const value = "test-value"; + + await cacheManager.set(key, value); + await cacheManager.clear(); + + const result = await cacheManager.get(key); + expect(result).toBeUndefined(); + expect(lruCache.recordClear).toBeCalledTimes(1); + }); + + test("getOrAdd should add value if not found", async () => { + const { cacheManager } = setup(); + + const key = "test-key"; + const value = "test-value"; + const addValue = jest.fn(() => Promise.resolve(value)); + const result = await cacheManager.getOrAdd(key, addValue); + expect(result).toBe(value); + expect(addValue).toBeCalledTimes(1); + }); + + test("getOrAdd should get value if found", async () => { + const { cacheManager } = setup(); + + const key = "test-key"; + const value = "test-value"; + await cacheManager.set(key, value); + const addValue = jest.fn(() => Promise.resolve("new-value")); + const result = await cacheManager.getOrAdd(key, addValue, {}); + expect(result).toBe(value); + expect(addValue).not.toBeCalled(); + }); + + test("getOrAdd should bypass cache if specified", async () => { + const { cacheManager } = setup(); + + const key = "test-key"; + const value = "test-value"; + await cacheManager.set(key, value); + const addValue = jest.fn(() => Promise.resolve("new-value")); + const result = await cacheManager.getOrAdd(key, addValue, { + bypassCache: true, + }); + expect(result).toBe("new-value"); + expect(addValue).toBeCalledTimes(1); + }); + + test("should remove value if excceed capacity", async () => { + const { cacheManager } = setup(1); + + jest.spyOn(cacheManager, "remove"); + + const key = "test-key"; + const value = "test-value"; + await cacheManager.set(key, value); + await cacheManager.set("key2", "value2"); + + const result = await cacheManager.get(key); + expect(result).toBeUndefined(); + + const result2 = await cacheManager.get("key2"); + expect(result2).toBe("value2"); + + expect(cacheManager.remove).toHaveBeenNthCalledWith(1, key); + expect(cacheManager.lruCache.recordRemove).toHaveBeenNthCalledWith( + 1, + key + ); + }); +}); diff --git a/packages/bonito-core/src/cache/cache-manager.ts b/packages/bonito-core/src/cache/cache-manager.ts new file mode 100644 index 000000000..75ade683b --- /dev/null +++ b/packages/bonito-core/src/cache/cache-manager.ts @@ -0,0 +1,98 @@ +import { LruCache } from "./lru-cache"; + +export interface getOrAddOptions { + /** + * If true, the cache will be bypassed, and the value will be fetched from the source + */ + bypassCache?: boolean; +} + +export interface CacheManager { + /** + * Get a value from the cache + * @param key The key to look up + * @param defaultValue The value to return if the key is not found + */ + get(key: string, defaultValue?: T): Promise; + + /** + * Get a value from the cache, or add it if it is not found + * @param key The key to look up + * @param addValue The value to add if the key is not found + */ + getOrAdd( + key: string, + addValue: () => Promise, + options?: getOrAddOptions + ): Promise; + + /** + * Set a value in the cache + * @param key The key to set + * @param value The value to set + */ + set(key: string, value: T): Promise; + + /** + * Remove a value from the cache + * @param key The key to remove + */ + remove(key: string): Promise; + + /** + * Clear all cache + */ + clear(): Promise; +} + +export abstract class CacheManagerBase implements CacheManager { + lruCache: LruCache; + + constructor(public capacity: number = 100) { + this.lruCache = new LruCache(this, capacity); + } + + async getOrAdd( + key: string, + addValue: () => Promise, + options?: getOrAddOptions + ): Promise { + const bypassCache = options?.bypassCache ?? false; + if (!bypassCache) { + const cached = await this.get(key); + if (cached) { + return cached; + } + } + const value = await addValue(); + await this.set(key, value); + return value; + } + + async get(key: string, defaultValue?: T): Promise { + this.lruCache.recordGet(key); + return this.getInternal(key, defaultValue); + } + protected abstract getInternal( + key: string, + defaultValue?: T + ): Promise; + + async set(key: string, value: T): Promise { + this.lruCache.recordSet(key); + return this.setInternal(key, value); + } + protected abstract setInternal(key: string, value: T): Promise; + + async remove(key: string): Promise { + this.lruCache.recordRemove(key); + return this.removeInternal(key); + } + protected abstract removeInternal(key: string): Promise; + + async clear(): Promise { + this.lruCache.recordClear(); + return this.clearInternal(); + } + protected abstract clearInternal(): Promise; +} diff --git a/packages/bonito-core/src/cache/cache-utils.ts b/packages/bonito-core/src/cache/cache-utils.ts new file mode 100644 index 000000000..fefc10173 --- /dev/null +++ b/packages/bonito-core/src/cache/cache-utils.ts @@ -0,0 +1,11 @@ +import { getEnvironment } from "../environment"; +import { CacheManager } from "./cache-manager"; + +/** + * Gets the cache manager for the current environment + * + * @returns The globally-configured cache manager instance + */ +export function getCacheManager(): CacheManager { + return getEnvironment().getCacheManager(); +} diff --git a/packages/bonito-core/src/cache/index.ts b/packages/bonito-core/src/cache/index.ts new file mode 100644 index 000000000..0a30597a8 --- /dev/null +++ b/packages/bonito-core/src/cache/index.ts @@ -0,0 +1,3 @@ +export * from "./cache-manager"; +export * from "./memory-cache-manager"; +export * from "./cache-utils"; diff --git a/packages/bonito-core/src/cache/lru-cache.ts b/packages/bonito-core/src/cache/lru-cache.ts new file mode 100644 index 000000000..c295437e2 --- /dev/null +++ b/packages/bonito-core/src/cache/lru-cache.ts @@ -0,0 +1,123 @@ +import { CacheManager } from "./cache-manager"; + +class LruEntry { + key: string; + next: LruEntry | null; + prev: LruEntry | null; + + constructor(key: string) { + this.key = key; + this.next = null; + this.prev = null; + } +} + +export class LruCache { + private _head: LruEntry; + + private _tail: LruEntry; + + private _map: Map; + + constructor( + public cacheManager: CacheManager, + public capacity: number + ) { + if (capacity <= 0) { + throw new Error(`Invalid capacity: ${capacity}`); + } + this._head = new LruEntry(""); + this._tail = new LruEntry(""); + this._head.next = this._tail; + this._tail.prev = this._head; + this._map = new Map(); + } + + private _moveToHead(entry: LruEntry) { + this._removeEntry(entry); + this._addEntry(entry); + } + + private _removeEntry(entry: LruEntry) { + const prev = entry.prev; + const next = entry.next; + + if (prev) { + prev.next = next; + } + + if (next) { + next.prev = prev; + } + } + + private _addEntry(entry: LruEntry) { + const next = this._head?.next; + if (!next) { + throw new Error("Invalid state: head's next is null"); + } + + this._head.next = entry; + entry.prev = this._head; + + entry.next = next; + next.prev = entry; + } + + private _checkCapacity() { + if (this._map.size > this.capacity) { + const toRemove = this._tail.prev; + if (!toRemove) { + throw new Error("Invalid state: tail's prev is null"); + } + this._removeEntry(toRemove); + this._map.delete(toRemove.key); + this.cacheManager.remove(toRemove.key); + } + } + + recordGet(key: string) { + const entry = this._map.get(key); + if (entry) { + this._moveToHead(entry); + } + } + + recordSet(key: string) { + let entry = this._map.get(key); + if (entry) { + this._moveToHead(entry); + return; + } + entry = new LruEntry(key); + this._addEntry(entry); + this._map.set(key, entry); + this._checkCapacity(); + } + + recordRemove(key: string) { + const entry = this._map.get(key); + if (entry) { + this._removeEntry(entry); + this._map.delete(key); + } + } + + recordClear() { + this._map.clear(); + this._head.next = this._tail; + this._tail.prev = this._head; + } + + getHead(): LruEntry | null { + const head = this._head.next; + if (!head || head === this._tail) { + return null; + } + return head; + } + + getSize(): number { + return this._map.size; + } +} diff --git a/packages/bonito-core/src/cache/memory-cache-manager.ts b/packages/bonito-core/src/cache/memory-cache-manager.ts new file mode 100644 index 000000000..f23f0c229 --- /dev/null +++ b/packages/bonito-core/src/cache/memory-cache-manager.ts @@ -0,0 +1,24 @@ +import { CacheManagerBase } from "./cache-manager"; + +export class MemoryCacheManager extends CacheManagerBase { + private cache: Map = new Map(); + + async getInternal( + key: string, + defaultValue?: T + ): Promise { + return this.cache.has(key) ? (this.cache.get(key) as T) : defaultValue; + } + + async setInternal(key: string, value: T): Promise { + this.cache.set(key, value); + } + + async removeInternal(key: string): Promise { + this.cache.delete(key); + } + + async clearInternal(): Promise { + this.cache.clear(); + } +} diff --git a/packages/bonito-core/src/environment/abstract-environment.ts b/packages/bonito-core/src/environment/abstract-environment.ts index 596ac79f9..d4f08672e 100644 --- a/packages/bonito-core/src/environment/abstract-environment.ts +++ b/packages/bonito-core/src/environment/abstract-environment.ts @@ -12,6 +12,7 @@ import { } from "./environment"; import { Clock } from "../datetime/clock"; import { Notifier } from "../notification"; +import { CacheManager } from "../cache"; const DEFAULT_BASE_PATH = "/"; @@ -93,6 +94,21 @@ export abstract class AbstractEnvironment< return notifier; } + /** + * Get an instance of the global cache manager + */ + getCacheManager(): CacheManager { + const cacheManager = this.getInjectable( + DependencyName.CacheManager + ); + if (!cacheManager) { + throw new Error( + "No cache manager configured for the current environment" + ); + } + return cacheManager; + } + /** * Get the currently configured HTTP client */ diff --git a/packages/bonito-core/src/environment/environment.ts b/packages/bonito-core/src/environment/environment.ts index 679fcff79..874aad5ef 100644 --- a/packages/bonito-core/src/environment/environment.ts +++ b/packages/bonito-core/src/environment/environment.ts @@ -7,6 +7,7 @@ import { ResourceGroupService } from "../resource-group"; import { StorageAccountService } from "../storage"; import { SubscriptionService } from "../subscription"; import { Notifier } from "../notification"; +import { CacheManager } from "../cache"; /** * Represents the execution environment of the application. Acts as a @@ -56,6 +57,11 @@ export interface Environment { */ getNotifier(): Notifier; + /** + * Gets the cache manager for the current environment + */ + getCacheManager(): CacheManager; + /** * Gets the HTTP client for the current environment */ @@ -108,6 +114,7 @@ export enum DependencyName { ResourceGroupService = "resourceGroupService", StorageAccountService = "storageAccountService", SubscriptionService = "subscriptionService", + CacheManager = "cacheManager", } /** @@ -124,6 +131,7 @@ export interface DependencyFactories { [DependencyName.ResourceGroupService]: () => ResourceGroupService; [DependencyName.StorageAccountService]: () => StorageAccountService; [DependencyName.SubscriptionService]: () => SubscriptionService; + [DependencyName.CacheManager]: () => CacheManager; } /** diff --git a/packages/bonito-core/src/environment/mock-environment.ts b/packages/bonito-core/src/environment/mock-environment.ts index 6edd3be46..8022b4f44 100644 --- a/packages/bonito-core/src/environment/mock-environment.ts +++ b/packages/bonito-core/src/environment/mock-environment.ts @@ -15,6 +15,7 @@ import { EnvironmentMode, } from "./environment"; import { FakeNotifier } from "../notification/fake-notifier"; +import { MemoryCacheManager } from "../cache"; export const mockEnvironmentConfig: EnvironmentConfig = { mode: EnvironmentMode.Development, @@ -31,6 +32,7 @@ export const mockDependencyFactories: DependencyFactories = { storageAccountService: () => new FakeStorageAccountService(), subscriptionService: () => new FakeSubscriptionService(), notifier: () => new FakeNotifier(), + cacheManager: () => new MemoryCacheManager(), }; export class MockEnvironment< diff --git a/packages/bonito-core/src/index.ts b/packages/bonito-core/src/index.ts index a1a8caaf5..59319b4ed 100644 --- a/packages/bonito-core/src/index.ts +++ b/packages/bonito-core/src/index.ts @@ -33,6 +33,7 @@ export { export * from "./location"; export { getLogger } from "./logging/logging-util"; export { getNotifier } from "./notification"; +export { getCacheManager } from "./cache/cache-utils"; export * from "./resource-group"; export * from "./service"; export * from "./storage"; diff --git a/packages/bonito-core/src/service/operations.ts b/packages/bonito-core/src/service/operations.ts index 311743a93..e55e07eab 100644 --- a/packages/bonito-core/src/service/operations.ts +++ b/packages/bonito-core/src/service/operations.ts @@ -10,6 +10,12 @@ export interface OperationOptions { * convention. For example: "TaskForm/SubmitTask" */ commandName?: string; + + /** + * If true, the operation should bypass any cache and + * fetch the latest data from the server and update the cache. + */ + bypassCache?: boolean; } /** diff --git a/packages/react/src/vm-extension/__tests__/node-vm-ext-list.spec.tsx b/packages/react/src/vm-extension/__tests__/node-vm-ext-list.spec.tsx index fadc50270..0ba0cbbb9 100644 --- a/packages/react/src/vm-extension/__tests__/node-vm-ext-list.spec.tsx +++ b/packages/react/src/vm-extension/__tests__/node-vm-ext-list.spec.tsx @@ -6,6 +6,9 @@ import { NodeVMExtList } from "../node-vm-ext-list"; import { dataGridIgnoredA11yRules } from "@azure/bonito-ui/lib/components/data-grid/test-ignore-a11y-rules"; import { runAxe } from "@azure/bonito-ui/lib/test-util/a11y"; +const hoboAccountResourceId = + "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/supercomputing/providers/microsoft.batch/batchaccounts/hobo"; + describe("NodeVMExtList", () => { beforeEach(() => { initMockBatchBrowserEnvironment(); @@ -14,7 +17,7 @@ describe("NodeVMExtList", () => { it("should render vm extension lists", async () => { const { getByText, container } = render( @@ -29,7 +32,7 @@ describe("NodeVMExtList", () => { it("should render vm extension lists with no result", async () => { const { getByText } = render( diff --git a/packages/react/src/vm-extension/node-vm-ext-list.tsx b/packages/react/src/vm-extension/node-vm-ext-list.tsx index 01ca49e29..73cf9492e 100644 --- a/packages/react/src/vm-extension/node-vm-ext-list.tsx +++ b/packages/react/src/vm-extension/node-vm-ext-list.tsx @@ -1,58 +1,76 @@ import { inject } from "@azure/bonito-core/lib/environment"; -import { NodeService } from "@batch/ui-service"; +import { AccountService, NodeService } from "@batch/ui-service"; import { BatchDependencyName } from "@batch/ui-service/lib/environment"; import React from "react"; import { VmExtensionList, VmExtItem } from "./vm-extension-list"; interface NodeVmExtensionListProps { - accountEndpoint: string; + accountResourceId: string; poolId: string; nodeId: string; onItemClick?: (item: VmExtItem) => void; } export const NodeVMExtList = (props: NodeVmExtensionListProps) => { - const { accountEndpoint, poolId, nodeId, onItemClick } = props; + const { accountResourceId, poolId, nodeId, onItemClick } = props; const [extensions, setExtensions] = React.useState([]); const [loading, setLoading] = React.useState(true); - const nodeService: NodeService = React.useMemo(() => { - return inject(BatchDependencyName.NodeService); - }, []); + const nodeService: NodeService = inject(BatchDependencyName.NodeService); + + const accountService: AccountService = inject( + BatchDependencyName.AccountService + ); + + const fetchExtensions = React.useCallback(async () => { + const accountData = await accountService.get(accountResourceId); + if (!accountData) { + throw new Error(`Account with id ${accountResourceId} not found`); + } + const accountEndpoint = accountData.properties?.accountEndpoint; + if (!accountEndpoint) { + throw new Error( + `Account with id ${accountResourceId} does not have an account endpoint` + ); + } + setLoading(true); + try { + const resList = await nodeService.listVmExtensions( + accountEndpoint, + poolId, + nodeId + ); + const exts = []; + if (resList) { + for (const ext of resList) { + ext.vmExtension && + exts.push({ + ...ext.vmExtension, + provisioningState: ext.provisioningState, + instanceView: ext.instanceView, + }); + } + } + setExtensions(exts); + } finally { + setLoading(false); + } + }, [accountResourceId, accountService, nodeId, nodeService, poolId]); React.useEffect(() => { let isMounted = true; setLoading(true); - nodeService - .listVmExtensions(accountEndpoint, poolId, nodeId) - .then((resList) => { - if (!isMounted) { - return; - } - const exts = []; - if (resList) { - for (const ext of resList) { - ext.vmExtension && - exts.push({ - ...ext.vmExtension, - provisioningState: ext.provisioningState, - instanceView: ext.instanceView, - }); - } - } - setExtensions(exts); - }) - .finally(() => { - if (!isMounted) { - return; - } - setLoading(false); - }); + fetchExtensions().finally(() => { + if (!isMounted) { + return; + } + setLoading(false); + }); return () => { isMounted = false; }; - }, [accountEndpoint, nodeId, nodeService, poolId]); + }, [fetchExtensions]); return ( { + const hoboAcctResId = + "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/supercomputing/providers/Microsoft.Batch/batchAccounts/hobo"; + + let service: FakeAccountService; + let fakeSet: BatchFakeSet; + beforeEach(() => { + initMockBatchEnvironment(); + fakeSet = new BasicBatchFakeSet(); + service = new FakeAccountService(); + service.setFakes(fakeSet); + }); + + test("Get account by ARM resource ID", async () => { + const account = await service.get(hoboAcctResId); + expect(account?.name).toEqual("hobo"); + }); + + test("should return undefined ARM resource ID not found", async () => { + const account = await service.get( + "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/supercomputing/providers/Microsoft.Batch/batchAccounts/not-hobo" + ); + expect(account).toBeUndefined(); + }); +}); diff --git a/packages/service/src/account/__tests__/live-account-service.spec.ts b/packages/service/src/account/__tests__/live-account-service.spec.ts new file mode 100644 index 000000000..16ac5675e --- /dev/null +++ b/packages/service/src/account/__tests__/live-account-service.spec.ts @@ -0,0 +1,99 @@ +import { getArmUrl } from "@azure/bonito-core"; +import { getMockEnvironment } from "@azure/bonito-core/lib/environment"; +import { MockHttpClient, MockHttpResponse } from "@azure/bonito-core/lib/http"; +import { BatchApiVersion } from "../../constants"; +import { initMockBatchEnvironment } from "../../environment"; +import { BatchFakeSet, BasicBatchFakeSet } from "../../test-util/fakes"; +import { LiveAccountService } from "../live-account-service"; + +describe("LiveAccountService", () => { + const hoboAcctResId = + "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/supercomputing/providers/Microsoft.Batch/batchAccounts/hobo"; + + let service: LiveAccountService; + let fakeSet: BatchFakeSet; + let httpClient: MockHttpClient; + + beforeEach(() => { + initMockBatchEnvironment(); + httpClient = getMockEnvironment().getHttpClient(); + service = new LiveAccountService(); + fakeSet = new BasicBatchFakeSet(); + }); + + test("Get account by ARM resource ID", async () => { + const mockAccountRes = fakeSet.getBatchAccount(hoboAcctResId); + // change the name of the account to test bypassing the cache + const mockAccountResRenamed = { + ...mockAccountRes, + name: "hobo2", + }; + + httpClient.addExpected( + new MockHttpResponse( + `${getArmUrl()}${hoboAcctResId}?api-version=${BatchApiVersion.arm}`, + { + status: 200, + body: JSON.stringify(mockAccountRes), + } + ) + ); + + httpClient.addExpected( + new MockHttpResponse( + `${getArmUrl()}${hoboAcctResId}?api-version=${BatchApiVersion.arm}`, + { + status: 200, + body: JSON.stringify(mockAccountResRenamed), + } + ) + ); + + const account = await service.get(hoboAcctResId); + expect(account?.name).toEqual("hobo"); + + // verify that the cache is working + const account2 = await service.get(hoboAcctResId); + expect(account2?.name).toEqual("hobo"); + + // verify that the cache is bypassed + const account3 = await service.get(hoboAcctResId, { + bypassCache: true, + }); + expect(account3?.name).toEqual("hobo2"); + }); + + test("Get account by ARM resource ID error", async () => { + httpClient.addExpected( + new MockHttpResponse( + `${getArmUrl()}${hoboAcctResId}?api-version=${BatchApiVersion.arm}`, + { + status: 500, + body: "Boom", + } + ) + ); + + await expect(() => service.get(hoboAcctResId)).rejects + .toMatchInlineSnapshot(` + [Error: The Batch management plane returned an unexpected status code [unexpected 500 status] + Response body: + "Boom"] + `); + }); + + test("Return undefined if account not found", async () => { + httpClient.addExpected( + new MockHttpResponse( + `${getArmUrl()}${hoboAcctResId}?api-version=${BatchApiVersion.arm}`, + { + status: 404, + body: "Not found", + } + ) + ); + + const account = await service.get(hoboAcctResId); + expect(account).toBeUndefined(); + }); +}); diff --git a/packages/service/src/account/account-service.ts b/packages/service/src/account/account-service.ts new file mode 100644 index 000000000..d65868783 --- /dev/null +++ b/packages/service/src/account/account-service.ts @@ -0,0 +1,14 @@ +import { OperationOptions } from "@azure/bonito-core"; +import { BatchAccountOutput } from "../arm-batch-models"; + +export interface AccountService { + /** + * Get a batch account, returns undefined if not found + * @param accountResouceId The resource id of the account + * @param opts + */ + get( + accountResouceId: string, + opts?: OperationOptions + ): Promise; +} diff --git a/packages/service/src/account/fake-account-service.ts b/packages/service/src/account/fake-account-service.ts new file mode 100644 index 000000000..bb2faa18c --- /dev/null +++ b/packages/service/src/account/fake-account-service.ts @@ -0,0 +1,20 @@ +import { OperationOptions } from "@azure/bonito-core"; +import { BatchAccountOutput } from "../arm-batch-models"; +import { AccountService } from "./account-service"; +import { BatchFakeSet, BasicBatchFakeSet } from "../test-util/fakes"; + +export class FakeAccountService implements AccountService { + fakeSet: BatchFakeSet = new BasicBatchFakeSet(); + + setFakes(fakeSet: BatchFakeSet): void { + this.fakeSet = fakeSet; + } + + async get( + accountResouceId: string, + opts?: OperationOptions + ): Promise { + const result = this.fakeSet.getBatchAccount(accountResouceId); + return result; + } +} diff --git a/packages/service/src/account/index.ts b/packages/service/src/account/index.ts index 0ecccbf9d..2d449930c 100644 --- a/packages/service/src/account/index.ts +++ b/packages/service/src/account/index.ts @@ -1 +1,4 @@ export * from "./account-models"; +export * from "./account-service"; +export * from "./live-account-service"; +export * from "./fake-account-service"; diff --git a/packages/service/src/account/live-account-service.ts b/packages/service/src/account/live-account-service.ts new file mode 100644 index 000000000..a6cff3544 --- /dev/null +++ b/packages/service/src/account/live-account-service.ts @@ -0,0 +1,56 @@ +import { + CustomHttpHeaders, + OperationOptions, + getArmUrl, + getCacheManager, +} from "@azure/bonito-core"; +import { BatchAccountOutput } from "../arm-batch-models"; +import { AccountService } from "./account-service"; +import { createARMBatchClient, isUnexpected } from "../internal/arm-batch-rest"; +import { + createArmUnexpectedStatusCodeError, + parseBatchAccountIdInfo, +} from "../utils"; + +export class LiveAccountService implements AccountService { + async get( + accountResouceId: string, + opts?: OperationOptions + ): Promise { + const { subscriptionId, resourceGroupName, batchAccountName } = + parseBatchAccountIdInfo(accountResouceId); + const cacheManager = getCacheManager(); + const armBatchClient = createARMBatchClient({ + baseUrl: getArmUrl(), + }); + + const cacheKey = `get-${accountResouceId}`; + const { bypassCache } = opts ?? {}; + + const _get = async () => { + const res = await armBatchClient + .path( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Batch/batchAccounts/{accountName}", + subscriptionId, + resourceGroupName, + batchAccountName + ) + .get({ + headers: { + [CustomHttpHeaders.CommandName]: + opts?.commandName ?? "GetAccount", + }, + }); + + if (isUnexpected(res)) { + if (res.status === "404") { + return undefined; + } + throw createArmUnexpectedStatusCodeError(res); + } + + return res.body; + }; + return cacheManager.getOrAdd(cacheKey, _get, { bypassCache }); + } +} diff --git a/packages/service/src/environment/batch-dependencies.ts b/packages/service/src/environment/batch-dependencies.ts index 94d334127..4c54ce85c 100644 --- a/packages/service/src/environment/batch-dependencies.ts +++ b/packages/service/src/environment/batch-dependencies.ts @@ -1,13 +1,16 @@ import { DependencyFactories } from "@azure/bonito-core/lib/environment"; import { NodeService } from "../node"; import { PoolService } from "../pool"; +import { AccountService } from "../account"; export enum BatchDependencyName { PoolService = "poolService", NodeService = "nodeService", + AccountService = "accountService", } export interface BatchDependencyFactories extends DependencyFactories { [BatchDependencyName.PoolService]: () => PoolService; [BatchDependencyName.NodeService]: () => NodeService; + [BatchDependencyName.AccountService]: () => AccountService; } diff --git a/packages/service/src/environment/environment-util.ts b/packages/service/src/environment/environment-util.ts index 2dc157201..abcd4328f 100644 --- a/packages/service/src/environment/environment-util.ts +++ b/packages/service/src/environment/environment-util.ts @@ -12,10 +12,12 @@ import { BatchDependencyFactories, BatchDependencyName, } from "./batch-dependencies"; +import { FakeAccountService } from "../account/fake-account-service"; export const mockBatchDepFactories: Partial = { [BatchDependencyName.PoolService]: () => new FakePoolService(), [BatchDependencyName.NodeService]: () => new FakeNodeService(), + [BatchDependencyName.AccountService]: () => new FakeAccountService(), }; /** diff --git a/packages/service/src/pool/live-pool-service.ts b/packages/service/src/pool/live-pool-service.ts index e2089dbb7..f518aff20 100644 --- a/packages/service/src/pool/live-pool-service.ts +++ b/packages/service/src/pool/live-pool-service.ts @@ -2,7 +2,6 @@ import type { Pool, PoolOutput } from "./pool-models"; import type { PoolService } from "./pool-service"; import { - AbstractHttpService, CustomHttpHeaders, OperationOptions, getArmUrl, @@ -20,10 +19,7 @@ const SINGLE_POOL_PATH = const POOLS_PATH = "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Batch/batchAccounts/{accountName}/pools"; -export class LivePoolService - extends AbstractHttpService - implements PoolService -{ +export class LivePoolService implements PoolService { async createOrUpdate( poolResourceId: string, pool: Pool, diff --git a/web/src/index.tsx b/web/src/index.tsx index def1212e1..e9afdd31d 100644 --- a/web/src/index.tsx +++ b/web/src/index.tsx @@ -28,6 +28,8 @@ import { FakePoolService } from "@batch/ui-service/lib/pool"; import * as React from "react"; import * as ReactDOM from "react-dom"; import { Application } from "./components"; +import { MemoryCacheManager } from "@azure/bonito-core/lib/cache"; +import { FakeAccountService } from "@batch/ui-service/lib/account"; // Defined by webpack declare const ENV: { @@ -63,8 +65,11 @@ export async function init(rootEl: HTMLElement): Promise { [DependencyName.LocationService]: () => new FakeLocationService(), [DependencyName.Notifier]: () => new AlertNotifier(), // TODO: update with real notification implementation + [DependencyName.CacheManager]: () => new MemoryCacheManager(), [BatchDependencyName.PoolService]: () => new FakePoolService(), [BatchDependencyName.NodeService]: () => new FakeNodeService(), + [BatchDependencyName.AccountService]: () => + new FakeAccountService(), [DependencyName.ResourceGroupService]: () => new FakeResourceGroupService(), [DependencyName.StorageAccountService]: () => From 644d334d99e46a3f819903f1a66670a138e95c0f Mon Sep 17 00:00:00 2001 From: Sanjana Kapur Date: Tue, 16 Jul 2024 16:11:33 -0700 Subject: [PATCH 29/57] Add support for multiple repos to bux tooling (#2921) --- util/bux/cli.ts | 4 -- util/bux/util.ts | 172 ++++++++++++++++++++++++++++------------------- 2 files changed, 104 insertions(+), 72 deletions(-) diff --git a/util/bux/cli.ts b/util/bux/cli.ts index 5029bd581..0e6a8bca1 100755 --- a/util/bux/cli.ts +++ b/util/bux/cli.ts @@ -82,10 +82,6 @@ yargs type: "string", describe: "The path to Batch Explorer/Shared Libraries", }) - .option("paths.batchPortalExtension", { - type: "string", - describe: "The path to the Batch portal extension", - }) .option("print", { type: "boolean", describe: "Print the resultant configuration object", diff --git a/util/bux/util.ts b/util/bux/util.ts index 98389052d..42bdbdba4 100644 --- a/util/bux/util.ts +++ b/util/bux/util.ts @@ -17,19 +17,21 @@ import { export const defaultBatchExplorerHome = path.resolve(__dirname, "../../"); export const configFile = path.resolve(os.homedir(), ".config/batch/bux.json"); -const portalReactPath = "src/src/BatchExtension/Client/ReactViews"; const defaultJsonIndentSize = 2; const printJsonIndentSize = 4; export interface Configuration { paths: { batchExplorer?: string; - batchPortalExtension?: string; }; } type ConfigPath = keyof Configuration["paths"]; +export interface BuxConfig { + rootPackage: string; +} + export const info = (...args: string[]) => console.log(color.blue(...args)); export const warn = (...args: string[]) => console.warn(color.yellow(...args)); export const error = (...args: string[]) => console.error(color.red(...args)); @@ -71,6 +73,23 @@ export async function loadConfiguration(): Promise { return readJsonOrDefault(configFile); } +// Recursively searches upward from startDir (the current working directory from which the command is run) for a bux.json configuration file +export async function findBuxConfig( + startDir: string +): Promise { + let currentDir = startDir; + + while (currentDir !== path.parse(currentDir).root) { + const configPath = path.join(currentDir, "bux.json"); + if (fs.existsSync(configPath)) { + return readJsonOrDefault(configPath); + } + currentDir = path.dirname(currentDir); + } + + return null; +} + /** * Gets option from the project's editor config. * @param {string} option The config option to return @@ -222,7 +241,7 @@ function getGitInfo(path: string): GitInfo { }); } catch (e) { if (e instanceof Error) { - error(`Error retreiving Git info: ${e.message}`); + error(`Error retrieving Git info: ${e.message}`); } throw e; } @@ -252,26 +271,30 @@ function printInfo(name: string, repoPath?: string): void { } } -async function printLinkStatus(): Promise { +async function printLinkStatus(rootPackage: string): Promise { const linkChecks: boolean[] = []; - await runLinkageTask((opts: LinkOptions) => { - let isLinked = false; + await runLinkageTask( + (opts: LinkOptions) => { + let isLinked = false; - const nodeModulePath = path.join( - opts.targetPath, - "node_modules", - opts.packageName - ); + const nodeModulePath = path.join( + opts.targetPath, + "node_modules", + opts.packageName + ); - if (fs.existsSync(nodeModulePath)) { - const stats = fs.lstatSync(nodeModulePath); - if (stats.isSymbolicLink()) { - isLinked = true; + if (fs.existsSync(nodeModulePath)) { + const stats = fs.lstatSync(nodeModulePath); + if (stats.isSymbolicLink()) { + isLinked = true; + } } - } - linkChecks.push(isLinked); - }); + linkChecks.push(isLinked); + }, + undefined, + rootPackage + ); const allPackagesLinked = linkChecks.reduce((prev, curr) => prev && curr); let linkStatus; @@ -285,13 +308,17 @@ async function printLinkStatus(): Promise { export async function printStatus() { const config = await loadConfiguration(); + const buxConfig = await findBuxConfig(process.cwd()); + + if (!buxConfig) { + error("No bux.json configuration found. Exiting..."); + process.exit(1); + } try { printInfo("Batch Explorer", config.paths.batchExplorer); info(""); - printInfo("Batch portal extension", config.paths.batchPortalExtension); - info(""); - await printLinkStatus(); + await printLinkStatus(buxConfig.rootPackage); } catch (e) { error("Config errors found. Run `bux configure` to re-configure."); throw e; @@ -354,44 +381,62 @@ export async function gatherBuildResults(basePath: string) { } export async function linkLocalProjects() { - runLinkageTask((opts: LinkOptions) => { - info(`Linking ${opts.versionedPackageName}`); + const buxConfig = await findBuxConfig(process.cwd()); - const nodeModulesPath = path.join(opts.targetPath, "node_modules"); - const targetPath = path.join(nodeModulesPath, opts.packageName); + if (!buxConfig) { + error("No bux.json configuration found. Exiting..."); + process.exit(1); + } - if (!fs.existsSync(nodeModulesPath)) { - throw new Error( - `Failed to link ${opts.packageName}: ${nodeModulesPath} doesn't exist` - ); - } - if (!fs.lstatSync(nodeModulesPath).isDirectory()) { - throw new Error( - `Failed to link ${opts.packageName}: ${nodeModulesPath} is not a directory` - ); - } + runLinkageTask( + (opts: LinkOptions) => { + info(`Linking ${opts.versionedPackageName}`); - if (fs.existsSync(targetPath)) { - if (fs.lstatSync(targetPath).isSymbolicLink()) { - // Early out if target is already a symlink - console.warn( - `${targetPath} is already a symbolic link - skipping` + const nodeModulesPath = path.join(opts.targetPath, "node_modules"); + const targetPath = path.join(nodeModulesPath, opts.packageName); + + if (!fs.existsSync(nodeModulesPath)) { + throw new Error( + `Failed to link ${opts.packageName}: ${nodeModulesPath} doesn't exist` + ); + } + if (!fs.lstatSync(nodeModulesPath).isDirectory()) { + throw new Error( + `Failed to link ${opts.packageName}: ${nodeModulesPath} is not a directory` ); - return; + } + + if (fs.existsSync(targetPath)) { + if (fs.lstatSync(targetPath).isSymbolicLink()) { + // Early out if target is already a symlink + console.warn( + `${targetPath} is already a symbolic link - skipping` + ); + return; + } else { + shell.rm("-rf", targetPath); + } } else { - shell.rm("-rf", targetPath); + console.warn( + `No directory for ${opts.packageName} found in node_modules.` + ); } - } else { - console.warn( - `No directory for ${opts.packageName} found in node_modules.` - ); - } - shell.ln("-s", opts.packagePath, targetPath); - }); + shell.ln("-s", opts.packagePath, targetPath); + }, + undefined, + buxConfig.rootPackage + ); } export async function unlinkLocalProjects() { + const buxConfig = await findBuxConfig(process.cwd()); + + if (!buxConfig) { + error("No bux.json configuration found. Exiting..."); + process.exit(1); + } + runLinkageTask( (opts: LinkOptions) => { info(`Unlinking ${opts.versionedPackageName}`); @@ -421,13 +466,13 @@ export async function unlinkLocalProjects() { info("Running `npm install` to restore packages..."); shell.cd(targetPath); shell.exec(`npm install -s`); - } + }, + buxConfig.rootPackage ); } export type ConfigureCommandOptions = { "paths.batchExplorer"?: string; - "paths.batchPortalExtension"?: string; print: boolean; }; @@ -448,16 +493,10 @@ export async function configure(options: ConfigureCommandOptions) { } } else { const answers = await inquirer.prompt([ - { - name: "batchPortalExtension", - message: "Path to Batch Portal Extension", - default: config.paths.batchPortalExtension, - validate: validateDirectory, - type: "string", - }, { name: "batchExplorer", - message: "Path to Batch Explorer", + message: + "Path to Batch Explorer (use /mnt/c/... for WSL, e.g., CycleCloud):", default: config.paths.batchExplorer || defaultBatchExplorerHome, validate: validateDirectory, type: "string", @@ -508,20 +547,17 @@ interface LinkOptions { */ async function runLinkageTask( perPackageCallback: (opts: LinkOptions) => void, - cleanupCallback?: (targetPath: string) => void + cleanupCallback?: (targetPath: string) => void, + rootPackage?: string ) { const config = await loadConfiguration(); - if (!config.paths || !config.paths.batchPortalExtension) { + if (!rootPackage) { error( - `Configuration does not contain portal paths. ` + - `Run the 'configure' command to fix.` + `No root package path found. Ensure bux.json contains the rootPackage path.` ); return; } - const targetPath = path.join( - config.paths.batchPortalExtension, - portalReactPath - ); + const targetPath = path.join(process.cwd(), rootPackage); const targetPackageJson = path.join(targetPath, "package.json"); if (!fs.existsSync(targetPackageJson)) { error(`No package.json in target directory ${targetPath}`); @@ -575,7 +611,7 @@ function isConfigurationObject(object: unknown): object is Configuration { } function isConfigPathKey(key: string): key is ConfigPath { - return ["batchExplorer", "batchPortalExtension"].includes(key); + return ["batchExplorer"].includes(key); } function printJson(json: object) { From cb5b5d606d59bdd230f8a06adb93241a84c31abd Mon Sep 17 00:00:00 2001 From: Sanjana Kapur Date: Mon, 29 Jul 2024 12:14:02 -0700 Subject: [PATCH 30/57] Fix regressions in bux script logic (#2922) --- util/bux/util.ts | 51 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/util/bux/util.ts b/util/bux/util.ts index 42bdbdba4..5678b9822 100644 --- a/util/bux/util.ts +++ b/util/bux/util.ts @@ -76,18 +76,21 @@ export async function loadConfiguration(): Promise { // Recursively searches upward from startDir (the current working directory from which the command is run) for a bux.json configuration file export async function findBuxConfig( startDir: string -): Promise { +): Promise<{ buxConfig: BuxConfig | null; rootDir: string }> { let currentDir = startDir; while (currentDir !== path.parse(currentDir).root) { const configPath = path.join(currentDir, "bux.json"); if (fs.existsSync(configPath)) { - return readJsonOrDefault(configPath); + return { + buxConfig: readJsonOrDefault(configPath), + rootDir: currentDir, + }; } currentDir = path.dirname(currentDir); } - return null; + return { buxConfig: null, rootDir: "" }; } /** @@ -296,7 +299,10 @@ async function printLinkStatus(rootPackage: string): Promise { rootPackage ); - const allPackagesLinked = linkChecks.reduce((prev, curr) => prev && curr); + const allPackagesLinked = linkChecks.reduce( + (prev, curr) => prev && curr, + true + ); let linkStatus; if (allPackagesLinked) { linkStatus = color.green("active"); @@ -308,9 +314,9 @@ async function printLinkStatus(rootPackage: string): Promise { export async function printStatus() { const config = await loadConfiguration(); - const buxConfig = await findBuxConfig(process.cwd()); + const { buxConfig, rootDir } = await findBuxConfig(process.cwd()); - if (!buxConfig) { + if (!buxConfig || !rootDir) { error("No bux.json configuration found. Exiting..."); process.exit(1); } @@ -318,6 +324,11 @@ export async function printStatus() { try { printInfo("Batch Explorer", config.paths.batchExplorer); info(""); + const gitRoot = findGitRoot(process.cwd()); + if (gitRoot) { + printInfo("Current repository", gitRoot); + info(""); + } await printLinkStatus(buxConfig.rootPackage); } catch (e) { error("Config errors found. Run `bux configure` to re-configure."); @@ -381,9 +392,9 @@ export async function gatherBuildResults(basePath: string) { } export async function linkLocalProjects() { - const buxConfig = await findBuxConfig(process.cwd()); + const { buxConfig, rootDir } = await findBuxConfig(process.cwd()); - if (!buxConfig) { + if (!buxConfig || !rootDir) { error("No bux.json configuration found. Exiting..."); process.exit(1); } @@ -430,9 +441,9 @@ export async function linkLocalProjects() { } export async function unlinkLocalProjects() { - const buxConfig = await findBuxConfig(process.cwd()); + const { buxConfig, rootDir } = await findBuxConfig(process.cwd()); - if (!buxConfig) { + if (!buxConfig || !rootDir) { error("No bux.json configuration found. Exiting..."); process.exit(1); } @@ -557,7 +568,14 @@ async function runLinkageTask( ); return; } - const targetPath = path.join(process.cwd(), rootPackage); + + const { buxConfig, rootDir } = await findBuxConfig(process.cwd()); + if (!buxConfig || !rootDir) { + error(`No bux.json configuration found. Exiting...`); + process.exit(1); + } + + const targetPath = path.join(rootDir, rootPackage); const targetPackageJson = path.join(targetPath, "package.json"); if (!fs.existsSync(targetPackageJson)) { error(`No package.json in target directory ${targetPath}`); @@ -565,7 +583,6 @@ async function runLinkageTask( } const targetConf = readJsonOrDefault(targetPackageJson); - const packageRoot = path.join( config.paths.batchExplorer || defaultBatchExplorerHome, "packages" @@ -617,3 +634,13 @@ function isConfigPathKey(key: string): key is ConfigPath { function printJson(json: object) { info(JSON.stringify(json, null, printJsonIndentSize)); } + +function findGitRoot(currentDir: string): string | null { + while (currentDir !== path.parse(currentDir).root) { + if (fs.existsSync(path.join(currentDir, ".git"))) { + return currentDir; + } + currentDir = path.dirname(currentDir); + } + return null; +} From 12a901880c9dabf416207389238ec50370d2753b Mon Sep 17 00:00:00 2001 From: Sanjana Kapur Date: Fri, 16 Aug 2024 19:18:59 -0700 Subject: [PATCH 31/57] Remove unused localization code (#2924) --- desktop/.gitignore | 5 - desktop/i18n-deprecated/resources.cs.json | 128 ------- desktop/i18n-deprecated/resources.de.json | 109 ------ desktop/i18n-deprecated/resources.es.json | 171 ---------- desktop/i18n-deprecated/resources.fr.json | 203 ------------ desktop/i18n-deprecated/resources.hu.json | 21 -- desktop/i18n-deprecated/resources.it.json | 170 ---------- desktop/i18n-deprecated/resources.ja.json | 312 ------------------ desktop/i18n-deprecated/resources.ko.json | 282 ---------------- desktop/i18n-deprecated/resources.nl.json | 33 -- desktop/i18n-deprecated/resources.pl.json | 143 -------- desktop/i18n-deprecated/resources.pt-BR.json | 311 ----------------- desktop/i18n-deprecated/resources.pt.json | 121 ------- desktop/i18n-deprecated/resources.ru.json | 99 ------ desktop/i18n-deprecated/resources.sv.json | 21 -- desktop/i18n-deprecated/resources.tr.json | 63 ---- .../i18n-deprecated/resources.zh-Hans.json | 307 ----------------- .../i18n-deprecated/resources.zh-Hant.json | 91 ----- desktop/package.json | 5 +- desktop/scripts/i18n/create-xliff.ts | 29 -- desktop/scripts/i18n/digest-xliff.ts | 35 -- desktop/scripts/i18n/generate.ts | 25 -- desktop/scripts/i18n/load-dev-translations.ts | 21 -- 23 files changed, 1 insertion(+), 2704 deletions(-) delete mode 100644 desktop/i18n-deprecated/resources.cs.json delete mode 100644 desktop/i18n-deprecated/resources.de.json delete mode 100644 desktop/i18n-deprecated/resources.es.json delete mode 100644 desktop/i18n-deprecated/resources.fr.json delete mode 100644 desktop/i18n-deprecated/resources.hu.json delete mode 100644 desktop/i18n-deprecated/resources.it.json delete mode 100644 desktop/i18n-deprecated/resources.ja.json delete mode 100644 desktop/i18n-deprecated/resources.ko.json delete mode 100644 desktop/i18n-deprecated/resources.nl.json delete mode 100644 desktop/i18n-deprecated/resources.pl.json delete mode 100644 desktop/i18n-deprecated/resources.pt-BR.json delete mode 100644 desktop/i18n-deprecated/resources.pt.json delete mode 100644 desktop/i18n-deprecated/resources.ru.json delete mode 100644 desktop/i18n-deprecated/resources.sv.json delete mode 100644 desktop/i18n-deprecated/resources.tr.json delete mode 100644 desktop/i18n-deprecated/resources.zh-Hans.json delete mode 100644 desktop/i18n-deprecated/resources.zh-Hant.json delete mode 100644 desktop/scripts/i18n/create-xliff.ts delete mode 100644 desktop/scripts/i18n/digest-xliff.ts delete mode 100644 desktop/scripts/i18n/generate.ts delete mode 100644 desktop/scripts/i18n/load-dev-translations.ts diff --git a/desktop/.gitignore b/desktop/.gitignore index 26f6f36d6..00a3cb5bd 100644 --- a/desktop/.gitignore +++ b/desktop/.gitignore @@ -10,8 +10,3 @@ logs/ coverage.lcov documentation/ .python-version - -# Ignore the english compiled file -i18n-deprecated/resources.en.json -i18n-deprecated/xliff/ -i18n-deprecated/xliffs/ diff --git a/desktop/i18n-deprecated/resources.cs.json b/desktop/i18n-deprecated/resources.cs.json deleted file mode 100644 index 14a08a085..000000000 --- a/desktop/i18n-deprecated/resources.cs.json +++ /dev/null @@ -1,128 +0,0 @@ -{ - "account-details.resources": "Prostředky", - "account-summary-card.url": "Adresa URL", - "add-certificate-form.certificate.select": "Vyberte certifikát", - "add-task-form.action": "Přidat", - "add-task-form.subtitle": "Přidat úkol do vybrané úlohy", - "add-task-form.title": "Přidat úlohu", - "common.apply": "Použít", - "common.configuration": "CONFIGURATION", - "common.loading": "Načítání", - "common.no": "Ne", - "common.none": "žádné", - "common.yes": "Ano", - "duration-picker.unit.custom": "Vlastní (formát ISO)", - "duration-picker.unit.days": "Dny", - "duration-picker.unit.hours": "Hodiny", - "duration-picker.unit.minutes": "Minuty", - "duration-picker.unit.seconds": "Sekundy", - "duration-picker.unit.unlimited": "Neomezené", - "entity-command.confirm.multiple.title": "Opravdu chcete {action} tyto položky {type} (počet: {count})?", - "entity-command.confirm.single.description": "Chystáte se {action} položku {entityId}.", - "entity-command.confirm.single.title": "Opravdu chcete {action} tuto položku {type}?", - "file-explorer.path": "PATH", - "form-footer.buttons.cancel": "Zrušit", - "form-footer.buttons.save": "Uložit", - "job-progress-status.inaccurate": "Počet úkolů nemusí být v reálném čase přesný.", - "main-menu.help.label": "Nápověda", - "main-navigation.certificates": "Certifikáty", - "main-navigation.dashboard": "Pomlčka", - "main-navigation.data": "Data", - "main-navigation.gallery": "Galerie", - "main-navigation.jobs": "Úlohy", - "main-navigation.jobschedules": "Plány úlohy", - "main-navigation.packages": "Balíčky", - "main-navigation.pools": "Fondy", - "main-navigation.profile": "Profil", - "models.pool": "Fond", - "models.pools": "Fondy", - "models.storageAccount": "Účet úložiště", - "node-configuration.allocation-time": "Čas přidělení", - "node-configuration.end-time": "Koncový čas", - "node-configuration.exit-code": "Ukončovací kód", - "node-configuration.external-ip": "Externí IP", - "node-configuration.id": "ID", - "node-configuration.internal-ip": "Interní IP", - "node-configuration.is-dedicated": "Je vyhrazeno", - "node-configuration.last-boot-time": "Poslední čas spuštění", - "node-configuration.node-agent-version": "Verze agenta uzlu", - "node-configuration.node-size": "Velikost uzlu", - "node-configuration.retry-count": "Počet opakování", - "node-configuration.run-time": "Doba provádění", - "node-configuration.running-tasks-count": "Spuštěné úlohy", - "node-configuration.scheduling-state": "Stav plánování", - "node-configuration.start-task-completed": "Dokončeno v", - "node-configuration.start-task-execution": "Spustit provádění úlohy", - "node-configuration.start-task-not-started": "Spustit provádění úlohy", - "node-configuration.start-task-running": "Spuštění pro", - "node-configuration.start-time": "Čas zahájení", - "node-configuration.state": "Stav", - "node-configuration.state-transition-time": "Čas změny stavu", - "node-configuration.total-tasks-run": "Celkový běh úlohy", - "node-configuration.total-tasks-succeeded": "Celkem úspěšných úloh", - "node-configuration.url": "Adresa URL", - "partial-sort-warning.load-all": "Načíst vše (Může to trvat dlouho.)", - "partial-sort-warning.loading-all": "Načítají se všechny entity. Počkejte prosím.", - "partial-sort-warning.manual-update": "Seznam se nebude aktualizovat automaticky při řazení (z důvodu výkonu).", - "partial-sort-warning.message": "Všechny entity nebyly zavedeny – zde se zobrazuje částečné řazení.", - "partial-sort-warning.update": "Aktualizovat", - "pool-picker.reset": "Obnovit", - "profile-button.about": "O aplikaci", - "profile-button.logout": "Odhlášení", - "profile-button.profile": "Profil", - "profile-button.report": "Nahlásit chybu nebo žádost o funkci", - "profile-button.settings": "Nastavení", - "profile-button.thirdPartyNotices": "Oznámení týkající se třetích stran", - "profile-button.viewLogs": "Zobrazit protokoly", - "profile-button.viewTheme": "Zobrazit barvy motivu", - "rerun-task-form.action": "Spustit znovu", - "rerun-task-form.subtitle": "Tímto se úkol odstraní a vytvoří se nový se stejným ID.", - "rerun-task-form.title": "Opakovat úlohu", - "resource-permission-button.none": "žádné", - "resource-permission-button.permission": "Oprávnění", - "settings.general": "Obecné", - "settings.saved": "Uloženo", - "settings.title": "Nastavení", - "task-commands.delete": "Odstranit", - "task-configuration.affinityId.label": "ID spřažení", - "task-configuration.applicationPackages.application": "Aplikace", - "task-configuration.applicationPackages.label": "Balíčky aplikací", - "task-configuration.applicationPackages.none": "Tato úloha neobsahuje žádné odkazy na balíčky aplikací.", - "task-configuration.applicationPackages.summary": "Odkaz na balíček aplikace {count}", - "task-configuration.applicationPackages.version": "VERSION", - "task-configuration.commandLine.label": "Příkazový řádek", - "task-configuration.computeNode": "Výpočetní uzel", - "task-configuration.creationTime.label": "Čas vytvoření", - "task-configuration.displayName.label": "Zobrazený název", - "task-configuration.exitConditions.default": "Výchozí", - "task-configuration.exitConditions.label": "Podmínky ukončení", - "task-configuration.exitConditions.noOpExitCodes": "Ukončení kódy, které nedělají nic", - "task-configuration.exitConditions.onSchedulingError": "Při chybě plánování", - "task-configuration.exitConditions.terminateJobExitCodes": "Kódy ukončení, které ukončí úlohu", - "task-configuration.general": "Obecné", - "task-configuration.id.label": "ID", - "task-configuration.lastModified.label": "Naposledy upraveno", - "task-configuration.multiInstanceSettings.coordinationCommandLine.label": "Koordinační příkazový řádek", - "task-configuration.multiInstanceSettings.label": "Nastavení více instancí", - "task-configuration.multiInstanceSettings.numberOfInstances.label": "Počet instancí", - "task-configuration.nodeId.label": "ID uzlu", - "task-configuration.nodeUrl.label": "Adresa URL uzlu", - "task-configuration.outputFiles.destination": "Cíl", - "task-configuration.outputFiles.label": "Výstupní soubory", - "task-configuration.outputFiles.pattern": "Vzorek", - "task-configuration.outputFiles.uploadWhen": "Nahrát když", - "task-configuration.pool.label": "Fond", - "task-configuration.previousState.label": "Předchozí stav", - "task-configuration.previousStateTransitionTime.label": "Čas přechodu z předchozího stavu", - "task-configuration.state.label": "Stav", - "task-configuration.stateTransitionTime.label": "Čas přechodu do stavu", - "task-configuration.taskRootDir.label": "Kořenový adresář úlohy", - "task-configuration.taskRootDirUrl.label": "Adresa URL kořenového adresáře úlohy", - "task-configuration.userIdentity.label": "Identita uživatele", - "task-dependency-browser.no-dependency": "Tato úloha není závislá na jiných úlohách.", - "task-resource-files.fileMode": "Režim souboru", - "task-resource-files.filePath": "Cesta k souboru uzlu", - "task-resource-files.none": "Tato úloha neobsahuje žádné soubory prostředků.", - "user-account-picker.password": "Heslo", - "user-account-picker.username": "Uživatelské jméno" -} \ No newline at end of file diff --git a/desktop/i18n-deprecated/resources.de.json b/desktop/i18n-deprecated/resources.de.json deleted file mode 100644 index d4a0e89ac..000000000 --- a/desktop/i18n-deprecated/resources.de.json +++ /dev/null @@ -1,109 +0,0 @@ -{ - "account-cost-card.subtitle": "Zeigt die gemeldeten Vorsteuerkosten. Beachten Sie, dass diese möglicherweise unvollständig sind.", - "account-details.monitoring": "Überwachung", - "account-details.resources": "Ressourcen", - "account-summary-card.url": "URL", - "add-certificate-form.certificate.label": "Zertifikat", - "add-certificate-form.certificate.required": "Bitte wählen Sie eine gültige Zertifikatdatei aus.", - "add-certificate-form.certificate.select": "Zertifikat auswählen", - "add-certificate-form.title": "Zertifikat erstellen", - "add-task-form.action": "Hinzufügen", - "common.apply": "Anwenden", - "common.back": "zurück", - "common.configuration": "CONFIGURATION", - "common.confirm": "Bestätigen", - "common.loading": "Laden", - "common.no": "Nein", - "common.none": "NONE", - "common.refresh": "Aktualisieren", - "common.required": "Erforderlich", - "common.updated": "Updated", - "common.yes": "Ja", - "create-new-aad-app.create": "Erstellen", - "sig-image-picker.sigImage.label": "Bild", - "datetime-picker.date": "Date", - "datetime-picker.time": "Zeit", - "duration-picker.unit.custom": "Benutzerdefiniert (ISO-Format)", - "duration-picker.unit.days": "Tage", - "duration-picker.unit.hours": "Stunden", - "duration-picker.unit.label": "Einheit", - "duration-picker.unit.minutes": "Minuten", - "duration-picker.unit.seconds": "Sekunden", - "duration-picker.unit.unlimited": "Unbegrenzt", - "edit-certificate-references-form.updated": "Die Zertifikate für {poolId} wurden aktualisiert.", - "editable-table.deleteRow": "Zeile löschen", - "file-explorer.path": "Pfad", - "form-footer.buttons.cancel": "Abbrechen", - "form-footer.buttons.save": "Speichern", - "form-footer.buttons.select": "Auswählen", - "gallery.actions": "Aktionen", - "job-state.completed.allTasksCompleted.message": "Wenn alle Aufgaben abgeschlossen sind, ist der Job erfolgreich", - "job-state.disabling.message": "Job wird gerade deaktiviert", - "main-menu.help.label": "Hilfe", - "main-menu.help.privacyStatement": "Datenschutzbestimmungen", - "main-navigation.certificates": "Zertifikate", - "main-navigation.dashboard": "Bindestrich", - "main-navigation.data": "Daten", - "main-navigation.gallery": "Galerie", - "main-navigation.jobs": "Aufträge", - "main-navigation.jobschedules": "Auftragszeitpläne", - "main-navigation.packages": "Pakete", - "main-navigation.pools": "Pools", - "main-navigation.profile": "Profil", - "models.container": "Container", - "models.node": "Knoten", - "models.pools": "Pools", - "models.storageAccount": "Speicherkonto", - "node-configuration.end-time": "Endzeit", - "node-configuration.id": "ID", - "node-configuration.start-time": "Startzeit", - "node-configuration.state": "Status", - "node-configuration.url": "URL", - "partial-sort-warning.update": "Aktualisieren", - "pool-graphs.cpu": "CPU", - "pool-graphs.diskIO": "Datenträger-E/A", - "pool-graphs.last": "Last", - "pool-graphs.memory": "Speicher", - "pool-graphs.network": "Netzwerk", - "pool-graphs.timespan.1h": "1 Stunde", - "pool-graphs.timespan.24h": "24 Stunden", - "pool-os-picker.category.container": "Container", - "pool-os-picker.category.distributions": "Distributionen", - "pool-os-picker.category.rendering": "Grafik und Rendering", - "pool-picker.reset": "Zurücksetzen", - "pool-scale-picker.type.autoscale": "Automatische Skalierung", - "profile-button.about": "Info", - "profile-button.profile": "Profil", - "profile-button.settings": "Einstellungen", - "profile-button.viewLogs": "Logs anzeigen", - "programmatic-usage.authenticationType": "Authentifizierungstyp", - "programmatic-usage.credentials": "Anmeldeinformationen", - "rerun-task-form.action": "Erneut ausführen", - "resource-permission-button.none": "NONE", - "resource-permission-button.permission": "Berechtigung", - "settings.general": "Allgemein", - "settings.saved": "Gespeichert", - "settings.title": "Einstellungen", - "task-commands.delete": "Löschen", - "task-commands.terminate": "Beenden", - "task-configuration.applicationPackages.application": "Anwendung", - "task-configuration.applicationPackages.version": "VERSION", - "task-configuration.commandLine.label": "Befehlszeile", - "task-configuration.creationTime.label": "Erstellungszeit", - "task-configuration.displayName.label": "Anzeigename", - "task-configuration.exitConditions.default": "Standard", - "task-configuration.exitConditions.fileUploadError": "Fehler beim Upload der Datei", - "task-configuration.general": "Allgemein", - "task-configuration.id.label": "ID", - "task-configuration.lastModified.label": "Zuletzt geändert", - "task-configuration.multiInstanceSettings.coordinationCommandLine.label": "Koordinationsbefehlzeile", - "task-configuration.nodeId.label": "Knoten-ID", - "task-configuration.outputFiles.destination": "Ziel", - "task-configuration.outputFiles.pattern": "Muster", - "task-configuration.state.label": "Status", - "task-configuration.userIdentity.label": "Benutzeridentität", - "user-account-picker.password": "Kennwort", - "user-account-picker.runAsAdmin": "Als Admin ausführen", - "user-account-picker.username": "Benutzername", - "virtual-network-picker.subnet": "Subnetz" -} diff --git a/desktop/i18n-deprecated/resources.es.json b/desktop/i18n-deprecated/resources.es.json deleted file mode 100644 index 68677fb49..000000000 --- a/desktop/i18n-deprecated/resources.es.json +++ /dev/null @@ -1,171 +0,0 @@ -{ - "account-cost-card.subtitle": "Esto está mostrando el informe de costoregistrado antes de impuestos . Tenga en cuenta que el costo podría ser parcial.", - "account-cost-card.title": "Costo diario", - "account-cost-card.unsupportedSubscription": "No puede ver el costo de este suscripción (No soportado)", - "account-details.resources": "Recursos", - "account-monitoring.notARM": "El monitoreo de cuenta está habilitado únicamente para cuentas ARM batch.", - "account-summary-card.resourceGroup": "Grupo de recursos", - "account-summary-card.subscription": "Suscripción", - "account-summary-card.url": "URL", - "add-certificate-form.certificate.description": "Seleccione un certificado (.pfx o .cer) que cargar", - "add-certificate-form.certificate.invalid": "El certificado debe ser un archivo CER o PFX válido", - "add-certificate-form.certificate.label": "Certificado", - "add-certificate-form.certificate.required": "Por favor, seleccione un archivo de certificado válido", - "add-certificate-form.certificate.select": "Selección de certificado", - "add-certificate-form.password.label": "Contraseña del certificado", - "add-certificate-form.title": "Crear certificado", - "add-task-form.action": "Agregar", - "add-task-form.subtitle": "Añadir una tarea al trabajo seleccionado", - "add-task-form.title": "Añadir tarea", - "batch-account-create.accountName.maxlength": "El Nombre de cuenta tiene una longitud máxima de 64 caracteres", - "batch-account-create.accountName.required": "Nombre de cuenta es un campo obligatorio", - "batch-account-create.location.reachedQuota": "Ya ha alcanzado el cupo de {used} de {quota} cuentas para la suscripción «{subscription}» en esta ubicación. Puede solicitar un aumento al cupo de la cuenta, crear la cuenta en otra ubicación, o bien, crear la cuenta en otra suscripción.", - "batch-account-create.location.required": "Ubicación es un campo obligatorio", - "batch-account-create.storageAccount.missingSubscription": "Especifique la suscripción y la ubicación antes de escoger una cuenta de almacenamiento.", - "blob-container-picker.loading": "Cargando los contenedores", - "browse-layout.openedAdvancedFilter": "Abrió la hoja filtro avanzado", - "certificate-references-picker.duplicate": "No puede referenciar dos veces el mismo certificado {thumbprint}", - "certificate-references-picker.noCertificates": "No se encontró certificado(s) para esta cuenta de batch, por favor cargue su certificado(s) primero.", - "common.apply": "Aplicar", - "common.back": "Atrás", - "common.configuration": "CONFIGURACIÓN", - "common.confirm": "Confirmar", - "common.loading": "Cargando", - "common.no": "No", - "common.none": "NONE", - "common.refresh": "Actualizar", - "common.required": "Requerido", - "common.updated": "Actualizado", - "common.yes": "Sí", - "create-new-aad-app.create": "Crear", - "create-new-aad-app.title": "Crear una aplicación nueva", - "sig-image-picker.sigImage.label": "Imagen", - "datetime-picker.currentTimeZone": "Zona horaria actual", - "datetime-picker.date": "Fecha", - "datetime-picker.time": "Tiempo", - "duration-picker.unit.custom": "Personalizado (formato ISO)", - "duration-picker.unit.days": "Días", - "duration-picker.unit.hours": "Horas", - "duration-picker.unit.minutes": "Minutos", - "duration-picker.unit.seconds": "Segundos", - "duration-picker.unit.unlimited": "Sin límite", - "editable-table.deleteRow": "Eliminar fila", - "entity-command.confirm.multiple.title": "¿Confirma que desea {action} estos {count} {type}?", - "entity-configuration.viewAsJSON": "Ver como JSON", - "file-explorer.collapseAll": "Contraer todo", - "file-explorer.noFiles": "No hay archivos", - "file-explorer.path": "PATH", - "file-explorer.unknownFile": "No se puede encontrar este archivo. Compruebe la ruta de acceso.", - "file-viewer-container.notFound": "El archivo {filename} no existe.", - "file-viewer-container.unkownFileType": "Este archivo tiene una extensión desconocida. ¿Desea abrirlo?", - "form-footer.buttons.andClose": "{action} y cerrar", - "form-footer.buttons.cancel": "Cancelar", - "form-footer.buttons.normalForm": "Cambiar a la forma clásica", - "form-footer.buttons.save": "Guardar", - "form-footer.buttons.select": "Seleccionar", - "gallery.actions": "Acciones", - "gallery.title": "Aplicaciones de Galería", - "job-state.completed.jmcomplete.message": "Trabajo completado correctamente al finalizar la tarea del administrador", - "job-state.completed.message": "El trabajo se ha completado. No se aceptará ninguna tarea más.", - "job-state.completed.taskfailed.message": "Trabajo completado pero con un fallo por fallo de una tarea.", - "job-state.deleting.message": "El trabajo está eliminándose", - "job-state.disabled.message": "El trabajo está desactivado. No se ejecutará ninguna tarea.", - "job-state.enabling.message": "El trabajo ha regresado del estado desactivado", - "location-picker.noLocationInSubscription": "No hay ubicaciones disponibles en la suscripción «{name}»", - "main-menu.help.label": "Ayuda", - "main-menu.help.privacyStatement": "Declaración de privacidad", - "main-menu.help.reportIssue": "Comunicar un problema", - "main-menu.help.viewLicense": "Ver licencia", - "main-navigation.certificates": "Certificados", - "main-navigation.dashboard": "Tablero", - "main-navigation.data": "Datos", - "main-navigation.gallery": "Galería", - "main-navigation.jobs": "Trabajos", - "main-navigation.jobschedules": "Programas de trabajos", - "main-navigation.packages": "Paquetes", - "main-navigation.pools": "Grupos", - "main-navigation.profile": "Perfil", - "models.container": "Contenedor", - "models.node": "Nodo", - "models.nodes": "Nodos", - "models.pools": "Grupos", - "models.storageAccount": "Cuenta de almacenamiento", - "node-configuration.end-time": "Hora de finalización", - "node-configuration.id": "ID.", - "node-configuration.run-time": "Tiempo de ejecución", - "node-configuration.running-tasks-count": "Tareas en ejecución", - "node-configuration.scheduling-state": "Estado de Programación", - "node-configuration.start-task-execution": "Iniciar ejecución de tarea", - "node-configuration.start-task-not-started": "Iniciar ejecución de tarea", - "node-configuration.start-time": "Hora de inicio", - "node-configuration.state": "Estado", - "node-configuration.state-transition-time": "Tiempo de transición de estado", - "node-configuration.total-tasks-run": "Ejecución de tarea completa", - "node-configuration.url": "URL", - "partial-sort-warning.loading-all": "Cargando todas las entidades. Espere.", - "partial-sort-warning.update": "Actualizar", - "pool-commands.resize": "Redimiensionar", - "pool-details.graphs": "Gráficos", - "pool-details.openInNewWindow": "Abrir en una ventana nueva", - "pool-graphs.cpu": "CPU", - "pool-graphs.diskIO": "E/S del disco", - "pool-graphs.diskUsage": "Uso de disco", - "pool-graphs.last": "Último", - "pool-graphs.memory": "Memoria", - "pool-graphs.network": "Red", - "pool-graphs.notEnabled": "CPU, memoria, disco, etc.", - "pool-graphs.timespan.1h": "1 hora", - "pool-graphs.timespan.label": "Gráficos de intervalo de tiempo", - "pool-os-picker.category.distributions": "Distribuciones", - "pool-picker.filterByID": "Buscar por id.", - "pool-picker.reset": "Restablecer", - "pool-scale-picker.evaluationInterval.label": "Intervalo de evaluación de fórmulas", - "pool-scale-picker.resizeTimeout.label": "Cambiar el tamaño de tiempo de espera", - "pool-scale-picker.type.label": "Tipo de escala", - "profile-button.about": "Acerca de", - "profile-button.profile": "Perfil", - "profile-button.report": "Informar de un error o solicitar una característica", - "profile-button.settings": "Configuración", - "profile-button.viewLogs": "Ver registros", - "profile-button.viewTheme": "Ver colores del tema", - "programmatic-usage.authenticationType": "Tipo de autenticación", - "programmatic-usage.credentials": "Credenciales", - "rerun-task-form.action": "Volver a ejecutar", - "rerun-task-form.title": "Volver a ejecutar tarea", - "resource-permission-button.giveRole": "Papel de dar {rol}", - "resource-permission-button.none": "NONE", - "resource-permission-button.permission": "Permiso", - "resource-permission-button.removeAccess": "Eliminar el acceso", - "resourcefile-picker.blobPrefix": "Prefijo BLOB", - "settings.general": "General", - "settings.title": "Configuración", - "task-commands.delete": "Eliminar", - "task-commands.terminate": "Terminar", - "task-configuration.affinityId.label": "Id de afinidad", - "task-configuration.applicationPackages.application": "Aplicación", - "task-configuration.applicationPackages.summary": "{count} referencias al paquete de aplicación", - "task-configuration.applicationPackages.version": "Versión", - "task-configuration.commandLine.label": "Línea de comandos", - "task-configuration.computeNode": "Nodo de computación", - "task-configuration.displayName.label": "Nombre para mostrar", - "task-configuration.exitConditions.default": "Predeterminado", - "task-configuration.exitConditions.noOpExitCodes": "Códigos de salida que no hacen nada", - "task-configuration.general": "General", - "task-configuration.id.label": "ID.", - "task-configuration.lastModified.label": "Última modificación", - "task-configuration.multiInstanceSettings.coordinationCommandLine.label": "Línea de comandos de coordinación", - "task-configuration.outputFiles.destination": "Destino", - "task-configuration.outputFiles.pattern": "Patrón", - "task-configuration.outputFiles.uploadWhen": "Subir cuando", - "task-configuration.state.label": "Estado", - "task-configuration.taskRootDir.label": "Directorio raíz de la tarea", - "task-node-info.nodeNotFound": "Ya no existe el nodo Compute", - "task-resource-files.fileMode": "Modo de archivo", - "task-resource-files.httpUrl": "Url http", - "time-range-picker.customRange": "Rango personalizado", - "time-range-picker.timeRange": "Rango de tiempo", - "user-account-picker.loginMode": "Modo de conexión", - "user-account-picker.password": "Contraseña", - "user-account-picker.username": "Nombre de usuario", - "user-account-picker.windowsConfiguration": "Configuración específica de Windows" -} diff --git a/desktop/i18n-deprecated/resources.fr.json b/desktop/i18n-deprecated/resources.fr.json deleted file mode 100644 index 4e23ffe98..000000000 --- a/desktop/i18n-deprecated/resources.fr.json +++ /dev/null @@ -1,203 +0,0 @@ -{ - "aad-app-secret-picker.description.label": "Description (facultative)", - "aad-app-secret-picker.secret.label": "Secret. Il sera généré automatiquement s'il n'est pas fourni", - "account-cost-card.title": "Coût journalier", - "account-cost-card.total": "Total pour la période de facturation", - "account-cost-card.unsupportedSubscription": "Impossible d’afficher le coût pour cet abonnement(Non supporté)", - "account-cost-card.usingLocalAccount": "Le coût ne peut pas être obtenu avec le compte local de lot", - "account-details.monitoring": "Monitorage", - "account-details.resources": "Ressources", - "account-summary-card.resourceGroup": "Groupe de ressources", - "account-summary-card.subscription": "Abonnement", - "account-summary-card.url": "URL", - "add-certificate-form.certificate.description": "Sélectionnez un certificat (pfx ou cer) à télécharger", - "add-certificate-form.certificate.label": "Certificat", - "add-certificate-form.certificate.required": "Veuillez sélectionner un fichier de certificat valide", - "add-certificate-form.certificate.select": "Sélectionner un certificat", - "add-certificate-form.password.label": "Mot de passe de certificat", - "add-certificate-form.title": "Créer un certificat", - "add-task-form.action": "ajouter", - "add-task-form.subtitle": "Ajouter une tâche au travail sélectionné", - "add-task-form.title": "Ajouter une tâche", - "batch-account-create.accountName.maxlength": "Le nom du compte a une longueur maximale de 64 caractères", - "batch-account-create.accountName.required": "Le nom de compte est un champ obligatoire", - "batch-account-create.location.required": "L'emplacement est un champ obligatoire", - "batch-account-create.subscription.required": "L’abonnement est un champ obligatoire", - "blob-container-picker.loading": "Conteneurs en cours de chargement", - "browse-layout.openedAdvancedFilter": "La lame de filtre avancé est ouvert", - "common.apply": "Appliquer", - "common.back": "Précédent", - "common.configuration": "CONFIGURATION", - "common.confirm": "Confirmer", - "common.loading": "Chargement", - "common.no": "Non", - "common.none": "Aucun(e)", - "common.rebootAll": "Redémarrer tout", - "common.refresh": "Actualiser", - "common.refreshing": "Actualisation", - "common.required": "Requis", - "common.updated": "Mise à jour terminée", - "common.yes": "Oui", - "create-new-aad-app.create": "Créer", - "create-new-aad-app.secret.label": "Secret", - "create-new-aad-app.title": "Créer une nouvelle application", - "sig-image-picker.sigImage.label": "Image", - "sig-image-picker.errorLoading": "Le serveur a rencontré une erreur lors du chargement des images personnalisées, veuillez réessayer ultérieurement.", - "sig-image-picker.noSigImageAvailable": "Aucune image personnalisée dans la région pour ce compte", - "sig-image-picker.nodeAgentSku.label": "Agent de nœud", - "datetime-picker.currentTimeZone": "Fuseau horaire actuel", - "datetime-picker.date": "Date", - "datetime-picker.time": "Heure", - "duration-picker.unit.custom": "Personnalisé (format ISO)", - "duration-picker.unit.days": "Jours", - "duration-picker.unit.hours": "Heures", - "duration-picker.unit.label": "Unité", - "duration-picker.unit.minutes": "Minutes", - "duration-picker.unit.seconds": "Secondes", - "duration-picker.unit.unlimited": "Illimité", - "edit-app-package-form.title": "Modifier les références de package pour l'application pool {poolId}", - "edit-app-package-form.updated": "Les packages d’application pour {poolId} ont été mis à jour", - "editable-table.deleteRow": "Supprimer la ligne", - "entity-command.confirm.multiple.title": "Voulez-vous vraiment {action} ces {count} {type} ?", - "entity-command.confirm.single.title": "Êtes-vous sûr de vouloir {action} ce {type} ?", - "entity-configuration.viewClassic": "Vue classique", - "file-explorer.noFiles": "Aucun fichier", - "file-explorer.path": "PATH", - "file-explorer.unknownFile": "Impossible de trouver ce fichier. Vérifiez le chemin d’accès.", - "file-group-picker.create": "Créer un nouveau groupe de fichiers", - "file-group-picker.warning": "Ce groupe de fichier ne semble pas exister. Il sera créé pour vous quand le travail sera soumis.", - "form-footer.buttons.cancel": "Annuler", - "form-footer.buttons.jsonEditor": "Basculer vers l’éditeur JSON", - "form-footer.buttons.normalForm": "Basculer sur la forme classique", - "form-footer.buttons.save": "Enregistrer", - "form-footer.buttons.select": "Sélectionner", - "gallery.actions": "Actions", - "gallery.myLibrary": "Ma bibliothèque", - "gallery.recentTemplates": "Modèles récents", - "job-progress-status.inaccurate": "Le nombre de tâches peut ne pas être exact en temps réel", - "job-state.active.message": "Le travail est en cours d’exécution. La tâche peut être planifiée.", - "job-state.completed.taskfailed.message": "Travail terminé avec un échec car une des tâches a échoué.", - "job-state.completed.timeout.message": "Le travail a expiré. Le travail a fonctionné plus longtemps que la limite fournie.", - "job-state.deleting.message": "Le travail est en cours de suppression", - "job-state.disabling.message": "Le travail est sur le point d'être désactivé", - "job-state.terminating.message": "Le travail se termine", - "main-menu.help.label": "Aide", - "main-menu.help.privacyStatement": "Déclaration de confidentialité", - "main-menu.help.viewLicense": "Voir la licence", - "main-navigation.certificates": "Certificats", - "main-navigation.data": "Données", - "main-navigation.gallery": "Galerie", - "main-navigation.jobs": "Travaux", - "main-navigation.jobschedules": "Planifications de travail", - "main-navigation.label": "Navigation principale", - "main-navigation.packages": "Packages", - "main-navigation.pools": "Pools", - "main-navigation.profile": "Profil", - "models.container": "Conteneur", - "models.node": "Nœud", - "models.nodes": "Nœuds", - "models.pool": "Pool", - "models.pools": "Pools", - "models.storageAccount": "Compte de stockage", - "node-configuration.allocation-time": "Temps d’allocation", - "node-configuration.end-time": "Heure de fin", - "node-configuration.exit-code": "Code de sortie", - "node-configuration.external-ip": "Adresse ip externe", - "node-configuration.id": "ID", - "node-configuration.internal-ip": "Adresse IP interne", - "node-configuration.is-dedicated": "Est dédié", - "node-configuration.last-boot-time": "Dernière heure de démarrage", - "node-configuration.node-agent-version": "Version de l'agent du nœud", - "node-configuration.node-size": "Taille de noeud", - "node-configuration.run-time": "Temps d’exécution", - "node-configuration.running-tasks-count": "Tâches en cours d'exécution", - "node-configuration.scheduling-state": "État de planification", - "node-configuration.start-task-completed": "Achevée en", - "node-configuration.start-task-running": "En cours d’exécution pour", - "node-configuration.start-time": "Heure de début", - "node-configuration.state": "État", - "node-configuration.state-transition-time": "Heure de la transition d'état", - "node-configuration.url": "URL", - "partial-sort-warning.load-all": "Charger tout (cela peut prendre beaucoup de temps)", - "partial-sort-warning.loading-all": "Chargement de toutes les entités. Veuillez patienter.", - "partial-sort-warning.manual-update": "La liste ne sera pas mise à jour automatiquement pendant le tri (pour des raisons de performance)", - "partial-sort-warning.update": "Mettre à jour", - "pool-details.estimatedCost": "Coût estimatif de ce pool dans son état actuel", - "pool-details.graphs": "Graphiques", - "pool-details.openInNewWindow": "Ouvrir dans une nouvelle fenêtre", - "pool-graphs.cpu": "UC", - "pool-graphs.diskUsage": "Utilisation du disque", - "pool-graphs.last": "Dernier", - "pool-graphs.memory": "Mémoire", - "pool-graphs.network": "Réseau", - "pool-graphs.timespan.10min": "10 minutes", - "pool-graphs.timespan.1h": "1 heure", - "pool-graphs.timespan.24h": "24 heures", - "pool-graphs.timespan.7d": "7 jours", - "pool-graphs.timespan.label": "Période de temps des graphes", - "pool-os-picker.category.container": "Conteneur", - "pool-os-picker.category.dataScience": "Science des données", - "pool-os-picker.category.distributions": "Distributions", - "pool-os-picker.category.rendering": "Graphiques et rendu", - "pool-os-picker.containerConfiguration": "Configuration du conteneur", - "pool-picker.filterByID": "Rechercher par id", - "pool-picker.filterByOS": "Filtrer par Système d'Exploitation", - "pool-picker.noneMatching": "Vous n’avez aucun pool correspondant aux filtres actuels.", - "pool-picker.reset": "Réinitialiser", - "pool-scale-picker.evaluationInterval.label": "Intervalle d'évaluation de la formule", - "pool-scale-picker.targetDedicatedNodes.label": "Nœuds dédiés", - "pool-scale-picker.type.fixed": "Taille fixe", - "pool-scale-picker.type.label": "Type d'échelle", - "profile-button.logout": "Déconnexion", - "profile-button.profile": "Profil", - "profile-button.report": "Signaler un bogue ou une demande de fonctionnalité", - "profile-button.settings": "Paramètres", - "profile-button.thirdPartyNotices": "Avis de tiers", - "profile-button.viewTheme": "Couleurs de thème d’affichage", - "programmatic-usage.authenticationType": "Type d'authentification ", - "programmatic-usage.credentials": "Informations d'identification", - "rerun-task-form.action": "Réexécuter", - "rerun-task-form.title": "Réexécuter la tâche", - "resource-permission-button.none": "Aucun(e)", - "resource-permission-button.permission": "Autorisation", - "resource-permission-button.removeAccess": "Supprimer l’accès", - "settings.general": "Général", - "settings.saved": "Enregistré ", - "settings.title": "Paramètres", - "task-commands.delete": "supprimer", - "task-commands.rerun": "Ré-exécuter", - "task-commands.terminate": "Finaliser", - "task-configuration.affinityId.label": "Id d’affinité", - "task-configuration.applicationPackages.application": "Application", - "task-configuration.applicationPackages.label": "Packages d’application", - "task-configuration.applicationPackages.none": "Cette tâche ne contient aucune référence de package d’application", - "task-configuration.applicationPackages.summary": "{count} références de packages d'application", - "task-configuration.applicationPackages.version": "Version", - "task-configuration.commandLine.label": "Ligne de commande", - "task-configuration.computeNode": "Nœud de calcul", - "task-configuration.creationTime.label": "Heure de création", - "task-configuration.displayName.label": "Nom complet", - "task-configuration.exitConditions.default": "Par défaut", - "task-configuration.exitConditions.label": "Conditions de sortie", - "task-configuration.exitConditions.terminateJobExitCodes": "Codes de sortie qui terminent le travail", - "task-configuration.general": "Général", - "task-configuration.id.label": "ID", - "task-configuration.lastModified.label": "Dernière modification", - "task-configuration.multiInstanceSettings.numberOfInstances.label": "Nombre d’instances", - "task-configuration.nodeId.label": "ID du nœud", - "task-configuration.nodeUrl.label": "URL du nœud", - "task-configuration.outputFiles.destination": "Destination", - "task-configuration.outputFiles.pattern": "Modèle", - "task-configuration.pool.label": "Pool", - "task-configuration.previousState.label": "État précédent", - "task-configuration.previousStateTransitionTime.label": "Heure de transition d'état précédente", - "task-configuration.state.label": "État", - "task-configuration.stateTransitionTime.label": "Heure de la transition d'état", - "task-configuration.taskRootDir.label": "Répertoire racine de la tâche", - "task-configuration.userIdentity.label": "Identité de l’utilisateur", - "task-dependency-browser.no-dependency": "Cette tâche ne dépend pas d’autres tâches", - "task-resource-files.filePath": "Chemin d’accès au nœud", - "user-account-picker.password": "Mot de passe", - "user-account-picker.username": "Nom d'utilisateur", - "virtual-network-picker.subnet": "Sous-réseau" -} diff --git a/desktop/i18n-deprecated/resources.hu.json b/desktop/i18n-deprecated/resources.hu.json deleted file mode 100644 index 39ceb0217..000000000 --- a/desktop/i18n-deprecated/resources.hu.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "duration-picker.unit.days": "Nap", - "duration-picker.unit.hours": "??ra", - "duration-picker.unit.minutes": "Perc", - "duration-picker.unit.seconds": "M??sodperc", - "duration-picker.unit.unlimited": "Korl??tlan", - "main-navigation.certificates": "Tan??s??tv??nyok", - "main-navigation.data": "Adatok", - "main-navigation.gallery": "Gal??ria", - "main-navigation.jobs": "Feladatok", - "main-navigation.jobschedules": "Feladat??temez??sek", - "main-navigation.packages": "Csomagok", - "main-navigation.pools": "K??szletek", - "main-navigation.profile": "Profil", - "models.pools": "K??szletek", - "models.storageAccount": "T??rfi??k", - "profile-button.profile": "Profil", - "settings.saved": "Mentve", - "user-account-picker.password": "Jelsz??", - "user-account-picker.username": "Felhaszn??l??n??v" -} \ No newline at end of file diff --git a/desktop/i18n-deprecated/resources.it.json b/desktop/i18n-deprecated/resources.it.json deleted file mode 100644 index 043a92c6b..000000000 --- a/desktop/i18n-deprecated/resources.it.json +++ /dev/null @@ -1,170 +0,0 @@ -{ - "aad-app-secret-picker.expireIn.label": "Scade in", - "account-cost-card.usingLocalAccount": "Non è possibile ottenere il costo con un account batch locale", - "account-details.resources": "Risorse", - "account-summary-card.resourceGroup": "Gruppo di risorse", - "account-summary-card.url": "URL", - "add-certificate-form.certificate.description": "Selezionare un certificato (pfx o cer) da caricare", - "add-certificate-form.certificate.invalid": "E' necessario che il certificato sia un file CER o PFX valido", - "add-certificate-form.certificate.label": "Certificato", - "add-certificate-form.certificate.select": "Seleziona un certificato", - "add-certificate-form.password.label": "Password del certificato", - "add-certificate-form.title": "Crea certificato", - "add-task-form.action": "Aggiungi", - "batch-account-create.accountName.required": "Il nome account è un campo obbligatorio", - "batch-account-create.resourceGroup.willCreate": "Questo gruppo di risorse non esiste ancora e verrà creato prima dell'account batch.", - "blob-container-picker.loading": "Caricamento container in corso", - "certificate-references-picker.duplicate": "Non è possibile fare riferimento allo stesso certificato due volte {thumbprint}", - "common.apply": "Applica", - "common.back": "Indietro", - "common.configuration": "CONFIGURAZIONE", - "common.confirm": "Conferma", - "common.loading": "Caricamento", - "common.no": "No", - "common.none": "Nessuno", - "common.refresh": "Aggiorna", - "common.required": "Richiesti", - "common.yes": "Sì", - "create-new-aad-app.create": "Crea", - "create-new-aad-app.title": "Crea una nuova applicazione", - "sig-image-picker.sigImage.label": "Immagine", - "datetime-picker.currentTimeZone": "Fuso orario corrente", - "duration-picker.unit.custom": "Personalizzato (formato ISO)", - "duration-picker.unit.days": "Giorni", - "duration-picker.unit.hours": "Ore", - "duration-picker.unit.label": "Unità", - "duration-picker.unit.minutes": "Minuti", - "duration-picker.unit.seconds": "Secondi", - "duration-picker.unit.unlimited": "Senza limiti", - "edit-app-package-form.updated": "I pacchetti dell'applicazione per {poolId} sono stati aggiornati", - "editable-table.deleteRow": "Elimina riga", - "entity-configuration.viewClassic": "Visualizzazione classica", - "file-explorer.collapseAll": "Comprimi tutto", - "file-explorer.noFiles": "Nessun file", - "file-explorer.noPathMatch": "Nessun file trovato per \"{path}\"", - "file-explorer.path": "PERCORSO", - "file-viewer-container.unkownFileType": "Questo file non ha un'estensione conosciuta. Vuoi aprirlo comunque?", - "form-footer.buttons.andClose": "{action} e chiudi", - "form-footer.buttons.cancel": "Annulla", - "form-footer.buttons.save": "Salva", - "form-footer.buttons.select": "Seleziona", - "gallery.actions": "Azioni", - "gallery.recentTemplates": "Modelli recenti", - "gallery.title": "Applicazioni della galleria", - "job-state.completed.jmcomplete.message": "Processo completato correttamente al completamento dell'attività del manager dei processi", - "job-state.completed.message": "Processo completato. Nessun'altra attività sarà accettata.", - "job-state.deleting.message": "Il processo è in corso di eliminazione", - "job-state.disabled.message": "Il processo è disattivato. Non verrà eseguita alcuna attività.", - "job-state.terminating.message": "Il processo sta per terminare", - "location-picker.noLocationInSubscription": "Nessuna posizione disponibile per la sottoscrizione '{name}'", - "main-menu.help.label": "Guida", - "main-menu.help.privacyStatement": "Informativa sulla privacy", - "main-menu.help.reportIssue": "Segnala il problema", - "main-navigation.certificates": "Certificati", - "main-navigation.dashboard": "Trattino", - "main-navigation.data": "Dati", - "main-navigation.gallery": "Galleria", - "main-navigation.jobs": "Processi", - "main-navigation.jobschedules": "Pianificazioni processi", - "main-navigation.packages": "Pacchetti", - "main-navigation.pools": "Pool", - "main-navigation.profile": "Profilo", - "models.container": "Contenitore", - "models.node": "Nodo", - "models.nodes": "Nodi", - "models.pools": "Pool", - "models.storageAccount": "Account di archiviazione", - "node-configuration.allocation-time": "Tempo di allocazione", - "node-configuration.end-time": "Ora di fine", - "node-configuration.exit-code": "Codice di uscita", - "node-configuration.external-ip": "Ip esterno", - "node-configuration.id": "ID", - "node-configuration.internal-ip": "Ip interno", - "node-configuration.is-dedicated": "È dedicato", - "node-configuration.last-boot-time": "Orario ultimo avvio", - "node-configuration.node-agent-version": "Versione dell'agente del nodo", - "node-configuration.node-size": "Dimensione del nodo", - "node-configuration.run-time": "Tempo di esecuzione", - "node-configuration.running-tasks-count": "Attività in esecuzione", - "node-configuration.start-task-completed": "Completato in", - "node-configuration.start-task-running": "In esecuzione per", - "node-configuration.start-time": "Ora di inizio", - "node-configuration.state": "Stato", - "node-configuration.state-transition-time": "Tempo di transizione di stato", - "node-configuration.total-tasks-run": "Numero totale di attività in esecuzione", - "node-configuration.total-tasks-succeeded": "Numero totale di attività eseguite con successo", - "node-configuration.url": "URL", - "partial-sort-warning.loading-all": "Caricamento di tutte le entità. Attendere prego.", - "partial-sort-warning.message": "Non tutte le entità sono state caricate, l'ordinamento visualizzato è parziale.", - "partial-sort-warning.update": "Aggiorna", - "pool-details.graphs": "Grafi", - "pool-details.openInNewWindow": "Apri in una nuova finestra", - "pool-graphs.cpu": "CPU", - "pool-graphs.last": "Ultimo", - "pool-graphs.memory": "Memoria", - "pool-graphs.network": "Rete", - "pool-graphs.notEnabled": "CPU, memoria, disco, ecc.", - "pool-graphs.timespan.10min": "10 minuti", - "pool-graphs.timespan.1h": "1 ora", - "pool-graphs.timespan.24h": "24 ore", - "pool-graphs.timespan.7d": "7 giorni", - "pool-os-picker.category.container": "Contenitore", - "pool-os-picker.category.dataScience": "Data science", - "pool-os-picker.nodeAgentSelection": "In base alla selezione effettuata, verrà utilizzato l'agente del nodo '{sku}'", - "pool-picker.filterByID": "Ricerca per id", - "pool-picker.reset": "Reimposta", - "pool-scale-picker.evaluationInterval.label": "Intervallo di valutazione formula", - "pool-scale-picker.targetDedicatedNodes.label": "Nodi dedicati", - "profile-button.logout": "Logout", - "profile-button.profile": "Profilo", - "profile-button.settings": "Impostazioni", - "profile-button.viewLogs": "Visualizza i log", - "profile-button.viewTheme": "Mostra colori del tema", - "programmatic-usage.authenticationType": "Tipo di autenticazione", - "programmatic-usage.credentials": "Credenziali", - "programmatic-usage.setup": "setup", - "programmatic-usage.title": "Credenziali ed esempi di codice per questo account batch", - "rerun-task-form.action": "Riesegui", - "rerun-task-form.subtitle": "Questo eliminerà il task e ne creerà uno nuovo con lo stesso id.", - "rerun-task-form.title": "Riesegui attività", - "resource-permission-button.giveRole": "Assegna il ruolo {role}", - "resource-permission-button.none": "Nessuno", - "resource-permission-button.permission": "Autorizzazione", - "settings.general": "Generale", - "settings.title": "Impostazioni", - "task-commands.delete": "Elimina", - "task-commands.rerun": "Eseguire nuovamente", - "task-commands.terminate": "Termina", - "task-configuration.affinityId.label": "Identificativo di affinità", - "task-configuration.applicationPackages.application": "Applicazione", - "task-configuration.applicationPackages.summary": "{count} riferimenti al pacchetto di applicazione", - "task-configuration.applicationPackages.version": "Versione", - "task-configuration.commandLine.label": "Riga di comando", - "task-configuration.creationTime.label": "Ora di creazione", - "task-configuration.displayName.label": "Nome visualizzato", - "task-configuration.exitConditions.default": "Predefinito", - "task-configuration.exitConditions.fileUploadError": "In caso di errore di caricamento file", - "task-configuration.exitConditions.label": "Condizioni di uscita", - "task-configuration.exitConditions.noOpExitCodes": "Codici di uscita che non fanno nulla", - "task-configuration.exitConditions.terminateJobExitCodes": "Codici di uscita che terminano il processo", - "task-configuration.general": "Generale", - "task-configuration.id.label": "ID", - "task-configuration.lastModified.label": "Ultima modifica", - "task-configuration.multiInstanceSettings.label": "Impostazioni multi istanza", - "task-configuration.multiInstanceSettings.numberOfInstances.label": "Numero di istanze", - "task-configuration.nodeId.label": "ID del nodo", - "task-configuration.outputFiles.destination": "Destinazione", - "task-configuration.outputFiles.uploadWhen": "Carica quando", - "task-configuration.pool.label": "Pool", - "task-configuration.previousStateTransitionTime.label": "Tempo di transizione dallo stato precedente", - "task-configuration.state.label": "Stato", - "task-configuration.stateTransitionTime.label": "Tempo di transizione di stato", - "task-configuration.userIdentity.label": "Identità dell'utente", - "task-dependency-browser.no-dependency": "Questa attività non dipende da altre", - "task-node-info.poolNotFound": "Il pool non esiste più", - "task-resource-files.filePath": "Percorso del file del nodo", - "task-resource-files.none": "Questa attività non contiene alcun file di risorsa", - "user-account-picker.password": "Password", - "user-account-picker.username": "Nome utente", - "virtual-network-picker.subnet": "Sottorete" -} diff --git a/desktop/i18n-deprecated/resources.ja.json b/desktop/i18n-deprecated/resources.ja.json deleted file mode 100644 index 2c2d46c29..000000000 --- a/desktop/i18n-deprecated/resources.ja.json +++ /dev/null @@ -1,312 +0,0 @@ -{ - "aad-app-secret-picker.description.label": "説明 (省略可)", - "aad-app-secret-picker.expireIn.label": "期限切れ", - "aad-app-secret-picker.secret.label": "シークレット。指定しないと、自動的に 1 つ生成されます。", - "account-cost-card.subtitle": "これは税引き前のコストレポートが表示されています。コストが一部である可能性がありますのでご注意ください。", - "account-cost-card.title": "日次のコスト", - "account-cost-card.total": "請求期間内の合計", - "account-cost-card.unsupportedSubscription": "このサブスクリプションのコストを表示できません (サポートされていません)。", - "account-cost-card.usingLocalAccount": "ローカル バッチ アカウントのコストを取得できません。", - "account-details.monitoring": "監視", - "account-details.resources": "リソース", - "account-monitoring.aggregatedOver": "{interval} 間隔で集計", - "account-monitoring.coreCount": "コアの分数", - "account-monitoring.currentNodeStates": "現在のノードの状態", - "account-monitoring.failedTask": "失敗したタスク", - "account-monitoring.nodeStates": "ノードの状態", - "account-monitoring.notARM": "アカウント監視は、ARM バッチ アカウントでのみ有効です", - "account-monitoring.taskStates": "タスクの状態", - "account-summary-card.resourceGroup": "リソース グループ", - "account-summary-card.subscription": "サブスクリプション", - "account-summary-card.url": "URL", - "add-certificate-form.certificate.description": "アップロードする証明書 (pfx または cer) を選択します。", - "add-certificate-form.certificate.invalid": "証明書は有効な CER または PFX ファイルのみである必要があります。", - "add-certificate-form.certificate.label": "証明書", - "add-certificate-form.certificate.required": "有効な証明書ファイルを選択してください。", - "add-certificate-form.certificate.select": "証明書の選択", - "add-certificate-form.password.label": "証明書のパスワード", - "add-certificate-form.password.required": "証明書の形式が '.pfx' の場合はパスワードが必要です。", - "add-certificate-form.title": "証明書を作成します。", - "add-task-form.action": "追加", - "add-task-form.subtitle": "選択したジョブにタスクを追加します。", - "add-task-form.title": "タスクを追加します。", - "batch-account-create.accountName.maxlength": "アカウント名は最長 64 文字です。", - "batch-account-create.accountName.minLength": "アカウント名の長さは3文字以上", - "batch-account-create.accountName.pattern": "アカウント名には小文字と数字のみ含めることができます", - "batch-account-create.accountName.required": "アカウント名は必須フィールドです。", - "batch-account-create.location.reachedQuota": "サブスクリプション '{subscription}' のこの場所における {quota} クォータ アカウント中、使用しているクォータは {used} に達しました。アカウント クォータの引き上げ、別の場所でのアカウントの作成、別のサブスクリプションでのアカウントの作成を要求できます。", - "batch-account-create.location.required": "場所は必須項目です", - "batch-account-create.resourceGroup.noneAvailable": "サブスクリプション '{subscription}' の中に有効なリソース グループがありません", - "batch-account-create.resourceGroup.notAllowed": "このリソース グループの下でバッチ アカウントを作成する権限がありません。", - "batch-account-create.resourceGroup.required": "リソース グループは必須です。", - "batch-account-create.resourceGroup.willCreate": "このリソース グループはまだ存在しません。バッチ アカウントの前に作成する必要があります。", - "batch-account-create.storageAccount.missingSubscription": "ストレージ アカウントを選ぶ前にサブスクリプションと場所を指定してください。", - "batch-account-create.subscription.required": "サブスクリプションは必須です。", - "blob-container-picker.loading": "コンテナーをロードしています", - "browse-layout.openedAdvancedFilter": "高度なフィルターのブレードを開きました", - "certificate-references-picker.addOne": "証明書を追加", - "certificate-references-picker.duplicate": "同じ証明書 {thumbprint} は参照できません。", - "certificate-references-picker.noCertificates": "このバッチ アカウントに証明書が見つかりませんでした。最初に証明書をアップロードしてください。", - "common.apply": "適用", - "common.back": "戻る", - "common.configuration": "CONFIGURATION", - "common.confirm": "確認", - "common.loading": "読み込み中", - "common.no": "いいえ", - "common.none": "なし", - "common.rebootAll": "すべて再起動", - "common.refresh": "最新の情報に更新", - "common.refreshing": "更新中", - "common.required": "必要な領域", - "common.updated": "更新", - "common.yes": "はい", - "create-new-aad-app.create": "作成", - "create-new-aad-app.secret.label": "秘密", - "create-new-aad-app.title": "新しいアプリケーションを作成します。", - "sig-image-picker.sigImage.label": "イメージ", - "sig-image-picker.errorLoading": "サーバーでカスタムイメージを読み込み中にエラーが発生しました。しばらくしてからもう一度お試しください。", - "sig-image-picker.noSigImageAvailable": "このアカウントの地域にカスタム画像がありません", - "sig-image-picker.nodeAgentSku.label": "ノード エージェント", - "datetime-picker.currentTimeZone": "現在のタイムゾーン", - "datetime-picker.date": "日付", - "datetime-picker.pickDate": "日付を選択します", - "datetime-picker.time": "時間", - "duration-picker.unit.custom": "カスタム (ISO 形式)", - "duration-picker.unit.days": "日数", - "duration-picker.unit.hours": "時間", - "duration-picker.unit.label": "ユニット", - "duration-picker.unit.minutes": "分", - "duration-picker.unit.seconds": "秒", - "duration-picker.unit.unlimited": "無制限", - "edit-app-package-form.title": "プール {poolId} のアプリケーション パッケージ参照を編集します。", - "edit-app-package-form.updated": "{poolId} のアプリケーション パッケージが更新されました", - "edit-certificate-references-form.title": "プール {poolId} の証明書リファレンスを編集", - "edit-certificate-references-form.updated": "{poolId} の証明書を更新しました", - "editable-table.deleteRow": "行を削除", - "entity-command.confirm.multiple.title": "本当にこれらの {count} 個の {type} を {action} しますか", - "entity-command.confirm.single.description": "{entityId} を {action} します", - "entity-command.confirm.single.title": "本当にこの {type} を {action} しますか", - "entity-configuration.viewAsJSON": "JSONとして表示", - "entity-configuration.viewClassic": "クラシック ビュー", - "file-explorer.collapseAll": "すべて折りたたんで表示します。", - "file-explorer.noFiles": "ファイルがありません。", - "file-explorer.noPathMatch": "\"{path}\" のファイルが見つかりませんでした", - "file-explorer.path": "PATH", - "file-explorer.unknownFile": "このファイルが見つかりません。パスを確認してください。", - "file-group-picker.create": "新しいファイル グループを作成", - "file-group-picker.warning": "このファイル グループは存在していないようです。それはジョブが登録されたときに作成されます。", - "file-viewer-container.notAllowed": "ファイル {filename} にアクセスできません。サーバーから forbidden エラーが返されました。", - "file-viewer-container.notFound": "ファイル {filename} が存在しません。", - "file-viewer-container.unkownFileType": "このファイルは、既知の拡張子ではありません。それでも開きますか?", - "form-footer.buttons.andClose": "{action} および閉じる", - "form-footer.buttons.cancel": "キャンセル", - "form-footer.buttons.jsonEditor": "JSON エディターに切り替えます", - "form-footer.buttons.normalForm": "クラシック形式に切り替える", - "form-footer.buttons.save": "保存", - "form-footer.buttons.select": "選択", - "gallery.actions": "アクション", - "gallery.myLibrary": "マイ ライブラリ", - "gallery.recentTemplates": "最近使用したテンプレート", - "gallery.title": "アプリケーションのギャラリー", - "gallery.viewReadme": "README の表示", - "job-progress-status.inaccurate": "タスク数がリアルタイムで正確ではない可能性があります。", - "job-state.active.message": "ジョブは現在実行中です。タスクをスケジュールすることができます。", - "job-state.completed.allTasksCompleted.message": "すべてのタスクが完了し、ジョブは正常に完了しました。", - "job-state.completed.jmcomplete.message": "ジョブ マネージャー タスクが完了したときにジョブが正常に完了しました", - "job-state.completed.message": "ジョブが完了しました。これ以上のタスクは受け入れられません。", - "job-state.completed.taskfailed.message": "タスクの 1 つが失敗したため、ジョブは失敗で完了しました。", - "job-state.completed.timeout.message": "ジョブがタイムアウトになりました。ジョブは、指定された制限値よりも長く実行されています。", - "job-state.completed.userTerminated.message": "ユーザーによってジョブが完了しました。", - "job-state.deleting.message": "ジョブは削除中", - "job-state.disabled.message": "ジョブは無効です。タスクは実行されません。", - "job-state.disabling.message": "プロセス内のジョブが無効です。", - "job-state.enabling.message": "ジョブが無効状態から復帰しています", - "job-state.terminating.message": "ジョブが終了しています。", - "list-base.filterApplied": "新しいフィルターが適用されました、{count} 件の結果", - "list-base.filterCleared": "フィルターをクリア、{count} 結果", - "location-picker.noLocationInSubscription": "サブスクリプション '{name}' には利用できる場所がありません。", - "main-menu.help.label": "ヘルプ", - "main-menu.help.privacyStatement": "プライバシーに関する声明", - "main-menu.help.reportIssue": "問題を報告", - "main-menu.help.viewLicense": "ライセンスを表示", - "main-navigation.certificates": "証明書", - "main-navigation.dashboard": "ダッシュ", - "main-navigation.data": "データ", - "main-navigation.gallery": "ギャラリー", - "main-navigation.jobs": "ジョブ", - "main-navigation.jobschedules": "ジョブ スケジュール", - "main-navigation.label": "メイン ・ ナビゲーション", - "main-navigation.packages": "パッケージ", - "main-navigation.pools": "プール", - "main-navigation.profile": "プロファイル", - "models.container": "コンテナー", - "models.node": "ノード", - "models.nodes": "ノード", - "models.pool": "プール", - "models.pools": "プール", - "models.storageAccount": "ストレージ アカウント", - "node-configuration.allocation-time": "割り当て時間", - "node-configuration.end-time": "終了時刻", - "node-configuration.exit-code": "終了コード", - "node-configuration.external-ip": "外部 IP アドレス", - "node-configuration.id": "ID", - "node-configuration.internal-ip": "内部 IP アドレス", - "node-configuration.is-dedicated": "専用", - "node-configuration.last-boot-time": "最近の起動時刻", - "node-configuration.node-agent-version": "ノード エージェントのバージョン", - "node-configuration.node-size": "ノードのサイズ", - "node-configuration.retry-count": "再試行回数", - "node-configuration.run-time": "実行時間", - "node-configuration.running-tasks-count": "実行中のタスク", - "node-configuration.scheduling-state": "スケジューリングの状態", - "node-configuration.start-task-completed": "完了", - "node-configuration.start-task-execution": "タスクの実行を開始します。", - "node-configuration.start-task-not-started": "タスクの実行を開始します。", - "node-configuration.start-task-running": "実行中", - "node-configuration.start-time": "開始時刻", - "node-configuration.state": "状態", - "node-configuration.state-transition-time": "状態遷移時間", - "node-configuration.total-tasks-run": "タスクの実行の合計", - "node-configuration.total-tasks-succeeded": "正常に完了したタスクの合計", - "node-configuration.url": "URL", - "partial-sort-warning.load-all": "すべてをロードします (これには時間がかかることがあります)", - "partial-sort-warning.loading-all": "すべてのエンティティを読み込み中です。お待ちください。", - "partial-sort-warning.manual-update": "ソート中はリストを自動的に更新できません (パフォーマンス上の理由)。", - "partial-sort-warning.message": "すべてのエンティティが読み込まれていません。これは部分的な並べ替えを示しています。", - "partial-sort-warning.update": "更新", - "pool-commands.resize": "サイズ変更", - "pool-commands.stopResize": "サイズ変更中止", - "pool-details.estimatedCost": "現在の状態でのこのプールのコストの見積もり", - "pool-details.graphs": "グラフ", - "pool-details.openInNewWindow": "新しいウィンドウで開く", - "pool-graphs.cpu": "CPU", - "pool-graphs.diskIO": "ディスク IO", - "pool-graphs.diskUsage": "ディスクの使用状況", - "pool-graphs.last": "最後の", - "pool-graphs.memory": "メモリ", - "pool-graphs.network": "ネットワーク", - "pool-graphs.notEnabled": "CPU、メモリ、ディスク等。", - "pool-graphs.timespan.10min": "10 分", - "pool-graphs.timespan.1h": "1 時間", - "pool-graphs.timespan.24h": "24 時間", - "pool-graphs.timespan.7d": "7 日間", - "pool-graphs.timespan.label": "グラフの期間", - "pool-os-picker.category.container": "コンテナー", - "pool-os-picker.category.dataScience": "データサイエンス", - "pool-os-picker.category.distributions": "配布", - "pool-os-picker.category.rendering": "グラフィックスとレンダリング", - "pool-os-picker.containerConfiguration": "コンテナーの構成", - "pool-os-picker.nodeAgentSelection": "あなたの選択に基づいて、ノード エージェント '{sku}' が使用されます。", - "pool-picker.filterByID": "ID で検索", - "pool-picker.filterByOS": "OS によるフィルター", - "pool-picker.noneMatching": "現在のフィルターに一致するプールがありません。", - "pool-picker.reset": "リセット", - "pool-scale-picker.evaluationInterval.label": "数式の評価間隔", - "pool-scale-picker.resizeTimeout.label": "タイムアウトのサイズを変更します。", - "pool-scale-picker.targetDedicatedNodes.label": "専用ノード", - "pool-scale-picker.targetLowPriorityNodes.label": "優先度の低いノード", - "pool-scale-picker.type.autoscale": "オートスケール", - "pool-scale-picker.type.fixed": "固定長", - "pool-scale-picker.type.label": "スケール タイプ", - "profile-button.about": "製品について", - "profile-button.logout": "ログアウト", - "profile-button.profile": "プロファイル", - "profile-button.report": "バグまたは機能リクエストを報告します。", - "profile-button.settings": "設定", - "profile-button.thirdPartyNotices": "サードパーティ通知", - "profile-button.viewLogs": "ログの表示", - "profile-button.viewTheme": "テーマカラーの表示", - "programmatic-usage.authenticationType": "認証の種類", - "programmatic-usage.credentials": "資格情報", - "programmatic-usage.setup": "セットアップ", - "programmatic-usage.title": "資格情報とこのバッチ アカウントのコード サンプル", - "rerun-task-form.action": "再実行", - "rerun-task-form.subtitle": "タスクを削除し、同じ id で新しいタスクを作成します。", - "rerun-task-form.title": "タスクの再実行", - "resource-permission-button.giveRole": "役割 {role} を与える", - "resource-permission-button.none": "なし", - "resource-permission-button.permission": "アクセス許可", - "resource-permission-button.removeAccess": "アクセス権を削除します。", - "resourcefile-picker.add.dragAndDrop": "自動的にアップロードするファイルをここにドラッグ アンド ドロップできます。", - "resourcefile-picker.add.fromStorage": "Azure Storage から追加します", - "resourcefile-picker.add.fromURL": "URL から追加します", - "resourcefile-picker.add.uploadFile": "ファイルのアップロード", - "resourcefile-picker.blobPrefix": "Blob プレフィックス", - "resourcefile-picker.cloudFileDialog.title": "ストレージ アカウントからファイルを選択します", - "settings.gallerySettings": "ギャラリーの設定", - "settings.general": "全般", - "settings.reset": "既定の設定にリセットします", - "settings.saved": "保存済み", - "settings.title": "設定", - "storage-error-display.isClassic": "リンクされているストレージ アカウントは従来のストレージ アカウントで、この機能では使用できません。", - "storage-error-display.noAutoStorage": "この Batch アカウントに対してリンクされているストレージ アカウントは構成されていません。ファイル グループを管理するために必要です。", - "task-commands.delete": "削除", - "task-commands.rerun": "再実行します。", - "task-commands.terminate": "終了", - "task-configuration.affinityId.label": "アフィニティ id", - "task-configuration.applicationPackages.application": "アプリケーション", - "task-configuration.applicationPackages.label": "アプリケーション パッケージ", - "task-configuration.applicationPackages.none": "このタスクにはアプリケーション パッケージの参照が含まれていません", - "task-configuration.applicationPackages.summary": "{count} 個のアプリケーション パッケージの参照", - "task-configuration.applicationPackages.version": "バージョン", - "task-configuration.commandLine.label": "コマンドライン", - "task-configuration.computeNode": "計算ノード", - "task-configuration.creationTime.label": "作成時刻", - "task-configuration.displayName.label": "表示名", - "task-configuration.exitConditions.default": "既定", - "task-configuration.exitConditions.fileUploadError": "ファイルのアップロード エラー", - "task-configuration.exitConditions.label": "終了条件", - "task-configuration.exitConditions.noOpExitCodes": "何もしない終了コード", - "task-configuration.exitConditions.onSchedulingError": "スケジュールエラー時", - "task-configuration.exitConditions.terminateJobExitCodes": "ジョブ終了時の終了コード", - "task-configuration.general": "全般", - "task-configuration.id.label": "ID", - "task-configuration.lastModified.label": "更新日時", - "task-configuration.multiInstanceSettings.coordinationCommandLine.label": "コーディネーション コマンドライン", - "task-configuration.multiInstanceSettings.label": "マルチ インスタンスの設定", - "task-configuration.multiInstanceSettings.numberOfInstances.label": "インスタンスの数", - "task-configuration.nodeId.label": "ノード ID", - "task-configuration.nodeUrl.label": "ノードの URL", - "task-configuration.outputFiles.destination": "先", - "task-configuration.outputFiles.label": "出力ファイル", - "task-configuration.outputFiles.pattern": "パターン", - "task-configuration.outputFiles.uploadWhen": "アップロード時", - "task-configuration.pool.label": "プール", - "task-configuration.previousState.label": "前の状態", - "task-configuration.previousStateTransitionTime.label": "以前の状態遷移時間", - "task-configuration.state.label": "状態", - "task-configuration.stateTransitionTime.label": "状態遷移時間", - "task-configuration.taskRootDir.label": "タスクのルート ディレクトリ", - "task-configuration.taskRootDirUrl.label": "タスクのルート ディレクトリの URL", - "task-configuration.userIdentity.label": "ユーザー ID", - "task-dependency-browser.no-dependency": "このタスクは他のタスクに依存しません。", - "task-node-info.navigateToNode": "計算ノードに移動します。", - "task-node-info.navigateToPool": "プールに移動します。", - "task-node-info.nodeNotFound": "計算ノードはもう存在しません", - "task-node-info.poolNotFound": "プールはもう存在しません", - "task-resource-files.fileMode": "ファイル モード", - "task-resource-files.filePath": "ノードのファイル パス", - "task-resource-files.httpUrl": "Http url", - "task-resource-files.none": "このタスクにリソース ファイルは含まれていません。", - "time-range-picker.customRange": "カスタム範囲", - "time-range-picker.errors.invalidRange": "開始時間終了時間よりも小さくなければなりません", - "time-range-picker.errors.required": "開始時刻と終了時刻の少なくともどちらかを指定する必要があります", - "time-range-picker.quickRange": "クイック範囲", - "time-range-picker.timeRange": "時間範囲", - "timezone-dropdown.tooltip": "日付のタイムゾーンを選択します", - "user-account-picker.gid": "ユーザー グループ ID", - "user-account-picker.linuxConfiguration": "Linux 固有の構成", - "user-account-picker.loginMode": "ログイン モード", - "user-account-picker.password": "パスワード", - "user-account-picker.runAsAdmin": "管理者として実行", - "user-account-picker.sshPrivateKey": "SSH 秘密鍵", - "user-account-picker.uid": "ユーザー ID", - "user-account-picker.username": "ユーザー名", - "user-account-picker.windowsConfiguration": "Windows 固有の構成", - "user-accounts-picker.addOne": "ユーザー アカウントを追加", - "user-accounts-picker.duplicate": "同じ名前 '{username}' を持つ 2 つのユーザーを持つことはできません。", - "virtual-network-picker.noneAvailable": "サブスクリプション '{subscriptionId}'、場所 '{location}' に使用可能な仮想ネットワークがありません。", - "virtual-network-picker.notArm": "ローカルバッチアカウントは仮想ネットワークでは使用できません。", - "virtual-network-picker.subnet": "サブネット", - "virtual-network-picker.virtualNetwork": "仮想ネットワーク" -} diff --git a/desktop/i18n-deprecated/resources.ko.json b/desktop/i18n-deprecated/resources.ko.json deleted file mode 100644 index ec374ebe6..000000000 --- a/desktop/i18n-deprecated/resources.ko.json +++ /dev/null @@ -1,282 +0,0 @@ -{ - "aad-app-secret-picker.description.label": "설명 (옵션)", - "aad-app-secret-picker.expireIn.label": "만료", - "aad-app-secret-picker.secret.label": "비밀. 하나가 제공되지 않으면 자동으로 생성됩니다.", - "account-cost-card.subtitle": "지금 보고 게신 부분은 세금을 제외한 항목입니다. 비용이 달라질수 있음을 확인하시길 바랍니다.", - "account-cost-card.title": "일일 비용", - "account-cost-card.total": "총 청구 기간", - "account-cost-card.unsupportedSubscription": "이 구독에 대한 비용을 확인할 수 없습니다 (지원되지 않음).", - "account-cost-card.usingLocalAccount": "로컬 배치 어카운트의 비용을 가져올 수 없습니다.", - "account-details.monitoring": "모니터링", - "account-details.resources": "리소스", - "account-monitoring.nodeStates": "노드 상태", - "account-monitoring.taskStates": "작업 상태", - "account-summary-card.resourceGroup": "리소스 그룹", - "account-summary-card.subscription": "구독", - "account-summary-card.url": "URL", - "add-certificate-form.certificate.description": "업로드 할 인증서 (pfx 또는 cer) 선택", - "add-certificate-form.certificate.invalid": "인증서는 유효한 CER 또는 PFX 파일이어야합니다.", - "add-certificate-form.certificate.label": "인증서", - "add-certificate-form.certificate.required": "유효한 인증서 파일을 선택하십시오", - "add-certificate-form.certificate.select": "인증서 선택", - "add-certificate-form.password.label": "인증서 암호", - "add-certificate-form.password.required": "인증서 형식이 '.pfx'인 경우 암호가 필요합니다.", - "add-certificate-form.title": "인증서 만들기", - "add-task-form.action": "추가", - "add-task-form.subtitle": "선택한 Job에 작업 추가", - "add-task-form.title": "작업 추가", - "batch-account-create.accountName.maxlength": "계정 이름의 최대 길이는 64 자입니다.", - "batch-account-create.accountName.minLength": "계정 이름에는 최소 3 문자가 필요합니다.", - "batch-account-create.accountName.pattern": "계정이름은 소문자와 숫자만 포함할 수 있습니다.", - "batch-account-create.accountName.required": "계정 이름 필드는 필수 필드입니다.", - "batch-account-create.location.reachedQuota": "이 위치의 {subscription} 구독에 대해 {quota} 계정 중 할당량 {used}에 도달했습니다. 계정 할당량 증가를 요청하거나, 다른 위치에서 계정을 만들거나, 다른 가입에서 계정을 만들 수 있습니다.", - "batch-account-create.location.required": "위치는 필수 입력 항목입니다.", - "batch-account-create.resourceGroup.noneAvailable": "구독 '{subscription}'에서 사용할 수 있는 리소스 그룹이 없습니다.", - "batch-account-create.resourceGroup.notAllowed": "이 리소스 그룹에서 배치 계정을 만들 권한이 없습니다.", - "batch-account-create.resourceGroup.required": "리소스 그룹은 필수 입력 필드입니다.", - "batch-account-create.resourceGroup.willCreate": "이 자원 그룹은 아직 존재하지 않으며 배치 계정 전에 작성될 것입니다.", - "batch-account-create.storageAccount.missingSubscription": "스토리지 계정을 선택하기 전에 구독 및 위치를 지정하십시오.", - "batch-account-create.subscription.required": "구독 필드는 필수 입력 필드입니다.", - "blob-container-picker.loading": "컨테이너를 불러오는 중입니다.", - "browse-layout.openedAdvancedFilter": "열려진 고급 필터 블레이드", - "certificate-references-picker.addOne": "인증서 추가", - "certificate-references-picker.duplicate": "동일한 인증서{thumbprint}를 두 번 참조할 수 없습니다", - "certificate-references-picker.noCertificates": "이 배치 계정에 대한 인증서가 없으므로, 먼저 인증서를 업로드 하세요.", - "common.apply": "적용", - "common.back": "뒤로", - "common.configuration": "CONFIGURATION", - "common.confirm": "확인", - "common.loading": "로드", - "common.no": "아니요", - "common.none": "None", - "common.rebootAll": "모두 재 부팅", - "common.refresh": "새로 고침", - "common.refreshing": "새로 고침", - "common.required": "필수", - "common.updated": "업데이트", - "common.yes": "예", - "create-new-aad-app.create": "만들기", - "create-new-aad-app.secret.label": "암호", - "create-new-aad-app.title": "새 응용 프로그램 만들기", - "sig-image-picker.sigImage.label": "이미지", - "sig-image-picker.errorLoading": "서버에서 사용자 정의 이미지를 로드하는 중에 오류가 발생했습니다. 나중에 다시 시도하십시오.", - "sig-image-picker.noSigImageAvailable": "이 계정의 해당 지역에 사용자 지정 이미지가 없습니다.", - "sig-image-picker.nodeAgentSku.label": "노드 에이전트", - "datetime-picker.currentTimeZone": "현재 시간대", - "datetime-picker.date": "날짜", - "datetime-picker.time": "시간", - "duration-picker.unit.custom": "사용자 정의 (ISO 형식)", - "duration-picker.unit.days": "일", - "duration-picker.unit.hours": "시간", - "duration-picker.unit.label": "단위", - "duration-picker.unit.minutes": "분", - "duration-picker.unit.seconds": "초", - "duration-picker.unit.unlimited": "제한 없음", - "edit-app-package-form.title": "풀{poolId}에 대한 응용 프로그램 패키지 참조를 편집하세요", - "edit-app-package-form.updated": "{poolId}에 대한 응용프로그램 패키지가 업데이트 되었습니다.", - "edit-certificate-references-form.title": "풀{poolId}에 대한 인증서 참조 편집", - "edit-certificate-references-form.updated": "{poolId}에 대한 인증서가 업데이트 되었습니다.", - "editable-table.deleteRow": "행 삭제", - "entity-command.confirm.multiple.title": "{count} {type} {action}을 수행하기 원하십니까?", - "entity-command.confirm.single.description": "{entityId}를 {action}하려고 합니다.", - "entity-command.confirm.single.title": "이 {type}에 {action}을(를) 하시겠습니까?", - "entity-configuration.viewAsJSON": "JSON으로 보기", - "entity-configuration.viewClassic": "클래식 보기", - "file-explorer.collapseAll": "모두 축소", - "file-explorer.noFiles": "파일 없음", - "file-explorer.noPathMatch": "\"{path}\"에 대한 파일을 찾을 수 없습니다.", - "file-explorer.path": "PATH", - "file-explorer.unknownFile": "이 파일을 찾을 수 없습니다. 경로를 확인해주십시오.", - "file-group-picker.create": "새 파일 그룹 만들기", - "file-group-picker.warning": "이 파일 그룹이 존재하지 않는 것 같습니다. 작업 제출시 작성됩니다.", - "file-viewer-container.notAllowed": "파일 \"{filename}\"에 액세스 할 수 없습니다. 서버가 금지 된 오류를 반환했습니다.", - "file-viewer-container.notFound": "파일{filename}이 존재하지 않습니다.", - "file-viewer-container.unkownFileType": "이 파일은 알려진 확장자가 아닙니다. 그래도 열어보시겠습니까?", - "form-footer.buttons.andClose": "{action}과 닫기", - "form-footer.buttons.cancel": "취소", - "form-footer.buttons.jsonEditor": "JSON 편집기로 전환", - "form-footer.buttons.normalForm": "클래식 양식으로 전환", - "form-footer.buttons.save": "저장", - "form-footer.buttons.select": "선택", - "gallery.actions": "동작", - "gallery.myLibrary": "내 라이브러리", - "gallery.recentTemplates": "최근 템플릿", - "gallery.title": "갤러리 응용 프로그램", - "gallery.viewReadme": "readme 보기", - "job-progress-status.inaccurate": "작업 수는 실시간으로 정확하지 않을 수 있습니다.", - "job-state.active.message": "작업이 현재 실행 중입니다. 작업을 예약할 수 있습니다.", - "job-state.completed.allTasksCompleted.message": "모든 동작이 완료되면, 작업이 성공적으로 완료됩니다.", - "job-state.completed.jmcomplete.message": "작업 관리자 작업이 완료되면 작업이 성공적으로 완료되었습니다.", - "job-state.completed.message": "작업이 완료되었습니다. 더 이상 작업이 허용되지 않습니다.", - "job-state.completed.taskfailed.message": "작업 중 하나가 실패하여 작업이 실패로 완료되었습니다.", - "job-state.completed.timeout.message": "작업 시간이 초과되었습니다. 작업이 제공된 제한 시간보다 오래 실행되었습니다.", - "job-state.completed.userTerminated.message": "사용자에 의해 작업이 완료되었습니다.", - "job-state.deleting.message": "삭제하는 과정을 돌리는 작업", - "job-state.disabled.message": "작업이 비활성화되었습니다. 작업이 실행되지 않습니다.", - "job-state.disabling.message": "작업이 비활성화되는 중입니다.", - "job-state.enabling.message": "작업이 사용 중지 된 상태에서 돌아오는 중입니다.", - "job-state.terminating.message": "작업이 종료 중입니다.", - "list-base.filterApplied": "새 필터가 적용되었습니다. (결과: {count})", - "list-base.filterCleared": "필터가 지워짐, 결과 {count}개", - "location-picker.noLocationInSubscription": "구독 '{name}'에 사용 가능한 위치가 없습니다.", - "main-menu.help.label": "도움말", - "main-menu.help.privacyStatement": "개인정보취급방침", - "main-menu.help.reportIssue": "문제 신고", - "main-menu.help.viewLicense": "라이센스 보기", - "main-navigation.certificates": "인증서", - "main-navigation.dashboard": "대시", - "main-navigation.data": "데이터", - "main-navigation.gallery": "갤러리", - "main-navigation.jobs": "작업", - "main-navigation.jobschedules": "작업 일정", - "main-navigation.label": "기본 탐색", - "main-navigation.packages": "패키지", - "main-navigation.pools": "풀", - "main-navigation.profile": "프로필", - "models.container": "컨테이너", - "models.node": "노드", - "models.nodes": "노드", - "models.pool": "풀", - "models.pools": "풀", - "node-configuration.allocation-time": "할당 시간", - "node-configuration.end-time": "종료 시간", - "node-configuration.exit-code": "종료 코드", - "node-configuration.external-ip": "외부 ip", - "node-configuration.id": "ID", - "node-configuration.internal-ip": "내부 IP", - "node-configuration.is-dedicated": "전용", - "node-configuration.last-boot-time": "마지막 부팅 시간", - "node-configuration.node-agent-version": "노드 에이전트 버전", - "node-configuration.node-size": "노드 크기", - "node-configuration.retry-count": "재시도 횟수", - "node-configuration.run-time": "실행 시간", - "node-configuration.running-tasks-count": "실행중인 작업", - "node-configuration.scheduling-state": "스케줄링 상태", - "node-configuration.start-task-completed": "완료", - "node-configuration.start-task-execution": "작업 실행 시작", - "node-configuration.start-task-not-started": "작업 실행 시작", - "node-configuration.start-task-running": "에 대한 실행", - "node-configuration.start-time": "시작 시간", - "node-configuration.state": "상태", - "node-configuration.state-transition-time": "상태 전환 시간", - "node-configuration.total-tasks-run": "전체 작업 실행", - "node-configuration.total-tasks-succeeded": "총 성공한 작업", - "node-configuration.url": "URL", - "partial-sort-warning.load-all": "모두 불러오기 (시간이 오래 걸릴 수 있음)", - "partial-sort-warning.loading-all": "전체 목록을 불러오는 중입니다. 잠시만 기다려주세요.", - "partial-sort-warning.manual-update": "정렬 중에 목록이 자동으로 업데이트되지 않습니다. (성능상의 이유).", - "partial-sort-warning.message": "모드 엔티티가 로드되지 않아서 일부분만 보이고 있습니다.", - "partial-sort-warning.update": "업데이트", - "pool-details.estimatedCost": "현재 상태에서 이 풀의 예상 비용", - "pool-details.graphs": "그래프", - "pool-details.openInNewWindow": "새 창에서 열기", - "pool-graphs.cpu": "CPU", - "pool-graphs.diskIO": "디스크 I/O", - "pool-graphs.diskUsage": "디스크 사용량", - "pool-graphs.last": "Last", - "pool-graphs.memory": "메모리", - "pool-graphs.network": "네트워크", - "pool-graphs.notEnabled": "CPU, 메모리, 디스크 등등", - "pool-graphs.timespan.10min": "10 분", - "pool-graphs.timespan.1h": "1시간", - "pool-graphs.timespan.24h": "24시간", - "pool-graphs.timespan.7d": "7 일", - "pool-graphs.timespan.label": "그래프 시간 범위", - "pool-os-picker.category.container": "컨테이너", - "pool-os-picker.category.dataScience": "데이터 사이언스", - "pool-os-picker.category.distributions": "배포판", - "pool-os-picker.category.rendering": "그래픽 및 렌더링", - "pool-os-picker.containerConfiguration": "컨테이너 구성", - "pool-os-picker.nodeAgentSelection": "선택에 따라 노드 에이전트 '{sku}'가 사용됩니다", - "pool-picker.filterByID": "Id로 검색", - "pool-picker.filterByOS": "OS별로 필터링", - "pool-picker.noneMatching": "현재의 필터와 일치하는 어떠한 Pool도 갖고 있지 않습니다.", - "pool-picker.reset": "다시 설정", - "pool-scale-picker.evaluationInterval.label": "수식 평가 간격", - "pool-scale-picker.resizeTimeout.label": "타임아웃 조정", - "pool-scale-picker.targetDedicatedNodes.label": "전용 노드", - "pool-scale-picker.targetLowPriorityNodes.label": "우선 순위가 낮은 노드", - "pool-scale-picker.type.autoscale": "자동조정", - "pool-scale-picker.type.fixed": "고정 크기", - "pool-scale-picker.type.label": "확장 유형", - "profile-button.about": "에 대한", - "profile-button.logout": "로그아웃", - "profile-button.profile": "프로필", - "profile-button.report": "버그 또는 기능 요청보고", - "profile-button.settings": "설정", - "profile-button.thirdPartyNotices": "제 3자 통지", - "profile-button.viewLogs": "로그 보기", - "profile-button.viewTheme": "테마 색상 보기", - "programmatic-usage.authenticationType": "인증 유형", - "programmatic-usage.credentials": "자격 증명", - "programmatic-usage.setup": "설치", - "programmatic-usage.title": "이 배치 계정의 자격증명 및 코드샘플", - "rerun-task-form.action": "재실행", - "rerun-task-form.subtitle": "이렇게 하면 작업이 삭제되고 동일한 ID로 새 작업이 생성됩니다.", - "rerun-task-form.title": "작업 재실행", - "resource-permission-button.giveRole": "{role} 역활부여", - "resource-permission-button.none": "None", - "resource-permission-button.permission": "사용 권한", - "resource-permission-button.removeAccess": "액세스 제거", - "settings.general": "일반", - "settings.saved": "저장됨", - "settings.title": "설정", - "task-commands.delete": "삭제", - "task-commands.rerun": "재실행", - "task-commands.terminate": "종료", - "task-configuration.affinityId.label": "동일 관심사 ID", - "task-configuration.applicationPackages.application": "응용 프로그램", - "task-configuration.applicationPackages.label": "응용 프로그램 패키지", - "task-configuration.applicationPackages.none": "이 작업에는 응용 프로그램 패키지 참조가 없습니다.", - "task-configuration.applicationPackages.summary": "{count} 애플리케이션 패키지 참조", - "task-configuration.applicationPackages.version": "버전", - "task-configuration.commandLine.label": "명령줄", - "task-configuration.computeNode": "계산된 노드", - "task-configuration.creationTime.label": "만든 시간", - "task-configuration.displayName.label": "표시 이름", - "task-configuration.exitConditions.default": "기본값", - "task-configuration.exitConditions.fileUploadError": "파일 업로드 오류", - "task-configuration.exitConditions.label": "종료 조건", - "task-configuration.exitConditions.noOpExitCodes": "어떤 작업도 수행하지 않는 종료 코드", - "task-configuration.exitConditions.onSchedulingError": "스케줄 오류시", - "task-configuration.exitConditions.terminateJobExitCodes": "작업 종료를 위한 종료 코드", - "task-configuration.general": "일반", - "task-configuration.id.label": "ID", - "task-configuration.lastModified.label": "마지막으로 수정한 날짜", - "task-configuration.multiInstanceSettings.coordinationCommandLine.label": "조정 명령 라인", - "task-configuration.multiInstanceSettings.label": "다중 인스턴스 설정", - "task-configuration.multiInstanceSettings.numberOfInstances.label": "인스턴스 갯수", - "task-configuration.nodeId.label": "노드 ID", - "task-configuration.nodeUrl.label": "노드 URL", - "task-configuration.outputFiles.destination": "대상", - "task-configuration.outputFiles.label": "출력 파일", - "task-configuration.outputFiles.pattern": "패턴", - "task-configuration.outputFiles.uploadWhen": "업로드 시점", - "task-configuration.pool.label": "풀", - "task-configuration.previousState.label": "이전 상태", - "task-configuration.previousStateTransitionTime.label": "이전 상태 전환 시간", - "task-configuration.state.label": "상태", - "task-configuration.stateTransitionTime.label": "상태 전환 시간", - "task-configuration.taskRootDir.label": "작업 루트 디렉터리", - "task-configuration.taskRootDirUrl.label": "작업 루트 디렉토리 URL", - "task-configuration.userIdentity.label": "사용자 ID", - "task-dependency-browser.no-dependency": "이 작업은 다른 작업에 의존 하지 않습니다.", - "task-node-info.navigateToNode": "노드를 계산하기 위해 이동", - "task-node-info.navigateToPool": "풀으로 이동", - "task-node-info.nodeNotFound": "계산된 노드가 더 이상 존재하지 않습니다.", - "task-node-info.poolNotFound": "풀이 더 이상 존재하지 않습니다.", - "task-resource-files.fileMode": "파일 모드", - "task-resource-files.filePath": "노드 파일 경로", - "task-resource-files.httpUrl": "Http url", - "task-resource-files.none": "이 작업에는 리소스 파일이 없습니다.", - "time-range-picker.customRange": "사용자 지정 범위", - "time-range-picker.errors.invalidRange": "시작 시간은 종료 시간보다 앞서야 합니다.", - "time-range-picker.errors.required": "시작 시간과 종료 시간은 필수입니다.", - "time-range-picker.timeRange": "시간 범위", - "user-account-picker.password": "암호", - "user-account-picker.username": "사용자 이름", - "virtual-network-picker.noneAvailable": "구독 '{subscriptionId}'및 위치 '{location}'에서 사용 가능한 가상 네트워크가 없습니다.", - "virtual-network-picker.notArm": "로컬 배치 계정을 사용할 때 VNET을 사용할 수 없습니다.", - "virtual-network-picker.subnet": "서브넷", - "virtual-network-picker.virtualNetwork": "가상 네트워크" -} diff --git a/desktop/i18n-deprecated/resources.nl.json b/desktop/i18n-deprecated/resources.nl.json deleted file mode 100644 index d652171a4..000000000 --- a/desktop/i18n-deprecated/resources.nl.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "create-new-aad-app.secret.label": "Geheim", - "duration-picker.unit.custom": "Aangepast (ISO formaat)", - "duration-picker.unit.days": "Dagen", - "duration-picker.unit.hours": "Uur", - "duration-picker.unit.minutes": "Minuten", - "duration-picker.unit.seconds": "Seconden", - "duration-picker.unit.unlimited": "Onbeperkt", - "entity-command.confirm.multiple.title": "Weet u zeker dat u deze {count} {type} wilt {action}", - "file-viewer-container.notFound": "Bestand {filename} bestaat niet.", - "file-viewer-container.unkownFileType": "Dit bestand heeft geen bekende extensie. Wilt u het nog steeds openen?", - "list-base.filterApplied": "Nieuw filter toegepast, {count} resultaten", - "list-base.filterCleared": "Filter uitgeschakeld, {count} resultaten", - "main-navigation.certificates": "Certificaten", - "main-navigation.data": "Gegevens", - "main-navigation.gallery": "Galerie", - "main-navigation.jobs": "Taken", - "main-navigation.jobschedules": "Taakplanningen", - "main-navigation.packages": "Pakketten", - "main-navigation.pools": "Groepen", - "main-navigation.profile": "Profiel", - "models.pools": "Groepen", - "models.storageAccount": "Opslagaccount", - "partial-sort-warning.loading-all": "Alle entiteiten aan het laden. Een ogenblik geduld.", - "pool-graphs.memory": "Geheugen", - "pool-picker.filterByOS": "Filter op OS", - "profile-button.profile": "Profiel", - "settings.saved": "Opgeslagen", - "task-configuration.outputFiles.destination": "Bestemming", - "task-configuration.outputFiles.pattern": "Patroon", - "user-account-picker.password": "Wachtwoord", - "user-account-picker.username": "Gebruikersnaam" -} \ No newline at end of file diff --git a/desktop/i18n-deprecated/resources.pl.json b/desktop/i18n-deprecated/resources.pl.json deleted file mode 100644 index 408bb4a81..000000000 --- a/desktop/i18n-deprecated/resources.pl.json +++ /dev/null @@ -1,143 +0,0 @@ -{ - "account-details.resources": "Zasoby", - "account-summary-card.resourceGroup": "Grupa zasobów", - "account-summary-card.url": "Adres URL", - "add-certificate-form.certificate.select": "Wybierz certyfikat", - "add-task-form.action": "Dodaj", - "add-task-form.subtitle": "Dodaj podzadanie do wybranego zadania", - "add-task-form.title": "Dodaj zadanie", - "blob-container-picker.loading": "Ładowanie kontenerów", - "common.apply": "Zastosuj", - "common.configuration": "KONFIGURACJA", - "common.loading": "Ładowanie", - "common.no": "Nie", - "common.none": "brak", - "common.refreshing": "Odświeżanie", - "common.yes": "Tak", - "sig-image-picker.sigImage.label": "Obraz", - "datetime-picker.currentTimeZone": "Bieżąca strefa czasowa", - "duration-picker.unit.custom": "Niestandardowe (format ISO)", - "duration-picker.unit.days": "Dni", - "duration-picker.unit.hours": "Godziny", - "duration-picker.unit.minutes": "Minuty", - "duration-picker.unit.seconds": "Sekundy", - "duration-picker.unit.unlimited": "Bez ograniczeń", - "entity-command.confirm.multiple.title": "Czy na pewno chcesz wykonać akcję {action} dla tych elementów {type} ({count})", - "entity-command.confirm.single.description": "Zamierzasz wykonać akcję {action} {entityId}", - "entity-command.confirm.single.title": "Czy na pewno chcesz wykonać akcję {action} dla tego typu {type}", - "entity-configuration.viewAsJSON": "Pokaż jako JSON", - "file-explorer.path": "ŚCIEŻKA", - "form-footer.buttons.cancel": "Anuluj", - "form-footer.buttons.save": "Zapisz", - "gallery.recentTemplates": "Ostatnie szablony", - "job-progress-status.inaccurate": "Liczba zadań może być niedokładna w czasie rzeczywistym", - "main-menu.help.label": "Pomoc", - "main-menu.help.reportIssue": "Zgłoś problem", - "main-menu.help.viewLicense": "Pokaż licencję", - "main-navigation.certificates": "Certyfikaty", - "main-navigation.dashboard": "Kreska", - "main-navigation.data": "Dane", - "main-navigation.gallery": "Galeria", - "main-navigation.jobs": "Zadania", - "main-navigation.jobschedules": "Harmonogramy zadań", - "main-navigation.packages": "Pakiety", - "main-navigation.pools": "Pule", - "main-navigation.profile": "Profil", - "models.nodes": "Węzły", - "models.pool": "Pula", - "models.pools": "Pule", - "models.storageAccount": "Konto magazynu", - "node-configuration.allocation-time": "Czas alokacji", - "node-configuration.end-time": "Czas zakończenia", - "node-configuration.exit-code": "Kod zakończenia", - "node-configuration.external-ip": "Zewnętrzny adres IP", - "node-configuration.id": "Identyfikator", - "node-configuration.internal-ip": "Wewnętrzny adres IP", - "node-configuration.is-dedicated": "Jest dedykowany", - "node-configuration.last-boot-time": "Ostatni czas rozruchu", - "node-configuration.node-agent-version": "Wersja agenta węzła", - "node-configuration.node-size": "Rozmiar węzła", - "node-configuration.retry-count": "Liczba ponowień próby", - "node-configuration.run-time": "Czas wykonania", - "node-configuration.running-tasks-count": "Uruchomione zadania", - "node-configuration.scheduling-state": "Stan planowania", - "node-configuration.start-task-completed": "Ukończone w", - "node-configuration.start-task-execution": "Rozpocznij wykonywanie zadania", - "node-configuration.start-task-not-started": "Rozpocznij wykonywanie zadania", - "node-configuration.start-task-running": "Uruchomione dla", - "node-configuration.start-time": "Czas rozpoczęcia", - "node-configuration.state": "Stan", - "node-configuration.state-transition-time": "Czas zmiany stanu", - "node-configuration.total-tasks-run": "Całkowite uruchomienie zadania", - "node-configuration.total-tasks-succeeded": "Łączna liczba pomyślnie wykonanych zadań", - "node-configuration.url": "Adres URL", - "partial-sort-warning.load-all": "Załaduj wszystko (może to zająć dużo czasu)", - "partial-sort-warning.loading-all": "Ładowanie wszystkich jednostek. Czekaj.", - "partial-sort-warning.manual-update": "Lista nie będzie automatycznie aktualizowana podczas sortowania (ze względu na wydajność)", - "partial-sort-warning.message": "Wszystkie jednostki nie zostały załadowane, tu pokazywane jest częściowe sortowanie.", - "partial-sort-warning.update": "Aktualizuj", - "pool-graphs.diskUsage": "Użycie dysku", - "pool-graphs.network": "Sieć", - "pool-os-picker.containerConfiguration": "Konfiguracja kontenera", - "pool-picker.reset": "Resetuj", - "pool-scale-picker.type.fixed": "Stały rozmiar", - "profile-button.about": "Informacje", - "profile-button.logout": "Wyloguj się", - "profile-button.profile": "Profil", - "profile-button.report": "Zgłoś błąd lub propozycję funkcji", - "profile-button.settings": "Ustawienia", - "profile-button.thirdPartyNotices": "Uwagi dotyczące innych firm", - "profile-button.viewLogs": "Wyświetl dzienniki", - "profile-button.viewTheme": "Wyświetl kolory motywu", - "rerun-task-form.action": "Uruchom ponownie", - "rerun-task-form.subtitle": "Spowoduje to usunięcie zadania i utworzenie nowego o tym samym identyfikatorze.", - "rerun-task-form.title": "Uruchom ponownie zadanie", - "resource-permission-button.none": "brak", - "resource-permission-button.permission": "Uprawnienie", - "settings.general": "Ogólne", - "settings.saved": "Zapisano", - "settings.title": "Ustawienia", - "task-commands.delete": "Usuń", - "task-configuration.affinityId.label": "Identyfikator koligacji", - "task-configuration.applicationPackages.application": "Aplikacja", - "task-configuration.applicationPackages.label": "Pakiety aplikacji", - "task-configuration.applicationPackages.none": "To zadanie nie zawiera żadnych odwołań do pakietu aplikacji", - "task-configuration.applicationPackages.summary": "Odwołanie pakietu aplikacji ({count})", - "task-configuration.applicationPackages.version": "Wersja", - "task-configuration.commandLine.label": "Wiersz polecenia", - "task-configuration.computeNode": "Węzeł obliczeniowy", - "task-configuration.creationTime.label": "Czas utworzenia", - "task-configuration.displayName.label": "Wyświetl nazwę", - "task-configuration.exitConditions.default": "Domyślny", - "task-configuration.exitConditions.label": "Warunki zakończenia", - "task-configuration.exitConditions.noOpExitCodes": "Kody zakończenia, które niczego nie robią", - "task-configuration.exitConditions.onSchedulingError": "Przy błędzie planowania", - "task-configuration.exitConditions.terminateJobExitCodes": "Kody zakończenia, które przerywają wykonywanie zadania", - "task-configuration.general": "Ogólne", - "task-configuration.id.label": "Identyfikator", - "task-configuration.lastModified.label": "Ostatnia modyfikacja", - "task-configuration.multiInstanceSettings.coordinationCommandLine.label": "Wiersz polecenia koordynacji", - "task-configuration.multiInstanceSettings.label": "Ustawienia dotyczące wielu wystąpień", - "task-configuration.multiInstanceSettings.numberOfInstances.label": "Liczba wystąpień", - "task-configuration.nodeId.label": "Identyfikator węzła", - "task-configuration.nodeUrl.label": "Adres URL węzła", - "task-configuration.outputFiles.destination": "Miejsce docelowe", - "task-configuration.outputFiles.label": "Pliki wyjściowe", - "task-configuration.outputFiles.pattern": "Wzorzec", - "task-configuration.outputFiles.uploadWhen": "Przekaż, gdy", - "task-configuration.pool.label": "Pula", - "task-configuration.previousState.label": "Poprzedni stan", - "task-configuration.previousStateTransitionTime.label": "Poprzedni czas zmiany stanu", - "task-configuration.state.label": "Stan", - "task-configuration.stateTransitionTime.label": "Czas zmiany stanu", - "task-configuration.taskRootDir.label": "Katalog główny zadania", - "task-configuration.taskRootDirUrl.label": "Adres URL katalogu głównego zadania", - "task-configuration.userIdentity.label": "Tożsamość użytkownika", - "task-dependency-browser.no-dependency": "To zadanie nie zależy od żadnych innych zadań", - "task-node-info.nodeNotFound": "Węzęł obliczeniowy już nie istnieje", - "task-resource-files.fileMode": "Tryb plików", - "task-resource-files.filePath": "Ścieżka pliku węzła", - "task-resource-files.none": "To zadanie nie zawiera żadnych plików zasobów", - "user-account-picker.password": "Hasło", - "user-account-picker.username": "Nazwa użytkownika" -} diff --git a/desktop/i18n-deprecated/resources.pt-BR.json b/desktop/i18n-deprecated/resources.pt-BR.json deleted file mode 100644 index 606550ad9..000000000 --- a/desktop/i18n-deprecated/resources.pt-BR.json +++ /dev/null @@ -1,311 +0,0 @@ -{ - "aad-app-secret-picker.description.label": "Descrição (Opcional)", - "aad-app-secret-picker.expireIn.label": "Expira em", - "aad-app-secret-picker.secret.label": "Segredo. Um será gerado automaticamente se não fornecido", - "account-cost-card.subtitle": "Os custos exibidos são referentes ao pré-imposto relatado. Por favor, observe que o custo poderá ser parcial.", - "account-cost-card.title": "Custo diário", - "account-cost-card.total": "Total para o período de faturamento", - "account-cost-card.unsupportedSubscription": "Os custos para esta subscrição não podem ser exibidos(Não suportado)", - "account-cost-card.usingLocalAccount": "Não pode obter o custo com a conta local lote", - "account-details.monitoring": "Monitoramento", - "account-details.resources": "Recursos", - "account-monitoring.aggregatedOver": "Agregado sobre intervalo {interval}", - "account-monitoring.coreCount": "Minutos de núcleo", - "account-monitoring.currentNodeStates": "Estados do nó atual", - "account-monitoring.failedTask": "Tarefa com falha", - "account-monitoring.nodeStates": "Estados do nó", - "account-monitoring.notARM": "O monitoramento de conta só é habilitado para contas de lote ARM", - "account-monitoring.taskStates": "Status da Tarefa", - "account-summary-card.resourceGroup": "Grupo de recursos", - "account-summary-card.subscription": "Assinatura", - "account-summary-card.url": "URL", - "add-certificate-form.certificate.description": "Selecione um certificado (pfx ou cer) para carregar", - "add-certificate-form.certificate.invalid": "O certificado precisa ser válido e dos tipos CER ou PFX somente", - "add-certificate-form.certificate.label": "Certificado", - "add-certificate-form.certificate.required": "Por favor, selecione um arquivo de certificado válido", - "add-certificate-form.certificate.select": "Selecionar um certificado", - "add-certificate-form.password.label": "Senha do certificado", - "add-certificate-form.password.required": "Uma senha é necessária se o certificado é no formato '.pfx'", - "add-certificate-form.title": "Criar certificado", - "add-task-form.action": "adicionar", - "add-task-form.subtitle": "Adicionar uma tarefa para o trabalho selecionado", - "add-task-form.title": "Adicionar tarefa", - "batch-account-create.accountName.maxlength": "O nome da conta deve ter comprimento máximo de 64 caracteres", - "batch-account-create.accountName.minLength": "Nome da conta tem um comprimento mínimo de 3 caracteres", - "batch-account-create.accountName.pattern": "Nome da conta pode conter apenas números e letras minúsculas", - "batch-account-create.accountName.required": "Nome da conta é um campo obrigatório", - "batch-account-create.location.reachedQuota": "Você já alcançou sua cota {used} de {quota} contas para a assinatura '{subscription}' neste local. Você pode solicitar um um aumento da sua quota, criar a conta em outro local ou criar a conta em outra assinatura.", - "batch-account-create.location.required": "Localização é um campo obrigatório", - "batch-account-create.resourceGroup.noneAvailable": "Não há grupos de recursos disponíveis na assinatura 'assinatura {}'", - "batch-account-create.resourceGroup.notAllowed": "Você não tem permissão para criar uma conta batch neste grupo de recursos.", - "batch-account-create.resourceGroup.required": "Grupo de recursos é um campo obrigatório", - "batch-account-create.resourceGroup.willCreate": "Este grupo de recurso ainda não existe, e ele será criado antes da conta do lote.", - "batch-account-create.storageAccount.missingSubscription": "Por favor especifique a assinatura e a localização antes de escolher uma conta de armazenamento.", - "batch-account-create.subscription.required": "Assinatura é um campo obrigatório", - "blob-container-picker.loading": "Carregando containers", - "browse-layout.openedAdvancedFilter": "Folha de filtro avançado aberta", - "certificate-references-picker.addOne": "Adicionar um certificado", - "certificate-references-picker.duplicate": "Não pode fazer referência a duas vezes o mesmo certificado {digital}", - "certificate-references-picker.noCertificates": "Sem certificado (s) encontrado para esta conta de lote, favor fazer upload de seu certificado (s) primeiro.", - "common.apply": "Aplicar", - "common.back": "voltar", - "common.configuration": "CONFIGURATION", - "common.confirm": "Confirmar", - "common.loading": "Carregando", - "common.no": "Não", - "common.none": "NENHUM", - "common.rebootAll": "Reiniciar todos", - "common.refresh": "Atualizar", - "common.refreshing": "Atualizando", - "common.required": "Obrigatório", - "common.updated": "Atualizado", - "common.yes": "Sim", - "create-new-aad-app.create": "Criar", - "create-new-aad-app.secret.label": "Segredo", - "create-new-aad-app.title": "Criar uma nova aplicação", - "sig-image-picker.sigImage.label": "Imagem", - "sig-image-picker.errorLoading": "Servidor encontrou um erro ao carregar imagens personalizadas, por favor, tente novamente mais tarde.", - "sig-image-picker.noSigImageAvailable": "Não existem imagens personalizadas nesta região para esta conta", - "sig-image-picker.nodeAgentSku.label": "Agente de nó", - "datetime-picker.currentTimeZone": "Fuso horário atual", - "datetime-picker.date": "Data", - "datetime-picker.pickDate": "Selecione uma data", - "datetime-picker.time": "Hora", - "duration-picker.unit.custom": "Personalizado (formato ISO)", - "duration-picker.unit.days": "Dias", - "duration-picker.unit.hours": "Horas", - "duration-picker.unit.label": "Unidade", - "duration-picker.unit.minutes": "Minutos", - "duration-picker.unit.seconds": "Segundos", - "duration-picker.unit.unlimited": "Ilimitado", - "edit-app-package-form.title": "Editar referências do pacote de aplicação para a pool {poolId}", - "edit-app-package-form.updated": "Pacotes de aplicativos para {poolId} foram atualizados", - "edit-certificate-references-form.title": "Editar referências de certificado para pool {poolId}", - "edit-certificate-references-form.updated": "Certificados para {poolId} foram atualizados", - "editable-table.deleteRow": "Excluir linha", - "entity-command.confirm.multiple.title": "Tem certeza de que deseja {action} este(s) {count} {type}", - "entity-command.confirm.single.description": "Você está prestes a {action} {entityId}", - "entity-command.confirm.single.title": "Tem certeza que deseja {action} este(a) {type}", - "entity-configuration.viewAsJSON": "Exibir como JSON", - "entity-configuration.viewClassic": "Modo de exibição clássico", - "file-explorer.collapseAll": "Recolher tudo", - "file-explorer.noFiles": "Não há arquivos", - "file-explorer.noPathMatch": "Nenhum arquivo encontrado para \"{caminho}\"", - "file-explorer.path": "PATH", - "file-explorer.unknownFile": "Não é possível encontrar este arquivo. Verifique o caminho.", - "file-group-picker.create": "Criar um novo grupo de arquivos", - "file-group-picker.warning": "Este grupo de arquivos parece não existir. Ele será criado quando o trabalho for enviado.", - "file-viewer-container.notAllowed": "Arquivo {filename} não pode ser acessado. Servidor retornou o erro forbidden.", - "file-viewer-container.notFound": "Arquivo {filename} não existe.", - "file-viewer-container.unkownFileType": "Este arquivo não tem uma extensão conhecida. Ainda quer abri-lo?", - "form-footer.buttons.andClose": "{action} e Fechar", - "form-footer.buttons.cancel": "Cancelar", - "form-footer.buttons.jsonEditor": "Alterne para o editor de JSON", - "form-footer.buttons.normalForm": "Alterne para o formulário clássico", - "form-footer.buttons.save": "Salvar", - "form-footer.buttons.select": "Selecione", - "gallery.actions": "Ações", - "gallery.myLibrary": "Minha biblioteca", - "gallery.recentTemplates": "Modelos recentes", - "gallery.title": "Aplicativos de galeria", - "gallery.viewReadme": "Visualizar readme", - "job-progress-status.inaccurate": "Contagem de tarefa pode não ser exata em tempo real", - "job-state.active.message": "O Job está sendo executado. A tarefa pode ser agendada.", - "job-state.completed.allTasksCompleted.message": "O Job será concluído quando todas as tarefas forem concluídas", - "job-state.completed.jmcomplete.message": "O Job será concluído com sucesso quando o Job de gerenciamento for concluído.", - "job-state.completed.message": "O Job foi concluído. Nenhuma outra tarefa será aceita.", - "job-state.completed.taskfailed.message": "Trabalho concluído com falha em uma das tarefas.", - "job-state.completed.timeout.message": "O tempo limite para o Job foi esgotado. O Job ficou em estado de execução por mais tempo que limite fornecido.", - "job-state.completed.userTerminated.message": "O Job foi concluído pelo usuário.", - "job-state.deleting.message": "O Job está em processo de exclusão", - "job-state.disabled.message": "O trabalho está desabilitado. Nenhuma tarefa será executada.", - "job-state.disabling.message": "O Job está em processo de desativação.", - "job-state.enabling.message": "O trabalho está retornando com status desativado", - "job-state.terminating.message": "O Job está sendo encerrado.", - "list-base.filterApplied": "Novo filtro aplicado, {count} resultados", - "list-base.filterCleared": "Filtro limpo, {count} resultados", - "location-picker.noLocationInSubscription": "Não há locais disponíveis em assinatura '{nome}'", - "main-menu.help.label": "Ajuda", - "main-menu.help.privacyStatement": "Declaração de Privacidade", - "main-menu.help.reportIssue": "Informar problema", - "main-menu.help.viewLicense": "Visualizar licença", - "main-navigation.certificates": "Certificados", - "main-navigation.dashboard": "Traço", - "main-navigation.data": "Dados", - "main-navigation.gallery": "Galeria", - "main-navigation.jobs": "Trabalhos", - "main-navigation.jobschedules": "Planos de trabalho", - "main-navigation.label": "Navegação principal", - "main-navigation.packages": "Pacotes", - "main-navigation.pools": "Pools", - "main-navigation.profile": "Perfil", - "models.container": "Container", - "models.node": "Nó", - "models.nodes": "Nós", - "models.pool": "Pool", - "models.pools": "Pools", - "models.storageAccount": "Conta de armazenamento", - "node-configuration.allocation-time": "Tempo de alocação", - "node-configuration.end-time": "Hora de término", - "node-configuration.exit-code": "Código de saída", - "node-configuration.external-ip": "Ip externo", - "node-configuration.id": "ID", - "node-configuration.internal-ip": "Ip interno", - "node-configuration.is-dedicated": "É dedicado", - "node-configuration.last-boot-time": "Última inicialização", - "node-configuration.node-agent-version": "Versão do agente de nó", - "node-configuration.node-size": "Tamanho do nó", - "node-configuration.retry-count": "Repetir contagem", - "node-configuration.run-time": "Tempo de execução", - "node-configuration.running-tasks-count": "Executando tarefas", - "node-configuration.scheduling-state": "Estado de agendamento", - "node-configuration.start-task-completed": "Concluída em", - "node-configuration.start-task-execution": "Iniciar a execução da tarefa", - "node-configuration.start-task-not-started": "Iniciar a execução da tarefa", - "node-configuration.start-task-running": "Executando para", - "node-configuration.start-time": "Hora de início", - "node-configuration.state": "Estado", - "node-configuration.state-transition-time": "Tempo de transição de estado", - "node-configuration.total-tasks-run": "Total de Tarefas Executadas", - "node-configuration.total-tasks-succeeded": "Total de tarefas executadas com sucesso", - "node-configuration.url": "URL", - "partial-sort-warning.load-all": "Carregar todos (isto pode demorar muito tempo)", - "partial-sort-warning.loading-all": "Carregando todas as entidades. Por favor aguarde.", - "partial-sort-warning.manual-update": "Lista não será atualizada automaticamente enquanto classificando (por questões de desempenho)", - "partial-sort-warning.message": "Todas as entidades não foram carregadas, esta sendo apresentada uma classificação parcial.", - "partial-sort-warning.update": "Atualização", - "pool-commands.resize": "Redimensionar", - "pool-commands.stopResize": "Parar o redimensionamento", - "pool-details.estimatedCost": "Custo estimado deste pool no estado corrente", - "pool-details.graphs": "Gráficos", - "pool-details.openInNewWindow": "Abrir em uma nova janela", - "pool-graphs.cpu": "CPU", - "pool-graphs.diskIO": "Leitra e Escrita de Disco.", - "pool-graphs.diskUsage": "Uso do disco", - "pool-graphs.last": "Último", - "pool-graphs.memory": "Memória", - "pool-graphs.network": "Rede", - "pool-graphs.notEnabled": "CPU, memória, disco, etc.", - "pool-graphs.timespan.10min": "10 minutos", - "pool-graphs.timespan.1h": "Uma hora.", - "pool-graphs.timespan.24h": "24 horas", - "pool-graphs.timespan.7d": "7 dias", - "pool-graphs.timespan.label": "Gráficos de intervalo de tempo", - "pool-os-picker.category.container": "Container", - "pool-os-picker.category.dataScience": "Data science", - "pool-os-picker.category.distributions": "Distribuições", - "pool-os-picker.category.rendering": "Gráficos e renderização", - "pool-os-picker.containerConfiguration": "Configuração do container", - "pool-os-picker.nodeAgentSelection": "Baseado em sua seleção, o seguinte agente '{sku}' será usado", - "pool-picker.filterByID": "Pesquisar por id", - "pool-picker.filterByOS": "Filtrar por sistema operacional", - "pool-picker.noneMatching": "Você não tem pools combinando os filtros atuais.", - "pool-picker.reset": "Redefinir", - "pool-scale-picker.evaluationInterval.label": "Intervalo de fórmula de avaliação", - "pool-scale-picker.resizeTimeout.label": "Redefinir timeout", - "pool-scale-picker.targetDedicatedNodes.label": "Nós dedicados", - "pool-scale-picker.targetLowPriorityNodes.label": "Nós de baixa prioridade", - "pool-scale-picker.type.autoscale": "AutoScale", - "pool-scale-picker.type.fixed": "Tamanho fixo", - "pool-scale-picker.type.label": "Tipo de escala", - "profile-button.about": "Sobre", - "profile-button.logout": "Logout", - "profile-button.profile": "Perfil", - "profile-button.report": "Relatar um bug ou recurso solicitado", - "profile-button.settings": "Configurações", - "profile-button.thirdPartyNotices": "Anúncios de terceiros", - "profile-button.viewLogs": "Exibição de Logs", - "profile-button.viewTheme": "Exibição de cores de tema", - "programmatic-usage.authenticationType": "Tipo de autenticação", - "programmatic-usage.credentials": "Credenciais", - "programmatic-usage.setup": "Configuração", - "programmatic-usage.title": "Credenciais e exemplos de código para esta conta de lote", - "rerun-task-form.action": "Reexecutar", - "rerun-task-form.subtitle": "Isto irá excluir a tarefa e criar uma nova com o mesmo id.", - "rerun-task-form.title": "Reexecutar tarefa", - "resource-permission-button.giveRole": "Dar papel {role}", - "resource-permission-button.none": "NENHUM", - "resource-permission-button.permission": "Permissão", - "resource-permission-button.removeAccess": "Remover o acesso", - "resourcefile-picker.add.dragAndDrop": "Você pode arrastar e soltar os arquivos aqui para que eles sejam carregados automaticamente", - "resourcefile-picker.add.fromStorage": "Adicionar do Azure Storage", - "resourcefile-picker.add.fromURL": "Adicionar URL", - "resourcefile-picker.add.uploadFile": "Upload de arquivo", - "resourcefile-picker.blobPrefix": "Prefixo de BLOB", - "resourcefile-picker.cloudFileDialog.title": "Escolher o(s) arquivo(s) da conta de armazenamento", - "settings.gallerySettings": "Configurações de galeria", - "settings.general": "Geral", - "settings.reset": "Retornar às configurações iniciais", - "settings.saved": "Salvo", - "settings.title": "Configurações", - "storage-error-display.noAutoStorage": "Nenhuma conta de armazenamento vinculados configurada para esta conta de lote. Isso é necessário para o gerenciamento de grupos de arquivos.", - "task-commands.delete": "Excluir", - "task-commands.rerun": "Executar novamente", - "task-commands.terminate": "Terminar", - "task-configuration.affinityId.label": "Identificação de afinidade", - "task-configuration.applicationPackages.application": "Aplicativo", - "task-configuration.applicationPackages.label": "Pacotes de aplicativos", - "task-configuration.applicationPackages.none": "Esta tarefa não contém nenhuma referência de pacote de aplicativo", - "task-configuration.applicationPackages.summary": "referência de pacote de aplicativo {count}", - "task-configuration.applicationPackages.version": "Versão", - "task-configuration.commandLine.label": "Linha de comando", - "task-configuration.computeNode": "Nó de Computação", - "task-configuration.creationTime.label": "Tempo de criação", - "task-configuration.displayName.label": "Nome para Exibição", - "task-configuration.exitConditions.default": "Padrão", - "task-configuration.exitConditions.fileUploadError": "Erro ao fazer upload de arquivo", - "task-configuration.exitConditions.label": "Condições de saída", - "task-configuration.exitConditions.noOpExitCodes": "Códigos de saída que não fazem nada", - "task-configuration.exitConditions.onSchedulingError": "No erro de agendamento", - "task-configuration.exitConditions.terminateJobExitCodes": "Códigos de saída que encerram o trabalho", - "task-configuration.general": "Geral", - "task-configuration.id.label": "ID", - "task-configuration.lastModified.label": "Última Modificação", - "task-configuration.multiInstanceSettings.coordinationCommandLine.label": "Coordenação de linha de comando", - "task-configuration.multiInstanceSettings.label": "Configurações de múltiplas instâncias", - "task-configuration.multiInstanceSettings.numberOfInstances.label": "Número de instâncias", - "task-configuration.nodeId.label": "ID do nó", - "task-configuration.nodeUrl.label": "URL do nó", - "task-configuration.outputFiles.destination": "Destino", - "task-configuration.outputFiles.label": "Arquivos de saída", - "task-configuration.outputFiles.pattern": "Padrão", - "task-configuration.outputFiles.uploadWhen": "Quando carregar", - "task-configuration.pool.label": "Pool", - "task-configuration.previousState.label": "Estado anterior", - "task-configuration.previousStateTransitionTime.label": "Tempo de transição de estado anterior", - "task-configuration.state.label": "Estado", - "task-configuration.stateTransitionTime.label": "Tempo de transição de estado", - "task-configuration.taskRootDir.label": "Diretório de raiz de tarefa", - "task-configuration.taskRootDirUrl.label": "URL do diretório raiz da tarefa", - "task-configuration.userIdentity.label": "Identidade de usuário", - "task-dependency-browser.no-dependency": "Esta tarefa não depende de qualquer outras tarefas", - "task-node-info.navigateToNode": "Navegue para o nó de computação", - "task-node-info.navigateToPool": "Navegar para o pool", - "task-node-info.nodeNotFound": "Nó de computação não existe mais", - "task-node-info.poolNotFound": "O pool não existe mais", - "task-resource-files.fileMode": "Modo de arquivo", - "task-resource-files.filePath": "Caminho do arquivo de nó", - "task-resource-files.httpUrl": "Url http", - "task-resource-files.none": "Essa tarefa não contém recurso de arquivos", - "time-range-picker.customRange": "Intervalo personalizado", - "time-range-picker.errors.invalidRange": "Hora de início deve ser menor do que a Hora de fim", - "time-range-picker.errors.required": "Pelo menos a hora de início ou de término deve ser fornecida", - "time-range-picker.quickRange": "Intervalo rápido", - "time-range-picker.timeRange": "Intervalo de tempo", - "timezone-dropdown.tooltip": "Selecione o fuso horário para as datas", - "user-account-picker.gid": "ID do grupo de usuários", - "user-account-picker.linuxConfiguration": "Configuração específica do Linux", - "user-account-picker.loginMode": "Modo de Login", - "user-account-picker.password": "Senha", - "user-account-picker.runAsAdmin": "Executar como administador", - "user-account-picker.sshPrivateKey": "Chave privada SSH", - "user-account-picker.uid": "Id de usuário", - "user-account-picker.username": "Nome do Usuário", - "user-account-picker.windowsConfiguration": "Configuração específica do Windows", - "user-accounts-picker.addOne": "Adicionar uma conta de usuário", - "user-accounts-picker.duplicate": "Não é possível ter 2 usuários com o mesmo nome '{username}'", - "virtual-network-picker.noneAvailable": "Existem redes virtuais disponíveis sob subscrição '{subscriptionId}' local '{location}'.", - "virtual-network-picker.notArm": "Não é possível usar VNET ao usar uma conta de grupo local", - "virtual-network-picker.subnet": "Subrede", - "virtual-network-picker.virtualNetwork": "Rede virtual" -} diff --git a/desktop/i18n-deprecated/resources.pt.json b/desktop/i18n-deprecated/resources.pt.json deleted file mode 100644 index be8216693..000000000 --- a/desktop/i18n-deprecated/resources.pt.json +++ /dev/null @@ -1,121 +0,0 @@ -{ - "aad-app-secret-picker.description.label": "Descrição (Opcional)", - "account-details.monitoring": "Monitorização", - "account-details.resources": "Recursos", - "account-summary-card.resourceGroup": "Grupo de recursos", - "account-summary-card.subscription": "Subscrição", - "account-summary-card.url": "URL", - "add-certificate-form.certificate.label": "Certificado", - "add-certificate-form.certificate.select": "Selecionar um certificado:", - "add-certificate-form.password.label": "Palavra-passe de Certificado", - "add-certificate-form.title": "Criar certificado", - "add-task-form.action": "Adicionar...", - "add-task-form.title": "Adicionar Tarefa", - "common.back": "Anterior\r\n", - "common.configuration": "Configuração", - "common.confirm": "Confirmar", - "common.loading": "A carregar...", - "common.no": "Não", - "common.none": "Nenhum", - "common.refresh": "Atualizar", - "common.refreshing": "A atualizar...", - "common.yes": "Sim", - "create-new-aad-app.create": "Criar", - "create-new-aad-app.secret.label": "Segredo", - "sig-image-picker.sigImage.label": "Imagem", - "duration-picker.unit.days": "dias", - "duration-picker.unit.hours": "Horas", - "duration-picker.unit.label": "Unidade", - "duration-picker.unit.minutes": "Minutos", - "duration-picker.unit.seconds": "Segundos", - "duration-picker.unit.unlimited": "Ilimitado", - "editable-table.deleteRow": "Eliminar linha", - "file-explorer.collapseAll": "Fechar tudo", - "file-explorer.noFiles": "Nenhum ficheiro", - "file-explorer.path": "Caminho", - "form-footer.buttons.cancel": "Cancelar", - "form-footer.buttons.save": "Guardar", - "form-footer.buttons.select": "Selecionar", - "main-menu.help.label": "Ajuda", - "main-menu.help.privacyStatement": "Declaração de Privacidade\r\n", - "main-navigation.certificates": "Certificados", - "main-navigation.dashboard": "Travessão", - "main-navigation.data": "Dados", - "main-navigation.gallery": "Galeria", - "main-navigation.jobs": "Tarefas", - "main-navigation.jobschedules": "Agendas de trabalhos", - "main-navigation.packages": "Pacotes", - "main-navigation.pools": "Conjuntos", - "main-navigation.profile": "Perfil", - "models.container": "Contentor", - "models.node": "nó", - "models.nodes": "nós", - "models.pool": " Conjunto", - "models.pools": "Conjuntos", - "models.storageAccount": "Conta de armazenamento", - "node-configuration.end-time": "Hora de fim:", - "node-configuration.exit-code": "Código de Saída", - "node-configuration.external-ip": "IP externo", - "node-configuration.id": "ID", - "node-configuration.last-boot-time": "Último Arranque", - "node-configuration.node-size": "Tamanho do Nó", - "node-configuration.retry-count": "Contagem de repetições", - "node-configuration.run-time": "Tempo de execução", - "node-configuration.running-tasks-count": "Executar Tarefas", - "node-configuration.start-time": "Hora de início:", - "node-configuration.state": "Estado", - "node-configuration.url": "URL", - "partial-sort-warning.update": "Atualizar", - "pool-commands.resize": "Redimensionar", - "pool-details.graphs": "Gráficos", - "pool-details.openInNewWindow": "Abrir numa janela nova", - "pool-graphs.cpu": "CPU", - "pool-graphs.diskUsage": "Utilização do Disco", - "pool-graphs.last": "Último", - "pool-graphs.memory": "Memória", - "pool-graphs.network": "Rede", - "pool-graphs.timespan.10min": "10 minutos", - "pool-graphs.timespan.1h": "1 Hora", - "pool-graphs.timespan.7d": "7 Dias", - "pool-os-picker.category.container": "Contentor", - "pool-picker.filterByOS": "Filtrar por SO", - "pool-picker.reset": "Repor", - "profile-button.about": "acerca de();", - "profile-button.logout": "Terminar Sessão", - "profile-button.profile": "Perfil", - "profile-button.settings": "Definições", - "profile-button.thirdPartyNotices": "Avisos de terceiros", - "profile-button.viewLogs": "Ver Registos", - "programmatic-usage.authenticationType": "Tipo de autenticação", - "programmatic-usage.credentials": "Credenciais", - "programmatic-usage.setup": "Configuração", - "rerun-task-form.action": "Voltar a executar", - "resource-permission-button.none": "Nenhum", - "resource-permission-button.removeAccess": "Remover acesso", - "settings.general": "Geral", - "settings.saved": "Guardado", - "settings.title": "Definições", - "task-commands.delete": "Eliminar", - "task-commands.terminate": "Terminar", - "task-configuration.affinityId.label": "ID de Afinidade", - "task-configuration.applicationPackages.application": "Aplicação", - "task-configuration.applicationPackages.label": "Pacotes de Aplicações", - "task-configuration.applicationPackages.version": "Versão", - "task-configuration.commandLine.label": "Linha de comandos:", - "task-configuration.creationTime.label": "Hora de Criação", - "task-configuration.displayName.label": "Nome a Apresentar", - "task-configuration.exitConditions.default": "Predefinição", - "task-configuration.general": "Geral", - "task-configuration.id.label": "ID", - "task-configuration.lastModified.label": "Última modificação", - "task-configuration.multiInstanceSettings.numberOfInstances.label": "Número de instâncias", - "task-configuration.nodeId.label": "ID do Nó:", - "task-configuration.outputFiles.destination": "Destino", - "task-configuration.outputFiles.label": "Ficheiros de Saída", - "task-configuration.outputFiles.pattern": "Padrão", - "task-configuration.pool.label": " Conjunto", - "task-configuration.state.label": "Estado", - "task-configuration.userIdentity.label": "Identidade de Utilizador", - "user-account-picker.password": "Palavra-passe", - "user-account-picker.username": "Nome de Utilizador" -} diff --git a/desktop/i18n-deprecated/resources.ru.json b/desktop/i18n-deprecated/resources.ru.json deleted file mode 100644 index c591927ab..000000000 --- a/desktop/i18n-deprecated/resources.ru.json +++ /dev/null @@ -1,99 +0,0 @@ -{ - "account-details.monitoring": "Мониторинг", - "account-details.resources": "Ресурсы", - "account-summary-card.url": "URL-адрес", - "add-certificate-form.certificate.label": "Сертификат", - "add-certificate-form.certificate.select": "Выберите сертификат", - "add-certificate-form.title": "Создание сертификата", - "add-task-form.action": "добавить", - "browse-layout.openedAdvancedFilter": "Колонка расширенного фильтра открыта", - "common.apply": "Применить", - "common.back": "Назад", - "common.configuration": "CONFIGURATION", - "common.confirm": "Подтверждение", - "common.loading": "Загрузка", - "common.no": "Нет", - "common.none": "NONE", - "common.refresh": "Обновить", - "common.required": "Требуется", - "common.updated": "Обновлен", - "common.yes": "Да", - "create-new-aad-app.create": "Создать", - "sig-image-picker.sigImage.label": "Образ", - "datetime-picker.date": "Дата", - "datetime-picker.time": "Время", - "duration-picker.unit.custom": "Пользовательский (ISO формат)", - "duration-picker.unit.days": "Дни", - "duration-picker.unit.hours": "Часы", - "duration-picker.unit.label": "Единицы", - "duration-picker.unit.minutes": "Минуты", - "duration-picker.unit.seconds": "Секунды", - "duration-picker.unit.unlimited": "Неограниченно", - "file-explorer.path": "Путь", - "form-footer.buttons.cancel": "Отмена", - "form-footer.buttons.jsonEditor": "Переключиться в редактор JSON", - "form-footer.buttons.normalForm": "Переключиться на классический вид", - "form-footer.buttons.save": "Сохранить", - "form-footer.buttons.select": "Выбрать", - "gallery.actions": "Действия", - "job-state.active.message": "Задание выполняется. Сейчас можно запланировать задачу.", - "main-menu.help.label": "Справка", - "main-menu.help.privacyStatement": "Заявление о конфиденциальности", - "main-menu.help.viewLicense": "Просмотр лицензии", - "main-navigation.certificates": "Сертификаты", - "main-navigation.data": "Данные", - "main-navigation.gallery": "Галерея", - "main-navigation.jobs": "Задания", - "main-navigation.jobschedules": "Расписания заданий", - "main-navigation.packages": "Пакеты", - "main-navigation.pools": "Пулы", - "main-navigation.profile": "Профиль", - "models.container": "Контейнер", - "models.node": "Узел", - "models.pools": "Пулы", - "models.storageAccount": "Учетная запись хранения", - "node-configuration.allocation-time": "Время выделения", - "node-configuration.end-time": "Время окончания", - "node-configuration.id": "Идентификатор", - "node-configuration.start-time": "Время начала", - "node-configuration.state": "State", - "node-configuration.url": "URL-адрес", - "partial-sort-warning.update": "Обновить", - "pool-graphs.cpu": "ЦП", - "pool-graphs.last": "Последние", - "pool-graphs.memory": "Память", - "pool-graphs.network": "Сеть", - "pool-graphs.timespan.1h": "1 час", - "pool-graphs.timespan.24h": "24 часа", - "pool-os-picker.category.container": "Контейнер", - "pool-picker.reset": "Сброс", - "profile-button.profile": "Профиль", - "profile-button.settings": "Параметры", - "programmatic-usage.authenticationType": "Тип проверки подлинности", - "programmatic-usage.credentials": "Учетные данные", - "resource-permission-button.none": "NONE", - "resource-permission-button.permission": "Разрешение", - "settings.general": "Общее", - "settings.saved": "Сохранено", - "settings.title": "Параметры", - "task-commands.delete": "Удалить", - "task-commands.rerun": "Запустить повторно", - "task-configuration.applicationPackages.application": "Приложение", - "task-configuration.applicationPackages.none": "Эта задача не содержит ссылок на пакеты приложений", - "task-configuration.applicationPackages.version": "Версия", - "task-configuration.commandLine.label": "Командная строка", - "task-configuration.creationTime.label": "Время создания", - "task-configuration.displayName.label": "Отображаемое имя", - "task-configuration.exitConditions.default": "По умолчанию", - "task-configuration.general": "Общее", - "task-configuration.id.label": "Идентификатор", - "task-configuration.lastModified.label": "Дата изменения", - "task-configuration.nodeId.label": "Идентификатор узла", - "task-configuration.outputFiles.destination": "Назначение", - "task-configuration.outputFiles.pattern": "Шаблон", - "task-configuration.state.label": "State", - "time-range-picker.customRange": "Пользовательский диапазон", - "user-account-picker.password": "Пароль", - "user-account-picker.username": "Имя пользователя", - "virtual-network-picker.subnet": "Подсеть" -} diff --git a/desktop/i18n-deprecated/resources.sv.json b/desktop/i18n-deprecated/resources.sv.json deleted file mode 100644 index 88fd566e0..000000000 --- a/desktop/i18n-deprecated/resources.sv.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "duration-picker.unit.days": "Dagar", - "duration-picker.unit.hours": "Timmar", - "duration-picker.unit.minutes": "Minuter", - "duration-picker.unit.seconds": "Sekunder", - "duration-picker.unit.unlimited": "Obegr??nsad", - "main-navigation.certificates": "Certifikat", - "main-navigation.data": "Data", - "main-navigation.gallery": "Galleri", - "main-navigation.jobs": "Jobb", - "main-navigation.jobschedules": "Jobbscheman", - "main-navigation.packages": "Paket", - "main-navigation.pools": "Pooler", - "main-navigation.profile": "Profil", - "models.pools": "Pooler", - "models.storageAccount": "Lagringskonto", - "profile-button.profile": "Profil", - "settings.saved": "Sparade", - "user-account-picker.password": "L??senord", - "user-account-picker.username": "Anv??ndarnamn" -} \ No newline at end of file diff --git a/desktop/i18n-deprecated/resources.tr.json b/desktop/i18n-deprecated/resources.tr.json deleted file mode 100644 index c4f080ab9..000000000 --- a/desktop/i18n-deprecated/resources.tr.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "account-details.resources": "Kaynaklar", - "account-summary-card.url": "URL", - "add-certificate-form.certificate.required": "Lütfen geçerli bir sertifika dosyası seçin", - "add-certificate-form.certificate.select": "Sertifika seçin", - "add-task-form.action": "Ekle", - "add-task-form.title": "Görev Ekle", - "common.apply": "Uygula", - "common.configuration": "YAPILANDIRMA", - "common.loading": "Yükleniyor", - "common.no": "Hayır", - "common.none": "yok", - "common.yes": "Evet", - "duration-picker.unit.custom": "Custom (ISO biçimi)", - "duration-picker.unit.days": "Gün", - "duration-picker.unit.hours": "Saat", - "duration-picker.unit.label": "Birim", - "duration-picker.unit.minutes": "Dakika", - "duration-picker.unit.seconds": "Saniye", - "duration-picker.unit.unlimited": "Sınırsız", - "file-explorer.collapseAll": "Tümünü Daralt", - "file-explorer.path": "PATH", - "form-footer.buttons.cancel": "İptal", - "form-footer.buttons.save": "Kaydet", - "job-state.completed.allTasksCompleted.message": "Tüm görevler tamamlandığında iş başarıyla tamamlandı", - "job-state.completed.taskfailed.message": "Görevlerden biri başarısız olduğundan, iş bir hata ile sona erdi.", - "job-state.completed.timeout.message": "İş zaman aşımına uğradı. İş belirlenen sınırdan daha uzun süredir yürütülüyor.", - "main-menu.help.label": "Yardım", - "main-navigation.certificates": "Sertifikalar", - "main-navigation.dashboard": "Çizgi", - "main-navigation.data": "Veri", - "main-navigation.gallery": "Galeri", - "main-navigation.jobs": "Toplu İşlem işleri", - "main-navigation.jobschedules": "İş zamanlamaları", - "main-navigation.packages": "Paketler", - "main-navigation.pools": "Havuzlar", - "main-navigation.profile": "Profil", - "models.pools": "Havuzlar", - "models.storageAccount": "Depolama hesabı", - "node-configuration.id": "Kimlik", - "node-configuration.last-boot-time": "Son önyükleme zamanı", - "node-configuration.url": "URL", - "partial-sort-warning.update": "Güncelleştir", - "pool-picker.filterByOS": "İşletim sistemine göre filtrele", - "pool-picker.reset": "Sıfırla", - "profile-button.profile": "Profil", - "profile-button.settings": "Ayarlar", - "resource-permission-button.none": "yok", - "resource-permission-button.permission": "İzin", - "settings.general": "Genel", - "settings.saved": "Kaydedildi", - "settings.title": "Ayarlar", - "task-commands.delete": "Sil", - "task-configuration.applicationPackages.application": "Uygulama", - "task-configuration.applicationPackages.version": "SÜRÜM", - "task-configuration.displayName.label": "Görünen Ad", - "task-configuration.exitConditions.default": "Varsayılan", - "task-configuration.general": "Genel", - "task-configuration.id.label": "Kimlik", - "task-configuration.taskRootDir.label": "Görev kök dizini", - "user-account-picker.password": "Parola", - "user-account-picker.username": "Kullanıcı Adı" -} \ No newline at end of file diff --git a/desktop/i18n-deprecated/resources.zh-Hans.json b/desktop/i18n-deprecated/resources.zh-Hans.json deleted file mode 100644 index d44517cf4..000000000 --- a/desktop/i18n-deprecated/resources.zh-Hans.json +++ /dev/null @@ -1,307 +0,0 @@ -{ - "aad-app-secret-picker.description.label": "说明 (可选)", - "aad-app-secret-picker.expireIn.label": "过期于", - "aad-app-secret-picker.secret.label": "隐私项。如果未提供, 将自动生成一个", - "account-cost-card.subtitle": "这是税前成本报告。请注意,费用可能是部分的。", - "account-cost-card.title": "日常花费", - "account-cost-card.total": "账单期间合计", - "account-cost-card.unsupportedSubscription": "无法查看此订阅的成本 (不支持)", - "account-cost-card.usingLocalAccount": "不能使用本地批处理帐户获得成本", - "account-details.monitoring": "监控", - "account-details.resources": "资源", - "account-monitoring.aggregatedOver": "在 {interval} 间隔聚合", - "account-monitoring.coreCount": "核心分钟", - "account-monitoring.currentNodeStates": "当前节点状态", - "account-monitoring.failedTask": "失败的任务", - "account-monitoring.nodeStates": "节点状态", - "account-monitoring.notARM": "仅对ARM 批处理帐户启用帐户监视", - "account-monitoring.taskStates": "任务状态", - "account-summary-card.resourceGroup": "资源组", - "account-summary-card.subscription": "订阅", - "account-summary-card.url": "URL", - "add-certificate-form.certificate.description": "选择要上传的证书 (pfx 或 cer)", - "add-certificate-form.certificate.invalid": "证书必须只能是有效的 cer 或 pfx 文件", - "add-certificate-form.certificate.label": "证书", - "add-certificate-form.certificate.required": "请选择一个有效的证书文件", - "add-certificate-form.certificate.select": "选择证书", - "add-certificate-form.password.label": "证书密码", - "add-certificate-form.password.required": "如果证书格式为 \". pfx\", 则需要密码", - "add-certificate-form.title": "创建证书", - "add-task-form.action": "添加", - "add-task-form.subtitle": "向所选作业添加任务", - "add-task-form.title": "添加任务", - "batch-account-create.accountName.maxlength": "帐户名的最大长度为64个字符", - "batch-account-create.accountName.minLength": "帐户名的最小长度为3个字符", - "batch-account-create.accountName.pattern": "帐户名只能包含小写字母和数字", - "batch-account-create.accountName.required": "账户名称是必填字段", - "batch-account-create.location.reachedQuota": "您在这个位置的订阅 \"{subscription}\" 的 {quota}帐户已经达到了配额 {used}。您可以请求增加帐户配额、在其他位置创建帐户或在另一个订阅中创建帐户。", - "batch-account-create.location.required": "区域是必填字段", - "batch-account-create.resourceGroup.noneAvailable": "订阅 \"{subscription}\" 中没有可用的资源组", - "batch-account-create.resourceGroup.notAllowed": "您无权在此资源组下创建批处理帐户", - "batch-account-create.resourceGroup.required": "资源组是必填字段", - "batch-account-create.resourceGroup.willCreate": "此资源组尚未存在, 它将在这批帐户之前创建。", - "batch-account-create.storageAccount.missingSubscription": "请在选择存储帐户之前指定订阅和区域。", - "batch-account-create.subscription.required": "订阅是必填字段", - "blob-container-picker.loading": "容器加载中", - "browse-layout.openedAdvancedFilter": "打开的高级过滤项", - "certificate-references-picker.addOne": "添加证书", - "certificate-references-picker.duplicate": "不能两次引用同一个证书{thumbprint}", - "certificate-references-picker.noCertificates": "未找到此批处理帐户的证书, 请先上传您的证书。", - "common.apply": "应用", - "common.back": "上一步", - "common.configuration": "CONFIGURATION", - "common.confirm": "确认", - "common.loading": "正在加载", - "common.no": "否", - "common.none": "没有", - "common.rebootAll": "全部重新启动", - "common.refresh": "刷新", - "common.refreshing": "正在刷新", - "common.required": "必需", - "common.updated": "已更新", - "common.yes": "是", - "create-new-aad-app.create": "创建", - "create-new-aad-app.secret.label": "隐私", - "create-new-aad-app.title": "创建一个新的应用程序", - "sig-image-picker.sigImage.label": "图片", - "sig-image-picker.errorLoading": "服务器在加载自定义图像时遇到错误, 请稍后再试。", - "sig-image-picker.noSigImageAvailable": "此帐户的区域中没有自定义镜像", - "sig-image-picker.nodeAgentSku.label": "节点代理", - "datetime-picker.currentTimeZone": "当前时区", - "datetime-picker.date": "日期", - "datetime-picker.pickDate": "选择日期", - "datetime-picker.time": "时间", - "duration-picker.unit.custom": "自定义 (ISO 格式)", - "duration-picker.unit.days": "天", - "duration-picker.unit.hours": "小时", - "duration-picker.unit.label": "单位", - "duration-picker.unit.minutes": "分钟", - "duration-picker.unit.seconds": "秒", - "duration-picker.unit.unlimited": "无限制", - "edit-app-package-form.title": "编辑池 {poolId} 应用程序包", - "edit-app-package-form.updated": "{poolId} 的应用程序包已更新", - "edit-certificate-references-form.title": "为池 {poolId} 编辑证书引用", - "edit-certificate-references-form.updated": "{poolId}的证书已更新", - "editable-table.deleteRow": "删除行", - "entity-command.confirm.multiple.title": "您确定要 {action} 这些 {count} {type}", - "entity-command.confirm.single.description": "您将要使用{action} {entityId}", - "entity-command.confirm.single.title": "确实要 {action} 此 {type}", - "entity-configuration.viewAsJSON": "以JSON格式查看", - "entity-configuration.viewClassic": "经典视图", - "file-explorer.collapseAll": "全部折叠", - "file-explorer.noFiles": "没有文件", - "file-explorer.noPathMatch": "找不到在\"{path}\" 的文件", - "file-explorer.path": "PATH", - "file-explorer.unknownFile": "找不到此文件。请检查文件路径。", - "file-group-picker.create": "创建新的文件组", - "file-group-picker.warning": "文件组似乎不存在。将在提交作业时为您创建它。", - "file-viewer-container.notAllowed": "无法访问文件 {filename}。服务器返回禁止的错误", - "file-viewer-container.notFound": "文件 {filename} 不存在。", - "file-viewer-container.unkownFileType": "此文件扩展名未知。是否仍要打开它?", - "form-footer.buttons.andClose": "{action} 和关闭", - "form-footer.buttons.cancel": "取消", - "form-footer.buttons.jsonEditor": "切换到 JSON 编辑器", - "form-footer.buttons.normalForm": "切换到经典格式", - "form-footer.buttons.save": "保存", - "form-footer.buttons.select": "选择", - "gallery.actions": "操作", - "gallery.myLibrary": "我的库", - "gallery.recentTemplates": "最近使用的模板", - "gallery.title": "库应用程序", - "gallery.viewReadme": "查看自述文件", - "job-progress-status.inaccurate": "任务实时计数可能不准确", - "job-state.active.message": "当前作业正在运行。可以安排任务。", - "job-state.completed.allTasksCompleted.message": "当所有任务完成后,作业执行成功", - "job-state.completed.jmcomplete.message": "在作业管理器任务完成后,作业成功结束", - "job-state.completed.message": "作业已完成。不会再接受任何任务。", - "job-state.completed.taskfailed.message": "由于一个任务失败,作业完成失败。", - "job-state.completed.timeout.message": "作业超时。作业的运行时间超过了所提供的限制。", - "job-state.completed.userTerminated.message": "作业已由用户完成", - "job-state.deleting.message": "作业正在被删除的过程中", - "job-state.disabled.message": "作业已禁用。不会运行任何任务。", - "job-state.disabling.message": "任务正在被禁用", - "job-state.enabling.message": "作业正在从禁用状态返回", - "job-state.terminating.message": "作业正在终止", - "list-base.filterApplied": "应用了新的筛选器, {count} 结果", - "list-base.filterCleared": "筛选清除, {count} 结果", - "location-picker.noLocationInSubscription": "订阅 \"{name}\" 中没有可用的区域", - "main-menu.help.label": "帮助", - "main-menu.help.privacyStatement": "隐私声明", - "main-menu.help.reportIssue": "报告问题", - "main-menu.help.viewLicense": "查看许可证", - "main-navigation.certificates": "证书", - "main-navigation.dashboard": "破折号", - "main-navigation.data": "数据", - "main-navigation.gallery": "库", - "main-navigation.jobs": "作业", - "main-navigation.jobschedules": "作业计划", - "main-navigation.label": "主要内容导航", - "main-navigation.packages": "包", - "main-navigation.pools": "池", - "main-navigation.profile": "配置 文件", - "models.container": "容器", - "models.node": "节点", - "models.nodes": "节点集合", - "models.pool": "池", - "models.pools": "池", - "models.storageAccount": "存储帐户", - "node-configuration.allocation-time": "分配时间", - "node-configuration.end-time": "结束时间", - "node-configuration.exit-code": "退出代码", - "node-configuration.external-ip": "外部 ip", - "node-configuration.id": "ID", - "node-configuration.internal-ip": "内部 ip", - "node-configuration.is-dedicated": "是专用", - "node-configuration.last-boot-time": "最后启动时间", - "node-configuration.node-agent-version": "节点代理版本", - "node-configuration.node-size": "节点大小", - "node-configuration.retry-count": "重试次数", - "node-configuration.run-time": "执行时间", - "node-configuration.running-tasks-count": "运行任务", - "node-configuration.scheduling-state": "计划状态", - "node-configuration.start-task-completed": "完成于", - "node-configuration.start-task-execution": "启动任务执行", - "node-configuration.start-task-not-started": "启动任务执行", - "node-configuration.start-task-running": "运行的", - "node-configuration.start-time": "开始时间", - "node-configuration.state": "状态", - "node-configuration.state-transition-time": "状态转换时间", - "node-configuration.total-tasks-run": "全部任务运行", - "node-configuration.total-tasks-succeeded": "全部成功的任务", - "node-configuration.url": "URL", - "partial-sort-warning.load-all": "全部加载 (这可能需要很长时间)", - "partial-sort-warning.loading-all": "正在加载所有实体,请稍候。", - "partial-sort-warning.manual-update": "排序时不会自动更新列表 (性能原因)", - "partial-sort-warning.message": "尚未加载所有实体,这显示了部分排序。", - "partial-sort-warning.update": "更新", - "pool-commands.resize": "调整", - "pool-commands.stopResize": "停止调整大小", - "pool-details.estimatedCost": "当前状态下该池的估计成本", - "pool-details.graphs": "图表", - "pool-details.openInNewWindow": "在新窗口中打开", - "pool-graphs.cpu": "CPU", - "pool-graphs.diskIO": "磁盘 IO", - "pool-graphs.diskUsage": "磁盘使用情况", - "pool-graphs.last": "最后", - "pool-graphs.memory": "内存", - "pool-graphs.network": "网络", - "pool-graphs.notEnabled": "CPU、内存、磁盘等。", - "pool-graphs.timespan.10min": "10分钟", - "pool-graphs.timespan.1h": "1小时", - "pool-graphs.timespan.24h": "24小时", - "pool-graphs.timespan.7d": "7天", - "pool-graphs.timespan.label": "时间段图形", - "pool-os-picker.category.container": "容器", - "pool-os-picker.category.dataScience": "数据科学", - "pool-os-picker.category.distributions": "分发", - "pool-os-picker.category.rendering": "图形和渲染", - "pool-os-picker.containerConfiguration": "容器配置", - "pool-os-picker.nodeAgentSelection": "基于您的选择,节点代理 \"{sku}\"将被使用", - "pool-picker.filterByID": "按 id 搜索", - "pool-picker.filterByOS": "按操作系统筛选", - "pool-picker.noneMatching": "您没有与当前筛选器匹配的任何池。", - "pool-picker.reset": "重置", - "pool-scale-picker.evaluationInterval.label": "公式评估间隔", - "pool-scale-picker.resizeTimeout.label": "调整超时", - "pool-scale-picker.targetDedicatedNodes.label": "专用节点", - "pool-scale-picker.targetLowPriorityNodes.label": "低优先级节点", - "pool-scale-picker.type.autoscale": "自动缩放", - "pool-scale-picker.type.fixed": "固定尺寸", - "pool-scale-picker.type.label": "扩展类型", - "profile-button.about": "关于", - "profile-button.logout": "注销", - "profile-button.profile": "配置 文件", - "profile-button.report": "报告 bug 或功能请求", - "profile-button.settings": "设置", - "profile-button.thirdPartyNotices": "第三方通知", - "profile-button.viewLogs": "查看日志", - "profile-button.viewTheme": "查看主题颜色", - "programmatic-usage.authenticationType": "身份验证类型", - "programmatic-usage.credentials": "凭据", - "programmatic-usage.setup": "设置", - "programmatic-usage.title": "这批帐户的凭据和代码示例", - "rerun-task-form.action": "重新运行", - "rerun-task-form.subtitle": "这将删除该任务并创建一个具有相同ID的新任务。", - "rerun-task-form.title": "重新运行任务", - "resource-permission-button.giveRole": "授予 {role} 角色", - "resource-permission-button.none": "没有", - "resource-permission-button.permission": "权限", - "resource-permission-button.removeAccess": "删除访问权限", - "resourcefile-picker.add.dragAndDrop": "您可以在此处拖放文件以自动上传", - "resourcefile-picker.add.fromStorage": "从 Azure 存储添加", - "resourcefile-picker.add.fromURL": "从网址添加", - "resourcefile-picker.add.uploadFile": "上传文件", - "resourcefile-picker.blobPrefix": "Blob 前缀", - "resourcefile-picker.cloudFileDialog.title": "从存储帐户中选取文件", - "settings.general": "常规", - "settings.title": "设置", - "task-commands.delete": "删除", - "task-commands.rerun": "重新运行", - "task-commands.terminate": "终止", - "task-configuration.affinityId.label": "关联 id", - "task-configuration.applicationPackages.application": "应用程序", - "task-configuration.applicationPackages.label": "应用程序包", - "task-configuration.applicationPackages.none": "此任务不包含应用程序包引用", - "task-configuration.applicationPackages.summary": "{计数} 应用程序包引用", - "task-configuration.applicationPackages.version": "版本", - "task-configuration.commandLine.label": "命令行", - "task-configuration.computeNode": "运算节点", - "task-configuration.creationTime.label": "创建时间", - "task-configuration.displayName.label": "显示名称", - "task-configuration.exitConditions.default": "默认值", - "task-configuration.exitConditions.fileUploadError": "文件上传错误", - "task-configuration.exitConditions.label": "退出条件", - "task-configuration.exitConditions.noOpExitCodes": "不执行任何操作的退出代码", - "task-configuration.exitConditions.onSchedulingError": "在调度错误", - "task-configuration.exitConditions.terminateJobExitCodes": "退出代码终止作业", - "task-configuration.general": "常规", - "task-configuration.id.label": "ID", - "task-configuration.lastModified.label": "上次修改时间", - "task-configuration.multiInstanceSettings.coordinationCommandLine.label": "协调命令行", - "task-configuration.multiInstanceSettings.label": "多实例设置", - "task-configuration.multiInstanceSettings.numberOfInstances.label": "实例数量", - "task-configuration.nodeId.label": "节点 ID", - "task-configuration.nodeUrl.label": "节点 URL", - "task-configuration.outputFiles.destination": "目标", - "task-configuration.outputFiles.label": "输出文件", - "task-configuration.outputFiles.pattern": "模式", - "task-configuration.outputFiles.uploadWhen": "上载时", - "task-configuration.pool.label": "池", - "task-configuration.previousState.label": "前一状态", - "task-configuration.previousStateTransitionTime.label": "上一个状态转换时间", - "task-configuration.state.label": "状态", - "task-configuration.stateTransitionTime.label": "状态过渡时间", - "task-configuration.taskRootDir.label": "任务根目录", - "task-configuration.taskRootDirUrl.label": "任务根目录 URL", - "task-configuration.userIdentity.label": "用户标识", - "task-dependency-browser.no-dependency": "此任务不依赖于任何其他任务", - "task-node-info.navigateToNode": "导航到计算节点", - "task-node-info.navigateToPool": "导航到池", - "task-node-info.nodeNotFound": "计算节点已经不存在了", - "task-node-info.poolNotFound": "池已经不存在了", - "task-resource-files.fileMode": "文件模式", - "task-resource-files.filePath": "节点文件路径", - "task-resource-files.httpUrl": "Http url", - "task-resource-files.none": "此任务不包含任何资源文件", - "time-range-picker.customRange": "自定义范围", - "time-range-picker.errors.invalidRange": "开始时间必须小于结束时间", - "time-range-picker.errors.required": "必须提供至少开始时间或结束时间", - "time-range-picker.quickRange": "快速范围", - "time-range-picker.timeRange": "时间范围", - "timezone-dropdown.tooltip": "选择日期的时区", - "user-account-picker.gid": "用户组 id", - "user-account-picker.linuxConfiguration": "linux 特定配置", - "user-account-picker.loginMode": "登录模式", - "user-account-picker.password": "密码", - "user-account-picker.runAsAdmin": "以管理员身份运行", - "user-account-picker.sshPrivateKey": "SSH 私钥", - "user-account-picker.uid": "用户 id", - "user-account-picker.username": "用户名", - "user-account-picker.windowsConfiguration": "Windows特定配置", - "user-accounts-picker.addOne": "添加用户帐户", - "user-accounts-picker.duplicate": "不能有2个同名的用户 \"{username}\"", - "virtual-network-picker.noneAvailable": "订阅 “{subscriptionId}” 和位置 “{location}” 下没有可用的虚拟网络。", - "virtual-network-picker.notArm": "当使用本地批处理账户时无法使用 VNET", - "virtual-network-picker.subnet": "子网", - "virtual-network-picker.virtualNetwork": "虚拟网络" -} diff --git a/desktop/i18n-deprecated/resources.zh-Hant.json b/desktop/i18n-deprecated/resources.zh-Hant.json deleted file mode 100644 index 6b6b2edb5..000000000 --- a/desktop/i18n-deprecated/resources.zh-Hant.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "account-details.resources": "資源", - "account-summary-card.url": "URL", - "add-certificate-form.certificate.label": "憑證", - "add-certificate-form.certificate.select": "選取憑證", - "add-task-form.action": "加入", - "batch-account-create.accountName.maxlength": "帳戶名稱最長為 64 個字元", - "browse-layout.openedAdvancedFilter": "已開啟進階篩選刀鋒視窗", - "common.apply": "套用", - "common.back": "上一頁", - "common.configuration": "組態", - "common.confirm": "確認", - "common.loading": "正在載入", - "common.no": "否", - "common.none": "無", - "common.rebootAll": "全部重新開機", - "common.refresh": "重新整理", - "common.required": "必要", - "common.yes": "是", - "create-new-aad-app.create": "建立", - "datetime-picker.date": "日期", - "datetime-picker.time": "時間", - "duration-picker.unit.custom": "自訂 (ISO 格式)", - "duration-picker.unit.days": "日", - "duration-picker.unit.hours": "小時", - "duration-picker.unit.minutes": "分鐘", - "duration-picker.unit.seconds": "秒", - "duration-picker.unit.unlimited": "無限制", - "editable-table.deleteRow": "刪除行", - "file-explorer.path": "PATH", - "form-footer.buttons.cancel": "取消", - "form-footer.buttons.save": "儲存", - "form-footer.buttons.select": "選擇", - "gallery.actions": "動作", - "job-state.completed.userTerminated.message": "作業已由使用者完成", - "main-menu.help.label": "說明", - "main-menu.help.privacyStatement": "隱私權聲明", - "main-navigation.certificates": "憑證", - "main-navigation.dashboard": "破折號", - "main-navigation.data": "資料", - "main-navigation.gallery": "主機庫", - "main-navigation.jobs": "作業", - "main-navigation.jobschedules": "作業排程", - "main-navigation.packages": "封裝", - "main-navigation.pools": "集區", - "main-navigation.profile": "設定檔", - "models.pools": "集區", - "node-configuration.end-time": "結束時間", - "node-configuration.external-ip": "外部 IP", - "node-configuration.id": "識別碼", - "node-configuration.retry-count": "重試計數", - "node-configuration.start-task-not-started": "執行任務", - "node-configuration.start-time": "開始時間", - "node-configuration.state": "狀態", - "node-configuration.url": "URL", - "partial-sort-warning.update": "更新", - "pool-graphs.memory": "記憶體", - "pool-graphs.network": "網路", - "pool-picker.reset": "重設", - "pool-scale-picker.resizeTimeout.label": "重新調整逾時長度", - "profile-button.logout": "登出", - "profile-button.profile": "設定檔", - "profile-button.report": "回報 bug 或功能請求", - "profile-button.settings": "設定", - "profile-button.viewLogs": "查看日誌", - "programmatic-usage.authenticationType": "驗證類型", - "programmatic-usage.credentials": "認證", - "resource-permission-button.giveRole": "給 {role} 角色", - "resource-permission-button.none": "無", - "resource-permission-button.permission": "使用權限", - "settings.general": "一般", - "settings.title": "設定", - "task-commands.delete": "刪除", - "task-configuration.applicationPackages.application": "應用程式", - "task-configuration.applicationPackages.version": "版本", - "task-configuration.commandLine.label": "命令列", - "task-configuration.displayName.label": "顯示名稱", - "task-configuration.exitConditions.default": "預設", - "task-configuration.general": "一般", - "task-configuration.id.label": "識別碼", - "task-configuration.lastModified.label": "上次修改日期", - "task-configuration.nodeId.label": "節點 ID", - "task-configuration.outputFiles.destination": "目的地", - "task-configuration.outputFiles.pattern": "模式", - "task-configuration.state.label": "狀態", - "task-dependency-browser.no-dependency": "此任務不依賴於任何其他任務", - "task-node-info.poolNotFound": "集區已不存在", - "task-resource-files.fileMode": "檔案模式", - "user-account-picker.password": "密碼", - "user-account-picker.username": "使用者名稱" -} diff --git a/desktop/package.json b/desktop/package.json index 9e38957aa..4f7f2b7af 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -43,10 +43,7 @@ "build-client:dev": " tsc -p tsconfig.node.json --noUnusedLocals false", "build-app": "npm run webpack -- --profile --colors --display-error-details --display-cached", "build-python": "pyinstaller python/main.spec -y --distpath=python/dist --workpath=python/build", - "build-i18n": "npm run ts scripts/i18n/generate.ts", - "build-i18n-xliff": "npm run ts scripts/i18n/create-xliff.ts", - "build-i18n-digest": "npm run ts scripts/i18n/digest-xliff.ts", - "build": "npm run clean && npm run build-translations && npm run build-client && npm run build-app && npm run build-i18n", + "build": "npm run clean && npm run build-translations && npm run build-client && npm run build-app", "build:clean": "npm run build", "build:package": "npm run build:prod && npm run build-python && npm run package", "build:prod": "cross-env NODE_ENV=production npm run build", diff --git a/desktop/scripts/i18n/create-xliff.ts b/desktop/scripts/i18n/create-xliff.ts deleted file mode 100644 index 5855be8de..000000000 --- a/desktop/scripts/i18n/create-xliff.ts +++ /dev/null @@ -1,29 +0,0 @@ -// eslint-disable no-console -import "../../src/client/init"; - -import * as fs from "fs"; -import * as mkdirp from "mkdirp"; -import * as path from "path"; -import { promisify } from "util"; -import { XliffSerializer } from "../../src/@batch-flask/compiler"; -import { loadDevTranslations } from "./load-dev-translations"; - -const ensureDir = mkdirp; -const writeFile = promisify(fs.writeFile); - -async function createXliffTranslations() { - const translations = await loadDevTranslations(); - const xliff = XliffSerializer.encode(translations); - const dest = "./i18n/xliffs/resources.en.xlf"; - await ensureDir(path.dirname(dest)); - await writeFile(dest, xliff); - console.log(`Saved compiled xliff to ${dest}`); -} - -async function run() { - await createXliffTranslations(); -} - -run().then(() => { - process.exit(0); -}); diff --git a/desktop/scripts/i18n/digest-xliff.ts b/desktop/scripts/i18n/digest-xliff.ts deleted file mode 100644 index 998398b2d..000000000 --- a/desktop/scripts/i18n/digest-xliff.ts +++ /dev/null @@ -1,35 +0,0 @@ -// eslint-disable no-console -import "../../src/client/init"; - -import * as fs from "fs"; -import * as globNode from "glob"; -import { promisify } from "util"; -import { XliffSerializer } from "../../src/@batch-flask/compiler"; - -const readFile = promisify(fs.readFile); -const writeFile = promisify(fs.writeFile); -const glob = promisify(globNode); - -async function digestXliffTranslations(file: string) { - const content = await readFile(file); - const result = await XliffSerializer.decode(content.toString()); - const json = JSON.stringify(result.translations, Object.keys(result.translations).sort(), 2); - const dest = `./i18n-deprecated/resources.${result.targetLanguage}.json`; - await writeFile(dest, json); - console.log(`Parsed xliff file ${file} and wrote json translations into ${dest}`); -} - -async function run() { - const files = await glob("./i18n/xliffs/*.xlf", { - ignore: "./i18n/xliffs/*.en.xlf", - }); - console.log(`Found ${files.length} xliff files. Processing and compiling json translations`); - for (const file of files) { - await digestXliffTranslations(file); - } - console.log(`Done compiling json translations`); -} - -run().then(() => { - process.exit(0); -}); diff --git a/desktop/scripts/i18n/generate.ts b/desktop/scripts/i18n/generate.ts deleted file mode 100644 index f7d663b6a..000000000 --- a/desktop/scripts/i18n/generate.ts +++ /dev/null @@ -1,25 +0,0 @@ -// eslint-disable no-console -import "../../src/client/init"; - -import * as fs from "fs"; -import { promisify } from "util"; -import { loadDevTranslations } from "./load-dev-translations"; - -const writeFile = promisify(fs.writeFile); - -async function createEnglishTranslations() { - const translations = await loadDevTranslations(); - const content = JSON.stringify(translations, null, 2); - - const dest = "./i18n-deprecated/resources.en.json"; - await writeFile(dest, content); - console.log(`Saved combined english translations (${translations.size}) to ${dest}`); -} - -async function run() { - await createEnglishTranslations(); -} - -run().then(() => { - process.exit(0); -}); diff --git a/desktop/scripts/i18n/load-dev-translations.ts b/desktop/scripts/i18n/load-dev-translations.ts deleted file mode 100644 index 20c1e72d3..000000000 --- a/desktop/scripts/i18n/load-dev-translations.ts +++ /dev/null @@ -1,21 +0,0 @@ -// eslint-disable no-console -import { DevTranslationsLoader } from "../../src/@batch-flask/compiler"; - -export async function loadDevTranslations(): Promise<{ [key: string]: string }> { - const loader = new DevTranslationsLoader(); - console.log("Loading dev translations"); - let hasDuplicate = false; - const translations = await loader.load((key, file) => { - console.warn(`${key} is being duplicated. "${file}"`); - hasDuplicate = true; - }); - console.log(`Loaded dev translations (${translations.size})`); - if (hasDuplicate) { - process.exit(1); - } - - return Array.from(translations).reduce((obj, [key, value]) => { - obj[key] = value; - return obj; - }, {}); -} From 89482de69523b1e6db59840404449c10bd5e5c7b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 23 Aug 2024 21:39:52 +0000 Subject: [PATCH 32/57] Bump ws from 7.5.9 to 7.5.10 in /util/common-config (#2914) Bumps [ws](https://github.com/websockets/ws) from 7.5.9 to 7.5.10. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/7.5.9...7.5.10) --- updated-dependencies: - dependency-name: ws dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- util/common-config/package-lock.json | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/util/common-config/package-lock.json b/util/common-config/package-lock.json index 9a3d98a92..1e635a86c 100644 --- a/util/common-config/package-lock.json +++ b/util/common-config/package-lock.json @@ -3950,6 +3950,20 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", @@ -4142,9 +4156,9 @@ } }, "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "engines": { "node": ">=8.3.0" From 198559acab825f701f60969ee8e09bb23bd25d59 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 23 Aug 2024 21:41:20 +0000 Subject: [PATCH 33/57] Bump axios from 1.6.1 to 1.7.5 Bumps [axios](https://github.com/axios/axios) from 1.6.1 to 1.7.5. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v1.6.1...v1.7.5) --- updated-dependencies: - dependency-name: axios dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index d709e6940..8b95297c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4423,12 +4423,12 @@ } }, "node_modules/axios": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", - "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.5.tgz", + "integrity": "sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw==", "dev": true, "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -6227,9 +6227,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true, "funding": [ { From 8e438ff4e095c0b62ecef190eb43818b95893942 Mon Sep 17 00:00:00 2001 From: Haopeng Wang Date: Wed, 28 Aug 2024 16:10:42 -0700 Subject: [PATCH 34/57] fix recover window failed to load in prod build (#2927) Co-authored-by: Hoppe Wang --- desktop/config/webpack.config.base.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/desktop/config/webpack.config.base.js b/desktop/config/webpack.config.base.js index ae51396d2..9568ec305 100644 --- a/desktop/config/webpack.config.base.js +++ b/desktop/config/webpack.config.base.js @@ -56,7 +56,8 @@ const baseConfig = { }), new CopyWebpackPlugin({ patterns: [ - { context: "src/client/splash-screen", from: "**/*", to: "client/splash-screen" }, + { context: "src/client/splash-screen", from: "**/*.(html|svg)", to: "client/splash-screen" }, + { context: "src/client/recover-window", from: "**/*.(html|svg)", to: "client/recover-window" }, { context: "src/client/proxy", from: "**/*", to: "client/proxy" }, { context: "src/client/resources", from: "**/*", to: "client/resources" }, { context: "src/app/assets", from: "**/*", to: "assets" }, From c2a348e06c415e4c8c24eef12e00d6ed293b02a1 Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Wed, 1 May 2024 13:38:18 -0400 Subject: [PATCH 35/57] DEV_TOOLS_MODE controls window placement --- desktop/src/client/main-window/main-window.ts | 12 +++++++++++- docs/setup.md | 15 +++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/desktop/src/client/main-window/main-window.ts b/desktop/src/client/main-window/main-window.ts index 22c824f11..28296e926 100644 --- a/desktop/src/client/main-window/main-window.ts +++ b/desktop/src/client/main-window/main-window.ts @@ -5,6 +5,7 @@ import { BrowserWindow, app, ipcMain, nativeImage } from "electron"; import { BehaviorSubject, Observable } from "rxjs"; import { Constants } from "../client-constants"; import { BatchExplorerApplication, GenericWindow, enableRemoteForWindow } from "../core"; +import { is } from "immutable"; // Webpack dev server url when using HOT=1 const devServerUrl = Constants.urls.main.dev; @@ -26,6 +27,9 @@ export enum WindowState { FailedLoad, } +const AllowedDevToolsModes = ["left", "right", "undocked", "detach", "bottom"] as const; +type DevToolMode = typeof AllowedDevToolsModes[number]; + export class MainWindow extends GenericWindow { public appReady: Promise; public state: Observable; @@ -99,7 +103,9 @@ export class MainWindow extends GenericWindow { // Open the DevTools. if (process.env.NODE_ENV !== "production") { - window.webContents.openDevTools({ mode: 'undocked' }); + const mode = isDevToolsMode(process.env.DEV_TOOLS_MODE) ? + process.env.DEV_TOOLS_MODE : "undocked"; + window.webContents.openDevTools({ mode }); } return window; @@ -135,3 +141,7 @@ export class MainWindow extends GenericWindow { }); } } + +function isDevToolsMode(value: any): value is DevToolMode { + return AllowedDevToolsModes.includes(value); +} diff --git a/docs/setup.md b/docs/setup.md index b040a09fc..d195fb615 100644 --- a/docs/setup.md +++ b/docs/setup.md @@ -52,6 +52,21 @@ This command will enable hot reload for a better development experience. Simply Please also take a look at the [coding guidelines](coding-guidelines.md) for this repo for best practices. +In developer-mode, Batch Explorer starts with Chrome Developer Tools (DevTools) opened in "undocked" mode. To open DevTools in another mode, set the `DEV_TOOLS_MODE` environment variables. The allowed values are "left", "right", "bottom", "undocked", and "detach". + +**Linux shells:** + +```bash +DEV_TOOLS_MODE=right npm run launch:desktop +``` + +**Powershell:** + +```powershell +$Env:DEV_TOOLS_MODE = "right" +npm run launch:desktop +``` + ## Editor If you're using VSCode (recommended) we suggest you use the following extensions: From c92ae75d24eb34c2f1f2d69e62fac53b72a2059a Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Fri, 26 Apr 2024 13:02:23 -0400 Subject: [PATCH 36/57] Upgrades Angular to 11.2.12 Needed for slide toggles. --- desktop/package-lock.json | 54 ++++++++++++++-------------- desktop/package.json | 26 +++++++------- util/common-config/package-lock.json | 14 -------- 3 files changed, 40 insertions(+), 54 deletions(-) diff --git a/desktop/package-lock.json b/desktop/package-lock.json index 76067d77f..ee90bd8a2 100644 --- a/desktop/package-lock.json +++ b/desktop/package-lock.json @@ -9,17 +9,17 @@ "version": "2.21.0", "license": "MIT", "dependencies": { - "@angular/animations": "^11.0.0", - "@angular/cdk": "^11.0.0", - "@angular/common": "^11.0.0", - "@angular/compiler": "^11.0.0", - "@angular/core": "^11.0.0", - "@angular/forms": "^11.0.0", - "@angular/material": "^11.0.0", - "@angular/platform-browser": "^11.0.0", - "@angular/platform-browser-dynamic": "^11.0.0", - "@angular/platform-server": "^11.0.0", - "@angular/router": "^11.0.0", + "@angular/animations": "^11.2.12", + "@angular/cdk": "^11.2.12", + "@angular/common": "^11.2.12", + "@angular/compiler": "^11.2.12", + "@angular/core": "^11.2.12", + "@angular/forms": "^11.2.12", + "@angular/material": "^11.2.12", + "@angular/platform-browser": "^11.2.12", + "@angular/platform-browser-dynamic": "^11.2.12", + "@angular/platform-server": "^11.2.12", + "@angular/router": "^11.2.12", "@azure/core-util": "1.4.0", "@azure/msal-node": "^2.7.0", "@azure/storage-blob": "^12.11.0", @@ -67,8 +67,8 @@ "@angular-eslint/eslint-plugin": "^13.2.1", "@angular-eslint/eslint-plugin-template": "^13.2.1", "@angular-eslint/template-parser": "^13.2.1", - "@angular/compiler-cli": "^11.0.0", - "@ngtools/webpack": "^11.0.0", + "@angular/compiler-cli": "^11.2.12", + "@ngtools/webpack": "^11.2.12", "@playwright/test": "^1.43.1", "@types/chart.js": "^2.9.24", "@types/d3": "^7.4.0", @@ -184,9 +184,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.1.2.tgz", - "integrity": "sha512-V7zOMqL2l56JcwXVyswkG+7+t67r9XtkrVzRcG2Z5ZYwafU+iKWMwg5kBFZr1SX7fM1M9E4MpskxqtagQeUKng==", + "version": "11.2.19", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.2.19.tgz", + "integrity": "sha512-kvS0QXDYDatLyf0NYv2sahPYD7kya4g5GpQAV1ddjjLmEVeZssHt+Xfk2tzrkzYzqRMiyspx3HPPrrOnMUAFhQ==", "dev": true, "dependencies": { "ajv": "6.12.6", @@ -197,7 +197,7 @@ }, "engines": { "node": ">= 10.13.0", - "npm": ">= 6.11.0", + "npm": "^6.11.0 || ^7.5.6", "yarn": ">= 1.13.0" } }, @@ -1666,22 +1666,22 @@ } }, "node_modules/@ngtools/webpack": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-11.1.2.tgz", - "integrity": "sha512-x/HVx4doKu4gAwGGk+C89JCFe5GF8Te7I7uvwMTqEXr+Ua9YHYvN/q2IwLdhIXPB4ilBSIjrb9zm05yBvBTAeg==", + "version": "11.2.19", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-11.2.19.tgz", + "integrity": "sha512-HwLHA6ZrLSk7VHm5Bv3a8ljM6uU8+/670u2fKfMFwM4UQ42+yTFihwfFKLWQIcawBOlVCaUosr6o1xmeSquAqA==", "dev": true, "dependencies": { - "@angular-devkit/core": "11.1.2", - "enhanced-resolve": "5.6.0", + "@angular-devkit/core": "11.2.19", + "enhanced-resolve": "5.7.0", "webpack-sources": "2.2.0" }, "engines": { "node": ">= 10.13.0", - "npm": ">= 6.11.0", + "npm": "^6.11.0 || ^7.5.6", "yarn": ">= 1.13.0" }, "peerDependencies": { - "@angular/compiler-cli": "^11.0.0 || ^11.1.0-next", + "@angular/compiler-cli": "^11.0.0 || ^11.2.0-next", "typescript": "~4.0.0 || ~4.1.0", "webpack": "^4.0.0" } @@ -7711,9 +7711,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.6.0.tgz", - "integrity": "sha512-C3GGDfFZmqUa21o10YRKbZN60DPl0HyXKXxoEnQMWso9u7KMU23L7CBHfr/rVxORddY/8YQZaU2MZ1ewTS8Pcw==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.7.0.tgz", + "integrity": "sha512-6njwt/NsZFUKhM6j9U8hzVyD4E4r0x7NQzhTCbcWOJ0IQjNSAoalWmb0AE51Wn+fwan5qVESWi7t2ToBxs9vrw==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", diff --git a/desktop/package.json b/desktop/package.json index 4f7f2b7af..3b09080fa 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -102,9 +102,9 @@ "@angular-eslint/eslint-plugin": "^13.2.1", "@angular-eslint/eslint-plugin-template": "^13.2.1", "@angular-eslint/template-parser": "^13.2.1", - "@angular/compiler-cli": "^11.0.0", + "@angular/compiler-cli": "^11.2.12", "@batch/common-config": "^1.0.0", - "@ngtools/webpack": "^11.0.0", + "@ngtools/webpack": "^11.2.12", "@playwright/test": "^1.43.1", "@types/chart.js": "^2.9.24", "@types/d3": "^7.4.0", @@ -185,17 +185,17 @@ }, "dependencies": { "@azure/core-util": "1.4.0", - "@angular/animations": "^11.0.0", - "@angular/cdk": "^11.0.0", - "@angular/common": "^11.0.0", - "@angular/compiler": "^11.0.0", - "@angular/core": "^11.0.0", - "@angular/forms": "^11.0.0", - "@angular/material": "^11.0.0", - "@angular/platform-browser": "^11.0.0", - "@angular/platform-browser-dynamic": "^11.0.0", - "@angular/platform-server": "^11.0.0", - "@angular/router": "^11.0.0", + "@angular/animations": "^11.2.12", + "@angular/cdk": "^11.2.12", + "@angular/common": "^11.2.12", + "@angular/compiler": "^11.2.12", + "@angular/core": "^11.2.12", + "@angular/forms": "^11.2.12", + "@angular/material": "^11.2.12", + "@angular/platform-browser": "^11.2.12", + "@angular/platform-browser-dynamic": "^11.2.12", + "@angular/platform-server": "^11.2.12", + "@angular/router": "^11.2.12", "@azure/bonito-core": "^1.0.0", "@azure/bonito-ui": "^1.0.0", "@azure/msal-node": "^2.7.0", diff --git a/util/common-config/package-lock.json b/util/common-config/package-lock.json index 1e635a86c..7f8631db2 100644 --- a/util/common-config/package-lock.json +++ b/util/common-config/package-lock.json @@ -3950,20 +3950,6 @@ "is-typedarray": "^1.0.0" } }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, "node_modules/universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", From 48b57a735338772400b01a29f3881e4f68eebc55 Mon Sep 17 00:00:00 2001 From: David Watrous Date: Tue, 23 Apr 2024 16:37:05 -0400 Subject: [PATCH 37/57] Add support for using default browser for auth Fixes #2446 --- .../client/core/aad/auth-loopback-client.ts | 200 ++++++++++++++++++ .../src/client/core/aad/auth-provider.spec.ts | 31 ++- desktop/src/client/core/aad/auth-provider.ts | 109 ++++++---- .../src/client/core/aad/auth/aad.service.ts | 1 + .../authentication.service.spec.ts | 6 +- .../authentication/authentication.service.ts | 58 ++++- 6 files changed, 350 insertions(+), 55 deletions(-) create mode 100644 desktop/src/client/core/aad/auth-loopback-client.ts diff --git a/desktop/src/client/core/aad/auth-loopback-client.ts b/desktop/src/client/core/aad/auth-loopback-client.ts new file mode 100644 index 000000000..0d7e944bb --- /dev/null +++ b/desktop/src/client/core/aad/auth-loopback-client.ts @@ -0,0 +1,200 @@ +import { log } from "@batch-flask/utils"; +import { IncomingMessage, Server, ServerResponse, createServer } from "http"; +import { ILoopbackClient, ServerAuthorizationCodeResponse } from "@azure/msal-node"; +import type { AddressInfo } from "net"; + +/** + * Listen for an auth code response on the loopback address. Will use a preferred + * port if available, but fall back to a random port if not. + */ +export class AuthLoopbackClient implements ILoopbackClient { + port: number = 0; // default port, which will be set to a random available port + private server: Server; + + private constructor(port: number = 0) { + this.port = port; + } + + /** + * Initializes a loopback server with an available port + * @param preferredPort + * @param logger + * @returns + */ + static async initialize(preferredPort: number | undefined): Promise { + const loopbackClient = new AuthLoopbackClient(); + + if (preferredPort === 0 || preferredPort === undefined) { + return loopbackClient; + } + const isPortAvailable = await loopbackClient.isPortAvailable(preferredPort); + + if (isPortAvailable) { + loopbackClient.port = preferredPort; + } + + return loopbackClient; + } + + /** + * Spins up a loopback server which returns the server response when the localhost redirectUri is hit + * @param successTemplate + * @param errorTemplate + * @returns + */ + async listenForAuthCode(successTemplate?: string, errorTemplate?: string): Promise { + if (!!this.server) { + throw new Error('Auth code listener already exists. Cannot create another.'); + } + + const authCodeListener = new Promise((resolve, reject) => { + this.server = createServer(async (req: IncomingMessage, res: ServerResponse) => { + console.log("[Loopback] Handling loopback request at", req.url); + const url = req.url; + if (!url) { + res.end(errorTemplate || "Login failed: Error occurred loading redirectUrl"); + reject(new Error('Auth code listener callback was invoked without a url.')); + return; + } else if (url === "/") { + res.end(successTemplate || "Successfully logged in to Batch Explorer. You may close this window."); + return; + } + + const authCodeResponse = AuthLoopbackClient.getDeserializedQueryString(url); + if (authCodeResponse.code) { + console.log("[Loopback] Has auth code"); + const redirectUri = await this.getRedirectUri(); + res.writeHead(302, { location: redirectUri }); // Prevent auth code from being saved in the browser history + res.end(); + } + resolve(authCodeResponse); + }); + this.server.listen(this.port); + log.debug(`Initialized auth code listener on port ${this.port}`); + }); + + // Wait for server to be listening + await new Promise((resolve) => { + let ticks = 0; + const id = setInterval(() => { + if ((5000 / 100) < ticks) { + throw new Error('Timed out waiting for auth code listener to be registered.'); + } + + if (this.server.listening) { + clearInterval(id); + resolve(); + } + ticks++; + }, 100); + }); + + return authCodeListener; + } + + /** + * Get the port that the loopback server is running on + * @returns + */ + getRedirectUri(): string { + if (!this.server) { + throw new Error('No auth code listener exists yet.'); + } + + const addressInfo = this.server.address(); + console.log("[Loopback] Address info:", addressInfo); + if (addressInfo == null || typeof addressInfo === "string") { + this.closeServer(); + throw new Error("Failed to read auth code listener port"); + } + + return `http://localhost:${addressInfo.port}`; + } + + /** + * Close the loopback server + */ + closeServer(): void { + console.log("Closing server"); + if (!!this.server) { + this.server.close(); + } + } + + /** + * Attempts to create a server and listen on a given port + * @param port + * @returns + */ + isPortAvailable(port: number): Promise { + return new Promise(resolve => { + const server = createServer() + .listen(port, () => { + server.close(); + resolve(true); + }) + .on("error", () => { + resolve(false); + }); + }); + } + + /** + * Returns URL query string as server auth code response object. + */ + static getDeserializedQueryString( + query: string + ): ServerAuthorizationCodeResponse { + // Check if given query is empty + if (!query) { + return {}; + } + // Strip the ? symbol if present + const parsedQueryString = this.parseQueryString(query); + // If ? symbol was not present, above will return empty string, so give original query value + const deserializedQueryString: ServerAuthorizationCodeResponse = + this.queryStringToObject( + parsedQueryString || query + ); + // Check if deserialization didn't work + if (!deserializedQueryString) { + throw "Unable to deserialize query string"; + } + return deserializedQueryString; + } + + /** + * Parses query string from given string. Returns empty string if no query symbol is found. + * @param queryString + */ + static parseQueryString(queryString: string): string { + const queryIndex1 = queryString.indexOf("?"); + const queryIndex2 = queryString.indexOf("/?"); + if (queryIndex2 > -1) { + return queryString.substring(queryIndex2 + 2); + } else if (queryIndex1 > -1) { + return queryString.substring(queryIndex1 + 1); + } + return ""; + } + + /** + * Parses string into an object. + * + * @param query + */ + static queryStringToObject(query: string): ServerAuthorizationCodeResponse { + const obj: {[key:string]:string} = {}; + const params = query.split("&"); + const decode = (s: string) => decodeURIComponent(s.replace(/\+/g, " ")); + params.forEach((pair) => { + if (pair.trim()) { + const [key, value] = pair.split(/=(.+)/g, 2); // Split on the first occurence of the '=' character + if (key && value) { + obj[decode(key)] = decode(value); + } + } + }); + return obj as ServerAuthorizationCodeResponse; + } +} diff --git a/desktop/src/client/core/aad/auth-provider.spec.ts b/desktop/src/client/core/aad/auth-provider.spec.ts index 073b694d9..11ba6385c 100644 --- a/desktop/src/client/core/aad/auth-provider.spec.ts +++ b/desktop/src/client/core/aad/auth-provider.spec.ts @@ -3,7 +3,7 @@ import AuthProvider from "./auth-provider"; describe("AuthProvider", () => { let authProvider: AuthProvider; - const authCodeCallbackSpy = jasmine.createSpy("authCodeCallback") + const authCodeSpy = jasmine.createSpy("authCodeCallback") .and.returnValue("some-code"); const appSpy: any = { properties: { @@ -27,8 +27,11 @@ describe("AuthProvider", () => { it("authenticates interactively first, then silently", async () => { const call = async () => await authProvider.getToken({ - resourceURI: "resourceURI1", tenantId: "tenant1", - authCodeCallback: authCodeCallbackSpy + resourceURI: "resourceURI1", + browser: "builtin", + tenantId: "tenant1", + browserAuthCallback: authCodeSpy, + builtInAuthCodeCallback: authCodeSpy }); const clientSpy = makeClientApplicationSpy(); spyOn(authProvider, "_getClient").and.returnValue(clientSpy); @@ -38,7 +41,7 @@ describe("AuthProvider", () => { returnToken(clientSpy.acquireTokenSilent, "silent-token-1"); const result1 = await call(); - expect(authCodeCallbackSpy).toHaveBeenCalled(); + expect(authCodeSpy).toHaveBeenCalled(); expect(clientSpy.getAuthCodeUrl).toHaveBeenCalled(); expect(clientSpy.acquireTokenByCode).toHaveBeenCalled(); expect(clientSpy.acquireTokenSilent).not.toHaveBeenCalled(); @@ -46,10 +49,10 @@ describe("AuthProvider", () => { clientSpy.getAuthCodeUrl.calls.reset(); clientSpy.acquireTokenByCode.calls.reset(); - authCodeCallbackSpy.calls.reset(); + authCodeSpy.calls.reset(); const result2 = await call(); - expect(authCodeCallbackSpy).not.toHaveBeenCalled(); + expect(authCodeSpy).not.toHaveBeenCalled(); expect(clientSpy.getAuthCodeUrl).not.toHaveBeenCalled(); expect(clientSpy.acquireTokenByCode).not.toHaveBeenCalled(); expect(clientSpy.acquireTokenSilent).toHaveBeenCalled(); @@ -65,14 +68,18 @@ describe("AuthProvider", () => { const result1 = await authProvider.getToken({ resourceURI: "resourceURI1", + browser: "builtin", tenantId: "tenant1", - authCodeCallback: authCodeCallbackSpy + browserAuthCallback: authCodeSpy, + builtInAuthCodeCallback: authCodeSpy }); const result2 = await authProvider.getToken({ resourceURI: "resourceURI1", + browser: "builtin", tenantId: "tenant2", - authCodeCallback: authCodeCallbackSpy + browserAuthCallback: authCodeSpy, + builtInAuthCodeCallback: authCodeSpy }); expect(result1.accessToken).toEqual("tenant1-token"); @@ -103,8 +110,10 @@ describe("AuthProvider", () => { try { await authProvider.getToken({ tenantId: "tenant1", + browser: "builtin", resourceURI: "resourceURI1", - authCodeCallback: authCodeSpy + browserAuthCallback: authCodeSpy, + builtInAuthCodeCallback: authCodeSpy }); if (!retryable) { fail(`Should have thrown an error on code ${code}`); @@ -171,8 +180,10 @@ describe("AuthProvider", () => { try { await authProvider.getToken({ tenantId: "tenant1", + browser: "builtin", resourceURI: "resourceURI1", - authCodeCallback: authCodeSpy + browserAuthCallback: authCodeSpy, + builtInAuthCodeCallback: authCodeSpy }); } catch (e) { fail(`Should not have thrown error: ${e}`); diff --git a/desktop/src/client/core/aad/auth-provider.ts b/desktop/src/client/core/aad/auth-provider.ts index f3d1514f7..f7a7dfa0e 100644 --- a/desktop/src/client/core/aad/auth-provider.ts +++ b/desktop/src/client/core/aad/auth-provider.ts @@ -1,7 +1,8 @@ import { AccountInfo, AuthenticationResult, - PublicClientApplication + PublicClientApplication, + SilentFlowRequest } from "@azure/msal-node"; import { log } from "@batch-flask/utils"; import { BatchExplorerApplication } from ".."; @@ -15,7 +16,18 @@ const MSAL_SCOPES = ["user_impersonation"]; export type AuthorizationResult = AuthenticationResult; -export type AuthCodeCallback = +/** + * A callback which performs interactive auth using an external + * web browser + */ +export type BrowserAuthCallback = + (client: PublicClientApplication, tokenRequest: SilentFlowRequest, url: string, tenant: string) => Promise; + +/** + * A callback which peforms silent or interactive auth using a built-in + * Electron window + */ +export type BuiltInAuthCodeCallback = (url: string, tenant: string, silent?: boolean) => Promise; /** @@ -52,15 +64,19 @@ export default class AuthProvider { */ public async getToken(options: { resourceURI: string, + browser: "external" | "builtin", tenantId?: string, forceRefresh?: boolean, - authCodeCallback: AuthCodeCallback + browserAuthCallback: BrowserAuthCallback, + builtInAuthCodeCallback: BuiltInAuthCodeCallback, }): Promise { const { resourceURI, + browser, tenantId = defaultTenant, forceRefresh = false, - authCodeCallback + browserAuthCallback, + builtInAuthCodeCallback } = options; if (this._logoutPromise) { @@ -77,52 +93,76 @@ export default class AuthProvider { const client = await this._getClient(tenantId); const authRequest = this._authRequest(resourceURI, tenantId); + let account: AccountInfo | null = null; try { log.debug(`[${tenantId}] Trying to silently acquire token`); - const account = await this._getAccount(tenantId); + account = await this._getAccount(tenantId); if (!account) { throw new Error( - "[internal] No account for silent token acquisition" + "[internal] No valid account found for silent auth" ); } + const result = await client.acquireTokenSilent({ ...authRequest, account, forceRefresh }); return result; } catch (silentTokenException) { - log.debug(`[${tenantId}] Trying silent auth code flow (${silentTokenException})`); - let url, code; + let result: AuthorizationResult; - try { - // Attempt to get authorization code silently - url = await client.getAuthCodeUrl( - { ...authRequest, prompt: "none" } - ); - code = await authCodeCallback(url, tenantId, true); - } catch (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(";") + `)`); - throw silentAuthException; - } - log.debug( - `[${tenantId}] Trying interactive auth code flow (${silentAuthException})`); - url = await client.getAuthCodeUrl({ + if (browser === "external") { + log.debug(`[${tenantId}] Trying browser interactive auth code flow (${silentTokenException})`); + + const url = await client.getAuthCodeUrl({ ...authRequest, domainHint: tenantId, loginHint: this._primaryUsername }); - code = await authCodeCallback(url, tenantId); + result = await browserAuthCallback(client, {...authRequest, account, forceRefresh}, url, tenantId); + } else { + log.debug(`[${tenantId}] Trying silent auth code flow (${silentTokenException})`); + + let code: string; + try { + // Attempt to get authorization code silently + const url = await client.getAuthCodeUrl( + { ...authRequest, prompt: "none" } + ); + code = await builtInAuthCodeCallback(url, tenantId, true); + } catch (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(";") + `)`); + throw silentAuthException; + } + log.debug( + `[${tenantId}] Trying built-in interactive auth code flow (${silentAuthException})`); + const url = await client.getAuthCodeUrl({ + ...authRequest, + domainHint: tenantId, + loginHint: this._primaryUsername + }); + + code = await builtInAuthCodeCallback(url, tenantId); + } + + result = await client.acquireTokenByCode({ ...authRequest, code }); + } + + if (result.account) { + this._accounts[tenantId] = result.account; + if (!this._primaryUsername) { + this._primaryUsername = result.account.username; + } + } else { + log.warn("Authentication result did not contain account information"); } - const result: AuthorizationResult = - await client.acquireTokenByCode({ ...authRequest, code }); - this._processAccountInfo(result.account); return result; } } @@ -228,16 +268,9 @@ export default class AuthProvider { } throw new Error( - `Unable to find a valid AAD account for tenant ${tenantId}` + `Unable to find a valid account for tenant ${tenantId}` ); } - - private _processAccountInfo(account: AccountInfo) { - if (!this._primaryUsername) { - this._primaryUsername = account.username; - } - } - private _isTenantAuthRetryable(error: AuthorizeError) { for (const code of error.errorCodes) { if (unretryableAuthCodeErrors.includes(code)) { diff --git a/desktop/src/client/core/aad/auth/aad.service.ts b/desktop/src/client/core/aad/auth/aad.service.ts index 95d408c08..0e9761fe3 100644 --- a/desktop/src/client/core/aad/auth/aad.service.ts +++ b/desktop/src/client/core/aad/auth/aad.service.ts @@ -178,6 +178,7 @@ export class AADService { const defer = this._newAccessTokenSubject[subjectKey]; delete this._newAccessTokenSubject[subjectKey]; try { + console.log("Authorize resource", tenantId, this.properties.azureEnvironment[resource as string], forceRefresh); const result: AuthorizeResult = await this.userAuthorization.authorizeResource( tenantId, diff --git a/desktop/src/client/core/aad/authentication/authentication.service.spec.ts b/desktop/src/client/core/aad/authentication/authentication.service.spec.ts index 5862c80b9..22700bfbd 100644 --- a/desktop/src/client/core/aad/authentication/authentication.service.spec.ts +++ b/desktop/src/client/core/aad/authentication/authentication.service.spec.ts @@ -38,6 +38,8 @@ describe("AuthenticationService", () => { userAuthorization = new AuthenticationService(appSpy, CONFIG, fakeAuthProvider, fakeAADService); + // TODO: Remove this line when this is a setting + userAuthorization.browserAuthMode = "builtin"; fakeAuthWindow = appSpy.authenticationWindow; userAuthorization.state.subscribe(x => state = x); }); @@ -54,7 +56,7 @@ describe("AuthenticationService", () => { await delay(); }); - it("Should have called loadurl", async () => { + it("Should have called loadURL", async () => { fakeAuthWindow.notifyRedirect(CONFIG.redirectUri); await promise; @@ -86,7 +88,7 @@ describe("AuthenticationService", () => { expect(result).toBeNull(); expect(error).not.toBeNull(); expect(error.error).toEqual("Failed to authenticate"); - expect(error.description).toEqual("Failed to load the AAD login page (4:Foo bar)"); + expect(error.description).toEqual("Failed to load the Microsoft login page (4:Foo bar)"); expect(fakeAuthWindow.destroy).toHaveBeenCalledTimes(1); }); diff --git a/desktop/src/client/core/aad/authentication/authentication.service.ts b/desktop/src/client/core/aad/authentication/authentication.service.ts index 61fe47e6a..0919619e9 100644 --- a/desktop/src/client/core/aad/authentication/authentication.service.ts +++ b/desktop/src/client/core/aad/authentication/authentication.service.ts @@ -1,4 +1,4 @@ -import { SanitizedError } from "@batch-flask/utils"; +import { log, SanitizedError } from "@batch-flask/utils"; import { BatchExplorerApplication } from "client/core/batch-explorer-application"; import { Deferred } from "common"; import { BehaviorSubject, Observable } from "rxjs"; @@ -6,6 +6,9 @@ import { AADService } from ".."; import { AADConfig } from "../aad-config"; import * as AADConstants from "../aad-constants"; import AuthProvider, { AuthorizationResult } from "../auth-provider"; +import { shell } from "electron"; +import { AuthError, InteractiveRequest, PublicClientApplication, SilentFlowRequest } from "@azure/msal-node"; +import { AuthLoopbackClient } from "../auth-loopback-client"; export interface AuthorizeResult extends AuthorizationResult { code: string; @@ -86,6 +89,9 @@ export class AuthenticationService { private _state = new BehaviorSubject(AuthenticationState.None); private _logoutDeferred: Deferred | null; + // TODO: Make this a setting + public browserAuthMode: "external" | "builtin" = "external" + constructor( private app: BatchExplorerApplication, private config: AADConfig, @@ -158,22 +164,30 @@ export class AuthenticationService { } private async _authorizeNext() { + console.log("Authorize next"); if (this._authQueue.authInProgress()) { + console.log("Already in progress... skipping"); return; } const { tenantId, resourceURI, forceRefresh, deferred } = this._authQueue.shift(); try { + console.log("Get token for resource", resourceURI); const authResult: AuthorizationResult = await this.authProvider.getToken({ resourceURI, + // TODO: Make this a setting + browser: this.browserAuthMode, tenantId, forceRefresh, - authCodeCallback: (url, tenant, silent) => + browserAuthCallback: (client, tokenRequest, url, tenant) => + this._browserAuthCallback(client, tokenRequest, url, tenant), + builtInAuthCodeCallback: (url, tenant, silent) => this._authorizationCodeCallback(url, tenant, silent) }); + console.log("Setting state to authenticated"); if (this._state.getValue() !== AuthenticationState.Authenticated) { this._state.next(AuthenticationState.Authenticated); } @@ -192,15 +206,49 @@ export class AuthenticationService { } } + private async _browserAuthCallback(client: PublicClientApplication, + tokenRequest: SilentFlowRequest, url: string, tenant: string) { + this._state.next(AuthenticationState.UserInput); + + console.log("Browser auth callback"); + try { + const loopbackClient = await AuthLoopbackClient.initialize(3874); + + // opens a browser instance via Electron shell API + const openBrowser = async (url: string) => { + await shell.openExternal(url); + }; + const interactiveRequest: InteractiveRequest = { + ...tokenRequest, + openBrowser, + loopbackClient + }; + + return await client.acquireTokenInteractive(interactiveRequest); + } catch (error) { + log.warn(`[${tenant}] Failed to authenticate using browser auth: ${error}`); + this._authQueue.rejectCurrent(error); + if (!this._authQueue.empty()) { + this._authorizeNext(); + } + } + } + private async _authorizationCodeCallback(url: string, tenant: string, silent = false) { this._state.next(AuthenticationState.UserInput); + return await this._loadAuthWindow(url, { show: !silent, tenant }); } - private _loadAuthWindow(url: string, + /** + * Authenticate using an Electron browser window + * + * @returns A promise which resolves to an auth code string + */ + private async _loadAuthWindow(url: string, { clear = false, show = true, tenant = "" } = {} - ) { + ): Promise { const authWindow = this.app.authenticationWindow; const deferred = new Deferred(); authWindow.create(); @@ -269,7 +317,7 @@ export class AuthenticationService { this._closeWindow(); this._authQueue.rejectCurrent(new AuthorizeError({ error: "Failed to authenticate", - error_description: `Failed to load the AAD login page (${code}:${description})`, + error_description: `Failed to load the Microsoft login page (${code}:${description})`, })); if (!this._authQueue.empty()) { this._authorizeNext(); From 57c05bfdf094533dd7da70d3060946b6bd6063e8 Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Wed, 7 Dec 2022 10:35:40 -0500 Subject: [PATCH 38/57] Authentication Overlay * Main app window now opens without prior authentication * New welcome screen prompts user to sign in, while hiding side menu items and allowing the user to access settings * An overlay prompts the user to authenticate against each tenant that requires interactive authentication, and includes a toggle for using the external (system) browser * App settings now have ability to toggle external browser for auth --- desktop/i18n/resources.resjson | 13 +- .../aad/access-token/access-token.model.ts | 5 + .../src/@batch-flask/core/material.module.ts | 2 + desktop/src/@batch-flask/ui/common.i18n.yml | 2 + .../src/@batch-flask/ui/form/form.module.ts | 2 + desktop/src/@batch-flask/ui/form/index.ts | 1 + .../ui/form/slide-toggle/index.ts | 1 + .../slide-toggle/slide-toggle.component.ts | 43 +++ .../ui/form/slide-toggle/slide-toggle.html | 3 + .../ui/form/slide-toggle/slide-toggle.scss | 13 + desktop/src/app/app.component.ts | 50 ++- desktop/src/app/app.layout.html | 4 + desktop/src/app/app.module.ts | 4 + desktop/src/app/app.routes.ts | 7 +- .../auth-overlay/auth-overlay.component.ts | 52 +++ .../auth/auth-overlay/auth-overlay.html | 18 + .../app/components/auth/auth-overlay/index.ts | 1 + desktop/src/app/components/auth/auth.i18n.yml | 8 + .../src/app/components/auth/auth.module.ts | 12 + .../external-browser-auth-toggle.component.ts | 26 ++ .../auth/external-browser-auth-toggle.html | 9 + desktop/src/app/components/auth/index.ts | 3 + .../main-navigation.component.ts | 9 +- .../main-navigation/main-navigation.html | 76 ++-- .../main-navigation/main-navigation.i18n.yml | 1 + .../profile-button.component.spec.ts | 2 +- .../profile-button.component.ts | 26 +- .../profile-button/profile-button.i18n.yml | 3 +- .../components/settings/settings.component.ts | 14 +- .../src/app/components/settings/settings.html | 9 + .../app/components/settings/settings.i18n.yml | 2 + .../tenant-picker/tenant-card.component.ts | 13 +- .../components/tenant-picker/tenant-card.html | 4 +- .../components/tenant-picker/tenant-card.scss | 3 + .../tenant-picker/tenant-picker.component.ts | 14 +- .../tenant-picker/tenant-picker.html | 5 +- desktop/src/app/components/welcome/index.ts | 2 + .../welcome/welcome.component.spec.ts | 3 + .../components/welcome/welcome.component.ts | 29 ++ .../src/app/components/welcome/welcome.html | 13 + .../app/components/welcome/welcome.module.ts | 13 + desktop/src/app/services/aad/auth.service.ts | 102 ++++- .../batch-account/batch-account.service.ts | 5 + .../app/services/batch-explorer.service.ts | 4 - desktop/src/app/services/navigator.service.ts | 11 +- desktop/src/app/styles/base/layout.scss | 10 + desktop/src/app/styles/main.scss | 1 + .../app/styles/partials/central-panel.scss | 44 +++ .../client/core/aad/auth-loopback-client.ts | 4 - desktop/src/client/core/aad/auth-observer.ts | 9 + .../src/client/core/aad/auth-provider.spec.ts | 204 ++++------ desktop/src/client/core/aad/auth-provider.ts | 174 +++++---- .../client/core/aad/auth/aad.service.spec.ts | 38 +- .../src/client/core/aad/auth/aad.service.ts | 140 +++---- .../authentication.service.spec.ts | 150 +++++--- .../authentication/authentication.service.ts | 356 +++++++++++------- .../client/core/batch-explorer-application.ts | 109 +++--- desktop/src/client/core/unique-window.ts | 4 + .../src/common/be-user-configuration.model.ts | 3 + desktop/src/common/constants/constants.ts | 6 +- .../utils/mocks/auth/auth-provider.mock.ts | 32 +- .../test/utils/mocks/windows/windows.mock.ts | 19 +- 62 files changed, 1316 insertions(+), 629 deletions(-) create mode 100644 desktop/src/@batch-flask/ui/form/slide-toggle/index.ts create mode 100644 desktop/src/@batch-flask/ui/form/slide-toggle/slide-toggle.component.ts create mode 100644 desktop/src/@batch-flask/ui/form/slide-toggle/slide-toggle.html create mode 100644 desktop/src/@batch-flask/ui/form/slide-toggle/slide-toggle.scss create mode 100644 desktop/src/app/components/auth/auth-overlay/auth-overlay.component.ts create mode 100644 desktop/src/app/components/auth/auth-overlay/auth-overlay.html create mode 100644 desktop/src/app/components/auth/auth-overlay/index.ts create mode 100644 desktop/src/app/components/auth/auth.i18n.yml create mode 100644 desktop/src/app/components/auth/auth.module.ts create mode 100644 desktop/src/app/components/auth/external-browser-auth-toggle.component.ts create mode 100644 desktop/src/app/components/auth/external-browser-auth-toggle.html create mode 100644 desktop/src/app/components/auth/index.ts create mode 100644 desktop/src/app/components/welcome/index.ts create mode 100644 desktop/src/app/components/welcome/welcome.component.spec.ts create mode 100644 desktop/src/app/components/welcome/welcome.component.ts create mode 100644 desktop/src/app/components/welcome/welcome.html create mode 100644 desktop/src/app/components/welcome/welcome.module.ts create mode 100644 desktop/src/app/styles/partials/central-panel.scss create mode 100644 desktop/src/client/core/aad/auth-observer.ts diff --git a/desktop/i18n/resources.resjson b/desktop/i18n/resources.resjson index 319ca7f1f..21cbec954 100644 --- a/desktop/i18n/resources.resjson +++ b/desktop/i18n/resources.resjson @@ -50,6 +50,11 @@ "auth-service.activate-tenant": "Activate tenant to authorize", "auth-service.tenant-error": "Cannot access resources for tenant {tenantName}", "auth-settings.title": "Authentication Settings", + "auth.cancel-button.label": "Cancel", + "auth.not-logged-in": "You are not logged in. Please log in to continue.", + "auth.signin-button.label": "Sign in", + "auth.tenant-sign-in-title": "Sign in to {tenant}", + "auth.welcome": "Welcome to Azure Batch Explorer", "auto-storage-account-picker.clear-button-label": "Clear", "auto-storage-account-picker.fields.classic": "Classic", "auto-storage-account-picker.fields.location": "Location", @@ -82,6 +87,7 @@ "common.back": "Back", "common.configuration": "Configuration", "common.confirm": "Confirm", + "common.copyright": "Copyright", "common.creationTime": "Creation time", "common.displayName": "Display name", "common.done": "Done", @@ -109,6 +115,7 @@ "common.updated": "Updated", "common.value": "Value", "common.version": "Version", + "common.welcome": "Welcome to Batch Explorer", "common.yes": "Yes", "create-new-aad-app.create": "Create", "create-new-aad-app.secret.label": "Secret", @@ -255,6 +262,7 @@ "main-navigation.dashboard": "Dash", "main-navigation.data": "Data", "main-navigation.gallery": "Gallery", + "main-navigation.home": "Home", "main-navigation.jobs": "Jobs", "main-navigation.jobschedules": "Job schedules", "main-navigation.label": "Main sidebar", @@ -357,11 +365,12 @@ "profile-button.about": "About", "profile-button.authentication": "Authentication", "profile-button.keybindings": "Keybindings", - "profile-button.logout": "Logout", "profile-button.playground": "Playground", "profile-button.profile": "Profile", "profile-button.report": "Report a bug or feature request", "profile-button.settings": "Settings", + "profile-button.sign-in": "Sign in", + "profile-button.sign-out": "Sign out", "profile-button.thirdPartyNotices": "Third party notices", "profile-button.viewLogs": "View logs", "profile-button.viewTheme": "View theme colors", @@ -397,6 +406,8 @@ "select-dropdown.unselected": "Unselected", "server-error.debug-button-label": "Toggle troubleshooting info", "settings.advancedSettings": "Advanced settings", + "settings.external-browser-auth": "Use system browser for authentication", + "settings.external-browser-auth-hint": "Organizations with certain access policies may require sign-in with an internal window. Unset if you experience issues.", "settings.gallerySettings": "Gallery settings", "settings.general": "General", "settings.reset": "Reset to default settings", diff --git a/desktop/src/@batch-flask/core/aad/access-token/access-token.model.ts b/desktop/src/@batch-flask/core/aad/access-token/access-token.model.ts index 5e57768be..2a2a2b8d6 100644 --- a/desktop/src/@batch-flask/core/aad/access-token/access-token.model.ts +++ b/desktop/src/@batch-flask/core/aad/access-token/access-token.model.ts @@ -61,3 +61,8 @@ export class AccessToken { return `${this.tokenType} ${this.accessToken}`; } } + +export interface AuthEvent { + type: "signout" | "cancel"; + message?: string; +} diff --git a/desktop/src/@batch-flask/core/material.module.ts b/desktop/src/@batch-flask/core/material.module.ts index be3865dbb..70502211c 100644 --- a/desktop/src/@batch-flask/core/material.module.ts +++ b/desktop/src/@batch-flask/core/material.module.ts @@ -3,6 +3,7 @@ import { NgModule } from "@angular/core"; import { MatAutocompleteModule } from "@angular/material/autocomplete"; import { MatButtonModule } from "@angular/material/button"; import { MatButtonToggleModule } from "@angular/material/button-toggle"; +import { MatSlideToggleModule } from "@angular/material/slide-toggle"; import { MatCheckboxModule } from "@angular/material/checkbox"; import { MatNativeDateModule } from "@angular/material/core"; import { MatDatepickerModule } from "@angular/material/datepicker"; @@ -31,6 +32,7 @@ const modules = [ MatDatepickerModule, MatDialogModule, MatSidenavModule, + MatSlideToggleModule, PortalModule, MatNativeDateModule, ]; diff --git a/desktop/src/@batch-flask/ui/common.i18n.yml b/desktop/src/@batch-flask/ui/common.i18n.yml index c08dfa67e..b4ac54bf5 100644 --- a/desktop/src/@batch-flask/ui/common.i18n.yml +++ b/desktop/src/@batch-flask/ui/common.i18n.yml @@ -33,3 +33,5 @@ common: value: Value version: Version yes: "Yes" + welcome: Welcome to Batch Explorer + copyright: Copyright diff --git a/desktop/src/@batch-flask/ui/form/form.module.ts b/desktop/src/@batch-flask/ui/form/form.module.ts index b120a134d..ccfd5fa0b 100644 --- a/desktop/src/@batch-flask/ui/form/form.module.ts +++ b/desktop/src/@batch-flask/ui/form/form.module.ts @@ -24,6 +24,7 @@ import { InputDirective } from "./input"; import { KeyValuePickerComponent } from "./key-value-picker"; import { SimpleFormComponent } from "./simple-form"; import { SingleLineTextareaDirective } from "./single-line-textarea"; +import { SlideToggleComponent } from "./slide-toggle"; // components // Add submodules there @@ -47,6 +48,7 @@ const components = [ FormPickerItemTemplateDirective, FormSectionComponent, HintComponent, + SlideToggleComponent, InputDirective, KeyValuePickerComponent, SimpleFormComponent, diff --git a/desktop/src/@batch-flask/ui/form/index.ts b/desktop/src/@batch-flask/ui/form/index.ts index 607b1a633..17106df90 100644 --- a/desktop/src/@batch-flask/ui/form/index.ts +++ b/desktop/src/@batch-flask/ui/form/index.ts @@ -4,3 +4,4 @@ export * from "./form-picker"; export * from "./form-section"; export * from "./complex-form"; export * from "./simple-form"; +export * from "./slide-toggle"; diff --git a/desktop/src/@batch-flask/ui/form/slide-toggle/index.ts b/desktop/src/@batch-flask/ui/form/slide-toggle/index.ts new file mode 100644 index 000000000..8432c4cfa --- /dev/null +++ b/desktop/src/@batch-flask/ui/form/slide-toggle/index.ts @@ -0,0 +1 @@ +export * from "./slide-toggle.component"; diff --git a/desktop/src/@batch-flask/ui/form/slide-toggle/slide-toggle.component.ts b/desktop/src/@batch-flask/ui/form/slide-toggle/slide-toggle.component.ts new file mode 100644 index 000000000..4f70a8a12 --- /dev/null +++ b/desktop/src/@batch-flask/ui/form/slide-toggle/slide-toggle.component.ts @@ -0,0 +1,43 @@ +import { Component, EventEmitter, Input, Output, forwardRef } from '@angular/core'; +import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; +import "./slide-toggle.scss"; +import { MatSlideToggleChange } from '@angular/material/slide-toggle'; + +@Component({ + selector: "be-slide-toggle", + templateUrl: "./slide-toggle.html", + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => SlideToggleComponent), + multi: true + }] +}) +export class SlideToggleComponent implements ControlValueAccessor { + @Input() public checked: boolean; + @Input() public isDisabled: boolean = false; + @Output() public toggleChange = new EventEmitter(); + + private onChange = (_: boolean) => { /* void */ }; + + writeValue(value: boolean): void { + this.checked = value; + } + + registerOnChange(fn: any): void { + this.onChange = fn; + } + + registerOnTouched() { + // Do nothing + } + + public valueChange(value: boolean) { + this.checked = value; + this.onChange(value); + } + + public onToggleChange(event: MatSlideToggleChange): void { + this.writeValue(event.checked); + this.toggleChange.emit(event.checked); + } +} diff --git a/desktop/src/@batch-flask/ui/form/slide-toggle/slide-toggle.html b/desktop/src/@batch-flask/ui/form/slide-toggle/slide-toggle.html new file mode 100644 index 000000000..46fc5cb6d --- /dev/null +++ b/desktop/src/@batch-flask/ui/form/slide-toggle/slide-toggle.html @@ -0,0 +1,3 @@ + + + diff --git a/desktop/src/@batch-flask/ui/form/slide-toggle/slide-toggle.scss b/desktop/src/@batch-flask/ui/form/slide-toggle/slide-toggle.scss new file mode 100644 index 000000000..e63e5d8a6 --- /dev/null +++ b/desktop/src/@batch-flask/ui/form/slide-toggle/slide-toggle.scss @@ -0,0 +1,13 @@ +@import "app/styles/variables"; + +be-slide-toggle { + .mat-slide-toggle-bar { + background-color: $secondary-background !important; + } + .mat-slide-toggle-thumb { + background-color: $primary-color !important; + } + .mat-slide-toggle.mat-checked .mat-slide-toggle-bar { + background-color: $primary-color-light !important; + } +} diff --git a/desktop/src/app/app.component.ts b/desktop/src/app/app.component.ts index 3986e7a6a..c4537afc4 100644 --- a/desktop/src/app/app.component.ts +++ b/desktop/src/app/app.component.ts @@ -9,6 +9,8 @@ import { PermissionService } from "@batch-flask/ui/permission"; import { registerIcons } from "app/config"; import { AppTranslationsLoaderService, + AuthSelectRequest, + AuthSelectResult, AuthService, AuthorizationHttpService, BatchAccountService, @@ -24,6 +26,7 @@ import { BEUserConfiguration } from "common"; import { Subject, combineLatest } from "rxjs"; import { takeUntil } from "rxjs/operators"; import { initDesktopEnvironment } from "./environment/desktop-environment"; +import { IpcEvent } from "common/constants"; @Component({ selector: "bl-app", @@ -32,6 +35,10 @@ import { initDesktopEnvironment } from "./environment/desktop-environment"; export class AppComponent implements OnInit, OnDestroy { public isAppReady = false; public fullscreen = false; + public showAuthOverlay = false; + + public authTenantId: string; + public authRequestId: string; @HostBinding("class.batch-explorer") public readonly beCls = true; @HostBinding("class.high-contrast") public isHighContrast = false; @@ -45,13 +52,13 @@ export class AppComponent implements OnInit, OnDestroy { private accountService: BatchAccountService, private navigatorService: NavigatorService, userConfigurationService: UserConfigurationService, - remote: ElectronRemote, + private remote: ElectronRemote, pythonRpcService: PythonRpcService, themeService: ThemeService, private route: ActivatedRoute, permissionService: PermissionService, authHttpService: AuthorizationHttpService, - authService: AuthService, + private authService: AuthService, ipc: IpcService, keybindingService: KeyBindingsService, private telemetryService: TelemetryService, @@ -102,6 +109,21 @@ export class AppComponent implements OnInit, OnDestroy { themeService.currentTheme.pipe(takeUntil(this._destroy)).subscribe((theme) => { this.isHighContrast = theme.isHighContrast; }); + + this.registerAuthEvents(); + let initialNav = false; + this.authService.isLoggedIn().pipe(takeUntil(this._destroy)) + .subscribe((isLoggedIn) => { + if (!isLoggedIn) { + // Always navigate to welcome page if not logged in + this.navigatorService.goto("/welcome"); + } else { + if (!initialNav) { + initialNav = true; + this.navigatorService.goto("/accounts"); + } + } + }); } public ngOnInit() { @@ -123,4 +145,28 @@ export class AppComponent implements OnInit, OnDestroy { new Workspace({ ...endUserWorkspace }), ]); } + + private registerAuthEvents() { + this.authService.on("AuthSelect", (request: AuthSelectRequest) => { + this.showAuthOverlay = true; + this.authTenantId = request.tenantId; + this.authRequestId = request.requestId; + }); + this.authService.on("AuthSelectResult", (result: AuthSelectResult) => { + this.remote.send( + IpcEvent.userAuthSelectResponse(result.requestId), + result + ); + if (result.result === "cancel") { + this.showAuthOverlay = false; + } + }); + this.authService.on("AuthComplete", (result) => { + // Dismiss the overlay only if auth completed + this.showAuthOverlay = false; + }); + this.authService.on("Logout", () => { + this.accountService.clear(); + }); + } } diff --git a/desktop/src/app/app.layout.html b/desktop/src/app/app.layout.html index 496d0fa20..7a41da7b2 100644 --- a/desktop/src/app/app.layout.html +++ b/desktop/src/app/app.layout.html @@ -30,4 +30,8 @@ + diff --git a/desktop/src/app/app.module.ts b/desktop/src/app/app.module.ts index 9241715c7..462578696 100644 --- a/desktop/src/app/app.module.ts +++ b/desktop/src/app/app.module.ts @@ -20,7 +20,9 @@ import { FileModule } from "app/components/file/file.module"; import { LayoutModule } from "app/components/layout"; import { MiscModule } from "app/components/misc"; import { SettingsModule } from "app/components/settings"; +import { WelcomeModule } from "app/components/welcome"; import { BatchExplorerErrorHandler } from "app/error-handler"; +import { AuthModule } from "app/components/auth"; import { routes } from "./app.routes"; import { AuthService, @@ -33,8 +35,10 @@ import { RendererTelemetryModule } from "./services/telemetry"; const modules = [ AccountModule, FileModule, + AuthModule, SettingsModule, LayoutModule, + WelcomeModule, MiscModule, ]; diff --git a/desktop/src/app/app.routes.ts b/desktop/src/app/app.routes.ts index 86370ffc4..9299f583b 100644 --- a/desktop/src/app/app.routes.ts +++ b/desktop/src/app/app.routes.ts @@ -9,10 +9,11 @@ import { AccountDefaultComponent, AccountDetailsComponent } from "./components/a import { AccountHomeComponent } from "./components/account/home/account-home.component"; import { AccountMonitoringHomeComponent } from "./components/account/monitoring"; import { PlaygroundRouteComponent } from "./components/misc/playground-route"; +import { WelcomeComponent } from "./components/welcome"; export const routes: Routes = [ - { path: "", redirectTo: "accounts", pathMatch: "full" }, + { path: "", redirectTo: "welcome", pathMatch: "full" }, { component: AccountHomeComponent, path: "accounts", @@ -116,4 +117,8 @@ export const routes: Routes = [ path: "keybindings", component: KeyBindingsComponent, }, + { + path: "welcome", + component: WelcomeComponent, + } ]; diff --git a/desktop/src/app/components/auth/auth-overlay/auth-overlay.component.ts b/desktop/src/app/components/auth/auth-overlay/auth-overlay.component.ts new file mode 100644 index 000000000..6f03f6d4d --- /dev/null +++ b/desktop/src/app/components/auth/auth-overlay/auth-overlay.component.ts @@ -0,0 +1,52 @@ +import { Component, Input, OnInit, ViewChild } from "@angular/core"; +import { AuthService } from "app/services"; +import { autobind } from "@batch-flask/core"; +import { ExternalBrowserAuthToggleComponent } from ".."; + +@Component({ + selector: "be-auth-overlay", + templateUrl: "auth-overlay.html", +}) +export class AuthOverlayComponent implements OnInit { + public tenantName: string; + @Input() public tenantId: string; + @Input() public requestId: string; + + @ViewChild("authToggle") + private authToggleComponent: ExternalBrowserAuthToggleComponent; + + constructor(private authService: AuthService) {} + + public async ngOnInit() { + if (this.tenantId === "organizations") { + this.tenantName = "Azure"; + } else { + this.authService.tenants.subscribe((tenants) => { + const tenant = tenants.find(x => x.tenantId === this.tenantId); + if (tenant) { + this.tenantName = tenant.displayName; + } else { + this.tenantName = this.tenantId; + } + }); + } + } + + @autobind() + public async selectAuth() { + this.sendResponse("success"); + } + + @autobind() + public async cancel() { + this.sendResponse("cancel"); + } + + private sendResponse(result: "success" | "cancel") { + this.authService.authSelectResult({ + result, + requestId: this.requestId, + externalBrowserAuth: this.authToggleComponent.externalBrowserAuth, + }); + } +} diff --git a/desktop/src/app/components/auth/auth-overlay/auth-overlay.html b/desktop/src/app/components/auth/auth-overlay/auth-overlay.html new file mode 100644 index 000000000..5a45d0810 --- /dev/null +++ b/desktop/src/app/components/auth/auth-overlay/auth-overlay.html @@ -0,0 +1,18 @@ +
+
+

{{"auth.tenant-sign-in-title" | i18n: { tenant: tenantName } }}

+

{{"common.id" | i18n}} {{tenantId}}

+
+ + {{"auth.signin-button.label" | i18n }} + + + {{"auth.cancel-button.label" | i18n }} + +
+ + +
+
diff --git a/desktop/src/app/components/auth/auth-overlay/index.ts b/desktop/src/app/components/auth/auth-overlay/index.ts new file mode 100644 index 000000000..a3dcac11b --- /dev/null +++ b/desktop/src/app/components/auth/auth-overlay/index.ts @@ -0,0 +1 @@ +export * from "./auth-overlay.component"; diff --git a/desktop/src/app/components/auth/auth.i18n.yml b/desktop/src/app/components/auth/auth.i18n.yml new file mode 100644 index 000000000..f40a44f39 --- /dev/null +++ b/desktop/src/app/components/auth/auth.i18n.yml @@ -0,0 +1,8 @@ +auth: + welcome: Welcome to Azure Batch Explorer + not-logged-in: You are not logged in. Please log in to continue. + tenant-sign-in-title: Sign in to {tenant} + signin-button: + label: Sign in + cancel-button: + label: Cancel diff --git a/desktop/src/app/components/auth/auth.module.ts b/desktop/src/app/components/auth/auth.module.ts new file mode 100644 index 000000000..ccced3548 --- /dev/null +++ b/desktop/src/app/components/auth/auth.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from "@angular/core"; +import { commonModules } from "app/common"; +import { AuthOverlayComponent, ExternalBrowserAuthToggleComponent } from "."; + +const components = [AuthOverlayComponent, ExternalBrowserAuthToggleComponent]; + +@NgModule({ + declarations: components, + exports: components, + imports: commonModules +}) +export class AuthModule { } diff --git a/desktop/src/app/components/auth/external-browser-auth-toggle.component.ts b/desktop/src/app/components/auth/external-browser-auth-toggle.component.ts new file mode 100644 index 000000000..ce15281c0 --- /dev/null +++ b/desktop/src/app/components/auth/external-browser-auth-toggle.component.ts @@ -0,0 +1,26 @@ +import { Component, OnInit } from "@angular/core"; +import { UserConfigurationService, autobind } from "@batch-flask/core"; +import { BEUserConfiguration } from "common"; + +@Component({ + selector: "be-external-browser-auth-toggle", + templateUrl: "external-browser-auth-toggle.html", +}) +export class ExternalBrowserAuthToggleComponent implements OnInit { + public externalBrowserAuth = false; + + constructor( + public userConfigService: UserConfigurationService + ) {} + + public async ngOnInit() { + this.externalBrowserAuth = + await this.userConfigService.get("externalBrowserAuth"); + } + + @autobind() + public async toggleExternalBrowserAuth(value: boolean) { + await this.userConfigService.set("externalBrowserAuth", value); + this.externalBrowserAuth = value; + } +} diff --git a/desktop/src/app/components/auth/external-browser-auth-toggle.html b/desktop/src/app/components/auth/external-browser-auth-toggle.html new file mode 100644 index 000000000..baa6caa13 --- /dev/null +++ b/desktop/src/app/components/auth/external-browser-auth-toggle.html @@ -0,0 +1,9 @@ +
+ + {{"settings.external-browser-auth" | i18n }} + +

+ {{"settings.external-browser-auth-hint" | i18n }} +

+
diff --git a/desktop/src/app/components/auth/index.ts b/desktop/src/app/components/auth/index.ts new file mode 100644 index 000000000..8b0a315cf --- /dev/null +++ b/desktop/src/app/components/auth/index.ts @@ -0,0 +1,3 @@ +export * from "./auth-overlay"; +export * from "./external-browser-auth-toggle.component"; +export * from "./auth.module"; diff --git a/desktop/src/app/components/layout/main-navigation/main-navigation.component.ts b/desktop/src/app/components/layout/main-navigation/main-navigation.component.ts index 5d180ab2d..18cbe0be1 100644 --- a/desktop/src/app/components/layout/main-navigation/main-navigation.component.ts +++ b/desktop/src/app/components/layout/main-navigation/main-navigation.component.ts @@ -1,6 +1,6 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, HostBinding, OnDestroy } from "@angular/core"; import { I18nService } from "@batch-flask/core"; -import { BatchAccountService } from "app/services"; +import { AuthService, BatchAccountService } from "app/services"; import { Subscription } from "rxjs"; import "./main-navigation.scss"; @@ -13,6 +13,7 @@ import "./main-navigation.scss"; export class MainNavigationComponent implements OnDestroy { public selectedAccountAlias: string; public selectedId: string; + public loggedIn: boolean; @HostBinding("attr.role") public readonly role = "navigation"; @HostBinding("attr.aria-label") public get ariaLabel() { @@ -24,12 +25,18 @@ export class MainNavigationComponent implements OnDestroy { constructor( accountService: BatchAccountService, private changeDetector: ChangeDetectorRef, + authService: AuthService, private i18n: I18nService) { this._accountSub = accountService.currentAccountId.subscribe((accountId) => { this.selectedId = accountId; this.changeDetector.markForCheck(); }); + + authService.isLoggedIn().subscribe((loggedIn) => { + this.loggedIn = loggedIn; + this.changeDetector.markForCheck(); + }); } public ngOnDestroy(): void { diff --git a/desktop/src/app/components/layout/main-navigation/main-navigation.html b/desktop/src/app/components/layout/main-navigation/main-navigation.html index 0796d1c0e..8a47c64c7 100644 --- a/desktop/src/app/components/layout/main-navigation/main-navigation.html +++ b/desktop/src/app/components/layout/main-navigation/main-navigation.html @@ -1,40 +1,48 @@
    - -
    {{'main-navigation.dashboard' | i18n}}
    -
    -
    - -
    {{'main-navigation.jobs' | i18n}}
    -
    -
    - - -
    {{'main-navigation.jobschedules' | i18n}}
    -
    -
    - - -
    {{'main-navigation.pools' | i18n}}
    -
    -
    - - -
    {{'main-navigation.packages' | i18n}}
    -
    -
    - - -
    {{'main-navigation.certificates' | i18n}}
    -
    -
    - - -
    {{'main-navigation.data' | i18n}}
    + + +
    {{'main-navigation.dashboard' | i18n}}
    +
    + +
    {{'main-navigation.jobs' | i18n}}
    +
    +
    + + +
    {{'main-navigation.jobschedules' | i18n}}
    +
    +
    + + +
    {{'main-navigation.pools' | i18n}}
    +
    +
    + + +
    {{'main-navigation.packages' | i18n}}
    +
    +
    + + +
    {{'main-navigation.certificates' | i18n}}
    +
    +
    + + +
    {{'main-navigation.data' | i18n}}
    +
    +
    + + +
    {{'main-navigation.gallery' | i18n}}
    +
    +
    - - -
    {{'main-navigation.gallery' | i18n}}
    + + + +
    {{'main-navigation.home' | i18n}}
diff --git a/desktop/src/app/components/layout/main-navigation/main-navigation.i18n.yml b/desktop/src/app/components/layout/main-navigation/main-navigation.i18n.yml index a9dd0f82a..62eced425 100644 --- a/desktop/src/app/components/layout/main-navigation/main-navigation.i18n.yml +++ b/desktop/src/app/components/layout/main-navigation/main-navigation.i18n.yml @@ -8,4 +8,5 @@ main-navigation: certificates: Certificates data: Data gallery: Gallery + home: Home profile: Profile diff --git a/desktop/src/app/components/layout/main-navigation/profile-button/profile-button.component.spec.ts b/desktop/src/app/components/layout/main-navigation/profile-button/profile-button.component.spec.ts index 86bd0d547..cbc7d09a1 100644 --- a/desktop/src/app/components/layout/main-navigation/profile-button/profile-button.component.spec.ts +++ b/desktop/src/app/components/layout/main-navigation/profile-button/profile-button.component.spec.ts @@ -164,7 +164,7 @@ describe("ProfileButtonComponent", () => { expectMenuItem(ContextMenuSeparator); expectMenuItem(MultiContextMenuItem, "Developer"); expectMenuItem(ContextMenuSeparator); - expectMenuItem(ContextMenuItem, "profile-button.logout"); + expectMenuItem(ContextMenuItem, "profile-button.sign-in"); }); it("check for updates and show update notification when there is one", fakeAsync(() => { diff --git a/desktop/src/app/components/layout/main-navigation/profile-button/profile-button.component.ts b/desktop/src/app/components/layout/main-navigation/profile-button/profile-button.component.ts index 9ae0eaf78..b6e95daca 100644 --- a/desktop/src/app/components/layout/main-navigation/profile-button/profile-button.component.ts +++ b/desktop/src/app/components/layout/main-navigation/profile-button/profile-button.component.ts @@ -133,13 +133,19 @@ export class ProfileButtonComponent implements OnDestroy, OnInit { ); } - items.push( - new ContextMenuSeparator(), - new ContextMenuItem({ - label: this.i18n.t("profile-button.logout"), + items.push(new ContextMenuSeparator()); + + if (this.currentUserName === "") { + items.push(new ContextMenuItem({ + label: this.i18n.t("profile-button.sign-in"), + click: () => this._login() + })); + } else { + items.push(new ContextMenuItem({ + label: this.i18n.t("profile-button.sign-out"), click: () => this._logout() - }) - ); + })); + } items.unshift(this._getAutoUpdateMenuItem()); this.contextMenuService.openMenu(new ContextMenu(items)); @@ -194,7 +200,11 @@ export class ProfileButtonComponent implements OnDestroy, OnInit { } private _logout() { - this.batchExplorer.logoutAndLogin(); + this.authService.logout(); + } + + private _login() { + this.authService.login(); } private async _checkForUpdates(showNotification = true) { @@ -222,7 +232,7 @@ export class ProfileButtonComponent implements OnDestroy, OnInit { if (!OS.isLinux()) { setImmediate(async () => { this.remote.electronApp.removeAllListeners("window-all-closed"); - await this.authService.logout(false); + await this.authService.logout(); this.autoUpdateService.quitAndInstall(); this.remote.getCurrentWindow().close(); }); diff --git a/desktop/src/app/components/layout/main-navigation/profile-button/profile-button.i18n.yml b/desktop/src/app/components/layout/main-navigation/profile-button/profile-button.i18n.yml index 33411ad87..08be91c0c 100644 --- a/desktop/src/app/components/layout/main-navigation/profile-button/profile-button.i18n.yml +++ b/desktop/src/app/components/layout/main-navigation/profile-button/profile-button.i18n.yml @@ -9,4 +9,5 @@ profile-button: viewLogs: View logs report: Report a bug or feature request viewTheme: View theme colors - logout: Logout + sign-out: Sign out + sign-in: Sign in diff --git a/desktop/src/app/components/settings/settings.component.ts b/desktop/src/app/components/settings/settings.component.ts index 7eaa63818..c076b6103 100644 --- a/desktop/src/app/components/settings/settings.component.ts +++ b/desktop/src/app/components/settings/settings.component.ts @@ -1,6 +1,6 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy } from "@angular/core"; import { FormBuilder, FormGroup } from "@angular/forms"; -import { EntityConfigurationView, UserConfigurationService } from "@batch-flask/core"; +import { EntityConfigurationView, UserConfigurationService, autobind } from "@batch-flask/core"; import { BEUserDesktopConfiguration, DEFAULT_BE_USER_CONFIGURATION } from "common"; import { Subject } from "rxjs"; import { debounceTime, takeUntil } from "rxjs/operators"; @@ -22,6 +22,7 @@ export interface SettingsSelection { microsoftPortfolioPath: string; defaultOutputFileGroup: string; theme: string; + externalBrowserAuth: boolean; } @Component({ @@ -47,6 +48,7 @@ export class SettingsComponent implements OnDestroy { formBuilder: FormBuilder) { this.form = formBuilder.group({ theme: [null], + externalBrowserAuth: [true], entityConfigurationDefaultView: [null], subscriptionsIgnore: [[]], fileAssociations: [[]], @@ -62,12 +64,13 @@ export class SettingsComponent implements OnDestroy { defaultOutputFileGroup: [""], }); - this.userConfigurationService.config.pipe(takeUntil(this._destroy)).subscribe((config) => { + this.userConfigurationService.config.pipe(takeUntil(this._destroy)).subscribe((config: BEUserDesktopConfiguration) => { this.modified = JSON.stringify(config) !== JSON.stringify(DEFAULT_BE_USER_CONFIGURATION); this.changeDetector.markForCheck(); const selection: SettingsSelection = { theme: config.theme, + externalBrowserAuth: config.externalBrowserAuth, entityConfigurationDefaultView: config.entityConfiguration.defaultView, subscriptionsIgnore: config.subscriptions.ignore.map(x => ({ pattern: x })), fileAssociations: config.fileAssociations, @@ -102,6 +105,12 @@ export class SettingsComponent implements OnDestroy { }); } + @autobind() + public updateExternalBrowserAuth(value: boolean) { + this.form.get("externalBrowserAuth").setValue(value); + this.changeDetector.markForCheck(); + } + public ngOnDestroy() { this._destroy.next(); this._destroy.complete(); @@ -114,6 +123,7 @@ export class SettingsComponent implements OnDestroy { private _buildConfig(selection: SettingsSelection): Partial { return { theme: selection.theme, + externalBrowserAuth: selection.externalBrowserAuth, fileAssociations: selection.fileAssociations, entityConfiguration: { defaultView: selection.entityConfigurationDefaultView, diff --git a/desktop/src/app/components/settings/settings.html b/desktop/src/app/components/settings/settings.html index 6fa207013..e8b98baae 100644 --- a/desktop/src/app/components/settings/settings.html +++ b/desktop/src/app/components/settings/settings.html @@ -19,6 +19,15 @@

{{'settings.general' | i18n}}

+
+ + {{"settings.external-browser-auth" | i18n}} + +

+ {{"settings.external-browser-auth-hint" | i18n}} +

+
diff --git a/desktop/src/app/components/settings/settings.i18n.yml b/desktop/src/app/components/settings/settings.i18n.yml index 30464133f..52f9cdbae 100644 --- a/desktop/src/app/components/settings/settings.i18n.yml +++ b/desktop/src/app/components/settings/settings.i18n.yml @@ -5,3 +5,5 @@ settings: advancedSettings: Advanced settings gallerySettings: Gallery settings reset: Reset to default settings + external-browser-auth: Use system browser for authentication + external-browser-auth-hint: Organizations with certain access policies may require sign-in with an internal window. Unset if you experience issues. diff --git a/desktop/src/app/components/tenant-picker/tenant-card.component.ts b/desktop/src/app/components/tenant-picker/tenant-card.component.ts index 18c142ae2..ef475e7cc 100644 --- a/desktop/src/app/components/tenant-picker/tenant-card.component.ts +++ b/desktop/src/app/components/tenant-picker/tenant-card.component.ts @@ -1,5 +1,5 @@ import { Component, ChangeDetectionStrategy, OnDestroy, Input, EventEmitter, Output, OnChanges } from "@angular/core"; -import { I18nService, TenantSettingsService } from "@batch-flask/core"; +import { I18nService, TenantSettingsService, autobind } from "@batch-flask/core"; import { TenantDetails } from "app/models"; import { TenantAuthorization, TenantStatus } from "app/services"; import { Subject } from "rxjs"; @@ -19,6 +19,7 @@ export class TenantCardComponent implements OnDestroy, OnChanges { status: TenantStatus; tenant: TenantDetails; active: boolean; + canReauthenticate: boolean; // Required for supporting enums within Angular templates tenantStatus = TenantStatus; @@ -31,7 +32,6 @@ export class TenantCardComponent implements OnDestroy, OnChanges { private i18n: I18nService, private settingsService: TenantSettingsService ) { - this.refresh = this.refresh.bind(this); } public ngOnDestroy() { @@ -43,6 +43,7 @@ export class TenantCardComponent implements OnDestroy, OnChanges { this.status = this.authorization.status; this.tenant = this.authorization.tenant; this.active = this.authorization.active; + this.updateCanReauthenticate(); } statusText = () => this.i18n.t(`tenant-card.status-${this.status}`); @@ -58,9 +59,17 @@ export class TenantCardComponent implements OnDestroy, OnChanges { this.tenant.tenantId, observed.checked); this.active = observed.checked; + this.updateCanReauthenticate(); this.refresh(this.active); } + private updateCanReauthenticate() { + this.canReauthenticate = this.active && + !this.isHomeTenant() && + this.status !== TenantStatus.authorized; + } + + @autobind() refresh(reauthenticate = false) { this.refreshTenant.emit({ tenantId: this.tenant.tenantId, diff --git a/desktop/src/app/components/tenant-picker/tenant-card.html b/desktop/src/app/components/tenant-picker/tenant-card.html index c01813e2a..c4f15d919 100644 --- a/desktop/src/app/components/tenant-picker/tenant-card.html +++ b/desktop/src/app/components/tenant-picker/tenant-card.html @@ -42,9 +42,11 @@ {{authorization.message}}
{{authorization.messageDetails}}
+ +
{{"tenant-card.reauthenticate-button" | i18n}} diff --git a/desktop/src/app/components/tenant-picker/tenant-card.scss b/desktop/src/app/components/tenant-picker/tenant-card.scss index 9d669dc0f..01e685117 100644 --- a/desktop/src/app/components/tenant-picker/tenant-card.scss +++ b/desktop/src/app/components/tenant-picker/tenant-card.scss @@ -51,6 +51,9 @@ be-tenant-card { white-space: pre-wrap; } } + .tenant-reauth { + text-align: right; + } } max-width: $tenant-card-width; diff --git a/desktop/src/app/components/tenant-picker/tenant-picker.component.ts b/desktop/src/app/components/tenant-picker/tenant-picker.component.ts index de3c60a88..0f40dbda3 100644 --- a/desktop/src/app/components/tenant-picker/tenant-picker.component.ts +++ b/desktop/src/app/components/tenant-picker/tenant-picker.component.ts @@ -3,6 +3,7 @@ import { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR } from "@angular/f import { AuthService, reauthenticateAll, TenantAuthorization } from "app/services"; import { Subject, throwError } from "rxjs"; import { catchError, first, takeUntil } from "rxjs/operators"; +import { autobind } from "@batch-flask/core"; import "./tenant-picker.scss"; @@ -33,6 +34,8 @@ export class TenantPickerComponent implements ControlValueAccessor, OnDestroy { public tenantSettings = new FormControl([]); public saved: false; + public loggedIn: boolean; + public loaded = false; private _destroy = new Subject(); private _propagateChange?: TenantSettingsChanged; @@ -48,8 +51,14 @@ export class TenantPickerComponent implements ControlValueAccessor, OnDestroy { this._propagateChange(value); } }); - this.fetchTenantAuthorizations(); - this.refresh = this.refresh.bind(this); + this.auth.isLoggedIn().subscribe((loggedIn) => { + this.loggedIn = loggedIn; + if (loggedIn) { + this.fetchTenantAuthorizations(); + } + this.loaded = true; + this.changeDetector.markForCheck(); + }); } private fetchTenantAuthorizations(data: TenantRefreshModel = {}) { @@ -89,6 +98,7 @@ export class TenantPickerComponent implements ControlValueAccessor, OnDestroy { // NOOP } + @autobind() public refresh() { // Refresh all tenants from the server this.fetchTenantAuthorizations({ reauthenticate: true }); diff --git a/desktop/src/app/components/tenant-picker/tenant-picker.html b/desktop/src/app/components/tenant-picker/tenant-picker.html index 8fcfc2641..f3e06a72d 100644 --- a/desktop/src/app/components/tenant-picker/tenant-picker.html +++ b/desktop/src/app/components/tenant-picker/tenant-picker.html @@ -1,4 +1,4 @@ -
+

{{'tenant-picker.title' | i18n}}

@@ -20,3 +20,6 @@

{{'tenant-picker.title' | i18n}}

+ +
+
diff --git a/desktop/src/app/components/welcome/index.ts b/desktop/src/app/components/welcome/index.ts new file mode 100644 index 000000000..849c2329f --- /dev/null +++ b/desktop/src/app/components/welcome/index.ts @@ -0,0 +1,2 @@ +export * from "./welcome.component"; +export * from "./welcome.module"; diff --git a/desktop/src/app/components/welcome/welcome.component.spec.ts b/desktop/src/app/components/welcome/welcome.component.spec.ts new file mode 100644 index 000000000..5e1f684a2 --- /dev/null +++ b/desktop/src/app/components/welcome/welcome.component.spec.ts @@ -0,0 +1,3 @@ +describe("WelcomeComponent", () => { + it("allows users to log in with an external browser"); +}); diff --git a/desktop/src/app/components/welcome/welcome.component.ts b/desktop/src/app/components/welcome/welcome.component.ts new file mode 100644 index 000000000..134cb3a42 --- /dev/null +++ b/desktop/src/app/components/welcome/welcome.component.ts @@ -0,0 +1,29 @@ +import { Component } from "@angular/core"; +import { AuthService, NavigatorService } from "app/services"; +import { autobind } from "@batch-flask/core"; +import { first } from "rxjs/operators"; + +@Component({ + selector: "be-welcome", + templateUrl: "./welcome.html", +}) +export class WelcomeComponent { + public static breadcrumb() { + return { name: "Home" }; + } + + constructor( + private authService: AuthService, + private navigationService: NavigatorService + ) {} + + @autobind() + public async signIn() { + await this.authService.login(); + this.authService.isLoggedIn().pipe(first()).subscribe((isLoggedIn) => { + if (isLoggedIn) { + this.navigationService.goto("/accounts"); + } + }); + } +} diff --git a/desktop/src/app/components/welcome/welcome.html b/desktop/src/app/components/welcome/welcome.html new file mode 100644 index 000000000..64bcc2fee --- /dev/null +++ b/desktop/src/app/components/welcome/welcome.html @@ -0,0 +1,13 @@ +
+
+

{{"common.welcome" | i18n}}

+
+ + {{"auth.tenant-sign-in-title" | i18n: { tenant: "Azure" } }} + +
+ + +
+
diff --git a/desktop/src/app/components/welcome/welcome.module.ts b/desktop/src/app/components/welcome/welcome.module.ts new file mode 100644 index 000000000..a52aacceb --- /dev/null +++ b/desktop/src/app/components/welcome/welcome.module.ts @@ -0,0 +1,13 @@ +import { NgModule } from "@angular/core"; +import { commonModules } from "app/common"; +import { WelcomeComponent } from "."; +import { AuthModule } from "../auth"; + +const components = [WelcomeComponent]; + +@NgModule({ + declarations: components, + exports: components, + imports: [ ...commonModules, AuthModule ], +}) +export class WelcomeModule { } diff --git a/desktop/src/app/services/aad/auth.service.ts b/desktop/src/app/services/aad/auth.service.ts index 84b759e2c..7fa23cba0 100644 --- a/desktop/src/app/services/aad/auth.service.ts +++ b/desktop/src/app/services/aad/auth.service.ts @@ -1,5 +1,5 @@ -import { Injectable, NgZone, OnDestroy } from "@angular/core"; -import { AccessToken, AccessTokenCache, I18nService, ServerError, TenantSettings } from "@batch-flask/core"; +import { EventEmitter, Injectable, NgZone, OnDestroy } from "@angular/core"; +import { AccessToken, AccessTokenCache, AuthEvent, I18nService, ServerError, TenantSettings } from "@batch-flask/core"; import { TenantSettingsService } from "@batch-flask/core"; import { ElectronRemote } from "@batch-flask/electron"; import { wrapMainObservable } from "@batch-flask/electron/utils"; @@ -13,6 +13,7 @@ import { Constants } from "common"; import { Observable, from, throwError, combineLatest, forkJoin, of } from "rxjs"; import { catchError, map, publishReplay, refCount, share, switchMap } from "rxjs/operators"; import { TenantErrorService } from "./tenant-error.service"; +import { IpcEvent } from "common/constants"; export const reauthenticateAll = "*"; @@ -30,11 +31,25 @@ export interface TenantAuthorization { messageDetails?: string; } +export type AuthEventType = "AuthSelect" | "AuthSelectResult" | "AuthComplete" | + "Logout"; + type TenantAuthRequestOptions = { notifyOnError?: boolean; reauthenticate?: string; // "*" or tenantId }; +export interface AuthSelectResult { + result: "success" | "cancel"; + requestId?: string; + externalBrowserAuth?: boolean; +} + +export interface AuthSelectRequest { + tenantId?: string; + requestId?: string; +} + @Injectable({ providedIn: "root" }) export class AuthService implements OnDestroy { public tenants: Observable; @@ -46,6 +61,8 @@ export class AuthService implements OnDestroy { private previousTenantState: StringMap = {}; private tokenObservableCache: StringMap> = {}; + private authEvents = new Map>(); + constructor( zone: NgZone, batchExplorer: BatchExplorerService, @@ -69,16 +86,32 @@ export class AuthService implements OnDestroy { publishReplay(1), refCount(), ); + this.initializeEventEmitters(); } public ngOnDestroy() { - // Nothing to do + this.authEvents.forEach((event) => event.unsubscribe()); + } + + public async logout() { + await this.remote.send(IpcEvent.logout); + await this.tokenCache.clear(); + this.authEvents["Logout"].emit(); + return; } - public logout(closeWindows = true) { - this._aadService.logout(closeWindows); + public async login() { + return this.remote.send(IpcEvent.login); } + public isLoggedIn(): Observable { + return this.currentUser.pipe( + map(user => !!user), + catchError(() => of(false)) + ); + } + + /* Only used by Python-RPC */ public accessTokenFor(tenantId: string, resource: AADResourceName = null) { return this.accessTokenData(tenantId, resource) .pipe(map((x: AccessToken) => x.accessToken)); @@ -105,8 +138,7 @@ export class AuthService implements OnDestroy { switchMap(authorizations => forkJoin(authorizations.map( authorization => this.authorizeTenant(authorization, authOptions) - )) - ), + ))), share() ); } @@ -150,7 +182,7 @@ export class AuthService implements OnDestroy { return this.accessTokenData(tenantId, null, forceRefresh).pipe( switchMap(token => { - if (token) { + if (token?.accessToken) { authorization.status = TenantStatus.authorized; } return this.cacheAuthorization(authorization); @@ -166,7 +198,7 @@ export class AuthService implements OnDestroy { this.tenantErrorService.showError(authorization); } return this.cacheAuthorization(authorization); - }), + }) ); } } @@ -180,11 +212,14 @@ export class AuthService implements OnDestroy { */ public accessTokenData( tenantId: string, resource: AADResourceName = null, forceRefresh = false - ): - Observable { + ): Observable { const key = [tenantId, resource].join("|"); if (key in this.tokenObservableCache) { - return this.tokenObservableCache[key]; + if (forceRefresh) { + delete this.tokenObservableCache[key]; + } else { + return this.tokenObservableCache[key]; + } } if (this.tokenCache.hasToken(tenantId, resource)) { const token = this.tokenCache.getToken(tenantId, resource); @@ -194,20 +229,26 @@ export class AuthService implements OnDestroy { } } - const promise = this.remote.send( + const promise: Promise = this.remote.send( Constants.IpcEvent.AAD.accessTokenData, { tenantId, resource, forceRefresh } ); + promise.then((_) => this.authEvents["AuthComplete"].emit()); const tokenObservable = from(promise).pipe( - map(x => { - const token = new AccessToken({ ...x }); + map((tokenData: AccessToken | AuthEvent) => { + if (isAuthEvent(tokenData)) { + throw new AuthFlowException(tokenData); + } + const token = new AccessToken({ ...tokenData }); this.tokenCache.storeToken(tenantId, resource, token); delete this.tokenObservableCache[key]; return token; }), catchError(error => { delete this.tokenObservableCache[key]; - return throwError(error); + if (!(error instanceof AuthFlowException)) { + return throwError(error); + } }) ); this.tokenObservableCache[key] = tokenObservable; @@ -223,6 +264,18 @@ export class AuthService implements OnDestroy { .toPromise(); } + public showAuthSelect(data) { + this.authEvents["AuthSelect"].emit(data); + } + + public authSelectResult(result: AuthSelectResult) { + this.authEvents["AuthSelectResult"].emit(result); + } + + public on(event: AuthEventType, callback: (data: any) => void) { + this.authEvents[event].subscribe(callback); + } + // Caches current authorization state to avoid reauthenticating failed // tenants without user request. private cacheAuthorization(authorization: TenantAuthorization): @@ -231,4 +284,21 @@ export class AuthService implements OnDestroy { authorization; return of(authorization); } + + private initializeEventEmitters() { + this.authEvents["AuthSelect"] = new EventEmitter(); + this.authEvents["AuthSelectResult"] = new EventEmitter(); + this.authEvents["AuthComplete"] = new EventEmitter(); + this.authEvents["Logout"] = new EventEmitter(); + } +} + +class AuthFlowException extends Error { + constructor(public authEvent: AuthEvent) { + super(`Auth flow exception (${authEvent.type}): ${authEvent.message}`); + } +} + +function isAuthEvent(obj: any): obj is AuthEvent { + return obj && (obj.type === "cancel" || obj.type === "signout"); } diff --git a/desktop/src/app/services/batch-account/batch-account.service.ts b/desktop/src/app/services/batch-account/batch-account.service.ts index afc87e072..62637711d 100644 --- a/desktop/src/app/services/batch-account/batch-account.service.ts +++ b/desktop/src/app/services/batch-account/batch-account.service.ts @@ -165,6 +165,11 @@ export class BatchAccountService implements OnDestroy { }); } + public clear() { + DataCacheTracker.clearAllCaches(this._cache); + this._currentAccountId.next(null); + } + public load() { return forkJoin( this.localBatchAccountService.load(), diff --git a/desktop/src/app/services/batch-explorer.service.ts b/desktop/src/app/services/batch-explorer.service.ts index e4cbdf9a8..bba65c54d 100644 --- a/desktop/src/app/services/batch-explorer.service.ts +++ b/desktop/src/app/services/batch-explorer.service.ts @@ -61,10 +61,6 @@ export class BatchExplorerService implements OnDestroy { return this._app.openNewWindow(link); } - public async logoutAndLogin() { - return this.remote.send(IpcEvent.logoutAndLogin); - } - public async launchApplication(name: string, args: any): Promise { return this.remote.send(IpcEvent.launchApplication, { name, args }); } diff --git a/desktop/src/app/services/navigator.service.ts b/desktop/src/app/services/navigator.service.ts index 55bce20dd..6229bc122 100644 --- a/desktop/src/app/services/navigator.service.ts +++ b/desktop/src/app/services/navigator.service.ts @@ -1,3 +1,4 @@ +import { AuthService } from 'app/services'; import { Injectable, OnDestroy } from "@angular/core"; import { Router } from "@angular/router"; import { IpcService } from "@batch-flask/electron"; @@ -7,6 +8,7 @@ import { Subject } from "rxjs"; import { takeUntil } from "rxjs/operators"; import { URLSearchParams } from "url"; import { BatchAccountService } from "./batch-account"; +import { IpcEvent } from "common/constants"; export interface GotoOptions { /** @@ -23,7 +25,9 @@ export class NavigatorService implements OnDestroy { constructor( private accountService: BatchAccountService, private router: Router, - private ipc: IpcService) { + private ipc: IpcService, + private authService: AuthService + ) { } public ngOnDestroy() { @@ -46,6 +50,11 @@ export class NavigatorService implements OnDestroy { this.goto(link); }); }); + this.ipc.on(IpcEvent.userAuthSelectRequest).pipe( + takeUntil(this._destroy), + ).subscribe(([_, data]) => { + this.authService.showAuthSelect(data); + }); } public get onLine(): boolean { diff --git a/desktop/src/app/styles/base/layout.scss b/desktop/src/app/styles/base/layout.scss index c437aee23..d3f83a426 100644 --- a/desktop/src/app/styles/base/layout.scss +++ b/desktop/src/app/styles/base/layout.scss @@ -317,3 +317,13 @@ bl-app { position: relative; } } + +#auth-overlay { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(255, 255, 255, 0.8); + z-index: 1000; +} diff --git a/desktop/src/app/styles/main.scss b/desktop/src/app/styles/main.scss index b63e13dae..7a2769242 100644 --- a/desktop/src/app/styles/main.scss +++ b/desktop/src/app/styles/main.scss @@ -26,6 +26,7 @@ @import "./partials/grid"; @import "./partials/loading-indicators"; @import "./partials/icons"; +@import "./partials/central-panel"; // Vendor styles @import "./vendor/material-theme.scss"; diff --git a/desktop/src/app/styles/partials/central-panel.scss b/desktop/src/app/styles/partials/central-panel.scss new file mode 100644 index 000000000..6e9d370d8 --- /dev/null +++ b/desktop/src/app/styles/partials/central-panel.scss @@ -0,0 +1,44 @@ +@import "app/styles/variables"; + +.central-panel { + width: 100%; + height: 100vh; + display: flex; + justify-content: center; + align-items: center; + .central-panel-content { + padding: 5em; + text-align: center; + max-width: 500px; + color: $primary-text; + background-color: $main-background; + border-radius: 10px; + .description { + margin-bottom: 1em; + margin-top: 1em; + } + .central-button-group { + margin: 2em 0; + .central-button { + margin-bottom: 2em; + display: block; + font-size: 120%; + border-radius: 5px; + height: inherit; /* override hardcoded height */ + padding: 6px; + &[color=light] { + border: 1px solid $primary-color; + } + } + } + .caption { + font-size: 80%; + color: $secondary-text; + } + .footer { + margin-top: 2em; + font-size: 80%; + color: $secondary-text; + } + } +} diff --git a/desktop/src/client/core/aad/auth-loopback-client.ts b/desktop/src/client/core/aad/auth-loopback-client.ts index 0d7e944bb..6cd0f29ec 100644 --- a/desktop/src/client/core/aad/auth-loopback-client.ts +++ b/desktop/src/client/core/aad/auth-loopback-client.ts @@ -49,7 +49,6 @@ export class AuthLoopbackClient implements ILoopbackClient { const authCodeListener = new Promise((resolve, reject) => { this.server = createServer(async (req: IncomingMessage, res: ServerResponse) => { - console.log("[Loopback] Handling loopback request at", req.url); const url = req.url; if (!url) { res.end(errorTemplate || "Login failed: Error occurred loading redirectUrl"); @@ -62,7 +61,6 @@ export class AuthLoopbackClient implements ILoopbackClient { const authCodeResponse = AuthLoopbackClient.getDeserializedQueryString(url); if (authCodeResponse.code) { - console.log("[Loopback] Has auth code"); const redirectUri = await this.getRedirectUri(); res.writeHead(302, { location: redirectUri }); // Prevent auth code from being saved in the browser history res.end(); @@ -102,7 +100,6 @@ export class AuthLoopbackClient implements ILoopbackClient { } const addressInfo = this.server.address(); - console.log("[Loopback] Address info:", addressInfo); if (addressInfo == null || typeof addressInfo === "string") { this.closeServer(); throw new Error("Failed to read auth code listener port"); @@ -115,7 +112,6 @@ export class AuthLoopbackClient implements ILoopbackClient { * Close the loopback server */ closeServer(): void { - console.log("Closing server"); if (!!this.server) { this.server.close(); } diff --git a/desktop/src/client/core/aad/auth-observer.ts b/desktop/src/client/core/aad/auth-observer.ts new file mode 100644 index 000000000..78f14b93c --- /dev/null +++ b/desktop/src/client/core/aad/auth-observer.ts @@ -0,0 +1,9 @@ +export interface UserAuthSelection { + externalBrowserAuth?: boolean; +} + +export interface AuthObserver { + onAuthFailure(error); + selectUserAuthMethod(tenantId: string): Promise; + fetchAuthCode(url: string, tenantId: string): Promise; +} diff --git a/desktop/src/client/core/aad/auth-provider.spec.ts b/desktop/src/client/core/aad/auth-provider.spec.ts index 11ba6385c..0b2ae056f 100644 --- a/desktop/src/client/core/aad/auth-provider.spec.ts +++ b/desktop/src/client/core/aad/auth-provider.spec.ts @@ -1,10 +1,14 @@ -import { instrumentAuthProvider, instrumentForAuth, MockAuthorizeError } from "test/utils/mocks/auth"; +import { instrumentAuthProvider, instrumentForAuth } from "test/utils/mocks/auth"; import AuthProvider from "./auth-provider"; +import { AuthObserver } from "./auth-observer"; + +const FAKE_GET_TOKEN_ARGS = { + resourceURI: "resourceURI1", + tenantId: "tenant1" +}; describe("AuthProvider", () => { let authProvider: AuthProvider; - const authCodeSpy = jasmine.createSpy("authCodeCallback") - .and.returnValue("some-code"); const appSpy: any = { properties: { azureEnvironment: { @@ -14,6 +18,9 @@ describe("AuthProvider", () => { } } }; + let mockAuthCode; + let authObserver: jasmine.SpyObj; + instrumentForAuth(appSpy); const config: any = { tenant: "common", @@ -23,36 +30,35 @@ describe("AuthProvider", () => { beforeEach(() => { authProvider = new AuthProvider(appSpy, config); + authObserver = { + selectUserAuthMethod: jasmine.createSpy("selectUserAuthMethod") + .and.returnValue(Promise.resolve({ externalBrowserAuth: false })), + onAuthFailure: jasmine.createSpy("mock-auth-failure"), + fetchAuthCode: jasmine.createSpy("fetchAuthCode") + }; + authProvider.setAuthObserver(authObserver); + mockAuthCode = "some-code"; }); it("authenticates interactively first, then silently", async () => { - const call = async () => await authProvider.getToken({ - resourceURI: "resourceURI1", - browser: "builtin", - tenantId: "tenant1", - browserAuthCallback: authCodeSpy, - builtInAuthCodeCallback: authCodeSpy - }); - const clientSpy = makeClientApplicationSpy(); - spyOn(authProvider, "_getClient").and.returnValue(clientSpy); + authObserver.fetchAuthCode.and.returnValue(Promise.resolve(mockAuthCode)); + + const call = async () => await authProvider.getToken(FAKE_GET_TOKEN_ARGS); + const clientSpy = createClientSpy(); instrumentAuthProvider(authProvider); - returnToken(clientSpy.acquireTokenByCode, "interactive-token-1"); returnToken(clientSpy.acquireTokenSilent, "silent-token-1"); const result1 = await call(); - expect(authCodeSpy).toHaveBeenCalled(); expect(clientSpy.getAuthCodeUrl).toHaveBeenCalled(); expect(clientSpy.acquireTokenByCode).toHaveBeenCalled(); expect(clientSpy.acquireTokenSilent).not.toHaveBeenCalled(); - expect(result1.accessToken).toEqual("interactive-token-1"); + expect(result1.accessToken).toEqual("tenant1-token"); clientSpy.getAuthCodeUrl.calls.reset(); clientSpy.acquireTokenByCode.calls.reset(); - authCodeSpy.calls.reset(); const result2 = await call(); - expect(authCodeSpy).not.toHaveBeenCalled(); expect(clientSpy.getAuthCodeUrl).not.toHaveBeenCalled(); expect(clientSpy.acquireTokenByCode).not.toHaveBeenCalled(); expect(clientSpy.acquireTokenSilent).toHaveBeenCalled(); @@ -60,135 +66,79 @@ describe("AuthProvider", () => { }); it("should return a per-tenant access token", async () => { - spyOn(authProvider, "_createClient").and.callFake(tenantId => { - const spy = makeClientApplicationSpy(); - returnToken(spy.acquireTokenByCode, `${tenantId}-token`); - return spy; - }); + createClientSpy(); - const result1 = await authProvider.getToken({ - resourceURI: "resourceURI1", - browser: "builtin", - tenantId: "tenant1", - browserAuthCallback: authCodeSpy, - builtInAuthCodeCallback: authCodeSpy - }); + const result1 = await authProvider.getToken(FAKE_GET_TOKEN_ARGS); const result2 = await authProvider.getToken({ - resourceURI: "resourceURI1", - browser: "builtin", + ...FAKE_GET_TOKEN_ARGS, tenantId: "tenant2", - browserAuthCallback: authCodeSpy, - builtInAuthCodeCallback: authCodeSpy }); expect(result1.accessToken).toEqual("tenant1-token"); expect(result2.accessToken).toEqual("tenant2-token"); }); - it("should retry interactive auth only for certain error codes", - async () => { - spyOn(authProvider, "_createClient").and.callFake(tenantId => { - const spy = makeClientApplicationSpy(); - returnToken(spy.acquireTokenByCode, `${tenantId}-token`); - return spy; - }); + it("should use external browser when externalBrowserAuth is true", async () => { + createClientSpy(); + authObserver.selectUserAuthMethod.and.returnValue( + Promise.resolve({ externalBrowserAuth: true }) + ); - async function expectRetryable(code: string | string[], retryable) { - const authCodeSpy = - jasmine.createSpy("authCodeCallback").and.returnValues( - Promise.reject(new MockAuthorizeError({ - error: (retryable ? "Retryable" : "Unretryable") + - " error", - errorCodes: [].concat(code) // convert scalar or array - // into flat array - })), - // Second call for interactive auth - jasmine.anything - ); - - try { - await authProvider.getToken({ - tenantId: "tenant1", - browser: "builtin", - resourceURI: "resourceURI1", - browserAuthCallback: authCodeSpy, - builtInAuthCodeCallback: authCodeSpy - }); - if (!retryable) { - fail(`Should have thrown an error on code ${code}`); - } - } catch (e) { - if (retryable) { - fail(`Should not have thrown an error on code ${code}: ` + - e); - } - } - } + const browserSpy = + spyOn(authProvider, "_createExternalBrowserRequest"); + await authProvider.getToken(FAKE_GET_TOKEN_ARGS); + expect(browserSpy).toHaveBeenCalled(); + }); - await [ - "16000", "16001", "50013", "50027", "50050", "50056", "50058", - "50061", "50064", "50071", "50072", "50074", "50076", "50079", - "50085", "50089", "50097", "50125", "50126", "54005", "65004", - "70008", "700084", "70019", "90012", "90013" - ].forEach(code => expectRetryable(code, true)); - - await [ - "1000000", "1000031", "100007", "120012", "120013", "120014", - "120015", "120016", "120021", "130004", "130005", "130006", - "130007", "130008", "135010", "135011", "16003", "20001", "20012", - "20033", "220450", "220501", "221000", "240001", "240002", "28002", - "28003", "40008", "50002", "50002", "500021", "50005", "50007", - "50008", "50011", "50014", "50020", "50029", "50034", "50042", - "50043", "50048", "50049", "50053", "50055", "50057", "50059", - "50086", "50105", "50107", "501241", "50128", "50129", "50131", - "50132", "50133", "50134", "50135", "50140", "50143", "50144", - "50146", "50196", "51000", "51001", "51004", "53000", "53001", - "53002", "53003", "530032", "53011", "54000", "65005", "650052", - "650054", "650056", "650057", "67003", "700005", "70001", - "7000112", "7000114", "700016", "70002", "7000215", "700022", - "7000222", "700023", "70003", "700030", "70004", "70005", "700054", - "70007", "70011", "70018", "75003", "7500514", "7500529", "750054", - "75011", "75016", "80001", "80010", "80012", "80013", "81005", - "81006", "81007", "81009", "81010", "81011", "81012", "90002", - "90004", "90005", "90007", "90009", "90010", "9001023", "900144", - "90015", "90016", "90019", "90020", "90022", "90027", "90036", - "90038", "900382", "90043", "900432", "90051", "90055", "90056", - "90072", "90081", "90082", "90084", "90085", "90092", "90093", - "90094", "90095", "900971", "90099", "901002", "90107", "90123", - "90124", "90125", "90126", "90130" - ].forEach(code => expectRetryable(code, false)); - - expectRetryable([], true); - expectRetryable(["16000", "50071"], true); // Both retryable - expectRetryable(["90094", "50133"], false); // Both unretryable - expectRetryable(["50071", "50133"], false); // One retryable, one not + it("should use built-in window when externalBrowserAuth is false", async () => { + const clientSpy = createClientSpy(); + authObserver.selectUserAuthMethod.and.returnValue( + Promise.resolve({ externalBrowserAuth: false }) + ); + await authProvider.getToken(FAKE_GET_TOKEN_ARGS); + expect(clientSpy.getAuthCodeUrl).toHaveBeenCalled(); + expect(authObserver.fetchAuthCode).toHaveBeenCalled(); + expect(clientSpy.acquireTokenByCode).toHaveBeenCalled(); }); - it("shouldn't fail with non-auth exception", async () => { + describe("#_builtInWindowAuth", () => { + let clientSpy; + beforeEach(() => { + clientSpy = createClientSpy(); + authObserver.selectUserAuthMethod.and.returnValue( + Promise.resolve({ externalBrowserAuth: false }) + ); + }); + it("should handle error thrown by client.getAuthCodeUrl()", async () => { + const err = "fake getAuthCodeUrl error"; + clientSpy.getAuthCodeUrl.and.returnValue(Promise.reject(err)); + await expectAsync(authProvider.getToken(FAKE_GET_TOKEN_ARGS)) + .toBeRejectedWith(err); + expect(authObserver.onAuthFailure).toHaveBeenCalledWith(err); + expect(clientSpy.acquireTokenByCode).not.toHaveBeenCalled(); + expect(authObserver.fetchAuthCode).not.toHaveBeenCalled(); + }); + it("should handle error thrown by fetchAuthCode()", async () => { + const err = "fake fetchAuthCode error"; + authObserver.fetchAuthCode.and.returnValue(Promise.reject(err)); + await expectAsync(authProvider.getToken(FAKE_GET_TOKEN_ARGS)) + .toBeRejectedWith(err); + expect(clientSpy.getAuthCodeUrl).toHaveBeenCalled(); + expect(authObserver.onAuthFailure).toHaveBeenCalledWith(err); + expect(clientSpy.acquireTokenByCode).not.toHaveBeenCalled(); + }); + }); + + function createClientSpy() { + const spy = makeClientApplicationSpy(); 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", - browser: "builtin", - resourceURI: "resourceURI1", - browserAuthCallback: authCodeSpy, - builtInAuthCodeCallback: authCodeSpy - }); - } catch (e) { - fail(`Should not have thrown error: ${e}`); - } - }); + return spy; + } }); const makeTokenCacheSpy = () => jasmine.createSpyObj( diff --git a/desktop/src/client/core/aad/auth-provider.ts b/desktop/src/client/core/aad/auth-provider.ts index f7a7dfa0e..f8ba61477 100644 --- a/desktop/src/client/core/aad/auth-provider.ts +++ b/desktop/src/client/core/aad/auth-provider.ts @@ -1,34 +1,27 @@ import { AccountInfo, AuthenticationResult, + InteractiveRequest, PublicClientApplication, - SilentFlowRequest } from "@azure/msal-node"; import { log } from "@batch-flask/utils"; import { BatchExplorerApplication } from ".."; import { SecureDataStore } from "../secure-data-store"; import { AADConfig } from "./aad-config"; -import { defaultTenant, unretryableAuthCodeErrors, TenantPlaceholders } from "./aad-constants"; -import { AuthorizeError } from "./authentication"; +import { defaultTenant, TenantPlaceholders } from "./aad-constants"; import MSALCachePlugin from "./msal-cache-plugin"; +import { AuthObserver } from "./auth-observer"; +import { shell } from "electron"; +import { AuthLoopbackClient } from "./auth-loopback-client"; const MSAL_SCOPES = ["user_impersonation"]; export type AuthorizationResult = AuthenticationResult; - -/** - * A callback which performs interactive auth using an external - * web browser - */ -export type BrowserAuthCallback = - (client: PublicClientApplication, tokenRequest: SilentFlowRequest, url: string, tenant: string) => Promise; - -/** - * A callback which peforms silent or interactive auth using a built-in - * Electron window - */ -export type BuiltInAuthCodeCallback = - (url: string, tenant: string, silent?: boolean) => Promise; +interface MSALAuthRequest { + scopes: string[]; + redirectUri: string; + authority: string; +} /** * Provides authentication services @@ -40,6 +33,8 @@ export default class AuthProvider { private _logoutPromise?: Promise; private _primaryClient?: PublicClientApplication; + private authObserver: AuthObserver; + // Used for reauthentication to associated tenants private _primaryUsername?: string; @@ -51,6 +46,10 @@ export default class AuthProvider { new MSALCachePlugin(app.injector.get(SecureDataStore)); } + public setAuthObserver(observer: AuthObserver) { + this.authObserver = observer; + } + /** * Retrieves an access token for a tenant and resource * @@ -64,19 +63,13 @@ export default class AuthProvider { */ public async getToken(options: { resourceURI: string, - browser: "external" | "builtin", tenantId?: string, forceRefresh?: boolean, - browserAuthCallback: BrowserAuthCallback, - builtInAuthCodeCallback: BuiltInAuthCodeCallback, }): Promise { const { resourceURI, - browser, tenantId = defaultTenant, forceRefresh = false, - browserAuthCallback, - builtInAuthCodeCallback } = options; if (this._logoutPromise) { @@ -95,7 +88,7 @@ export default class AuthProvider { const authRequest = this._authRequest(resourceURI, tenantId); let account: AccountInfo | null = null; try { - log.debug(`[${tenantId}] Trying to silently acquire token`); + log.debug(`[${tenantId}] Trying to acquire token silently`); account = await this._getAccount(tenantId); if (!account) { @@ -109,52 +102,27 @@ export default class AuthProvider { }); return result; } catch (silentTokenException) { - let result: AuthorizationResult; - - if (browser === "external") { - log.debug(`[${tenantId}] Trying browser interactive auth code flow (${silentTokenException})`); - - const url = await client.getAuthCodeUrl({ - ...authRequest, - domainHint: tenantId, - loginHint: this._primaryUsername - }); - - result = await browserAuthCallback(client, {...authRequest, account, forceRefresh}, url, tenantId); + log.debug(`[${tenantId}] Silent token acquisition failed: ${ + silentTokenException}`); + + // Prompt user for interactive authentication type + const { externalBrowserAuth } = + await this.authObserver.selectUserAuthMethod(tenantId); + + let result: AuthenticationResult; + if (externalBrowserAuth) { + log.debug(`[${tenantId}] Interactive auth code flow with ` + + `system browser (${silentTokenException})`); + result = await this._systemBrowserAuth(client, authRequest, + tenantId); } else { - log.debug(`[${tenantId}] Trying silent auth code flow (${silentTokenException})`); - - let code: string; - try { - // Attempt to get authorization code silently - const url = await client.getAuthCodeUrl( - { ...authRequest, prompt: "none" } - ); - code = await builtInAuthCodeCallback(url, tenantId, true); - } catch (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(";") + `)`); - throw silentAuthException; - } - log.debug( - `[${tenantId}] Trying built-in interactive auth code flow (${silentAuthException})`); - const url = await client.getAuthCodeUrl({ - ...authRequest, - domainHint: tenantId, - loginHint: this._primaryUsername - }); - - code = await builtInAuthCodeCallback(url, tenantId); - } - - result = await client.acquireTokenByCode({ ...authRequest, code }); + log.debug(`[${tenantId}] Interactive auth code flow with ` + + `built-in window (${silentTokenException})`); + result = await this._builtInWindowAuth(client, authRequest, + tenantId); } - if (result.account) { + if (result?.account) { this._accounts[tenantId] = result.account; if (!this._primaryUsername) { this._primaryUsername = result.account.username; @@ -167,6 +135,68 @@ export default class AuthProvider { } } + private async _systemBrowserAuth( + client: PublicClientApplication, + authRequest: MSALAuthRequest, + tenantId: string + ): Promise { + try { + const interactiveRequest = + await this._createExternalBrowserRequest(authRequest); + return await client.acquireTokenInteractive(interactiveRequest); + } catch (error) { + log.warn(`[${tenantId}] Failed to authenticate with browser: ${error}`); + this.authObserver.onAuthFailure(error); + } + } + + private async _builtInWindowAuth( + client: PublicClientApplication, + authRequest: MSALAuthRequest, + tenantId: string, + ) { + let code: string; + let url: string; + try { + url = await client.getAuthCodeUrl({ + ...authRequest, + domainHint: tenantId, + loginHint: this._primaryUsername + }); + } catch (error) { + log.warn(`[${tenantId}] Failed to get auth code URL: ${error}`); + this.authObserver.onAuthFailure(error); + throw error; + } + + try { + code = await this.authObserver.fetchAuthCode(url, tenantId); + } catch (error) { + log.warn(`[${tenantId}] Failed to authenticate with built-in window: ${error}`); + this.authObserver.onAuthFailure(error); + throw error; + } + + const result = await client.acquireTokenByCode({ ...authRequest, code }); + return result; + } + + private async _createExternalBrowserRequest(authRequest: MSALAuthRequest): + Promise { + const loopbackClient = await AuthLoopbackClient.initialize(3874); + + // opens a browser instance via Electron shell API + const openBrowser = async (url: string) => { + await shell.openExternal(url); + }; + const interactiveRequest: InteractiveRequest = { + ...authRequest, + openBrowser, + loopbackClient + }; + return interactiveRequest; + } + public async logout(tenantId?: string): Promise { this._logoutPromise = this._removeAccounts(tenantId); return this._logoutPromise; @@ -271,14 +301,6 @@ export default class AuthProvider { `Unable to find a valid account for tenant ${tenantId}` ); } - private _isTenantAuthRetryable(error: AuthorizeError) { - for (const code of error.errorCodes) { - if (unretryableAuthCodeErrors.includes(code)) { - return false; - } - } - return true; - } private _getScopes(resourceURI: string): string[] { switch (resourceURI) { @@ -290,7 +312,7 @@ export default class AuthProvider { } } - private _authRequest(resourceURI: string, tenantId?: string) { + private _authRequest(resourceURI: string, tenantId?: string): MSALAuthRequest { return { scopes: this._getScopes(resourceURI), redirectUri: this.config.redirectUri, diff --git a/desktop/src/client/core/aad/auth/aad.service.spec.ts b/desktop/src/client/core/aad/auth/aad.service.spec.ts index 589256d74..6d9b7137b 100644 --- a/desktop/src/client/core/aad/auth/aad.service.spec.ts +++ b/desktop/src/client/core/aad/auth/aad.service.spec.ts @@ -61,55 +61,55 @@ describe("AADService", () => { dialogSpy = { showMessageBox: jasmine.createSpy("showMessageBox").and.returnValue(0), }; + }); + async function initService() { const mockAADService = mock("./aad.service", { electron: { dialog: dialogSpy, }, }); - service = new mockAADService.AADService( - appSpy, localStorage, propertiesSpy, telemetryManagerSpy, ipcMainMock); - - service.init(); - }); + appSpy, localStorage, propertiesSpy, telemetryManagerSpy, ipcMainMock + ); + spyOn(service, "_loadTenants").and.returnValue(Promise.resolve()); + await service.init(); + } - it("when there is no item in the localstorage it should not set the id_token", () => { + it("when there is no item in the localstorage it should not set the id_token", async () => { localStorage.removeItem(Constants.localStorageKey.currentUser); - const tmpService = new AADService( - appSpy, localStorage, propertiesSpy, telemetryManagerSpy, ipcMainMock); - tmpService.init(); + await initService(); let user: AADUser | null = null; - tmpService.currentUser.subscribe(x => user = x); + service.currentUser.subscribe(x => user = x); expect(user).toBeNull(); }); it("when localstorage has currentUser it should load it", async (done) => { await localStorage.setItem(Constants.localStorageKey.currentUser, JSON.stringify(sampleUser)); - const tmpService = new AADService( - appSpy, localStorage, propertiesSpy, telemetryManagerSpy, ipcMainMock); - await tmpService.init(); + await initService(); let user: AADUser | null = null; - tmpService.currentUser.subscribe(x => user = x); + service.currentUser.subscribe(x => user = x); expect(user).not.toBeNull(); expect(user.username).toEqual("frank.smith@example.com"); done(); }); - describe("Login", () => { - beforeEach(() => { + describe("Sign-in", () => { + beforeEach(async () => { const newToken = new AccessToken({ accessToken: "newToken", expiresOn: DateTime.local().plus({ hours: 1 }), } as any); - spyOn(service, "accessTokenData").and.returnValue(new Promise((resolve) => resolve(newToken))); + await initService(); + spyOn(service, "retrieveAccessToken") + .and.returnValue(Promise.resolve(newToken)); }); - it("login to public cloud", async () => { + it("sign in to public cloud", async () => { await service.login().done; expect(dialogSpy.showMessageBox).not.toHaveBeenCalled(); }); - it("login to national cloud", async () => { + it("sign in to national cloud", async () => { propertiesSpy.azureEnvironment = AzureChina; await service.login().done; expect(dialogSpy.showMessageBox).toHaveBeenCalledTimes(1); diff --git a/desktop/src/client/core/aad/auth/aad.service.ts b/desktop/src/client/core/aad/auth/aad.service.ts index 0e9761fe3..f48e72a73 100644 --- a/desktop/src/client/core/aad/auth/aad.service.ts +++ b/desktop/src/client/core/aad/auth/aad.service.ts @@ -1,6 +1,6 @@ import { Inject, Injectable, forwardRef } from "@angular/core"; -import { AccessToken, DataStore, ServerError } from "@batch-flask/core"; +import { AccessToken, AuthEvent, DataStore, ServerError } from "@batch-flask/core"; import { log } from "@batch-flask/utils"; import { TenantDetails } from "app/models"; import { AADResourceName, AzurePublic } from "client/azure-environment"; @@ -18,7 +18,11 @@ import { AADConfig } from "../aad-config"; import { defaultTenant } from "../aad-constants"; import AuthProvider from "../auth-provider"; import { - AuthenticationService, AuthenticationState, AuthorizeResult, LogoutError + AuthCancelException, + AuthenticationService, + AuthenticationState, + AuthorizeResult, + SignOutException } from "../authentication"; import { AADUser } from "./aad-user"; import { UserDecoder } from "./user-decoder"; @@ -29,6 +33,13 @@ const aadConfig: AADConfig = { redirectUri: "https://login.microsoftonline.com/common/oauth2/nativeclient", }; +interface RetrieveAccessTokenOptions { + tenantId?: string, + resource?: AADResourceName, + forceRefresh?: boolean, + selectAuthMode?: boolean +} + @Injectable() export class AADService { public currentUser: Observable; @@ -40,7 +51,7 @@ export class AADService { private _authenticationState = new BehaviorSubject(null); private _userDecoder: UserDecoder; - private _newAccessTokenSubject: StringMap> = {}; + private _newAccessTokenSubject: StringMap> = {}; private _currentUser = new BehaviorSubject(null); private _tenants = new BehaviorSubject([]); @@ -60,12 +71,23 @@ export class AADService { this.authenticationState = this._authenticationState.asObservable(); ipcMain.on(IpcEvent.AAD.accessTokenData, - async ({ tenantId, resource, forceRefresh }) => - await this.accessTokenData(tenantId, resource, forceRefresh)); + async ({ tenantId, resource, forceRefresh }) => { + const token = await this.retrieveAccessToken({ tenantId, + resource, forceRefresh }); + return { ...token, tenantId, resource }; + }); + this.userAuthorization.state.subscribe((state) => { this._authenticationState.next(state); }); + + + this.authenticationState.subscribe((state) => { + if (state === AuthenticationState.Authenticated) { + this._loadTenants(); + } + }); } public async init() { @@ -80,25 +102,19 @@ export class AADService { const started = this._ensureTelemetryOptInNationalClouds(); return { started, - done: started.then(() => this._loginInCurrentCloud()), + done: started.then(() => this._retrieveTokenAndTenants()), }; } - public async logout(closeWindows = true) { + public async logout() { await this.localStorage.removeItem(Constants.localStorageKey.currentUser); this._tenants.next([]); await this._clearUserSpecificCache(); for (const [, window] of this.app.windows) { window.webContents.session.clearStorageData({ storages: ["localstorage"] }); } - if (closeWindows) { - this.app.windows.closeAll(); - } - await this.userAuthorization.logout(); - } - - public async accessTokenFor(tenantId: string, resource?: AADResourceName) { - return this.accessTokenData(tenantId, resource).then(x => x.accessToken); + await this.userAuthorization.logout(null); + this._currentUser.next(null); } /** @@ -106,29 +122,29 @@ export class AADService { * @param tenantId * @param resource */ - public async accessTokenData( - tenantId: string, resource?: AADResourceName, forceRefresh = false - ): Promise { - return this._retrieveNewAccessToken(tenantId, resource || "arm", - forceRefresh); + private async retrieveAccessToken(options?: RetrieveAccessTokenOptions): + Promise { + options = (options ?? {}); + const { + tenantId = defaultTenant, + forceRefresh = false, + selectAuthMode = true + } = options; + const resource = options.resource ?? "arm"; + const defer = new Deferred(); + + this._newAccessTokenSubject[ + this._tenantResourceKey(tenantId, resource)] = defer; + this._redeemNewAccessToken({ tenantId, resource, forceRefresh, + selectAuthMode }); + return defer.promise; } - private async _loginInCurrentCloud() { - try { - await this.accessTokenData(defaultTenant); - this._authenticationState.next(AuthenticationState.Authenticated); - } catch (error) { - if (error instanceof LogoutError) { - throw error; - } else { - log.error("Error login in ", error); - throw error; - } - } + private async _retrieveTokenAndTenants() { + await this.retrieveAccessToken({ selectAuthMode: false }); + this._authenticationState.next(AuthenticationState.Authenticated); try { - const tenants = await this._loadTenants(); - - this._tenants.next(tenants); + await this._loadTenants(); } catch (error) { log.error("Error retrieving tenants", error); this._tenants.error(ServerError.fromARM(error)); @@ -144,26 +160,13 @@ export class AADService { try { const user = JSON.parse(userStr); this._currentUser.next(user); + this._authenticationState.next(AuthenticationState.Authenticated); } catch (e) { this.localStorage.removeItem(Constants.localStorageKey.currentUser); } } } - /** - * Retrieve a new access token. - * @return Observable with access token object - */ - private async _retrieveNewAccessToken( - tenantId: string, resource: AADResourceName, forceRefresh: boolean - ): Promise { - const defer = new Deferred(); - this._newAccessTokenSubject[ - this._tenantResourceKey(tenantId, resource)] = defer; - this._redeemNewAccessToken(tenantId, resource, forceRefresh); - return defer.promise; - } - private _tenantResourceKey(tenantId: string, resource: string) { return `${tenantId}|${resource}`; } @@ -171,20 +174,19 @@ export class AADService { /** * Load a new access token from the authorization code given at login */ - private async _redeemNewAccessToken( - tenantId: string, resource: AADResourceName, forceRefresh: boolean - ) { + private async _redeemNewAccessToken(options: RetrieveAccessTokenOptions) { + const { tenantId, resource, forceRefresh, selectAuthMode } = options; const subjectKey = this._tenantResourceKey(tenantId, resource); const defer = this._newAccessTokenSubject[subjectKey]; delete this._newAccessTokenSubject[subjectKey]; try { - console.log("Authorize resource", tenantId, this.properties.azureEnvironment[resource as string], forceRefresh); const result: AuthorizeResult = - await this.userAuthorization.authorizeResource( + await this.userAuthorization.authorizeResource({ tenantId, - this.properties.azureEnvironment[resource as string], - forceRefresh - ); + resourceURI: this.properties.azureEnvironment[resource as string], + forceRefresh, + selectAuthMode + }); this._processUserToken(result.idToken); defer.resolve(new AccessToken({ @@ -195,10 +197,18 @@ export class AADService { homeTenantId: result.account?.homeAccountId?.split(".")[1], resource })); - } catch (e) { - log.error(`Error redeeming auth code for a token for resource ` + - `${resource}: ${e}`); - defer.reject(e); + } catch (error) { + if (error instanceof SignOutException) { + defer.resolve({ type: "signout" }); + this._authenticationState.next(AuthenticationState.SignedOut); + } else if (error instanceof AuthCancelException) { + defer.resolve({ type: "cancel" }); + log.info("User cancelled login"); + } else { + log.error(`Error redeeming auth code for a token for resource ` + + `${resource}: ${error.message}`); + defer.reject(error); + } } } @@ -216,7 +226,11 @@ export class AADService { } private async _loadTenants(): Promise { - const token = await this.accessTokenData(defaultTenant); + await this.app.appReady.promise; + const token = await this.retrieveAccessToken(); + if (!(token instanceof AccessToken)) { + return; + } const headers = { Authorization: `${token.tokenType} ${token.accessToken}`, @@ -227,7 +241,7 @@ export class AADService { const { value } = await response.json(); const tenants = value as TenantDetails[]; tenants.forEach(tenant => tenant.homeTenantId = token.homeTenantId); - return tenants; + this._tenants.next(tenants); } private _tenantURL() { diff --git a/desktop/src/client/core/aad/authentication/authentication.service.spec.ts b/desktop/src/client/core/aad/authentication/authentication.service.spec.ts index 22700bfbd..f167680d1 100644 --- a/desktop/src/client/core/aad/authentication/authentication.service.spec.ts +++ b/desktop/src/client/core/aad/authentication/authentication.service.spec.ts @@ -1,3 +1,4 @@ +import { error } from './../../../../../../util/bux/util'; import { AccountInfo } from "@azure/msal-node"; import { delay } from "test/utils/helpers/misc"; import { MockAuthProvider } from "test/utils/mocks/auth"; @@ -26,10 +27,13 @@ describe("AuthenticationService", () => { let fakeAADService: AADService; let appSpy; let state: AuthenticationState; + let authWindowLoaded; beforeEach(() => { appSpy = { splashScreen: new MockSplashScreen(), - authenticationWindow: new MockAuthenticationWindow() + authenticationWindow: new MockAuthenticationWindow(), + onIPCEvent: jasmine.createSpy("onIPCEvent"), + sendIPCEvent: jasmine.createSpy("sendIPCEvent"), }; fakeAuthProvider = new MockAuthProvider(appSpy, CONFIG); fakeAADService = { @@ -38,41 +42,60 @@ describe("AuthenticationService", () => { userAuthorization = new AuthenticationService(appSpy, CONFIG, fakeAuthProvider, fakeAADService); - // TODO: Remove this line when this is a setting - userAuthorization.browserAuthMode = "builtin"; + userAuthorization.selectUserAuthMethod = + jasmine.createSpy("selectUserAuthMethod").and.returnValue( + Promise.resolve({ externalBrowserAuth: false })); fakeAuthWindow = appSpy.authenticationWindow; + authWindowLoaded = fakeAuthWindow.domReady; userAuthorization.state.subscribe(x => state = x); }); - describe("Authorize", () => { + describe("authorize()", () => { let result: AuthorizeResult | null; let error: AuthorizeError | null; - let promise; + beforeEach(async () => { result = null; error = null; - const obs = userAuthorization.authorize("tenant-1"); - promise = obs.then((out) => result = out).catch((e) => error = e); - await delay(); }); + const runAuthorize = async (eventCallback?: () => Promise | void) => { + try { + const promise = userAuthorization.authorize("tenant-1"); + + await authWindowLoaded; + + if (eventCallback) { + const callbackResult = eventCallback(); + if (callbackResult instanceof Promise) { + await callbackResult; + } + } else { + await fakeAuthWindow.notifyRedirect(CONFIG.redirectUri); + } + result = await promise; + } catch (_error) { + error = _error; + } + }; + it("Should have called loadURL", async () => { - fakeAuthWindow.notifyRedirect(CONFIG.redirectUri); - await promise; + await runAuthorize(); expect(fakeAuthWindow.loadURL).toHaveBeenCalledTimes(1); const args = fakeAuthWindow.loadURL.calls.mostRecent().args; expect(args.length).toBe(1); }); - it("window should be visible", () => { + it("window should be visible", async () => { + await runAuthorize(); expect(fakeAuthWindow.isVisible()).toBe(true); }); it("should return the id token and code when successful", async () => { - fakeAuthWindow.notifyRedirect(CONFIG.redirectUri); fakeAuthProvider.fakeToken = FAKE_TOKEN; - await promise; + await runAuthorize(); + expect(result).not.toBeNull(); expect(result.accessToken).toEqual("somecode"); expect(error).toBeNull(); @@ -81,9 +104,10 @@ describe("AuthenticationService", () => { expect(state).toBe(AuthenticationState.Authenticated); }); - it("Should error when the window fails to load", async () => { - fakeAuthWindow.notifyError({ code: 4, description: "Foo bar" }); - await promise; + it("should error when the window fails to load", async () => { + await runAuthorize(() => + fakeAuthWindow.notifyError({ code: 4, description: "Foo bar" }) + ); expect(result).toBeNull(); expect(error).not.toBeNull(); @@ -93,87 +117,90 @@ describe("AuthenticationService", () => { expect(fakeAuthWindow.destroy).toHaveBeenCalledTimes(1); }); - it("Should error when the url redirect returns an error", async () => { - fakeAuthWindow.notifyRedirect(CONFIG.redirectUri); - fakeAuthProvider.fakeError = { - error: "someerror", - description: "There was an error", - errorCodes: [ unretryableAuthCodeErrors[0] ] - }; - await promise; + it("should error when the url redirect returns an error", async () => { + await runAuthorize(() => fakeAuthWindow.notifyError({ + code: 4, description: "out of guacamole" + })); expect(result).toBeNull(); expect(error).not.toBeNull(); - expect(error.error).toEqual("someerror"); - expect(error.description).toEqual("There was an error"); + expect(error.error).toEqual("Failed to authenticate"); + expect(error.description).toContain("4:out of guacamole"); expect(fakeAuthWindow.destroy).toHaveBeenCalledTimes(1); }); it("should only authorize 1 tenant at a time and queue the others", async () => { - const obs1 = userAuthorization.authorize("tenant-1"); - const obs2 = userAuthorization.authorize("tenant-2"); - const tenant1Spy = jasmine.createSpy("Tenant-1"); - const tenant2Spy = jasmine.createSpy("Tenant-2"); - const p1 = obs1.then(tenant1Spy); - const p2 = obs2.then(tenant2Spy); + const result1 = userAuthorization.authorize("tenant-1"); + const result2 = userAuthorization.authorize("tenant-2"); + const spy = jasmine.createSpy("multipleTenants"); + const promise1 = result1.then(spy); + const promise2 = result2.then(spy); + + expect(spy).not.toHaveBeenCalled(); - expect(tenant1Spy).not.toHaveBeenCalled(); - expect(tenant2Spy).not.toHaveBeenCalled(); + await authWindowLoaded; fakeAuthWindow.notifyRedirect(CONFIG.redirectUri); fakeAuthProvider.fakeToken = FAKE_TOKEN; - await p1; + await promise1; + + result = spy.calls.mostRecent().args[0]; // Should have set tenant-1 expect(result).not.toBeNull(); expect(result.accessToken).toEqual("somecode"); expect(fakeAuthWindow.destroy).toHaveBeenCalledTimes(1); - expect(tenant1Spy).toHaveBeenCalled(); - expect(tenant1Spy).toHaveBeenCalledWith({ + + await authWindowLoaded; + + expect(spy).toHaveBeenCalled(); + expect(spy).toHaveBeenCalledWith({ id_token: null, code: null, session_state: null, + state: null, ...FAKE_TOKEN }); - expect(tenant2Spy).not.toHaveBeenCalled(); - // Should now authorize for tenant-2 fakeAuthWindow.notifyRedirect(CONFIG.redirectUri); - await p2; + await promise2; - expect(tenant2Spy).toHaveBeenCalled(); - expect(tenant2Spy).toHaveBeenCalledWith({ + expect(spy).toHaveBeenCalled(); + expect(spy).toHaveBeenCalledWith({ id_token: null, code: null, session_state: null, + state: null, ...FAKE_TOKEN }); expect(fakeAuthWindow.destroy).toHaveBeenCalledTimes(2); }); it("should continue authorizing even if a tenant fails", async () => { - fakeAuthWindow.notifyRedirect(CONFIG.redirectUri); fakeAuthProvider.fakeError = { error: "tenant1Error", description: "Tenant 1 Error", errorCodes: [ unretryableAuthCodeErrors[0] ] }; - const obs1 = userAuthorization.authorize("tenant-1"); - const obs2 = userAuthorization.authorize("tenant-2"); - const tenant1Spy = jasmine.createSpy("Tenant-1"); - const tenant2Spy = jasmine.createSpy("Tenant-2"); - const p1 = obs1.then(tenant1Spy); - const p2 = obs2.then(tenant2Spy); + const result1 = userAuthorization.authorize("tenant-1"); + const result2 = userAuthorization.authorize("tenant-2"); + const spy = jasmine.createSpy("multipleTenants"); + const promise1 = result1.then(spy); + const promise2 = result2.then(spy); + + expect(spy).not.toHaveBeenCalled(); - expect(tenant1Spy).not.toHaveBeenCalled(); + await authWindowLoaded; + fakeAuthWindow.notifyRedirect(CONFIG.redirectUri); try { - await p1; + await promise1; fail("should have thrown an error"); - } catch (error) { + } catch (_error) { + error = _error; expect(error.error).toEqual("tenant1Error"); } @@ -183,20 +210,23 @@ describe("AuthenticationService", () => { expect(error.error).toEqual("tenant1Error"); expect(fakeAuthWindow.destroy).toHaveBeenCalledTimes(1); - expect(tenant1Spy).not.toHaveBeenCalled(); - expect(tenant2Spy).not.toHaveBeenCalled(); + expect(spy).not.toHaveBeenCalled(); - // Should now authorize tenant-2 - fakeAuthWindow.notifyRedirect(CONFIG.redirectUri); fakeAuthProvider.fakeError = null; fakeAuthProvider.fakeToken = FAKE_TOKEN; - await p2; - expect(tenant2Spy).toHaveBeenCalled(); - expect(tenant2Spy).toHaveBeenCalledWith({ + await authWindowLoaded; + + // Should now authorize tenant-2 + fakeAuthWindow.notifyRedirect(CONFIG.redirectUri); + await promise2; + + expect(spy).toHaveBeenCalled(); + expect(spy).toHaveBeenCalledWith({ id_token: null, code: null, session_state: null, + state: null, ...FAKE_TOKEN }); expect(fakeAuthWindow.destroy).toHaveBeenCalledTimes(2); @@ -208,7 +238,7 @@ describe("AuthenticationService", () => { userAuthorization.authorize("tenant-1"); }); - it("shoud not be visible", () => { + it("should not be visible", () => { expect(fakeAuthWindow.isVisible()).toBe(false); }); }); diff --git a/desktop/src/client/core/aad/authentication/authentication.service.ts b/desktop/src/client/core/aad/authentication/authentication.service.ts index 0919619e9..bfcd6f407 100644 --- a/desktop/src/client/core/aad/authentication/authentication.service.ts +++ b/desktop/src/client/core/aad/authentication/authentication.service.ts @@ -1,4 +1,4 @@ -import { log, SanitizedError } from "@batch-flask/utils"; +import { SanitizedError, SecureUtils } from "@batch-flask/utils"; import { BatchExplorerApplication } from "client/core/batch-explorer-application"; import { Deferred } from "common"; import { BehaviorSubject, Observable } from "rxjs"; @@ -6,9 +6,10 @@ import { AADService } from ".."; import { AADConfig } from "../aad-config"; import * as AADConstants from "../aad-constants"; import AuthProvider, { AuthorizationResult } from "../auth-provider"; -import { shell } from "electron"; -import { AuthError, InteractiveRequest, PublicClientApplication, SilentFlowRequest } from "@azure/msal-node"; -import { AuthLoopbackClient } from "../auth-loopback-client"; +import { AuthError } from "@azure/msal-node"; +import { AuthObserver, UserAuthSelection } from "../auth-observer"; +import { IpcEvent } from "common/constants"; +import { first } from "rxjs/operators"; export interface AuthorizeResult extends AuthorizationResult { code: string; @@ -61,36 +62,46 @@ export class AuthorizeError extends Error { } } -interface AuthorizeQueueItem { - tenantId: string; - resourceURI: string; - forceRefresh: boolean; - deferred: Deferred; -} - export enum AuthenticationState { None, UserInput, Authenticated, + SignedOut, + Canceled } -export class LogoutError extends SanitizedError { - constructor() { - super("User logged out"); - } +enum TenantAuthState { + canceled, + pending, + completed, + signedOut, + failed +} + +export class SignOutException extends SanitizedError { + constructor() { super("User logged out"); } +} + +export class AuthCancelException extends SanitizedError { + constructor() { super("User canceled"); } +} + +export interface AuthorizeResourceOptions { + tenantId: string; + resourceURI: string; + forceRefresh?: boolean; + selectAuthMode?: boolean; } /** * This will open a new window at the /authorize endpoint to get the user */ -export class AuthenticationService { +export class AuthenticationService implements AuthObserver { public state: Observable; private _authQueue = new AuthorizeQueue(); private _state = new BehaviorSubject(AuthenticationState.None); - private _logoutDeferred: Deferred | null; - // TODO: Make this a setting - public browserAuthMode: "external" | "builtin" = "external" + public browserAuthMode: boolean; constructor( private app: BatchExplorerApplication, @@ -99,6 +110,7 @@ export class AuthenticationService { private aadService: AADService ) { this.state = this._state.asObservable(); + authProvider.setAuthObserver(this); } /** @@ -107,9 +119,11 @@ export class AuthenticationService { */ public async authorize(tenantId: string, forceRefresh = false): Promise { - return this.authorizeResource( - tenantId, this.app.properties.azureEnvironment.arm, forceRefresh - ); + return this.authorizeResource({ + tenantId, + resourceURI: this.app.properties.azureEnvironment.arm, + forceRefresh + }); } /** @@ -122,16 +136,27 @@ export class AuthenticationService { * @returns a promise with AuthorizedResult */ public async authorizeResource( - tenantId: string, resourceURI: string, forceRefresh: boolean + options: AuthorizeResourceOptions ): Promise { + const { + tenantId, + resourceURI, + forceRefresh, + selectAuthMode = true + } = options; const existingAuth = this._authQueue.get(tenantId, resourceURI); if (existingAuth) { - return existingAuth.deferred.promise; + if (forceRefresh) { + existingAuth.cancel("Force refresh"); + } else { + return this.convertToAuthResponse(existingAuth.promise()); + } } - const deferred = this._authQueue.add(tenantId, resourceURI, - forceRefresh); + const authItem = this._authQueue.add({ + tenantId, resourceURI, forceRefresh, selectAuthMode + }); this._authorizeNext(); - return deferred.promise; + return this.convertToAuthResponse(authItem.promise()); } /** @@ -140,107 +165,50 @@ export class AuthenticationService { * If a tenant is specified, only logout from that tenant */ public async logout(tenant?: string) { - if (this._logoutDeferred) { - return this._logoutDeferred.promise; - } - let showWindow = true; - - this.authProvider.logout(tenant); + await this.authProvider.logout(tenant); if (tenant) { this._authQueue.remove(tenant, this.app.properties.azureEnvironment.arm); - showWindow = false; } else { this._authQueue.clear(); } - - const url = AADConstants.logoutUrl( - this.app.properties.azureEnvironment.aadUrl, - tenant || this.config.tenant - ); - this._loadAuthWindow(url, { clear: true, tenant, show: showWindow }); - return this._logoutDeferred = new Deferred(); } private async _authorizeNext() { - console.log("Authorize next"); if (this._authQueue.authInProgress()) { - console.log("Already in progress... skipping"); return; } - const { tenantId, resourceURI, forceRefresh, deferred } = - this._authQueue.shift(); + const authItem = this._authQueue.shift(); + const { tenantId, resourceURI, forceRefresh } = authItem; try { - console.log("Get token for resource", resourceURI); const authResult: AuthorizationResult = await this.authProvider.getToken({ resourceURI, - // TODO: Make this a setting - browser: this.browserAuthMode, tenantId, - forceRefresh, - browserAuthCallback: (client, tokenRequest, url, tenant) => - this._browserAuthCallback(client, tokenRequest, url, tenant), - builtInAuthCodeCallback: (url, tenant, silent) => - this._authorizationCodeCallback(url, tenant, silent) + forceRefresh }); - console.log("Setting state to authenticated"); if (this._state.getValue() !== AuthenticationState.Authenticated) { this._state.next(AuthenticationState.Authenticated); } - deferred.resolve({ + authItem.complete({ ...authResult, code: null, id_token: null, - session_state: null + session_state: null, + state: null }); - } catch (e) { - deferred.reject(e); + } catch (error) { + authItem.error(error); } finally { this._authQueue.current = null; this._authorizeNext(); } } - private async _browserAuthCallback(client: PublicClientApplication, - tokenRequest: SilentFlowRequest, url: string, tenant: string) { - this._state.next(AuthenticationState.UserInput); - - console.log("Browser auth callback"); - try { - const loopbackClient = await AuthLoopbackClient.initialize(3874); - - // opens a browser instance via Electron shell API - const openBrowser = async (url: string) => { - await shell.openExternal(url); - }; - const interactiveRequest: InteractiveRequest = { - ...tokenRequest, - openBrowser, - loopbackClient - }; - - return await client.acquireTokenInteractive(interactiveRequest); - } catch (error) { - log.warn(`[${tenant}] Failed to authenticate using browser auth: ${error}`); - this._authQueue.rejectCurrent(error); - if (!this._authQueue.empty()) { - this._authorizeNext(); - } - } - } - - private async _authorizationCodeCallback(url: string, tenant: string, - silent = false) { - this._state.next(AuthenticationState.UserInput); - - return await this._loadAuthWindow(url, { show: !silent, tenant }); - } - /** * Authenticate using an Electron browser window * @@ -250,15 +218,18 @@ export class AuthenticationService { { clear = false, show = true, tenant = "" } = {} ): Promise { const authWindow = this.app.authenticationWindow; - const deferred = new Deferred(); authWindow.create(); if (tenant !== "" && !(tenant in AADConstants.TenantPlaceholders)) { this._setAuthWindowTitle(tenant); } - authWindow.onRedirect(newUrl => - this._authWindowRedirected(newUrl, deferred)); - authWindow.onNavigate(newUrl => this._handleNavigate(newUrl)); - authWindow.onError(error => this._handleError(error)); + const deferred = new Deferred(); + authWindow.onRedirect(url => this._authWindowRedirected(url, + data => deferred.resolve(data) + )); + authWindow.onError(error => { + this._handleError(error); + deferred.reject(error); + }); authWindow.onClose(() => this._authCanceled()); if (clear) { @@ -272,22 +243,14 @@ export class AuthenticationService { return deferred.promise; } - private _handleNavigate(url: string) { - if (this._logoutDeferred && AADConstants.isLogoutURL(url)) { - this._closeWindow(); - const deferred = this._logoutDeferred; - this._logoutDeferred = null; - deferred.resolve(); - } - } - /** * Get called when the auth window redirect or navigate somewhere. * This is used to catch the final redirect_uri of AD' * @param url Url used for callback * @param callback Called with the result of the auth code */ - private _authWindowRedirected(url: string, deferred: Deferred) { + private _authWindowRedirected(url: string, + callback: (code: string) => void) { if (!this._isRedirectUrl(url) || !this._authQueue.hasCurrent()) { return; } @@ -295,19 +258,13 @@ export class AuthenticationService { this._closeWindow(); const params: AuthCodeResult = this._getRedirectUrlParams(url); if (params.error) { - deferred.reject( - new AuthorizeError(params as AuthorizeResponseError) - ); - } else { - deferred.resolve(params.code); + throw new AuthorizeError(params as AuthorizeResponseError); } + callback(params.code); } private _authCanceled() { - this._authQueue.rejectCurrent(new AuthorizeError({ - error: "Canceled authentication", - error_description: `User canceled authentication` - })); + this._authQueue.cancelCurrent("Canceled authentication"); if (!this._authQueue.empty()) { this._authorizeNext(); } @@ -315,7 +272,7 @@ export class AuthenticationService { private _handleError({code, description}) { this._closeWindow(); - this._authQueue.rejectCurrent(new AuthorizeError({ + this._authQueue.failCurrent(new AuthorizeError({ error: "Failed to authenticate", error_description: `Failed to load the Microsoft login page (${code}:${description})`, })); @@ -360,6 +317,120 @@ export class AuthenticationService { } ); } + + public onAuthFailure(error: AuthError) { + if (this._authQueue.hasCurrent()) { + this._authQueue.failCurrent(error); + this._authorizeNext(); + } + } + + public async selectUserAuthMethod(tenantId: string): Promise { + if (this._authQueue.current?.selectAuthMode) { + this._state.next(AuthenticationState.UserInput); + return this._selectUserAuthMethod(tenantId); + } else { + return new Promise(resolve => { + this.app.userSettings.pipe(first()).subscribe(settings => { + resolve({ externalBrowserAuth: settings.externalBrowserAuth }); + }); + }); + } + } + + private async _selectUserAuthMethod(tenantId: string): Promise { + return new Promise((resolve, reject) => { + const requestId = createUniqueId(); + const responseEvent = IpcEvent.userAuthSelectResponse(requestId); + const listener = async (data) => { + if (data.result === "cancel") { + this._authQueue.cancelCurrent("User canceled"); + reject({ message: "User canceled" }); + } else { + resolve(data); + } + }; + this.app.onIPCEvent(responseEvent, data => listener(data)); + this.app.sendIPCEvent(IpcEvent.userAuthSelectRequest, { + requestId, + tenantId + }); + }); + } + + public fetchAuthCode(url: string, tenantId: string): Promise { + return this._loadAuthWindow(url, { tenant: tenantId }); + } + + private convertToAuthResponse(promise: Promise): Promise { + return promise.then(result => { + if (result.type === TenantAuthState.completed) { + return result.result; + } else if (result.type === TenantAuthState.canceled) { + throw new AuthCancelException(); + } else if (result.type === TenantAuthState.signedOut) { + throw new SignOutException(); + } else { + throw new Error(result.message); + } + }); + } +} + +type TenantAuthResult = { + type: TenantAuthState, + message?: string; + result?: AuthorizeResult; +}; + +class AuthorizeQueueItem { + private deferred: Deferred; + private _state: TenantAuthState = TenantAuthState.pending; + + constructor( + public tenantId: string, + public resourceURI: string, + public forceRefresh: boolean, + public selectAuthMode: boolean + ) { + this.deferred = new Deferred(); + } + + public promise() { + return this.deferred.promise; + } + + public cancel(reason?: string) { + this.deferred.resolve({ + type: TenantAuthState.canceled, + message: reason + }); + this._state = TenantAuthState.canceled; + } + + public complete(result: AuthorizeResult) { + this.deferred.resolve({ + type: TenantAuthState.completed, + result + }); + this._state = TenantAuthState.completed; + } + + public error(error: Error) { + this.deferred.reject(error); + this._state = TenantAuthState.failed; + } + + public signOut() { + this.deferred.resolve({ + type: TenantAuthState.signedOut + }); + this._state = TenantAuthState.signedOut; + } + + public get state() { + return this._state; + } } /** @@ -370,16 +441,20 @@ class AuthorizeQueue { public current: AuthorizeQueueItem = null; public clear() { - this.queue.forEach( - auth => auth.deferred.reject(new LogoutError())); + this.queue.forEach(auth => auth.cancel()); this.queue.length = 0; this.current = null; } - public add(tenantId: string, resourceURI: string, forceRefresh = false) { - const deferred = new Deferred(); - this.queue.push({ tenantId, resourceURI, forceRefresh, deferred }); - return deferred; + public add(options: AuthorizeResourceOptions): AuthorizeQueueItem { + const item = new AuthorizeQueueItem( + options.tenantId, + options.resourceURI, + options.forceRefresh, + options.selectAuthMode + ); + this.queue.push(item); + return item; } public shift(): AuthorizeQueueItem { @@ -391,18 +466,18 @@ class AuthorizeQueue { return this.hasCurrent() || this.queue.length === 0; } - public resolveCurrent(callback) { - const deferred = this.current.deferred; - this.clearCurrent(); - deferred.resolve(callback); - return deferred; + public cancelCurrent(message?: string) { + if (this.current) { + this.current.cancel(message); + } } - public rejectCurrent(callback) { - const deferred = this.current.deferred; - this.clearCurrent(); - deferred.reject(callback); - return deferred; + public failCurrent(error: Error) { + if (this.current) { + this.current.error(error); + } else { + throw new Error(`No auth in progress. Original: ${error.message}`); + } } public get(tenantId: string, resourceURI: string): AuthorizeQueueItem { @@ -415,16 +490,16 @@ class AuthorizeQueue { public remove(tenantId: string, resourceURI: string) { let index = 0; - let auth = null; + let auth: AuthorizeQueueItem = null; while (index < this.queue.length) { auth = this.queue[index]; if (this.matches(auth, tenantId, resourceURI)) { - auth.deferred.reject(new LogoutError()); + auth.signOut(); break; } index++; } - if (auth === this.current) { + if (auth?.tenantId === this.current?.tenantId) { this.shift(); } else if (index < this.queue.length) { this.queue.splice(index, 1); @@ -443,9 +518,8 @@ class AuthorizeQueue { public empty() { return this.queue.length === 0; } +} - private clearCurrent() { - this.current = null; - this.queue = this.queue.filter(item => !!item); - } +function createUniqueId(): string { + return SecureUtils.uuid(); } diff --git a/desktop/src/client/core/batch-explorer-application.ts b/desktop/src/client/core/batch-explorer-application.ts index da384e677..607a7cd91 100644 --- a/desktop/src/client/core/batch-explorer-application.ts +++ b/desktop/src/client/core/batch-explorer-application.ts @@ -1,5 +1,5 @@ import { Injectable, Injector } from "@angular/core"; -import { LocaleService, TelemetryService, TranslationsLoaderService } from "@batch-flask/core"; +import { LocaleService, TelemetryService, TranslationsLoaderService, UserConfigurationService } from "@batch-flask/core"; import { AutoUpdateService } from "@batch-flask/electron"; import { log } from "@batch-flask/utils"; import { AzureEnvironment } from "client/azure-environment"; @@ -10,7 +10,7 @@ import { TelemetryManager } from "client/core/telemetry/telemetry-manager"; import { ManualProxyConfigurationWindow } from "client/proxy/manual-proxy-configuration-window"; import { ProxyCredentialsWindow } from "client/proxy/proxy-credentials-window"; import { ProxySettingsManager } from "client/proxy/proxy-settings"; -import { BatchExplorerLink, Constants, Deferred } from "common"; +import { BEUserConfiguration, BatchExplorerLink, Constants, Deferred } from "common"; import { IpcEvent } from "common/constants"; import { app, dialog, ipcMain, protocol, session } from "electron"; import { UpdateCheckResult } from "electron-updater"; @@ -21,10 +21,11 @@ import { Constants as ClientConstants } from "../client-constants"; import { MainWindow, WindowState } from "../main-window"; import { PythonRpcServerProcess } from "../python-process"; import { RecoverWindow } from "../recover-window"; -import { AADService, AuthenticationState, AuthenticationWindow, LogoutError } from "./aad"; +import { AADService, AuthenticationWindow } from "./aad"; import { BatchExplorerInitializer } from "./batch-explorer-initializer"; import { MainWindowManager } from "./main-window-manager"; import { StorageBlobAdapter } from "./storage"; +import { filter, first, map } from "rxjs/operators"; const osName = `${os.platform()}-${os.arch()}/${os.release()}`; const isDev = ClientConstants.isDev ? "-dev" : ""; @@ -44,27 +45,34 @@ export class BatchExplorerApplication { public aadService: AADService; public state: Observable; public proxySettings: ProxySettingsManager; + public userSettings: Observable; + public appReady: Deferred; private _state = new BehaviorSubject(BatchExplorerState.Loading); private _initializer: BatchExplorerInitializer; private _currentlyAskingForCredentials: Promise | null; + private mainWindow: MainWindow; constructor( public autoUpdater: AutoUpdateService, public translationLoader: TranslationsLoaderService, public localeService: LocaleService, public injector: Injector, + public ipcMain: BlIpcMain, public properties: BatchExplorerProperties, private telemetryService: TelemetryService, private telemetryManager: TelemetryManager, - private ipcMain: BlIpcMain, - private storageBlobAdapter: StorageBlobAdapter) { + private storageBlobAdapter: StorageBlobAdapter, + configurationStore: UserConfigurationService + ) { this.windows = new MainWindowManager(this, this.telemetryManager); this.state = this._state.asObservable(); + this.appReady = new Deferred(); - ipcMain.on(IpcEvent.logoutAndLogin, () => { - return this.logoutAndLogin(); - }); + this.userSettings = configurationStore.config; + + ipcMain.on(IpcEvent.login, () => this.login()); + ipcMain.on(IpcEvent.logout, () => this.logout()); } public async init() { @@ -90,8 +98,6 @@ export class BatchExplorerApplication { * Start the app by showing the splash screen */ public async start() { - const appReady = new Deferred(); - const loggedIn = new Deferred(); this.pythonServer.start(); this._initializer.init(); @@ -99,20 +105,6 @@ export class BatchExplorerApplication { if (!window) { return; } this._setCommonHeaders(window); - const loginResponse = this.aadService.login(); - loginResponse.done.catch((e) => { - if (e instanceof LogoutError) { - return; - } - log.error("Error while login", e); - dialog.showMessageBox({ - title: "Error during login", - type: "error", - message: e.toString(), - }); - this.logoutAndLogin(); - }); - await loginResponse.started; this._initializer.setTaskStatus("window", "Loading application"); @@ -130,27 +122,12 @@ export class BatchExplorerApplication { break; case WindowState.Ready: this._initializer.completeTask("window"); - appReady.resolve(); - } - }); - const authSub = this.aadService.authenticationState.subscribe((state) => { - switch (state) { - case AuthenticationState.None: - this._initializer.setLoginStatus("Login to azure active directory"); - break; - case AuthenticationState.UserInput: - this._initializer.setLoginStatus("Prompting for user input"); - break; - case AuthenticationState.Authenticated: - this._initializer.completeLogin(); - loggedIn.resolve(); - break; + this.appReady.resolve(); } }); - await Promise.all([appReady.promise, loggedIn.promise]); + await this.appReady.promise; windowSub.unsubscribe(); - authSub.unsubscribe(); window.show(); } @@ -161,16 +138,30 @@ export class BatchExplorerApplication { */ public async updateAzureEnvironment(env: AzureEnvironment) { await this.aadService.logout(); - this.windows.closeAll(); await this.properties.updateAzureEnvironment(env); await this.aadService.login().done; - this.windows.openNewWindow(); + this.openMainWindow(); } - public async logoutAndLogin() { - await this.aadService.logout(); + public logout() { + return this.aadService.logout(); + } + + public async login() { await this.aadService.login().done; - this.windows.openNewWindow(); + this.openMainWindow(); + } + + private openMainWindow(showWhenReady = true) { + if (this.mainWindow && !this.mainWindow.isDestroyed()) { + if (!this.mainWindow.isVisible()) { + this.mainWindow.show(); + } + } else { + this.mainWindow = + this.windows.openNewWindow(undefined, showWhenReady); + } + return this.mainWindow; } /** @@ -192,12 +183,12 @@ export class BatchExplorerApplication { public async openFromArguments(argv: string[], showWhenReady = true): Promise { if (ClientConstants.isDev) { - return this.windows.openNewWindow(undefined, showWhenReady); + return this.openMainWindow(showWhenReady); } const program = parseArguments(argv); const arg = program.args[0]; if (!arg || arg.startsWith("data:")) { - return this.windows.openNewWindow(undefined, showWhenReady); + return this.openMainWindow(showWhenReady); } try { const link = new BatchExplorerLink(arg); @@ -260,6 +251,28 @@ export class BatchExplorerApplication { return app.getVersion(); } + public async getUserSetting(key: keyof BEUserConfiguration): + Promise { + const settingValue = this.userSettings.pipe( + map(settings => settings[key]), + filter(value => value !== undefined), + first(), + ); + return settingValue.toPromise(); + } + + public async sendIPCEvent(event: string, properties?: { [key: string]: string }): Promise { + if (!this.mainWindow || this.mainWindow.isDestroyed()) { + throw new Error("Main window is not available"); + } + return this.mainWindow.webContents.send(event, properties); + } + + public onIPCEvent(event: string, listener: (...args) => Promise): () => void { + const { unsubscribe } = this.ipcMain.on(event, listener); + return unsubscribe; + } + private _setupProcessEvents() { ipcMain.on("reload", () => { this.pythonServer.restart(); diff --git a/desktop/src/client/core/unique-window.ts b/desktop/src/client/core/unique-window.ts index 28b609b3e..874b7adb6 100644 --- a/desktop/src/client/core/unique-window.ts +++ b/desktop/src/client/core/unique-window.ts @@ -50,6 +50,10 @@ export abstract class GenericWindow { return Boolean(this._window && this._window.isVisible()); } + public isDestroyed(): boolean { + return !this._window; + } + /** * Display the window only if not already visible * @param focus If we should focus on the window if it is already visible. @default false diff --git a/desktop/src/common/be-user-configuration.model.ts b/desktop/src/common/be-user-configuration.model.ts index b725ce430..55af69a92 100644 --- a/desktop/src/common/be-user-configuration.model.ts +++ b/desktop/src/common/be-user-configuration.model.ts @@ -6,6 +6,8 @@ import { BatchFlaskUserConfiguration, EntityConfigurationView } from "@batch-fla export interface BEUserConfiguration extends BatchFlaskUserConfiguration { theme: string; + externalBrowserAuth: boolean; + subscriptions: { ignore: string[], }; @@ -97,4 +99,5 @@ export const DEFAULT_BE_USER_CONFIGURATION: BEUserDesktopConfiguration = { defaultOutputFileGroup: null, }, theme: "classic", + externalBrowserAuth: true }; diff --git a/desktop/src/common/constants/constants.ts b/desktop/src/common/constants/constants.ts index 5416333b4..5bbe8f8e0 100644 --- a/desktop/src/common/constants/constants.ts +++ b/desktop/src/common/constants/constants.ts @@ -208,7 +208,11 @@ export const IpcEvent = { clearTenantAuth: "AAD_CLEAR_TENANT_AUTH" }, launchApplication: "LAUNCH_APPLICATION", - logoutAndLogin: "LOGOUT_AND_LOGIN", + login: "LOGIN", + logout: "LOGOUT", + userAuthSelectRequest: "USER_AUTH_SELECT", + userAuthSelectResponse: + (requestId: string) => `USER_AUTH_SELECT_${requestId}`, sendTelemetry: "SEND_TELEMETRY", log: "SEND_LOG", storageBlob: { diff --git a/desktop/src/test/utils/mocks/auth/auth-provider.mock.ts b/desktop/src/test/utils/mocks/auth/auth-provider.mock.ts index 184d478ec..249e11d4e 100644 --- a/desktop/src/test/utils/mocks/auth/auth-provider.mock.ts +++ b/desktop/src/test/utils/mocks/auth/auth-provider.mock.ts @@ -1,21 +1,25 @@ -import { AuthenticationResult, ClientApplication } from "@azure/msal-node"; +import { AuthenticationResult, ClientApplication, InteractionRequiredAuthError } from "@azure/msal-node"; import { AzurePublic } from "client/azure-environment"; import { AuthorizeError, AuthorizeResponseError } from "client/core/aad"; import { AADConfig } from "client/core/aad/aad-config"; +import { AuthObserver } from "client/core/aad/auth-observer"; import AuthProvider from "client/core/aad/auth-provider"; export class MockAuthProvider extends AuthProvider { public fakeToken: Partial; public fakeConfig: AADConfig; public fakeError: Partial; + public fakeAuthObserver: jasmine.SpyObj; constructor(app: any, config: AADConfig) { instrumentForAuth(app); super(app, config); this.fakeConfig = config; spyOn(this, "_getClient").and.returnValue( - new MockClientApplication(this) + Promise.resolve(new MockClientApplication(this)) ); instrumentAuthProvider(this); + this.fakeAuthObserver = mockAuthObserver(); + this.setAuthObserver(this.fakeAuthObserver); } } export class MockClientApplication extends ClientApplication { @@ -29,13 +33,13 @@ export class MockClientApplication extends ClientApplication { public getAuthCodeUrl(request) { if (request?.prompt === "none") { - throw new AuthorizeError({ + return Promise.reject(new AuthorizeError({ error: "fakeError", error_description: "fakeErrorDescription", error_code: "" - }); + })); } - return Promise.resolve(this.fakeAuthProvider?.fakeConfig.redirectUri); + return Promise.resolve("https://login.contoso.net?fakeauthcode=12345"); } public acquireTokenByCode() { @@ -46,11 +50,20 @@ export class MockClientApplication extends ClientApplication { this.fakeAuthProvider.fakeToken as AuthenticationResult); } - public async acquireTokenSilent() { - return null; + public async acquireTokenSilent(): Promise { + throw new InteractionRequiredAuthError("Fake interaction required auth error"); } } +function mockAuthObserver(): jasmine.SpyObj { + return { + onAuthFailure: jasmine.createSpy("onAuthFailure"), + selectUserAuthMethod: jasmine.createSpy("selectUserAuthMethod") + .and.returnValue(Promise.resolve({ externalBrowserAuth: false })), + fetchAuthCode: jasmine.createSpy("fetchAuthCode") + }; +} + export class MockAuthorizeError extends AuthorizeError { static responseErrorPrototype: AuthorizeResponseError = { error: "error", @@ -87,7 +100,10 @@ export const instrumentAuthProvider = (authProvider: AuthProvider) => { const tenants = {}; spyOn(authProvider, "_getAccount").and.callFake(tenantId => { if (tenantId in tenants) { - return new MockClientApplication(); + return { + tenantId, + localAccountId: `${tenantId}-account1` + }; } else { tenants[tenantId] = true; throw new Error("no account"); diff --git a/desktop/src/test/utils/mocks/windows/windows.mock.ts b/desktop/src/test/utils/mocks/windows/windows.mock.ts index 1cbbeb1f2..016daa102 100644 --- a/desktop/src/test/utils/mocks/windows/windows.mock.ts +++ b/desktop/src/test/utils/mocks/windows/windows.mock.ts @@ -1,3 +1,4 @@ +import { Deferred } from "common"; import { Subject } from "rxjs"; export class MockBrowserWindow { @@ -76,13 +77,23 @@ export class MockUniqueWindow { public show: jasmine.Spy; public hide: jasmine.Spy; public destroy: jasmine.Spy; + public domReady: Promise; private _visible: boolean = false; + private _domReadyDeferred: Deferred; constructor() { - this.create = jasmine.createSpy("create"); + this._domReadyDeferred = new Deferred(); + this.domReady = this._domReadyDeferred.promise; + + this.create = jasmine.createSpy("create").and.callFake(() => { + this._domReadyDeferred.resolve(); + }); this.show = jasmine.createSpy("show").and.callFake(() => this._visible = true); this.hide = jasmine.createSpy("hide").and.callFake(() => this._visible = false); - this.destroy = jasmine.createSpy("destroy"); + this.destroy = jasmine.createSpy("destroy").and.callFake(() => { + this._domReadyDeferred = new Deferred(); + this.domReady = this._domReadyDeferred.promise; + }); } public isVisible() { @@ -129,9 +140,9 @@ export class MockAuthenticationWindow extends MockUniqueWindow { } public notifyRedirect(newUrl) { - for (const callback of this._onRedirectCallbacks) { + this._onRedirectCallbacks.forEach((callback) => { callback(newUrl); - } + }); } public notifyNavigate(newUrl) { From 9631a47219ff46dcef998a89993c54d5b8d0f535 Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Thu, 15 Aug 2024 10:53:56 -0400 Subject: [PATCH 39/57] Added unit tests to increase coverage --- .../slide-toggle.component.spec.ts | 65 ++++++ .../profile-button.component.spec.ts | 29 +++ .../settings/settings.component.spec.ts | 21 +- .../tenant-picker.component.spec.ts | 99 +++++++++ .../src/app/services/aad/auth.service.spec.ts | 195 +++++++++++++++++- .../app/services/navigator.service.spec.ts | 97 +++++++++ .../core/aad/auth-loopback-client.spec.ts | 166 +++++++++++++++ .../client/core/aad/auth-loopback-client.ts | 13 +- 8 files changed, 674 insertions(+), 11 deletions(-) create mode 100644 desktop/src/@batch-flask/ui/form/slide-toggle/slide-toggle.component.spec.ts create mode 100644 desktop/src/app/components/tenant-picker/tenant-picker.component.spec.ts create mode 100644 desktop/src/app/services/navigator.service.spec.ts create mode 100644 desktop/src/client/core/aad/auth-loopback-client.spec.ts diff --git a/desktop/src/@batch-flask/ui/form/slide-toggle/slide-toggle.component.spec.ts b/desktop/src/@batch-flask/ui/form/slide-toggle/slide-toggle.component.spec.ts new file mode 100644 index 000000000..7551f7244 --- /dev/null +++ b/desktop/src/@batch-flask/ui/form/slide-toggle/slide-toggle.component.spec.ts @@ -0,0 +1,65 @@ +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { FormsModule } from "@angular/forms"; +import { MatSlideToggleModule } from "@angular/material/slide-toggle"; +import { By } from "@angular/platform-browser"; +import { SlideToggleComponent } from "./slide-toggle.component"; +import { NoopAnimationsModule } from "@angular/platform-browser/animations"; + +describe("SlideToggleComponent", () => { + let component: SlideToggleComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [SlideToggleComponent], + imports: [FormsModule, MatSlideToggleModule, NoopAnimationsModule] + }).compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(SlideToggleComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it("should create", () => { + expect(component).toBeTruthy(); + }); + + it("should toggle checked state", () => { + const slideToggle = fixture.debugElement.query(By.css("mat-slide-toggle")); + slideToggle.triggerEventHandler("change", { checked: true }); + fixture.detectChanges(); + expect(component.checked).toBe(true); + + slideToggle.triggerEventHandler("change", { checked: false }); + fixture.detectChanges(); + expect(component.checked).toBe(false); + }); + + it("should emit toggleChange event", () => { + spyOn(component.toggleChange, "emit"); + const slideToggle = fixture.debugElement.query(By.css("mat-slide-toggle")); + slideToggle.triggerEventHandler("change", { checked: true }); + fixture.detectChanges(); + expect(component.toggleChange.emit).toHaveBeenCalledWith(true); + + slideToggle.triggerEventHandler("change", { checked: false }); + fixture.detectChanges(); + expect(component.toggleChange.emit).toHaveBeenCalledWith(false); + }); + + it("should disable the slide toggle", () => { + component.isDisabled = true; + fixture.detectChanges(); + const slideToggle = fixture.debugElement.query(By.css("mat-slide-toggle")); + expect(slideToggle.attributes["ng-reflect-disabled"]).toBe("true"); + }); + + it("should call registerOnChange", () => { + const fn = jasmine.createSpy("onChangeCallback"); + component.registerOnChange(fn); + component.valueChange(true); + expect(fn).toHaveBeenCalledWith(true); + }); +}); diff --git a/desktop/src/app/components/layout/main-navigation/profile-button/profile-button.component.spec.ts b/desktop/src/app/components/layout/main-navigation/profile-button/profile-button.component.spec.ts index cbc7d09a1..2538561c6 100644 --- a/desktop/src/app/components/layout/main-navigation/profile-button/profile-button.component.spec.ts +++ b/desktop/src/app/components/layout/main-navigation/profile-button/profile-button.component.spec.ts @@ -45,6 +45,8 @@ describe("ProfileButtonComponent", () => { notificationServiceSpy = new NotificationServiceMock(); authServiceSpy = { currentUser: new BehaviorSubject(null), + login: jasmine.createSpy("login"), + logout: jasmine.createSpy("logout"), }; autoUpdateServiceSpy = { @@ -133,6 +135,33 @@ describe("ProfileButtonComponent", () => { expect(items.length).toBe(14); }); + describe("login/logout", () => { + it("shows sign-in when not signed in", () => { + click(clickableEl); + const items = contextMenuServiceSpy.lastMenu.items; + const signInItem = items[items.length - 1] as ContextMenuItem; + expect(signInItem.label).toBe("profile-button.sign-in"); + + // Perform the sign in + signInItem.click(); + expect(authServiceSpy.login).toHaveBeenCalledOnce(); + }); + + it("shows sign-out when signed in", () => { + authServiceSpy.currentUser.next({ + name: "Some Name", + username: "somename" + }); + click(clickableEl); + const items = contextMenuServiceSpy.lastMenu.items; + const signOutItem = items[items.length - 1] as ContextMenuItem; + expect(signOutItem.label).toBe("profile-button.sign-out"); + + // Perform the sign out + signOutItem.click(); + expect(authServiceSpy.logout).toHaveBeenCalledOnce(); + }); + }); describe("Clicking on the profile", () => { it("It shows a context menu", () => { click(clickableEl); diff --git a/desktop/src/app/components/settings/settings.component.spec.ts b/desktop/src/app/components/settings/settings.component.spec.ts index d4ec81105..763e05945 100644 --- a/desktop/src/app/components/settings/settings.component.spec.ts +++ b/desktop/src/app/components/settings/settings.component.spec.ts @@ -5,7 +5,7 @@ import { By } from "@angular/platform-browser"; import { NoopAnimationsModule } from "@angular/platform-browser/animations"; import { UserConfigurationService } from "@batch-flask/core"; import { I18nTestingModule, MockUserConfigurationService } from "@batch-flask/core/testing"; -import { FormModule, SelectComponent, SelectModule, ToolbarModule } from "@batch-flask/ui"; +import { FormModule, SelectComponent, SelectModule, SlideToggleComponent, ToolbarModule } from "@batch-flask/ui"; import { ButtonComponent, ButtonsModule } from "@batch-flask/ui/buttons"; import { PermissionService } from "@batch-flask/ui/permission"; import { SettingsComponent } from "app/components/settings"; @@ -25,6 +25,9 @@ describe("SettingsComponent", () => { let resetButtonEl: DebugElement; let resetButton: ButtonComponent; + let externalBrowserAuthToggleEl: DebugElement; + let externalBrowserAuthToggle: SlideToggleComponent; + let settingsServiceSpy: MockUserConfigurationService; let themeSelect: SelectComponent; @@ -54,6 +57,11 @@ describe("SettingsComponent", () => { resetButtonEl = de.query(By.css("bl-button.reset")); resetButton = resetButtonEl.componentInstance; + externalBrowserAuthToggleEl = de.query( + By.css("be-slide-toggle[formControlName=externalBrowserAuth]")); + externalBrowserAuthToggle = + externalBrowserAuthToggleEl.componentInstance; + themeSelect = de.query(By.css("bl-select[formControlName=theme]")).componentInstance; }); @@ -68,6 +76,17 @@ describe("SettingsComponent", () => { expect(resetButton.disabled).toBe(false); }); + it("updates the externalBrowserAuth setting", fakeAsync(() => { + tick(400); + expect(settingsServiceSpy.current.externalBrowserAuth).toBe(true); + externalBrowserAuthToggleEl.triggerEventHandler("toggleChange", false); + tick(1000); + fixture.detectChanges(); + expect(settingsServiceSpy.current.externalBrowserAuth).toBe(false); + tick(1000); + expect(settingsServiceSpy.current.externalBrowserAuth).toBe(false); + })); + it("updates the theme", fakeAsync(() => { tick(400); expect(settingsServiceSpy.current.theme).toEqual("classic"); diff --git a/desktop/src/app/components/tenant-picker/tenant-picker.component.spec.ts b/desktop/src/app/components/tenant-picker/tenant-picker.component.spec.ts new file mode 100644 index 000000000..86d698d88 --- /dev/null +++ b/desktop/src/app/components/tenant-picker/tenant-picker.component.spec.ts @@ -0,0 +1,99 @@ +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { Component, DebugElement, NO_ERRORS_SCHEMA } from "@angular/core"; +import { of } from "rxjs"; +import { AuthService } from "app/services"; +import { TenantPickerComponent } from "./tenant-picker.component"; +import { I18nTestingModule } from "@batch-flask/core/testing"; +import { TenantCardComponent } from "."; +import { By } from "@angular/platform-browser"; + +@Component({ + template: ``, +}) +class TestComponent { +} + +describe("TenantPickerComponent", () => { + let fixture: ComponentFixture; + let de: DebugElement; + let component: TenantPickerComponent; + let authServiceMock: any; + + beforeEach(async () => { + authServiceMock = { + isLoggedIn: jasmine.createSpy("isLoggedIn").and.returnValue(of(true)), + getTenantAuthorizations: + jasmine.createSpy("getTenantAuthorizations") + .and.returnValue(of([])) + }; + + await TestBed.configureTestingModule({ + imports: [ + I18nTestingModule, + ], + declarations: [ + TenantPickerComponent, + TenantCardComponent, + TestComponent, + ], + providers: [ + { provide: AuthService, useValue: authServiceMock } + ], + schemas: [NO_ERRORS_SCHEMA], + }).compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(TestComponent); + de = fixture.debugElement.query(By.css("be-tenant-picker")); + component = de.componentInstance; + fixture.detectChanges(); + }); + + it("should create", () => { + expect(component).toBeTruthy(); + }); + + it("should initialize tenantSettings form control", () => { + expect(component.tenantSettings.value).toEqual([]); + }); + + it("should call fetchTenantAuthorizations on initialization if logged in", () => { + expect(authServiceMock.isLoggedIn).toHaveBeenCalled(); + expect(authServiceMock.getTenantAuthorizations).toHaveBeenCalled(); + }); + + it("should propagate changes when tenantSettings value changes", () => { + const propagateChangeSpy = jasmine.createSpy("propagateChange"); + component.registerOnChange(propagateChangeSpy); + + const newValue = [{ tenantId: "1", authorization: "auth1" }]; + component.tenantSettings.setValue(newValue); + + expect(propagateChangeSpy).toHaveBeenCalledWith(newValue); + }); + + it("should call fetchTenantAuthorizations with reauthenticate on refresh", () => { + const fetchTenantAuthorizationsSpy = + spyOn(component, "fetchTenantAuthorizations") + .and.callThrough(); + component.refresh(); + expect(fetchTenantAuthorizationsSpy).toHaveBeenCalledWith({ reauthenticate: true }); + }); + + it("should call fetchTenantAuthorizations with specific tenant on refreshTenant", () => { + const fetchTenantAuthorizationsSpy = + spyOn(component, "fetchTenantAuthorizations").and.callThrough(); + const refreshData = { tenantId: "1", reauthenticate: true }; + component.refreshTenant(refreshData); + expect(fetchTenantAuthorizationsSpy).toHaveBeenCalledWith(refreshData); + }); + + it("should clean up on destroy", () => { + const destroySpy = spyOn(component["_destroy"], "next"); + const completeSpy = spyOn(component["_destroy"], "complete"); + component.ngOnDestroy(); + expect(destroySpy).toHaveBeenCalled(); + expect(completeSpy).toHaveBeenCalled(); + }); +}); diff --git a/desktop/src/app/services/aad/auth.service.spec.ts b/desktop/src/app/services/aad/auth.service.spec.ts index 5902a062e..4682d33db 100644 --- a/desktop/src/app/services/aad/auth.service.spec.ts +++ b/desktop/src/app/services/aad/auth.service.spec.ts @@ -24,8 +24,14 @@ const token2 = new AccessToken({ tokenType: "Bearer" }); -describe("AuthService spec", () => { - let service: AuthService; +class AuthServiceStub extends AuthService { + public getTokenCache() { + return (this as any).tokenCache; + } +} + +describe("AuthService", () => { + let service: AuthServiceStub; let aadServiceSpy; let remoteSpy; let batchExplorerSpy; @@ -83,7 +89,7 @@ describe("AuthService spec", () => { ] }); - service = new AuthService( + service = new AuthServiceStub( zoneSpy, batchExplorerSpy, remoteSpy, @@ -215,7 +221,58 @@ describe("AuthService spec", () => { }); }); expect(remoteSpy.send).toHaveBeenCalledTimes(2); + }); + + it("returns cached token if available and not expired", (done) => { + const cachedToken = new AccessToken({ + accessToken: "cachedToken", + expiresOn: DateTime.local().plus({ hours: 1 }).toJSDate(), + tokenType: "Bearer" + }); + service.getTokenCache().storeToken(FakeTenants.One, resource1, cachedToken); + + service.accessTokenData(FakeTenants.One, resource1).subscribe((token) => { + expect(token).toEqual(cachedToken); + done(); + }); + }); + + it("fetches a new token if no cached token is available", (done) => { + service.getTokenCache().removeToken(FakeTenants.One, resource1); + + service.accessTokenData(FakeTenants.One, resource1).subscribe((token) => { + expect(remoteSpy.send).toHaveBeenCalledOnce(); + expect(token).toEqual(token1); + done(); + }); + }); + + it("fetches a new token if cached token is expired", (done) => { + const expiredToken = new AccessToken({ + accessToken: "expiredToken", + expiresOn: DateTime.local().minus({ hours: 1 }).toJSDate(), + tokenType: "Bearer" + }); + service.getTokenCache().storeToken(FakeTenants.One, resource1, expiredToken); + + service.accessTokenData(FakeTenants.One, resource1).subscribe((token) => { + expect(remoteSpy.send).toHaveBeenCalledOnce(); + expect(token).toEqual(token1); + done(); + }); + }); + + it("handles errors correctly", (done) => { + remoteSpy.send.and.returnValue(Promise.reject("some-error")); + + service.accessTokenData(FakeTenants.One, resource1).subscribe({ + next: () => fail("Should not have a next() call"), + error: (error) => { + expect(error).toEqual("some-error"); + done(); + } }); + }); }); it("updates the tenants when updated by the auth service", () => { @@ -338,5 +395,137 @@ describe("AuthService spec", () => { forceRefresh: true }); }); + + it("doesn't notify on error if notifyOnError is false", async () => { + remoteSpy.send.and.callFake(async (_, { tenantId }) => { + if (tenantId === FakeTenants.One) { + throw new Error("Fake error for tenant-1"); + } else { + return token2; + } + }); + tenantSettingsServiceSpy.current.next({ + [FakeTenants.One]: "active" + }); + const authorizations = await auth({ notifyOnError: false }); + expect(tenantErrorServiceSpy.showError).not.toHaveBeenCalled(); + }); + + it("caches authorization state for failed tenants", async () => { + remoteSpy.send.and.callFake(async (_, { tenantId }) => { + if (tenantId === FakeTenants.One) { + throw new Error("Fake error for tenant-1"); + } else { + return token2; + } + }); + tenantSettingsServiceSpy.current.next({ + [FakeTenants.One]: "active", + [FakeTenants.Two]: "active" + }); + await auth(); + remoteSpy.send.calls.reset(); + const authorizations = await auth(); + expect(remoteSpy.send).not.toHaveBeenCalledWith( + IpcEvent.AAD.accessTokenData, { + tenantId: FakeTenants.One, + resource: null, + forceRefresh: false + }); + expect(authorizations[0].status).toEqual("failed"); + }); + + it("refreshes token if forceRefresh is true", async () => { + tenantSettingsServiceSpy.current.next({ + [FakeTenants.One]: "active" + }); + await auth({ reauthenticate: FakeTenants.One }); + expect(remoteSpy.send).toHaveBeenCalledWith( + IpcEvent.AAD.accessTokenData, { + tenantId: FakeTenants.One, + resource: null, + forceRefresh: true + }); + }); + + it("does not refresh token if forceRefresh is false", async () => { + tenantSettingsServiceSpy.current.next({ + [FakeTenants.One]: "active" + }); + await auth(); + expect(remoteSpy.send).toHaveBeenCalledWith( + IpcEvent.AAD.accessTokenData, { + tenantId: FakeTenants.One, + resource: null, + forceRefresh: false + }); + }); + + it("emits AuthComplete event after fetching token", async () => { + tenantSettingsServiceSpy.current.next({ + [FakeTenants.One]: "active" + }); + const authCompleteSpy = jasmine.createSpy("authComplete"); + service.on("AuthComplete", authCompleteSpy); + await auth(); + expect(authCompleteSpy).toHaveBeenCalled(); + }); + + it("does not emit AuthComplete event if fetching token fails", async () => { + tenantSettingsServiceSpy.current.next({ + [FakeTenants.One]: "active" + }); + const authCompleteSpy = jasmine.createSpy("authComplete"); + service.on("AuthComplete", authCompleteSpy); + remoteSpy.send.and.callFake(async (_, { tenantId }) => { + if (tenantId === FakeTenants.One) { + throw new Error("Fake error for tenant-1"); + } else { + return token2; + } + }); + await auth(); + expect(authCompleteSpy).not.toHaveBeenCalled(); + }); + }); + + describe("#logout", () => { + it("clears the token cache and emits Logout event", async () => { + const logoutSpy = jasmine.createSpy("logout"); + service.on("Logout", logoutSpy); + + await service.logout(); + + expect(remoteSpy.send).toHaveBeenCalledWith(IpcEvent.logout); + expect(service.getTokenCache().hasToken(FakeTenants.One, resource1)).toBeFalse(); + expect(logoutSpy).toHaveBeenCalledOnce(); + }); + }); + + describe("#login", () => { + it("sends the login IPC event", async () => { + await service.login(); + expect(remoteSpy.send).toHaveBeenCalledWith(IpcEvent.login); + }); + }); + + describe("#isLoggedIn", () => { + it("returns true when user is logged in", (done) => { + aadServiceSpy.currentUser.next({ name: "test-user" }); + + service.isLoggedIn().subscribe((isLoggedIn) => { + expect(isLoggedIn).toBeTrue(); + done(); + }); + }); + + it("returns false when user is not logged in", (done) => { + aadServiceSpy.currentUser.next(null); + + service.isLoggedIn().subscribe((isLoggedIn) => { + expect(isLoggedIn).toBeFalse(); + done(); + }); + }); }); }); diff --git a/desktop/src/app/services/navigator.service.spec.ts b/desktop/src/app/services/navigator.service.spec.ts new file mode 100644 index 000000000..91cb59222 --- /dev/null +++ b/desktop/src/app/services/navigator.service.spec.ts @@ -0,0 +1,97 @@ +import { ElectronTestingModule } from '@batch-flask/electron/testing'; +import { TestBed } from "@angular/core/testing"; +import { Router } from "@angular/router"; +import { IpcService } from "@batch-flask/electron"; +import { BatchAccountService } from "./batch-account"; +import { AuthService } from "app/services"; +import { NavigatorService } from "./navigator.service"; +import { Constants, BatchExplorerLink, BatchExplorerLinkAction } from "common"; +import { IpcEvent } from "common/constants"; +import { RouterTestingModule } from "@angular/router/testing"; +import { of } from 'rxjs'; + +describe("NavigatorService", () => { + let service: NavigatorService; + let accountService: jasmine.SpyObj; + let router: jasmine.SpyObj; + let ipc: jasmine.SpyObj; + let authService: jasmine.SpyObj; + + beforeEach(() => { + const accountServiceSpy = jasmine.createSpyObj("BatchAccountService", ["selectAccount"]); + const authServiceSpy = jasmine.createSpyObj("AuthService", ["showAuthSelect"]); + const ipcSpy = jasmine.createSpyObj("IpcService", ["on"]); + const routerSpy = jasmine.createSpyObj("Router", ["navigateByUrl"]); + ipcSpy.on.and.returnValue(of([null, null])); + + TestBed.configureTestingModule({ + imports: [ElectronTestingModule, RouterTestingModule], + providers: [ + { provide: BatchAccountService, useValue: accountServiceSpy }, + { provide: AuthService, useValue: authServiceSpy }, + { provide: IpcService, useValue: ipcSpy }, + { provide: Router, useValue: routerSpy }, + ] + }); + + accountService = TestBed.inject(BatchAccountService) as jasmine.SpyObj; + router = TestBed.inject(Router) as jasmine.SpyObj; + ipc = TestBed.inject(IpcService) as jasmine.SpyObj; + authService = TestBed.inject(AuthService) as jasmine.SpyObj; + + service = new NavigatorService(accountService, router, ipc, authService); + }); + + it("should be created", () => { + expect(service).toBeTruthy(); + }); + + it("should unsubscribe from _destroy on ngOnDestroy", () => { + const destroySpy = spyOn(service["_destroy"], "next"); + const unsubscribeSpy = spyOn(service["_destroy"], "unsubscribe"); + + service.ngOnDestroy(); + + expect(destroySpy).toHaveBeenCalled(); + expect(unsubscribeSpy).toHaveBeenCalled(); + }); + + it("should initialize and subscribe to IPC events", () => { + service.init(); + + expect(ipc.on).toHaveBeenCalledWith(Constants.rendererEvents.batchExplorerLink); + expect(ipc.on).toHaveBeenCalledWith(Constants.rendererEvents.navigateTo); + expect(ipc.on).toHaveBeenCalledWith(IpcEvent.userAuthSelectRequest); + }); + + it("should handle openBatchExplorerLink with route action", () => { + const params = new URLSearchParams("param1=value1¶m2=value2"); + const link = new BatchExplorerLink({ + action: BatchExplorerLinkAction.route, + path: "/some/path", + queryParams: params, + session: null, + accountId: "account-id" + }); + + spyOn(service, "goto"); + + service.openBatchExplorerLink(link); + + expect(service.goto).toHaveBeenCalledWith("/some/path?param1=value1¶m2=value2", { accountId: "account-id" }); + }); + + it("should navigate to a route with goto method", async () => { + const route = "/some/path"; + const options = { accountId: "account-id" }; + + accountService.selectAccount.and.returnValue(undefined); + router.navigateByUrl.and.returnValue(Promise.resolve(true)); + + const result = await service.goto(route, options); + + expect(accountService.selectAccount).toHaveBeenCalledWith("account-id"); + expect(router.navigateByUrl).toHaveBeenCalledWith(route); + expect(result).toBe(true); + }); +}); diff --git a/desktop/src/client/core/aad/auth-loopback-client.spec.ts b/desktop/src/client/core/aad/auth-loopback-client.spec.ts new file mode 100644 index 000000000..1567b33ff --- /dev/null +++ b/desktop/src/client/core/aad/auth-loopback-client.spec.ts @@ -0,0 +1,166 @@ +import * as http from "http"; +import { AuthLoopbackClient } from "./auth-loopback-client"; +import { ServerAuthorizationCodeResponse } from "@azure/msal-node"; +import { IncomingMessage, ServerResponse } from "http"; + +describe("AuthLoopbackClient", () => { + let authLoopbackClient: AuthLoopbackClient; + let serverSpy; + + beforeEach(async () => { + authLoopbackClient = await AuthLoopbackClient.initialize(0); + }); + + afterEach(() => { + authLoopbackClient.closeServer(); + if (serverSpy) { + serverSpy.close(); + } + }); + + function createServerSpy(opts?: { listening?: boolean }) { + opts = opts || {}; + if (opts.listening === undefined) { + opts.listening = true; + } + serverSpy = jasmine.createSpyObj("server", + ["listen", "close", "emit", "address"]); + serverSpy.listen.and.returnValue({ on: () => jasmine.createSpy() }); + spyOn(http, "createServer").and.callFake((callback) => { + serverSpy.serverCallback = callback; + return serverSpy; + }); + serverSpy.listening = opts.listening; + } + + it("should initialize with preferredPort as undefined", async () => { + const client = await AuthLoopbackClient.initialize(undefined); + expect(client.port).toBe(0); + }); + + it("should initialize with a valid preferredPort", async () => { + spyOn(authLoopbackClient, "isPortAvailable").and.returnValue(Promise.resolve(true)); + const client = await AuthLoopbackClient.initialize(3000); + expect(client.port).toBe(3000); + }); + + it("should throw error if server is already initialized", () => { + createServerSpy(); + authLoopbackClient.listenForAuthCode(); + expectAsync(authLoopbackClient.listenForAuthCode()) + .toBeRejectedWithError("Auth code listener already exists. Cannot create another."); + }); + + it("should initialize and listen for auth code", () => { + createServerSpy(); + authLoopbackClient.listenForAuthCode(); + expect(serverSpy.listen).toHaveBeenCalled(); + }); + + it("should timeout if server does not start listening", () => { + createServerSpy({ listening: false }); + expectAsync(authLoopbackClient.listenForAuthCode()) + .toBeRejectedWithError("Timed out waiting for auth code listener to be registered."); + }); + + it("should throw error if server is not initialized in getRedirectUri", () => { + authLoopbackClient.closeServer(); + expect(() => authLoopbackClient.getRedirectUri()).toThrowError("No auth code listener exists yet."); + }); + + it("should throw error if server address is invalid in getRedirectUri", () => { + const serverSpy = jasmine.createSpyObj("server", ["address", "close"]); + serverSpy.address.and.returnValue(null); + (authLoopbackClient as any).server = serverSpy; + expect(() => authLoopbackClient.getRedirectUri()).toThrowError("Failed to read auth code listener port"); + }); + + it("should close the server", () => { + const serverSpy = jasmine.createSpyObj("server", ["close"]); + (authLoopbackClient as any).server = serverSpy; + authLoopbackClient.closeServer(); + expect(serverSpy.close).toHaveBeenCalled(); + }); + + it("should return true if port is available", async () => { + const result = await authLoopbackClient.isPortAvailable(3000); + expect(result).toBe(true); + }); + + it("should return false if port is unavailable", async () => { + createServerSpy(); + serverSpy.listen.and.callFake(() => ({ + on: (_, callback) => callback("Uhoh") + })); + const result = await authLoopbackClient.isPortAvailable(3000); + expect(result).toBe(false); + }); + + it("should return empty object for empty query in getDeserializedQueryString", () => { + const result = AuthLoopbackClient.getDeserializedQueryString(""); + expect(result).toEqual({}); + }); + + it("should return a valid redirect URI", () => { + createServerSpy(); + serverSpy.address.and.returnValue({ port: 3000 }); + authLoopbackClient.listenForAuthCode(); + const redirectUri = authLoopbackClient.getRedirectUri(); + expect(redirectUri).toMatch(/http:\/\/localhost:\d+/); + }); + + it("should parse query string correctly", () => { + const queryString = "code=authcode&state=state"; + const parsedObject = AuthLoopbackClient.queryStringToObject(queryString); + expect(parsedObject).toEqual({ + code: "authcode", + state: "state" + }); + }); + + it("should deserialize query string correctly", () => { + const queryString = "code=authcode&state=state"; + const deserializedObject = AuthLoopbackClient.getDeserializedQueryString(queryString); + expect(deserializedObject).toEqual({ + code: "authcode", + state: "state" + }); + }); + + it("should check if port is available", async () => { + const isAvailable = await authLoopbackClient.isPortAvailable(0); + expect(isAvailable).toBe(true); + }); + + it("should listen for auth code and return the response", async () => { + const successTemplate = "Success"; + const errorTemplate = "Error"; + + createServerSpy(); + spyOn(authLoopbackClient, "getRedirectUri").and.returnValue("http://localhost:3000"); + + const authCodeResponse: ServerAuthorizationCodeResponse = { + code: "authcode", + state: "state" + }; + + spyOn(AuthLoopbackClient, "getDeserializedQueryString").and.returnValue(authCodeResponse); + + const listenPromise = authLoopbackClient.listenForAuthCode(successTemplate, errorTemplate); + + // Simulate server behavior + const req = { url: "/?code=authcode&state=state" } as IncomingMessage; + const res = { + end: jasmine.createSpy("end"), + writeHead: jasmine.createSpy("writeHead") + } as unknown as ServerResponse; + + // Invoke the captured callback with the mock request and response + serverSpy.serverCallback(req, res); + + const result = await listenPromise; + + expect(result).toEqual(authCodeResponse); + expect(res.writeHead).toHaveBeenCalledWith(302, { location: "http://localhost:3000" }); + }); +}); diff --git a/desktop/src/client/core/aad/auth-loopback-client.ts b/desktop/src/client/core/aad/auth-loopback-client.ts index 6cd0f29ec..9a6800134 100644 --- a/desktop/src/client/core/aad/auth-loopback-client.ts +++ b/desktop/src/client/core/aad/auth-loopback-client.ts @@ -1,7 +1,6 @@ import { log } from "@batch-flask/utils"; import { IncomingMessage, Server, ServerResponse, createServer } from "http"; import { ILoopbackClient, ServerAuthorizationCodeResponse } from "@azure/msal-node"; -import type { AddressInfo } from "net"; /** * Listen for an auth code response on the loopback address. Will use a preferred @@ -44,7 +43,7 @@ export class AuthLoopbackClient implements ILoopbackClient { */ async listenForAuthCode(successTemplate?: string, errorTemplate?: string): Promise { if (!!this.server) { - throw new Error('Auth code listener already exists. Cannot create another.'); + throw new Error("Auth code listener already exists. Cannot create another."); } const authCodeListener = new Promise((resolve, reject) => { @@ -52,7 +51,7 @@ export class AuthLoopbackClient implements ILoopbackClient { const url = req.url; if (!url) { res.end(errorTemplate || "Login failed: Error occurred loading redirectUrl"); - reject(new Error('Auth code listener callback was invoked without a url.')); + reject(new Error("Auth code listener callback was invoked without a url.")); return; } else if (url === "/") { res.end(successTemplate || "Successfully logged in to Batch Explorer. You may close this window."); @@ -61,7 +60,7 @@ export class AuthLoopbackClient implements ILoopbackClient { const authCodeResponse = AuthLoopbackClient.getDeserializedQueryString(url); if (authCodeResponse.code) { - const redirectUri = await this.getRedirectUri(); + const redirectUri = this.getRedirectUri(); res.writeHead(302, { location: redirectUri }); // Prevent auth code from being saved in the browser history res.end(); } @@ -76,7 +75,7 @@ export class AuthLoopbackClient implements ILoopbackClient { let ticks = 0; const id = setInterval(() => { if ((5000 / 100) < ticks) { - throw new Error('Timed out waiting for auth code listener to be registered.'); + throw new Error("Timed out waiting for auth code listener to be registered."); } if (this.server.listening) { @@ -96,7 +95,7 @@ export class AuthLoopbackClient implements ILoopbackClient { */ getRedirectUri(): string { if (!this.server) { - throw new Error('No auth code listener exists yet.'); + throw new Error("No auth code listener exists yet."); } const addressInfo = this.server.address(); @@ -185,7 +184,7 @@ export class AuthLoopbackClient implements ILoopbackClient { const decode = (s: string) => decodeURIComponent(s.replace(/\+/g, " ")); params.forEach((pair) => { if (pair.trim()) { - const [key, value] = pair.split(/=(.+)/g, 2); // Split on the first occurence of the '=' character + const [key, value] = pair.split(/=(.+)/g, 2); // Split on the first occurence of the "=" character if (key && value) { obj[decode(key)] = decode(value); } From a290a3b6612e3af32b5c47bb1674d43492f81810 Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Fri, 16 Aug 2024 12:13:15 -0400 Subject: [PATCH 40/57] Disables end-to-end tests in CI pipeline --- .vsts/win/ci.yml | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/.vsts/win/ci.yml b/.vsts/win/ci.yml index 6c4be757c..fb6e40f97 100644 --- a/.vsts/win/ci.yml +++ b/.vsts/win/ci.yml @@ -7,14 +7,15 @@ steps: npm run build:package displayName: Build and package - - pwsh: | - . ../.vsts/win/exec.ps1 - $ErrorActionPreference = "Stop" - $env:BE_TEST_AAD_USER_EMAIL = "$(uiTestingAccountEmail)" - $env:BE_TEST_AAD_USER_PASSWORD = "$(uiTestingAccountPassword)" - npm run test-e2e - workingDirectory: desktop - displayName: End to end tests + # Disabling end-to-end tests in CI pipeline + # - pwsh: | + # . ../.vsts/win/exec.ps1 + # $ErrorActionPreference = "Stop" + # $env:BE_TEST_AAD_USER_EMAIL = "$(uiTestingAccountEmail)" + # $env:BE_TEST_AAD_USER_PASSWORD = "$(uiTestingAccountPassword)" + # npm run test-e2e + # workingDirectory: desktop + # displayName: End to end tests - template: ./security-analysis.yml From 13cddff1336083aeb95426de9bb57eb915d5639e Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Wed, 28 Aug 2024 16:45:44 -0400 Subject: [PATCH 41/57] Creates IPC listeners in app start() Moved out of the constructor in the case when the windows are reloaded. Fixes an issue where a system error causes IPC messages to be ignored because they are not recreated. --- desktop/src/client/core/batch-explorer-application.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/desktop/src/client/core/batch-explorer-application.ts b/desktop/src/client/core/batch-explorer-application.ts index 607a7cd91..1b4ee4447 100644 --- a/desktop/src/client/core/batch-explorer-application.ts +++ b/desktop/src/client/core/batch-explorer-application.ts @@ -70,9 +70,6 @@ export class BatchExplorerApplication { this.appReady = new Deferred(); this.userSettings = configurationStore.config; - - ipcMain.on(IpcEvent.login, () => this.login()); - ipcMain.on(IpcEvent.logout, () => this.logout()); } public async init() { @@ -127,6 +124,9 @@ export class BatchExplorerApplication { }); await this.appReady.promise; + this.ipcMain.on(IpcEvent.login, () => this.login()); + this.ipcMain.on(IpcEvent.logout, () => this.logout()); + windowSub.unsubscribe(); window.show(); @@ -300,7 +300,7 @@ export class BatchExplorerApplication { // eslint-disable-next-line @typescript-eslint/ban-types process.on("uncaughtException" as any, (error: Error) => { - log.error("There was a uncaught exception", error); + log.error("There was an uncaught exception", error); this.recoverWindow.createWithError(error.message); this.telemetryService.trackError(error); this.telemetryService.flush(true); From 4c4639de46dddb41bf2d676ce9b2eac80deb3806 Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Fri, 30 Aug 2024 15:37:45 -0400 Subject: [PATCH 42/57] External browser auth prompts for account selection --- .../src/client/core/aad/auth-provider.spec.ts | 66 +++++++++++-------- desktop/src/client/core/aad/auth-provider.ts | 4 +- 2 files changed, 42 insertions(+), 28 deletions(-) diff --git a/desktop/src/client/core/aad/auth-provider.spec.ts b/desktop/src/client/core/aad/auth-provider.spec.ts index 0b2ae056f..e33feb42b 100644 --- a/desktop/src/client/core/aad/auth-provider.spec.ts +++ b/desktop/src/client/core/aad/auth-provider.spec.ts @@ -1,6 +1,7 @@ import { instrumentAuthProvider, instrumentForAuth } from "test/utils/mocks/auth"; import AuthProvider from "./auth-provider"; import { AuthObserver } from "./auth-observer"; +import { PublicClientApplication } from "@azure/msal-node"; const FAKE_GET_TOKEN_ARGS = { resourceURI: "resourceURI1", @@ -20,6 +21,7 @@ describe("AuthProvider", () => { }; let mockAuthCode; let authObserver: jasmine.SpyObj; + let clientSpy: jasmine.SpyObj; instrumentForAuth(appSpy); const config: any = { @@ -44,7 +46,7 @@ describe("AuthProvider", () => { authObserver.fetchAuthCode.and.returnValue(Promise.resolve(mockAuthCode)); const call = async () => await authProvider.getToken(FAKE_GET_TOKEN_ARGS); - const clientSpy = createClientSpy(); + clientSpy = createClientSpy(); instrumentAuthProvider(authProvider); returnToken(clientSpy.acquireTokenSilent, "silent-token-1"); @@ -79,39 +81,48 @@ describe("AuthProvider", () => { expect(result2.accessToken).toEqual("tenant2-token"); }); - it("should use external browser when externalBrowserAuth is true", async () => { - createClientSpy(); - authObserver.selectUserAuthMethod.and.returnValue( - Promise.resolve({ externalBrowserAuth: true }) - ); - - const browserSpy = - spyOn(authProvider, "_createExternalBrowserRequest"); - await authProvider.getToken(FAKE_GET_TOKEN_ARGS); - expect(browserSpy).toHaveBeenCalled(); - }); - - it("should use built-in window when externalBrowserAuth is false", async () => { - const clientSpy = createClientSpy(); - authObserver.selectUserAuthMethod.and.returnValue( - Promise.resolve({ externalBrowserAuth: false }) - ); - - await authProvider.getToken(FAKE_GET_TOKEN_ARGS); - expect(clientSpy.getAuthCodeUrl).toHaveBeenCalled(); - expect(authObserver.fetchAuthCode).toHaveBeenCalled(); - expect(clientSpy.acquireTokenByCode).toHaveBeenCalled(); + describe("#_externalBrowserAuth", () => { + beforeEach(() => { + clientSpy = createClientSpy(); + authObserver.selectUserAuthMethod.and.returnValue( + Promise.resolve({ externalBrowserAuth: true }) + ); + }); + it("is called when externalBrowserAuth is true", async () => { + const browserSpy = + spyOn(authProvider, "_createExternalBrowserRequest"); + await authProvider.getToken(FAKE_GET_TOKEN_ARGS); + expect(browserSpy).toHaveBeenCalled(); + }); + it("handles error thrown by _createExternalBrowserRequest()", async () => { + const err = "fake external browser error"; + spyOn(authProvider, "_createExternalBrowserRequest") + .and.returnValue(Promise.reject(err)); + await expectAsync(authProvider.getToken(FAKE_GET_TOKEN_ARGS)) + .toBeRejectedWith(err); + expect(authObserver.onAuthFailure).toHaveBeenCalledWith(err); + }); + it("calls acquireTokenInteractive() with select_account prompt", async () => { + await authProvider.getToken(FAKE_GET_TOKEN_ARGS); + expect(clientSpy.acquireTokenInteractive).toHaveBeenCalledWith( + jasmine.objectContaining({ prompt: "select_account" })); + }); }); describe("#_builtInWindowAuth", () => { - let clientSpy; beforeEach(() => { clientSpy = createClientSpy(); authObserver.selectUserAuthMethod.and.returnValue( Promise.resolve({ externalBrowserAuth: false }) ); }); - it("should handle error thrown by client.getAuthCodeUrl()", async () => { + it("is called when externalBrowserAuth is false", async () => { + await authProvider.getToken(FAKE_GET_TOKEN_ARGS); + expect(clientSpy.getAuthCodeUrl).toHaveBeenCalled(); + expect(authObserver.fetchAuthCode).toHaveBeenCalled(); + expect(clientSpy.acquireTokenByCode).toHaveBeenCalled(); + }); + it("handles error thrown by client.getAuthCodeUrl()", async () => { const err = "fake getAuthCodeUrl error"; clientSpy.getAuthCodeUrl.and.returnValue(Promise.reject(err)); await expectAsync(authProvider.getToken(FAKE_GET_TOKEN_ARGS)) @@ -120,7 +131,7 @@ describe("AuthProvider", () => { expect(clientSpy.acquireTokenByCode).not.toHaveBeenCalled(); expect(authObserver.fetchAuthCode).not.toHaveBeenCalled(); }); - it("should handle error thrown by fetchAuthCode()", async () => { + it("handles error thrown by fetchAuthCode()", async () => { const err = "fake fetchAuthCode error"; authObserver.fetchAuthCode.and.returnValue(Promise.reject(err)); await expectAsync(authProvider.getToken(FAKE_GET_TOKEN_ARGS)) @@ -153,7 +164,8 @@ const makeClientApplicationSpy = () => jasmine.createSpyObj( acquireTokenSilent: jasmine.anything, getAuthCodeUrl: jasmine.anything, acquireTokenByCode: jasmine.anything, - getTokenCache: makeTokenCacheSpy() + getTokenCache: makeTokenCacheSpy(), + acquireTokenInteractive: jasmine.anything } ); diff --git a/desktop/src/client/core/aad/auth-provider.ts b/desktop/src/client/core/aad/auth-provider.ts index f8ba61477..979e32178 100644 --- a/desktop/src/client/core/aad/auth-provider.ts +++ b/desktop/src/client/core/aad/auth-provider.ts @@ -147,6 +147,7 @@ export default class AuthProvider { } catch (error) { log.warn(`[${tenantId}] Failed to authenticate with browser: ${error}`); this.authObserver.onAuthFailure(error); + throw error; } } @@ -192,7 +193,8 @@ export default class AuthProvider { const interactiveRequest: InteractiveRequest = { ...authRequest, openBrowser, - loopbackClient + loopbackClient, + prompt: "select_account" }; return interactiveRequest; } From 86687cfb4fe421a2fbb227744a35309175b3f86b Mon Sep 17 00:00:00 2001 From: CSIGS-ExpiresOn-10-23-2024 Date: Sun, 1 Sep 2024 00:08:36 +0000 Subject: [PATCH 43/57] Juno: check in to users/loc/juno/hb_b5190a78-9093-45f2-826d-2cc1e04cb56a_20240901000833979. --- .../loc/cs/desktop/i18n/resources.resjson.lcl | 99 +++++++++++++-- .../loc/de/desktop/i18n/resources.resjson.lcl | 99 +++++++++++++-- .../loc/es/desktop/i18n/resources.resjson.lcl | 99 +++++++++++++-- .../loc/fr/desktop/i18n/resources.resjson.lcl | 99 +++++++++++++-- .../loc/hu/desktop/i18n/resources.resjson.lcl | 99 +++++++++++++-- .../loc/id/desktop/i18n/resources.resjson.lcl | 99 +++++++++++++-- .../loc/it/desktop/i18n/resources.resjson.lcl | 99 +++++++++++++-- .../loc/ja/desktop/i18n/resources.resjson.lcl | 99 +++++++++++++-- .../loc/ko/desktop/i18n/resources.resjson.lcl | 99 +++++++++++++-- .../loc/nl/desktop/i18n/resources.resjson.lcl | 99 +++++++++++++-- .../loc/pl/desktop/i18n/resources.resjson.lcl | 117 ++++++++++++++++-- .../pt-BR/desktop/i18n/resources.resjson.lcl | 117 ++++++++++++++++-- .../pt-PT/desktop/i18n/resources.resjson.lcl | 99 +++++++++++++-- .../loc/ru/desktop/i18n/resources.resjson.lcl | 99 +++++++++++++-- .../loc/sv/desktop/i18n/resources.resjson.lcl | 99 +++++++++++++-- .../loc/tr/desktop/i18n/resources.resjson.lcl | 99 +++++++++++++-- .../desktop/i18n/resources.resjson.lcl | 99 +++++++++++++-- .../desktop/i18n/resources.resjson.lcl | 99 +++++++++++++-- 18 files changed, 1656 insertions(+), 162 deletions(-) diff --git a/Localize/loc/cs/desktop/i18n/resources.resjson.lcl b/Localize/loc/cs/desktop/i18n/resources.resjson.lcl index f10e985d8..7ad79eede 100644 --- a/Localize/loc/cs/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/cs/desktop/i18n/resources.resjson.lcl @@ -472,6 +472,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -760,6 +796,15 @@ + + + + + + + + + @@ -1003,6 +1048,12 @@ + + + + + + @@ -2317,6 +2368,15 @@ + + + + + + + + + @@ -3235,15 +3295,6 @@ - - - - - - - - - @@ -3280,6 +3331,24 @@ + + + + + + + + + + + + + + + + + + @@ -3595,6 +3664,18 @@ + + + + + + + + + + + + diff --git a/Localize/loc/de/desktop/i18n/resources.resjson.lcl b/Localize/loc/de/desktop/i18n/resources.resjson.lcl index 4384001db..718cfc5f1 100644 --- a/Localize/loc/de/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/de/desktop/i18n/resources.resjson.lcl @@ -472,6 +472,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -760,6 +796,15 @@ + + + + + + + + + @@ -1003,6 +1048,12 @@ + + + + + + @@ -2317,6 +2368,15 @@ + + + + + + + + + @@ -3235,15 +3295,6 @@ - - - - - - - - - @@ -3280,6 +3331,24 @@ + + + + + + + + + + + + + + + + + + @@ -3595,6 +3664,18 @@ + + + + + + + + + + + + diff --git a/Localize/loc/es/desktop/i18n/resources.resjson.lcl b/Localize/loc/es/desktop/i18n/resources.resjson.lcl index b49778ba5..a4e2a33f6 100644 --- a/Localize/loc/es/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/es/desktop/i18n/resources.resjson.lcl @@ -472,6 +472,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -760,6 +796,15 @@ + + + + + + + + + @@ -1003,6 +1048,12 @@ + + + + + + @@ -2317,6 +2368,15 @@ + + + + + + + + + @@ -3235,15 +3295,6 @@ - - - - - - - - - @@ -3280,6 +3331,24 @@ + + + + + + + + + + + + + + + + + + @@ -3595,6 +3664,18 @@ + + + + + + + + + + + + diff --git a/Localize/loc/fr/desktop/i18n/resources.resjson.lcl b/Localize/loc/fr/desktop/i18n/resources.resjson.lcl index 625613355..d7a3e4e23 100644 --- a/Localize/loc/fr/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/fr/desktop/i18n/resources.resjson.lcl @@ -472,6 +472,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -760,6 +796,15 @@ + + + + + + + + + @@ -1003,6 +1048,12 @@ + + + + + + @@ -2317,6 +2368,15 @@ + + + + + + + + + @@ -3235,15 +3295,6 @@ - - - - - - - - - @@ -3280,6 +3331,24 @@ + + + + + + + + + + + + + + + + + + @@ -3595,6 +3664,18 @@ + + + + + + + + + + + + diff --git a/Localize/loc/hu/desktop/i18n/resources.resjson.lcl b/Localize/loc/hu/desktop/i18n/resources.resjson.lcl index de4d25992..69e45baee 100644 --- a/Localize/loc/hu/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/hu/desktop/i18n/resources.resjson.lcl @@ -472,6 +472,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -760,6 +796,15 @@ + + + + + + + + + @@ -1003,6 +1048,12 @@ + + + + + + @@ -2317,6 +2368,15 @@ + + + + + + + + + @@ -3235,15 +3295,6 @@ - - - - - - - - - @@ -3280,6 +3331,24 @@ + + + + + + + + + + + + + + + + + + @@ -3595,6 +3664,18 @@ + + + + + + + + + + + + diff --git a/Localize/loc/id/desktop/i18n/resources.resjson.lcl b/Localize/loc/id/desktop/i18n/resources.resjson.lcl index 4f756dac3..d7417ae55 100644 --- a/Localize/loc/id/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/id/desktop/i18n/resources.resjson.lcl @@ -471,6 +471,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -759,6 +795,15 @@ + + + + + + + + + @@ -1002,6 +1047,12 @@ + + + + + + @@ -2316,6 +2367,15 @@ + + + + + + + + + @@ -3234,15 +3294,6 @@ - - - - - - - - - @@ -3279,6 +3330,24 @@ + + + + + + + + + + + + + + + + + + @@ -3594,6 +3663,18 @@ + + + + + + + + + + + + diff --git a/Localize/loc/it/desktop/i18n/resources.resjson.lcl b/Localize/loc/it/desktop/i18n/resources.resjson.lcl index aaf7ee24f..62064b2fe 100644 --- a/Localize/loc/it/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/it/desktop/i18n/resources.resjson.lcl @@ -472,6 +472,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -760,6 +796,15 @@ + + + + + + + + + @@ -1003,6 +1048,12 @@ + + + + + + @@ -2317,6 +2368,15 @@ + + + + + + + + + @@ -3235,15 +3295,6 @@ - - - - - - - - - @@ -3280,6 +3331,24 @@ + + + + + + + + + + + + + + + + + + @@ -3595,6 +3664,18 @@ + + + + + + + + + + + + diff --git a/Localize/loc/ja/desktop/i18n/resources.resjson.lcl b/Localize/loc/ja/desktop/i18n/resources.resjson.lcl index 454583245..bfe9ab766 100644 --- a/Localize/loc/ja/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/ja/desktop/i18n/resources.resjson.lcl @@ -472,6 +472,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -760,6 +796,15 @@ + + + + + + + + + @@ -1003,6 +1048,12 @@ + + + + + + @@ -2317,6 +2368,15 @@ + + + + + + + + + @@ -3235,15 +3295,6 @@ - - - - - - - - - @@ -3280,6 +3331,24 @@ + + + + + + + + + + + + + + + + + + @@ -3595,6 +3664,18 @@ + + + + + + + + + + + + diff --git a/Localize/loc/ko/desktop/i18n/resources.resjson.lcl b/Localize/loc/ko/desktop/i18n/resources.resjson.lcl index 412943fc0..389b24718 100644 --- a/Localize/loc/ko/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/ko/desktop/i18n/resources.resjson.lcl @@ -472,6 +472,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -760,6 +796,15 @@ + + + + + + + + + @@ -1003,6 +1048,12 @@ + + + + + + @@ -2317,6 +2368,15 @@ + + + + + + + + + @@ -3235,15 +3295,6 @@ - - - - - - - - - @@ -3280,6 +3331,24 @@ + + + + + + + + + + + + + + + + + + @@ -3595,6 +3664,18 @@ + + + + + + + + + + + + diff --git a/Localize/loc/nl/desktop/i18n/resources.resjson.lcl b/Localize/loc/nl/desktop/i18n/resources.resjson.lcl index d57acd13b..2c99a7f83 100644 --- a/Localize/loc/nl/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/nl/desktop/i18n/resources.resjson.lcl @@ -472,6 +472,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -760,6 +796,15 @@ + + + + + + + + + @@ -1003,6 +1048,12 @@ + + + + + + @@ -2317,6 +2368,15 @@ + + + + + + + + + @@ -3235,15 +3295,6 @@ - - - - - - - - - @@ -3280,6 +3331,24 @@ + + + + + + + + + + + + + + + + + + @@ -3595,6 +3664,18 @@ + + + + + + + + + + + + diff --git a/Localize/loc/pl/desktop/i18n/resources.resjson.lcl b/Localize/loc/pl/desktop/i18n/resources.resjson.lcl index 956db0d5f..77b40acab 100644 --- a/Localize/loc/pl/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/pl/desktop/i18n/resources.resjson.lcl @@ -472,6 +472,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -760,6 +805,15 @@ + + + + + + + + + @@ -1003,6 +1057,15 @@ + + + + + + + + + @@ -2317,6 +2380,15 @@ + + + + + + + + + @@ -3235,15 +3307,6 @@ - - - - - - - - - @@ -3280,6 +3343,24 @@ + + + + + + + + + + + + + + + + + + @@ -3595,6 +3676,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/Localize/loc/pt-BR/desktop/i18n/resources.resjson.lcl b/Localize/loc/pt-BR/desktop/i18n/resources.resjson.lcl index 8b3da84bc..c7e696ab2 100644 --- a/Localize/loc/pt-BR/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/pt-BR/desktop/i18n/resources.resjson.lcl @@ -472,6 +472,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -760,6 +805,15 @@ + + + + + + + + + @@ -1003,6 +1057,15 @@ + + + + + + + + + @@ -2317,6 +2380,15 @@ + + + + + + + + + @@ -3235,15 +3307,6 @@ - - - - - - - - - @@ -3280,6 +3343,24 @@ + + + + + + + + + + + + + + + + + + @@ -3595,6 +3676,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/Localize/loc/pt-PT/desktop/i18n/resources.resjson.lcl b/Localize/loc/pt-PT/desktop/i18n/resources.resjson.lcl index a2ce69f3f..619345aad 100644 --- a/Localize/loc/pt-PT/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/pt-PT/desktop/i18n/resources.resjson.lcl @@ -472,6 +472,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -760,6 +796,15 @@ + + + + + + + + + @@ -1003,6 +1048,12 @@ + + + + + + @@ -2317,6 +2368,15 @@ + + + + + + + + + @@ -3235,15 +3295,6 @@ - - - - - - - - - @@ -3280,6 +3331,24 @@ + + + + + + + + + + + + + + + + + + @@ -3595,6 +3664,18 @@ + + + + + + + + + + + + diff --git a/Localize/loc/ru/desktop/i18n/resources.resjson.lcl b/Localize/loc/ru/desktop/i18n/resources.resjson.lcl index 7c2ac6091..faa7def9d 100644 --- a/Localize/loc/ru/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/ru/desktop/i18n/resources.resjson.lcl @@ -472,6 +472,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -760,6 +796,15 @@ + + + + + + + + + @@ -1003,6 +1048,12 @@ + + + + + + @@ -2317,6 +2368,15 @@ + + + + + + + + + @@ -3235,15 +3295,6 @@ - - - - - - - - - @@ -3280,6 +3331,24 @@ + + + + + + + + + + + + + + + + + + @@ -3595,6 +3664,18 @@ + + + + + + + + + + + + diff --git a/Localize/loc/sv/desktop/i18n/resources.resjson.lcl b/Localize/loc/sv/desktop/i18n/resources.resjson.lcl index 6363eb16b..aa2706840 100644 --- a/Localize/loc/sv/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/sv/desktop/i18n/resources.resjson.lcl @@ -472,6 +472,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -760,6 +796,15 @@ + + + + + + + + + @@ -1003,6 +1048,12 @@ + + + + + + @@ -2317,6 +2368,15 @@ + + + + + + + + + @@ -3235,15 +3295,6 @@ - - - - - - - - - @@ -3280,6 +3331,24 @@ + + + + + + + + + + + + + + + + + + @@ -3595,6 +3664,18 @@ + + + + + + + + + + + + diff --git a/Localize/loc/tr/desktop/i18n/resources.resjson.lcl b/Localize/loc/tr/desktop/i18n/resources.resjson.lcl index 19a107bc9..a84ad62ef 100644 --- a/Localize/loc/tr/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/tr/desktop/i18n/resources.resjson.lcl @@ -472,6 +472,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -760,6 +796,15 @@ + + + + + + + + + @@ -1003,6 +1048,12 @@ + + + + + + @@ -2317,6 +2368,15 @@ + + + + + + + + + @@ -3235,15 +3295,6 @@ - - - - - - - - - @@ -3280,6 +3331,24 @@ + + + + + + + + + + + + + + + + + + @@ -3595,6 +3664,18 @@ + + + + + + + + + + + + diff --git a/Localize/loc/zh-Hans/desktop/i18n/resources.resjson.lcl b/Localize/loc/zh-Hans/desktop/i18n/resources.resjson.lcl index 4fa4c7c87..44b90a68d 100644 --- a/Localize/loc/zh-Hans/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/zh-Hans/desktop/i18n/resources.resjson.lcl @@ -472,6 +472,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -760,6 +796,15 @@ + + + + + + + + + @@ -1003,6 +1048,12 @@ + + + + + + @@ -2317,6 +2368,15 @@ + + + + + + + + + @@ -3235,15 +3295,6 @@ - - - - - - - - - @@ -3280,6 +3331,24 @@ + + + + + + + + + + + + + + + + + + @@ -3595,6 +3664,18 @@ + + + + + + + + + + + + diff --git a/Localize/loc/zh-Hant/desktop/i18n/resources.resjson.lcl b/Localize/loc/zh-Hant/desktop/i18n/resources.resjson.lcl index 07a76d282..c2f96a8dd 100644 --- a/Localize/loc/zh-Hant/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/zh-Hant/desktop/i18n/resources.resjson.lcl @@ -472,6 +472,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -760,6 +796,15 @@ + + + + + + + + + @@ -1003,6 +1048,12 @@ + + + + + + @@ -2317,6 +2368,15 @@ + + + + + + + + + @@ -3235,15 +3295,6 @@ - - - - - - - - - @@ -3280,6 +3331,24 @@ + + + + + + + + + + + + + + + + + + @@ -3595,6 +3664,18 @@ + + + + + + + + + + + + From b3270e6522c2fa4d6d7598cdc287caabc20c738e Mon Sep 17 00:00:00 2001 From: "CSIGS@microsoft.com" Date: Wed, 4 Sep 2024 16:02:34 -0700 Subject: [PATCH 44/57] Juno: check in to users/loc/juno/hb_b5190a78-9093-45f2-826d-2cc1e04cb56a_20240902000824948. (#2931) --- .../loc/cs/desktop/i18n/resources.resjson.lcl | 18 +++++++++++++++++ .../loc/fr/desktop/i18n/resources.resjson.lcl | 20 ++++++++++++++++++- .../loc/ko/desktop/i18n/resources.resjson.lcl | 20 ++++++++++++++++++- .../loc/sv/desktop/i18n/resources.resjson.lcl | 18 +++++++++++++++++ 4 files changed, 74 insertions(+), 2 deletions(-) diff --git a/Localize/loc/cs/desktop/i18n/resources.resjson.lcl b/Localize/loc/cs/desktop/i18n/resources.resjson.lcl index 7ad79eede..26ca65354 100644 --- a/Localize/loc/cs/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/cs/desktop/i18n/resources.resjson.lcl @@ -484,6 +484,9 @@ + + + @@ -499,12 +502,18 @@ + + + + + + @@ -1051,6 +1060,9 @@ + + + @@ -3667,12 +3679,18 @@ + + + + + + diff --git a/Localize/loc/fr/desktop/i18n/resources.resjson.lcl b/Localize/loc/fr/desktop/i18n/resources.resjson.lcl index d7a3e4e23..c70440387 100644 --- a/Localize/loc/fr/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/fr/desktop/i18n/resources.resjson.lcl @@ -484,6 +484,9 @@ + + + @@ -499,12 +502,18 @@ + + + + + + @@ -1051,6 +1060,9 @@ + + + @@ -2372,7 +2384,7 @@ - + @@ -3667,12 +3679,18 @@ + + + + + + diff --git a/Localize/loc/ko/desktop/i18n/resources.resjson.lcl b/Localize/loc/ko/desktop/i18n/resources.resjson.lcl index 389b24718..449547502 100644 --- a/Localize/loc/ko/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/ko/desktop/i18n/resources.resjson.lcl @@ -484,6 +484,9 @@ + + + @@ -499,12 +502,18 @@ + + + + + + @@ -1051,6 +1060,9 @@ + + + @@ -2372,7 +2384,7 @@ - + @@ -3667,12 +3679,18 @@ + + + + + + diff --git a/Localize/loc/sv/desktop/i18n/resources.resjson.lcl b/Localize/loc/sv/desktop/i18n/resources.resjson.lcl index aa2706840..562d4df08 100644 --- a/Localize/loc/sv/desktop/i18n/resources.resjson.lcl +++ b/Localize/loc/sv/desktop/i18n/resources.resjson.lcl @@ -484,6 +484,9 @@ + + + @@ -499,12 +502,18 @@ + + + + + + @@ -1051,6 +1060,9 @@ + + + @@ -3667,12 +3679,18 @@ + + + + + + From d43018f96db392c4c90f33bb59bdf36adad5b3f8 Mon Sep 17 00:00:00 2001 From: Haopeng Wang Date: Thu, 12 Sep 2024 08:34:19 +0900 Subject: [PATCH 45/57] Update desktop to Webpack v5 and Angular v12 (#2934) --------- Co-authored-by: David Watrous <509299+dpwatrous@users.noreply.github.com> Co-authored-by: Rena Chen Co-authored-by: Hoppe Wang --- desktop/config/webpack.common.js | 11 +- desktop/config/webpack.config.base.js | 20 +- desktop/config/webpack.config.dev.js | 30 +- desktop/config/webpack.config.prod.js | 35 - desktop/config/webpack.config.test.js | 25 +- desktop/package-lock.json | 14263 +++++----------- desktop/package.json | 101 +- desktop/patches/@azure+core-util+1.4.0.patch | 43 - desktop/patches/@azure+core-util+1.9.1.patch | 56 + desktop/scripts/lca/generate-third-party.ts | 3 +- desktop/scripts/publish/github-api.ts | 1 - desktop/scripts/swagger/validate-models.ts | 3 +- .../complex-form/complex-form.component.ts | 15 +- .../footer/form-footer.component.ts | 8 +- .../ui/form/form-page/form-page.component.ts | 5 +- .../src/@batch-flask/ui/form/form.module.ts | 2 +- .../@batch-flask/ui/table/table.component.ts | 3 +- .../programming-sample/samples/index.ts | 18 +- ...pplication-create-dialog.component.spec.ts | 2 +- .../all-job-graphs-home.scss | 2 +- .../theme-colors/theme-colors.component.ts | 2 +- .../certificate/certificate.service.ts | 6 + .../src/app/services/themes/theme.model.ts | 2 +- .../core/storage/storage-blob-adapter.spec.ts | 2 +- desktop/test/app/spec-runner.ts | 14 +- desktop/tsconfig.browser.json | 5 + desktop/tsconfig.json | 2 +- desktop/tsconfig.test.json | 2 +- packages/bonito-ui/package-lock.json | 40 - packages/bonito-ui/package.json | 2 - packages/playground/package-lock.json | 40 - packages/playground/package.json | 2 - packages/react/package-lock.json | 40 - packages/react/package.json | 2 - web/package-lock.json | 11 - web/package.json | 2 - 36 files changed, 4608 insertions(+), 10212 deletions(-) delete mode 100644 desktop/patches/@azure+core-util+1.4.0.patch create mode 100644 desktop/patches/@azure+core-util+1.9.1.patch diff --git a/desktop/config/webpack.common.js b/desktop/config/webpack.common.js index bd9908b10..df2d98a6d 100644 --- a/desktop/config/webpack.common.js +++ b/desktop/config/webpack.common.js @@ -3,23 +3,22 @@ const { DefinePlugin } = require("webpack"); const rules = { html: { - test: /\.html$/, - loader: "raw-loader", + test: /(\.html$)|(\.template$)/, + type: "asset/source", exclude: [/node_modules/, helpers.root("src/app/index.html")], }, json: { - type: "javascript/auto", test: /\.json$/, - loader: "raw-loader", + type: "asset/source", exclude: [/node_modules/], }, file: { test: /\.(ttf|eot|svg)(\?v=[0-9]\.[0-9]\.[0-9])?$/, - loader: "file-loader", + type: "asset/resource", }, font: { test: /\.woff(2)?(\?v=\d+\.\d+\.\d+)?$/, - loader: "url-loader?limit=10000&mimetype=application/font-woff", + type: "asset" }, }; diff --git a/desktop/config/webpack.config.base.js b/desktop/config/webpack.config.base.js index 9568ec305..372fd5716 100644 --- a/desktop/config/webpack.config.base.js +++ b/desktop/config/webpack.config.base.js @@ -3,7 +3,7 @@ const helpers = require("./helpers"); const path = require("path"); const HtmlWebpackPlugin = require("html-webpack-plugin"); const CopyWebpackPlugin = require("copy-webpack-plugin"); -const { AngularCompilerPlugin } = require("@ngtools/webpack"); +const { AngularWebpackPlugin } = require("@ngtools/webpack"); const { commonRules } = require("./webpack.common"); const MonacoWebpackPlugin = require("monaco-editor-webpack-plugin"); @@ -39,7 +39,7 @@ const baseConfig = { rules: [ { test: /(?:\.ngfactory\.js|\.ngstyle\.js|\.ts)$/, - use: ["@ngtools/webpack"], + loader: '@ngtools/webpack', exclude: [/\.spec\.ts/, /src\/test\//] }, ...commonRules, @@ -47,12 +47,11 @@ const baseConfig = { }, plugins: [ new MonacoWebpackPlugin(), - new AngularCompilerPlugin({ - skipCodeGeneration: !AOT, - tsConfigPath: "./tsconfig.browser.json", - mainPath: "./src/app/app.ts", // will auto-detect the root NgModule. - sourceMap: true, - // forkTypeChecker: !AOT, + new AngularWebpackPlugin({ + tsconfig: "./tsconfig.browser.json", + compilerOptions:{ + sourceMap: true, + } }), new CopyWebpackPlugin({ patterns: [ @@ -67,7 +66,7 @@ const baseConfig = { template: "src/app/index.html", chunksSortMode: (a, b) => { const entryPoints = ["app", "vendor", "styles", "sw-register", "polyfills", "inline"]; - return entryPoints.indexOf(b.names[0]) - entryPoints.indexOf(a.names[0]); + return entryPoints.indexOf(b) - entryPoints.indexOf(a); }, inject: "body", metadata: METADATA, @@ -81,6 +80,9 @@ const baseConfig = { }), ], target: "electron-renderer", + stats: { + errorDetails: true, + }, }; module.exports = baseConfig; diff --git a/desktop/config/webpack.config.dev.js b/desktop/config/webpack.config.dev.js index 57906d981..090546e7f 100644 --- a/desktop/config/webpack.config.dev.js +++ b/desktop/config/webpack.config.dev.js @@ -1,7 +1,6 @@ const config = require("./webpack.config.base"); const path = require("path"); const merge = require("webpack-merge"); -const WriteFilePlugin = require("write-file-webpack-plugin"); const { defineEnv } = require("./webpack.common"); const EvalSourceMapDevToolPlugin = require("webpack/lib/EvalSourceMapDevToolPlugin"); @@ -17,11 +16,19 @@ module.exports = merge(config, { devServer: { host, port, - stats: { - // Angular emits warning which are spaming the console - warnings: false, + client: { + logging: "error", + overlay: { + errors: true, + warnings: false, + runtimeErrors: true, + }, + }, + devMiddleware: { + writeToDisk: (filePath) => { + return /vendor\/vs.*/.test(filePath); + } }, - clientLogLevel: "error", }, output: { path: path.join(__dirname, "../build/"), @@ -33,11 +40,11 @@ module.exports = merge(config, { rules: [ { test: /\.scss$/, - loader: [ + use: [ { loader: "style-loader", options: { - singleton: true, + injectType: "singletonStyleTag", }, }, "css-loader", @@ -46,11 +53,11 @@ module.exports = merge(config, { }, { test: /\.css$/, - loader: [ + use: [ { loader: "style-loader", options: { - singleton: true, + injectType: "singletonStyleTag", }, }, "css-loader", @@ -63,9 +70,6 @@ module.exports = merge(config, { moduleFilenameTemplate: "[resource-path]", sourceRoot: "webpack:///" }), - defineEnv(ENV), - new WriteFilePlugin({ - test: /vendor\/vs.*/ - }), + defineEnv(ENV) ], }); diff --git a/desktop/config/webpack.config.prod.js b/desktop/config/webpack.config.prod.js index f53fd1c99..ec5f43e69 100644 --- a/desktop/config/webpack.config.prod.js +++ b/desktop/config/webpack.config.prod.js @@ -1,6 +1,5 @@ const config = require("./webpack.config.base"); const helpers = require("./helpers"); -const LoaderOptionsPlugin = require("webpack/lib/LoaderOptionsPlugin"); const merge = require("webpack-merge"); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const { defineEnv } = require("./webpack.common"); @@ -32,14 +31,6 @@ module.exports = merge(config, { */ filename: "[name].[chunkhash].bundle.js", - /** - * The filename of the SourceMaps for the JavaScript files. - * They are inside the output.path directory. - * - * @see http://webpack.github.io/docs/configuration.html#output-sourcemapfilename - */ - sourceMapFilename: "[name].[chunkhash].bundle.map", - /** * The filename of non-entry chunks as relative path * inside the output.path directory. @@ -71,31 +62,5 @@ module.exports = merge(config, { plugins: [ new MiniCssExtractPlugin({ filename: "[name]-[hash].css", chunkFilename: "[name]-[chunkhash].css" }), defineEnv(ENV), - - new LoaderOptionsPlugin({ - minimize: true, - debug: false, - options: { - - /** - * Html loader advanced options - * - * See: https://github.com/webpack/html-loader#advanced-options - */ - // TODO: Need to workaround Angular 2's html syntax => #id [bind] (event) *ngFor - htmlLoader: { - minimize: true, - removeAttributeQuotes: false, - caseSensitive: true, - customAttrSurround: [ - [/#/, /(?:)/], - [/\*/, /(?:)/], - [/\[?\(?/, /(?:)/] - ], - customAttrAssign: [/\)?\]?=/] - }, - - } - }), ], }); diff --git a/desktop/config/webpack.config.test.js b/desktop/config/webpack.config.test.js index c8184a77d..22a089844 100644 --- a/desktop/config/webpack.config.test.js +++ b/desktop/config/webpack.config.test.js @@ -1,5 +1,4 @@ const config = require("./webpack.config.base"); -const helpers = require("./helpers"); const { commonRules, defineEnv } = require("./webpack.common"); const ForkTsCheckerWebpackPlugin = require("fork-ts-checker-webpack-plugin"); const ENV = "test"; @@ -18,6 +17,7 @@ config.module.rules = config.module.rules = [ { test: /\.ts$/, use: [ + "@jsdevtools/coverage-istanbul-loader", { loader: "ts-loader", options: { @@ -28,15 +28,15 @@ config.module.rules = config.module.rules = [ ], exclude: [/node_modules/, /\.node\.spec\.ts/], // node.spec.ts are to be run in node environment }, - ...commonRules, + ...commonRules ].concat( [{ test: /\.scss$/, - loader: "style-loader!css-loader!sass-loader", + use: ["style-loader", "css-loader", "sass-loader"], }, { test: /node_modules.*\.css$/, - loader: "style-loader!css-loader", + use: ["style-loader", "css-loader"], }, /** * Instruments JS files with Istanbul for subsequent code coverage reporting. @@ -44,23 +44,6 @@ config.module.rules = config.module.rules = [ * * See: https://github.com/deepsweet/istanbul-instrumenter-loader */ - { - enforce: "post", - test: /\.(js|ts)$/, - loader: "istanbul-instrumenter-loader", - query: { - esModules: true - }, - include: [ - helpers.root("app"), - helpers.root("src"), - ], - exclude: [ - helpers.root("src/test"), - /\.(e2e|spec)\.(ts)$/, - /node_modules/ - ] - } ] ); diff --git a/desktop/package-lock.json b/desktop/package-lock.json index ee90bd8a2..9e3fad96a 100644 --- a/desktop/package-lock.json +++ b/desktop/package-lock.json @@ -9,20 +9,20 @@ "version": "2.21.0", "license": "MIT", "dependencies": { - "@angular/animations": "^11.2.12", - "@angular/cdk": "^11.2.12", - "@angular/common": "^11.2.12", - "@angular/compiler": "^11.2.12", - "@angular/core": "^11.2.12", - "@angular/forms": "^11.2.12", - "@angular/material": "^11.2.12", - "@angular/platform-browser": "^11.2.12", - "@angular/platform-browser-dynamic": "^11.2.12", - "@angular/platform-server": "^11.2.12", - "@angular/router": "^11.2.12", - "@azure/core-util": "1.4.0", + "@angular/animations": "^12.0.0", + "@angular/cdk": "^12.0.0", + "@angular/common": "^12.0.0", + "@angular/compiler": "^12.0.0", + "@angular/core": "^12.0.0", + "@angular/forms": "^12.0.0", + "@angular/material": "^12.0.0", + "@angular/platform-browser": "^12.0.0", + "@angular/platform-browser-dynamic": "^12.0.0", + "@angular/platform-server": "^12.0.0", + "@angular/router": "^12.0.0", + "@azure/core-util": "1.9.1", "@azure/msal-node": "^2.7.0", - "@azure/storage-blob": "^12.11.0", + "@azure/storage-blob": "^12.23.0", "@electron/remote": "^2.1.2", "applicationinsights": "^1.8.5", "chart.js": "^2.9.3", @@ -56,19 +56,20 @@ "reflect-metadata": "^0.1.13", "rxjs": "^6.6.7", "strip-json-comments": "^2.0.1", - "tinycolor2": "^1.4.1", + "tinycolor2": "^1.6.0", "winston": "^3.3.3", "winston-daily-rotate-file": "^3.10.0", "write-file-webpack-plugin": "^4.5.1", "xml2js": "^0.5.0", - "zone.js": "^0.11.0" + "zone.js": "^0.11.4" }, "devDependencies": { "@angular-eslint/eslint-plugin": "^13.2.1", "@angular-eslint/eslint-plugin-template": "^13.2.1", "@angular-eslint/template-parser": "^13.2.1", - "@angular/compiler-cli": "^11.2.12", - "@ngtools/webpack": "^11.2.12", + "@angular/compiler-cli": "^12.0.0", + "@jsdevtools/coverage-istanbul-loader": "^3.0.5", + "@ngtools/webpack": "^12.0.0", "@playwright/test": "^1.43.1", "@types/chart.js": "^2.9.24", "@types/d3": "^7.4.0", @@ -80,10 +81,7 @@ "@types/js-yaml": "^3.12.5", "@types/luxon": "^1.27.1", "@types/node": "18.11.9", - "@types/node-fetch": "^2.5.7", "@types/proxyquire": "^1.3.28", - "@types/react": "^17.0.53", - "@types/react-dom": "^17.0.18", "@types/strip-json-comments": "^0.0.30", "@types/tinycolor2": "^1.4.2", "@types/webdriverio": "^4.13.3", @@ -91,8 +89,8 @@ "angular2-template-loader": "^0.6.2", "colors": "^1.4.0", "concurrently": "^5.3.0", - "copy-webpack-plugin": "^6.0.3", - "css-loader": "^2.1.1", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.8.1", "electron": "^29.3.1", "electron-builder": "^24.13.3", "eslint": "^7.19.0", @@ -101,10 +99,8 @@ "eslint-plugin-import": "^2.25.4", "eslint-plugin-jsdoc": "^37.9.6", "eslint-plugin-prefer-arrow": "^1.2.3", - "file-loader": "^3.0.1", - "fork-ts-checker-webpack-plugin": "^5.1.0", - "html-webpack-plugin": "^3.2.0", - "istanbul-instrumenter-loader": "^3.0.1", + "fork-ts-checker-webpack-plugin": "^8.0.0", + "html-webpack-plugin": "^5.5.3", "jasmine": "~3.5.0", "jasmine-axe": "^1.1.0", "jasmine-core": "^3.6.0", @@ -119,33 +115,31 @@ "karma-mocha-reporter": "^2.2.5", "karma-sourcemap-loader": "^0.4.0", "karma-webpack": "^5.0.0", - "loader-utils": "^1.4.2", + "loader-utils": "^3.2.1", "merge2": "^1.4.1", - "mini-css-extract-plugin": "^0.5.0", - "monaco-editor-webpack-plugin": "^6.0.0", - "node-fetch": "^2.6.7", + "mini-css-extract-plugin": "^2.7.6", + "monaco-editor-webpack-plugin": "^7.1.0", "nyc": "^15.1.0", - "patch-package": "^6.5.1", - "playwright": "^1.43.1", + "patch-package": "^8.0.0", + "playwright": "^1.18.1", + "postcss-scss": "^4.0.9", "prettier": "^2.2.1", "proxyquire": "^2.1.3", - "raw-loader": "^1.0.0", "rimraf": "^2.7.1", - "sass": "^1.26.10", - "sass-loader": "^9.0.3", - "style-loader": "^0.23.1", - "stylelint": "^13.6.1", - "to-string-loader": "^1.1.6", - "ts-loader": "^5.4.5", - "ts-node": "^8.10.2", + "sass": "^1.66.1", + "sass-loader": "^13.3.2", + "style-loader": "^3.3.3", + "stylelint": "^15.10.3", + "to-string-loader": "^1.2.0", + "ts-loader": "^9.4.4", + "ts-node": "^10.9.1", "typescript": "~4.6.0", - "url-loader": "^1.1.2", - "webpack": "^4.44.1", - "webpack-cli": "^3.3.12", - "webpack-dev-server": "^3.11.0", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^4.15.1", "webpack-inline-manifest-plugin": "^4.0.1", "webpack-merge": "^4.2.2", - "yesno": "^0.0.1" + "yesno": "^0.4.0" }, "engines": { "node": ">=18.0.0" @@ -161,82 +155,19 @@ "tslib": "~2.3.1" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, - "node_modules/@angular-devkit/core": { - "version": "11.2.19", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.2.19.tgz", - "integrity": "sha512-kvS0QXDYDatLyf0NYv2sahPYD7kya4g5GpQAV1ddjjLmEVeZssHt+Xfk2tzrkzYzqRMiyspx3HPPrrOnMUAFhQ==", - "dev": true, - "dependencies": { - "ajv": "6.12.6", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.3", - "source-map": "0.7.3" - }, - "engines": { - "node": ">= 10.13.0", - "npm": "^6.11.0 || ^7.5.6", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/core/node_modules/magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, - "dependencies": { - "sourcemap-codec": "^1.4.4" - } - }, - "node_modules/@angular-devkit/core/node_modules/rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@angular-devkit/core/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@angular-devkit/core/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@angular-eslint/bundled-angular-compiler": { "version": "13.5.0", "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-13.5.0.tgz", @@ -302,55 +233,65 @@ } }, "node_modules/@angular/animations": { - "version": "11.2.14", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-11.2.14.tgz", - "integrity": "sha512-Heq/nNrCmb3jbkusu+BQszOecfFI/31Oxxj+CDQkqqYpBcswk6bOJLoEE472o+vmgxaXbgeflU9qbIiCQhpMFA==", + "version": "12.2.17", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-12.2.17.tgz", + "integrity": "sha512-WVUcvKvr6wr9Nf3I2ksu5bFJ5xHhby4UEBTvOAdLpDqic+dzqtzVwAktDRprBSdxKQk1OlTw6jD4MsVEDKnZTg==", "dependencies": { - "tslib": "^2.0.0" + "tslib": "^2.2.0" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0" }, "peerDependencies": { - "@angular/core": "11.2.14" + "@angular/core": "12.2.17" } }, "node_modules/@angular/cdk": { - "version": "11.2.13", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-11.2.13.tgz", - "integrity": "sha512-FkE4iCwoLbQxLDUOjV1I7M/6hmpyb7erAjEdWgch7nGRNxF1hqX5Bqf1lvLFKPNCbx5NRI5K7YVAdIUQUR8vug==", + "version": "12.2.13", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-12.2.13.tgz", + "integrity": "sha512-zSKRhECyFqhingIeyRInIyTvYErt4gWo+x5DQr0b7YLUbU8DZSwWnG4w76Ke2s4U8T7ry1jpJBHoX/e8YBpGMg==", "dependencies": { - "tslib": "^2.0.0" + "tslib": "^2.2.0" }, "optionalDependencies": { "parse5": "^5.0.0" }, "peerDependencies": { - "@angular/common": "^11.0.0 || ^12.0.0-0", - "@angular/core": "^11.0.0 || ^12.0.0-0" + "@angular/common": "^12.0.0 || ^13.0.0-0", + "@angular/core": "^12.0.0 || ^13.0.0-0", + "rxjs": "^6.5.3 || ^7.0.0" } }, "node_modules/@angular/common": { - "version": "11.2.14", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-11.2.14.tgz", - "integrity": "sha512-ZSLV/3j7eCTyLf/8g4yBFLWySjiLz3vLJAGWscYoUpnJWMnug1VRu6zoF/COxCbtORgE+Wz6K0uhfS6MziBGVw==", + "version": "12.2.17", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-12.2.17.tgz", + "integrity": "sha512-/Rc83mzlL6YZScYTzg+Ng2hiCSf3jUVHAfQ8cyLOIMj/y8863Q+DMLVWW+ttvHwCjEFY44pC8IPyBl5FmSJYHg==", "dependencies": { - "tslib": "^2.0.0" + "tslib": "^2.2.0" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0" }, "peerDependencies": { - "@angular/core": "11.2.14", - "rxjs": "^6.5.3" + "@angular/core": "12.2.17", + "rxjs": "^6.5.3 || ^7.0.0" } }, "node_modules/@angular/compiler": { - "version": "11.2.14", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-11.2.14.tgz", - "integrity": "sha512-XBOK3HgA+/y6Cz7kOX4zcJYmgJ264XnfcbXUMU2cD7Ac+mbNhLPKohWrEiSWalfcjnpf5gRfufQrQP7lpAGu0A==", + "version": "12.2.17", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-12.2.17.tgz", + "integrity": "sha512-dxM1CxzvEJPk6ShJngkW5j5BejBloxQNi+fJi+F8P/GN/Rj7vJUf0JxL+TUt1+Iv575V4NidJDKKikk6K485CA==", "dependencies": { - "tslib": "^2.0.0" + "tslib": "^2.2.0" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0" } }, "node_modules/@angular/compiler-cli": { - "version": "11.2.14", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-11.2.14.tgz", - "integrity": "sha512-A7ltnCp03/EVqK/Q3tVUDsokgz5GHW3dSPGl0Csk7Ys5uBB9ibHTmVt4eiXA4jt0+6Bk+mKxwe5BEDqLvwYFAg==", + "version": "12.2.17", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-12.2.17.tgz", + "integrity": "sha512-gJJlnDr8Fhs6z0hH0Y/5GC1YAgHY+sRh2BUrbDu+nIUubyyOVYSyQdL1jwEfCSIZl1GSg+4b4thU7pp7HtmX8g==", "dev": true, "dependencies": { "@babel/core": "^7.8.6", @@ -358,16 +299,15 @@ "canonical-path": "1.0.0", "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", - "dependency-graph": "^0.7.2", - "fs-extra": "4.0.2", + "dependency-graph": "^0.11.0", "magic-string": "^0.25.0", "minimist": "^1.2.0", "reflect-metadata": "^0.1.2", - "semver": "^6.3.0", + "semver": "^7.0.0", "source-map": "^0.6.1", "sourcemap-codec": "^1.4.8", - "tslib": "^2.0.0", - "yargs": "^16.2.0" + "tslib": "^2.2.0", + "yargs": "^17.0.0" }, "bin": { "ivy-ngcc": "ngcc/main-ivy-ngcc.js", @@ -376,65 +316,75 @@ "ngcc": "ngcc/main-ngcc.js" }, "engines": { - "node": ">=10.0" + "node": "^12.14.1 || >=14.0.0" }, "peerDependencies": { - "@angular/compiler": "11.2.14", - "typescript": ">=4.0 <4.2" + "@angular/compiler": "12.2.17", + "typescript": ">=4.2.3 <4.4" } }, "node_modules/@angular/core": { - "version": "11.2.14", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-11.2.14.tgz", - "integrity": "sha512-vpR4XqBGitk1Faph37CSpemwIYTmJ3pdIVNoHKP6jLonpWu+0azkchf0f7oD8/2ivj2F81opcIw0tcsy/D/5Vg==", + "version": "12.2.17", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-12.2.17.tgz", + "integrity": "sha512-XUvTgU0D8XqNH5Y7UlTMk/XjUQaEGC0kZxhw/QSSQr65WrXtXmcD4d8Cg84TJ52uGXmf7IAruKvtbvu1Mbmvug==", "dependencies": { - "tslib": "^2.0.0" + "tslib": "^2.2.0" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0" }, "peerDependencies": { - "rxjs": "^6.5.3", - "zone.js": "^0.10.2 || ^0.11.3" + "rxjs": "^6.5.3 || ^7.0.0", + "zone.js": "~0.11.4" } }, "node_modules/@angular/forms": { - "version": "11.2.14", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-11.2.14.tgz", - "integrity": "sha512-4LWqY6KEIk1AZQFnk+4PJSOCamlD4tumuVN06gO4D0dZo9Cx+GcvW6pM6N0CPubRvPs3sScCnu20WT11HNWC1w==", + "version": "12.2.17", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-12.2.17.tgz", + "integrity": "sha512-iOIAz5OR6yLWuNTSOSDqAffQ0FU71yw1QsOmltU/hBsO6H6smsIKVe8VlFa4SnBSAyVZXf/OhDRJ8gOqQT09mw==", "dependencies": { - "tslib": "^2.0.0" + "tslib": "^2.2.0" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0" }, "peerDependencies": { - "@angular/common": "11.2.14", - "@angular/core": "11.2.14", - "@angular/platform-browser": "11.2.14", - "rxjs": "^6.5.3" + "@angular/common": "12.2.17", + "@angular/core": "12.2.17", + "@angular/platform-browser": "12.2.17", + "rxjs": "^6.5.3 || ^7.0.0" } }, "node_modules/@angular/material": { - "version": "11.2.13", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-11.2.13.tgz", - "integrity": "sha512-FqFdGSkOtqsmeLyTSousodDGUy2NqbtxCIKv2rwbsIRwHNKB0KpR/UQhA2gMRuGa5hxhMJ0DW0Tf9neMRuLCTg==", + "version": "12.2.13", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-12.2.13.tgz", + "integrity": "sha512-6g2GyN4qp2D+DqY2AwrQuPB3cd9gybvQVXvNRbTPXEulHr+LgGei00ySdFHFp6RvdGSMZ4i3LM1Fq3VkFxhCfQ==", "dependencies": { - "tslib": "^2.0.0" + "tslib": "^2.2.0" }, "peerDependencies": { - "@angular/animations": "^11.0.0 || ^12.0.0-0", - "@angular/cdk": "11.2.13", - "@angular/common": "^11.0.0 || ^12.0.0-0", - "@angular/core": "^11.0.0 || ^12.0.0-0", - "@angular/forms": "^11.0.0 || ^12.0.0-0" + "@angular/animations": "^12.0.0 || ^13.0.0-0", + "@angular/cdk": "12.2.13", + "@angular/common": "^12.0.0 || ^13.0.0-0", + "@angular/core": "^12.0.0 || ^13.0.0-0", + "@angular/forms": "^12.0.0 || ^13.0.0-0", + "rxjs": "^6.5.3 || ^7.0.0" } }, "node_modules/@angular/platform-browser": { - "version": "11.2.14", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-11.2.14.tgz", - "integrity": "sha512-fb7b7ss/gRoP8wLAN17W62leMgjynuyjEPU2eUoAAazsG9f2cgM+z3rK29GYncDVyYQxZUZYnjSqvL6GSXx86A==", + "version": "12.2.17", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-12.2.17.tgz", + "integrity": "sha512-fxs0FDEnS9mzd36u0bHd6TbCvRC9pqK0YCWNnoLCf5ALQtyIL8CpgGNjOMnO8mCEl5l9QTFCDvKOn4V3p7E/dg==", "dependencies": { - "tslib": "^2.0.0" + "tslib": "^2.2.0" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0" }, "peerDependencies": { - "@angular/animations": "11.2.14", - "@angular/common": "11.2.14", - "@angular/core": "11.2.14" + "@angular/animations": "12.2.17", + "@angular/common": "12.2.17", + "@angular/core": "12.2.17" }, "peerDependenciesMeta": { "@angular/animations": { @@ -443,52 +393,58 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "11.2.14", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-11.2.14.tgz", - "integrity": "sha512-TWTPdFs6iBBcp+/YMsgCRQwdHpWGq8KjeJDJ2tfatGgBD3Gqt2YaHOMST1zPW6RkrmupytTejuVqXzeaKWFxuw==", + "version": "12.2.17", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-12.2.17.tgz", + "integrity": "sha512-2v7R5l+4ULSNLviKVTHCqn6iNFgY1M/+HtM1ZcM72V4cVVsXqXUAh7WV4sk4l4ECsExKxQoc6JlVtPUub8cCKA==", "dependencies": { - "tslib": "^2.0.0" + "tslib": "^2.2.0" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0" }, "peerDependencies": { - "@angular/common": "11.2.14", - "@angular/compiler": "11.2.14", - "@angular/core": "11.2.14", - "@angular/platform-browser": "11.2.14" + "@angular/common": "12.2.17", + "@angular/compiler": "12.2.17", + "@angular/core": "12.2.17", + "@angular/platform-browser": "12.2.17" } }, "node_modules/@angular/platform-server": { - "version": "11.2.14", - "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-11.2.14.tgz", - "integrity": "sha512-VSJ4FSyMPVCE3EGfD4hIK1fZu+KFYi04uL4Co8vchzBQFpXPFABpCS/lGd7rOyvLnKRmUvl4NGS72gQdS00IUw==", + "version": "12.2.17", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-12.2.17.tgz", + "integrity": "sha512-RUhI2luajbriMAavh39tVhAdqKtjd1phzjyxTxjJbohly/OqVGrChbI50IBT81J1MMdPgX8Y/cBrAV9xRGtVjw==", "dependencies": { "domino": "^2.1.2", - "tslib": "^2.0.0", + "tslib": "^2.2.0", "xhr2": "^0.2.0" }, "engines": { - "node": ">=8.0" + "node": "^12.14.1 || >=14.0.0" }, "peerDependencies": { - "@angular/animations": "11.2.14", - "@angular/common": "11.2.14", - "@angular/compiler": "11.2.14", - "@angular/core": "11.2.14", - "@angular/platform-browser": "11.2.14", - "@angular/platform-browser-dynamic": "11.2.14" + "@angular/animations": "12.2.17", + "@angular/common": "12.2.17", + "@angular/compiler": "12.2.17", + "@angular/core": "12.2.17", + "@angular/platform-browser": "12.2.17", + "@angular/platform-browser-dynamic": "12.2.17" } }, "node_modules/@angular/router": { - "version": "11.2.14", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-11.2.14.tgz", - "integrity": "sha512-3aYBmj+zrEL9yf/ntIQxHIYaWShZOBKP3U07X2mX+TPMpGlvHDnR7L6bWhQVZwewzMMz7YVR16ldg50IFuAlfA==", + "version": "12.2.17", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-12.2.17.tgz", + "integrity": "sha512-GKvEMUpLe157izpHLiS4bCZllqOj+MWhfWbhvR0DHFpE9FtkcDjBseTsWqQmyA1gqtRblO1Zn/1E33l9uaGMqw==", "dependencies": { - "tslib": "^2.0.0" + "tslib": "^2.2.0" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0" }, "peerDependencies": { - "@angular/common": "11.2.14", - "@angular/core": "11.2.14", - "@angular/platform-browser": "11.2.14", - "rxjs": "^6.5.3" + "@angular/common": "12.2.17", + "@angular/core": "12.2.17", + "@angular/platform-browser": "12.2.17", + "rxjs": "^6.5.3 || ^7.0.0" } }, "node_modules/@azure/abort-controller": { @@ -503,116 +459,229 @@ } }, "node_modules/@azure/core-auth": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.5.0.tgz", - "integrity": "sha512-udzoBuYG1VBoHVohDTrvKjyzel34zt77Bhp7dQntVGGD0ehVq48owENbBG8fIgkHRNUBQH5k1r0hpoMu5L8+kw==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.7.2.tgz", + "integrity": "sha512-Igm/S3fDYmnMq1uKS38Ae1/m37B3zigdlZw+kocwEhh5GjyKjPrXKO2J6rzpC1wAxrNil/jX9BJRqBshyjnF3g==", "dependencies": { - "@azure/abort-controller": "^1.0.0", + "@azure/abort-controller": "^2.0.0", "@azure/core-util": "^1.1.0", - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@azure/core-http": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-3.0.2.tgz", - "integrity": "sha512-o1wR9JrmoM0xEAa0Ue7Sp8j+uJvmqYaGoHOCT5qaVYmvgmnZDC0OvQimPA/JR3u77Sz6D1y3Xmk1y69cDU9q9A==", + "node_modules/@azure/core-auth/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", "dependencies": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.3.0", - "@azure/core-tracing": "1.0.0-preview.13", - "@azure/core-util": "^1.1.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-client": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.2.tgz", + "integrity": "sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w==", + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.4.0", + "@azure/core-rest-pipeline": "^1.9.1", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.6.1", "@azure/logger": "^1.0.0", - "@types/node-fetch": "^2.5.0", - "@types/tunnel": "^0.0.3", - "form-data": "^4.0.0", - "node-fetch": "^2.6.7", - "process": "^0.11.10", - "tslib": "^2.2.0", - "tunnel": "^0.0.6", - "uuid": "^8.3.0", - "xml2js": "^0.5.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-client/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-http-compat": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.1.2.tgz", + "integrity": "sha512-5MnV1yqzZwgNLLjlizsU3QqOeQChkIXw781Fwh1xdAqJR5AA32IUaq6xv1BICJvfbHoa+JYcaij2HFkhLbNTJQ==", + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-client": "^1.3.0", + "@azure/core-rest-pipeline": "^1.3.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-http-compat/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@azure/core-lro": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.5.4.tgz", - "integrity": "sha512-3GJiMVH7/10bulzOKGrrLeG/uCBH/9VtxqaMcB9lIqAeamI/xYQSHJL/KcsLDuH+yTjYpro/u6D/MuRe4dN70Q==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.7.2.tgz", + "integrity": "sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw==", "dependencies": { - "@azure/abort-controller": "^1.0.0", + "@azure/abort-controller": "^2.0.0", "@azure/core-util": "^1.2.0", "@azure/logger": "^1.0.0", - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-lro/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@azure/core-paging": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.5.0.tgz", - "integrity": "sha512-zqWdVIt+2Z+3wqxEOGzR5hXFZ8MGKK52x4vFLw8n58pR6ZfKRx3EXYTxTaYxYHc/PexPUTyimcTWFJbji9Z6Iw==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.6.2.tgz", + "integrity": "sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA==", "dependencies": { - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-rest-pipeline": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.16.2.tgz", + "integrity": "sha512-Hnhm/PG9/SQ07JJyLDv3l9Qr8V3xgAe1hFoBYzt6LaalMxfL/ZqFaZf/bz5VN3pMcleCPwl8ivlS2Fjxq/iC8Q==", + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.4.0", + "@azure/core-tracing": "^1.0.1", + "@azure/core-util": "^1.9.0", + "@azure/logger": "^1.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-rest-pipeline/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-rest-pipeline/node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" } }, "node_modules/@azure/core-tracing": { - "version": "1.0.0-preview.13", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz", - "integrity": "sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.1.2.tgz", + "integrity": "sha512-dawW9ifvWAWmUm9/h+/UQ2jrdvjCJ7VJEuCJ6XVNudzcOwm53BFZH4Q845vjfgoUAM8ZxokvVNxNxAITc502YA==", "dependencies": { - "@opentelemetry/api": "^1.0.1", - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=12.0.0" + "node": ">=18.0.0" } }, "node_modules/@azure/core-util": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.4.0.tgz", - "integrity": "sha512-eGAyJpm3skVQoLiRqm/xPa+SXi/NPDdSHMxbRAz2lSprd+Zs+qrpQGQQ2VQ3Nttu+nSZR4XoYQC71LbEI7jsig==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.9.1.tgz", + "integrity": "sha512-OLsq0etbHO1MA7j6FouXFghuHrAFGk+5C1imcpQ2e+0oZhYF07WLA+NW2Vqs70R7d+zOAWiWM3tbE1sXcDN66g==", "dependencies": { - "@azure/abort-controller": "^1.0.0", - "tslib": "^2.2.0" + "@azure/abort-controller": "^2.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-util/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-xml": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@azure/core-xml/-/core-xml-1.4.2.tgz", + "integrity": "sha512-CW3MZhApe/S4iikbYKE7s83fjDBPIr2kpidX+hlGRwh7N4o1nIpQ/PfJTeioqhfqdMvRtheEl+ft64fyTaLNaA==", + "dependencies": { + "fast-xml-parser": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@azure/logger": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.4.tgz", - "integrity": "sha512-ustrPY8MryhloQj7OWGe+HrYx+aoiOxzbXTtgblbV3xwCqpzUK36phH3XNHQKj3EPonyFUuDTfR3qFhTEAuZEg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.1.3.tgz", + "integrity": "sha512-J8/cIKNQB1Fc9fuYqBVnrppiUtW+5WWJPCj/tAokC5LdSTwkWWttN+jsRgw9BLYD7JDBx7PceiqOBxJJ1tQz3Q==", "dependencies": { - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@azure/msal-common": { - "version": "14.9.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.9.0.tgz", - "integrity": "sha512-yzBPRlWPnTBeixxLNI3BBIgF5/bHpbhoRVuuDBnYjCyWRavaPUsKAHUDYLqpGkBLDciA6TCc6GOxN4/S3WiSxg==", + "version": "14.13.1", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.13.1.tgz", + "integrity": "sha512-iUp3BYrsRZ4X3EiaZ2fDjNFjmtYMv9rEQd6c1op6ULn0HWk4ACvDmosL6NaBgWOhl1BAblIbd9vmB5/ilF8d4A==", "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-node": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.7.0.tgz", - "integrity": "sha512-wXD8LkUvHICeSWZydqg6o8Yvv+grlBEcmLGu+QEI4FcwFendbTEZrlSygnAXXSOCVaGAirWLchca35qrgpO6Jw==", + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.11.1.tgz", + "integrity": "sha512-8ECtug4RL+zsgh20VL8KYHjrRO3MJOeAKEPRXT2lwtiu5U3BdyIdBb50+QZthEkIi60K6pc/pdOx/k5Jp4sLng==", "dependencies": { - "@azure/msal-common": "14.9.0", + "@azure/msal-common": "14.13.1", "jsonwebtoken": "^9.0.0", "uuid": "^8.3.0" }, @@ -621,62 +690,67 @@ } }, "node_modules/@azure/storage-blob": { - "version": "12.15.0", - "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.15.0.tgz", - "integrity": "sha512-e7JBKLOFi0QVJqqLzrjx1eL3je3/Ug2IQj24cTM9b85CsnnFjLGeGjJVIjbGGZaytewiCEG7r3lRwQX7fKj0/w==", + "version": "12.23.0", + "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.23.0.tgz", + "integrity": "sha512-c1KJ5R5hqR/HtvmFtTn/Y1BNMq45NUBp0LZH7yF8WFMET+wmESgEr0FVTu/Z5NonmfUjbgJZG5Nh8xHc5RdWGQ==", "dependencies": { "@azure/abort-controller": "^1.0.0", - "@azure/core-http": "^3.0.0", + "@azure/core-auth": "^1.4.0", + "@azure/core-client": "^1.6.2", + "@azure/core-http-compat": "^2.0.0", "@azure/core-lro": "^2.2.0", "@azure/core-paging": "^1.1.1", - "@azure/core-tracing": "1.0.0-preview.13", + "@azure/core-rest-pipeline": "^1.10.1", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.6.1", + "@azure/core-xml": "^1.3.2", "@azure/logger": "^1.0.0", "events": "^3.0.0", "tslib": "^2.2.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz", + "integrity": "sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.11.tgz", - "integrity": "sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.9.tgz", + "integrity": "sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-compilation-targets": "^7.22.10", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.11", - "@babel/parser": "^7.22.11", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.11", - "@babel/types": "^7.22.11", - "convert-source-map": "^1.7.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.9", + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-module-transforms": "^7.24.9", + "@babel/helpers": "^7.24.8", + "@babel/parser": "^7.24.8", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.9", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", @@ -690,15 +764,30 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/generator": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz", - "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==", + "version": "7.24.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz", + "integrity": "sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==", "dev": true, "dependencies": { - "@babel/types": "^7.23.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.9", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -706,14 +795,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", - "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz", + "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -721,63 +810,76 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", "dev": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", - "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz", + "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -787,88 +889,89 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.11.tgz", - "integrity": "sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz", + "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.11", - "@babel/types": "^7.22.11" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.8" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", - "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz", + "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -878,9 +981,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.11.tgz", - "integrity": "sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", + "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -890,9 +993,9 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.22.11.tgz", - "integrity": "sha512-NhfzUbdWbiE6fCFypbWCPu6AR8xre31EOPF7wwAIJEvGQ2avov04eymayWinCuyXmV1b0+jzoXP/HYzzUYdvwg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.8.tgz", + "integrity": "sha512-DXG/BhegtMHhnN7YPIvxWd303/9aXvYFD1TjNL3CD6tUrhI2LVsg3Lck0aql5TRH29n4sj3emcROypkZVUfSuA==", "dev": true, "dependencies": { "core-js-pure": "^3.30.2", @@ -903,34 +1006,34 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.4.tgz", - "integrity": "sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.4", - "@babel/generator": "^7.23.4", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.4", - "@babel/types": "^7.23.4", - "debug": "^4.1.0", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz", + "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.8", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.8", + "@babel/types": "^7.24.8", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -938,13 +1041,13 @@ } }, "node_modules/@babel/types": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", - "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz", + "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -955,67 +1058,185 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, "engines": { "node": ">=0.1.90" } }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", - "dependencies": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "node_modules/@develar/schema-utils": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", - "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, "dependencies": { - "ajv": "^6.12.0", - "ajv-keywords": "^3.4.1" + "@jridgewell/trace-mapping": "0.3.9" }, "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">=12" } }, - "node_modules/@electron/asar": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.9.tgz", - "integrity": "sha512-Vu2P3X2gcZ3MY9W7yH72X9+AMXwUQZEJBrsPIbX0JsdllLtoh62/Q8Wg370/DawIEVKOyfD6KtTLo645ezqxUA==", + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, "dependencies": { - "commander": "^5.0.0", - "glob": "^7.1.6", - "minimatch": "^3.0.4" - }, - "bin": { - "asar": "bin/asar.js" - }, - "engines": { - "node": ">=10.12.0" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@electron/asar/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@csstools/css-parser-algorithms": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.7.1.tgz", + "integrity": "sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^2.4.1" } }, - "node_modules/@electron/asar/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "node_modules/@csstools/css-tokenizer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.4.1.tgz", + "integrity": "sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.13.tgz", + "integrity": "sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^2.7.1", + "@csstools/css-tokenizer": "^2.4.1" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.1.1.tgz", + "integrity": "sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.13" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@develar/schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", + "dev": true, + "dependencies": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@electron/asar": { + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.10.tgz", + "integrity": "sha512-mvBSwIBUeiRscrCeJE1LwctAriBj65eUDm0Pc11iE5gRwzkmsdbS7FnZ1XUWjpSeQWL1L5g12Fc/SchPM9DUOw==", + "dev": true, + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@electron/asar/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@electron/asar/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "dev": true, "engines": { @@ -1035,9 +1256,9 @@ } }, "node_modules/@electron/get": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.2.tgz", - "integrity": "sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", + "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", "dev": true, "dependencies": { "debug": "^4.1.1", @@ -1055,18 +1276,13 @@ "global-agent": "^3.0.0" } }, - "node_modules/@electron/get/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "node_modules/@electron/get/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" + "bin": { + "semver": "bin/semver.js" } }, "node_modules/@electron/notarize": { @@ -1316,9 +1532,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -1366,16 +1582,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true - }, "node_modules/@humanwhocodes/config-array": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.0", @@ -1412,6 +1623,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true }, "node_modules/@isaacs/cliui": { @@ -1545,53 +1757,156 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" } }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@jsdevtools/coverage-istanbul-loader": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz", + "integrity": "sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA==", + "dev": true, + "dependencies": { + "convert-source-map": "^1.7.0", + "istanbul-lib-instrument": "^4.0.3", + "loader-utils": "^2.0.0", + "merge-source-map": "^1.1.0", + "schema-utils": "^2.7.0" + } + }, + "node_modules/@jsdevtools/coverage-istanbul-loader/node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/@jsdevtools/coverage-istanbul-loader/node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@jsdevtools/coverage-istanbul-loader/node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jsdevtools/coverage-istanbul-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/@jsdevtools/coverage-istanbul-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@jsdevtools/coverage-istanbul-loader/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "dev": true + }, "node_modules/@malept/cross-spawn-promise": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", @@ -1666,24 +1981,19 @@ } }, "node_modules/@ngtools/webpack": { - "version": "11.2.19", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-11.2.19.tgz", - "integrity": "sha512-HwLHA6ZrLSk7VHm5Bv3a8ljM6uU8+/670u2fKfMFwM4UQ42+yTFihwfFKLWQIcawBOlVCaUosr6o1xmeSquAqA==", + "version": "12.2.18", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.2.18.tgz", + "integrity": "sha512-6h/QSG6oZDs2BGfrozdOKqtM5daoCu05q+0gyb3owHz1u9FtMeXXKQ3sQfyFC/GNT3dTMlH6YFxsJPvMPwuy9A==", "dev": true, - "dependencies": { - "@angular-devkit/core": "11.2.19", - "enhanced-resolve": "5.7.0", - "webpack-sources": "2.2.0" - }, "engines": { - "node": ">= 10.13.0", - "npm": "^6.11.0 || ^7.5.6", + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "peerDependencies": { - "@angular/compiler-cli": "^11.0.0 || ^11.2.0-next", - "typescript": "~4.0.0 || ~4.1.0", - "webpack": "^4.0.0" + "@angular/compiler-cli": "^12.0.0", + "typescript": "~4.2.3 || ~4.3.2", + "webpack": "^5.30.0" } }, "node_modules/@nodelib/fs.scandir": { @@ -1721,177 +2031,111 @@ "node": ">= 8" } }, - "node_modules/@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, - "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" + "optional": true, + "engines": { + "node": ">=14" } }, - "node_modules/@npmcli/fs/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@playwright/test": { + "version": "1.45.2", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.45.2.tgz", + "integrity": "sha512-JxG9eq92ET75EbVi3s+4sYbcG7q72ECeZNbdBlaMkGcNbiDQ4cAi8U2QP5oKkOx+1gpaiL1LDStmzCaEM1Z6fQ==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "playwright": "1.45.2" + }, + "bin": { + "playwright": "cli.js" }, "engines": { - "node": ">=10" + "node": ">=18" } }, - "node_modules/@npmcli/fs/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@npmcli/fs/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", "dev": true }, - "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "deprecated": "This functionality has been moved to @npmcli/fs", + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dev": true, "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" + "defer-to-connect": "^2.0.0" }, "engines": { "node": ">=10" } }, - "node_modules/@npmcli/move-file/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/@opentelemetry/api": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz", - "integrity": "sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true, - "optional": true, "engines": { - "node": ">=14" + "node": ">= 10" } }, - "node_modules/@playwright/test": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.43.1.tgz", - "integrity": "sha512-HgtQzFgNEEo4TE22K/X7sYTYNqEMMTZmFS8kTq6m8hXj+m1D8TgwgIbumHddJa9h4yl4GkKb8/bgAl2+g7eDgA==", - "dev": true, - "dependencies": { - "playwright": "1.43.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=16" - } + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "dev": true }, - "node_modules/@stylelint/postcss-css-in-js": { - "version": "0.37.3", - "resolved": "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.3.tgz", - "integrity": "sha512-scLk3cSH1H9KggSniseb2KNAU5D9FWc3H7BxCSAIdtU9OWIyw0zkEZ9qEKHryRM+SExYXRKNb7tOOVNAsQ3iwg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@babel/core": "^7.17.9" - }, - "peerDependencies": { - "postcss": ">=7.0.0", - "postcss-syntax": ">=0.36.2" - } + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true }, - "node_modules/@stylelint/postcss-markdown": { - "version": "0.36.2", - "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz", - "integrity": "sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==", - "deprecated": "Use the original unforked package instead: postcss-markdown", + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, "dependencies": { - "remark": "^13.0.0", - "unist-util-find-all-after": "^3.0.2" - }, - "peerDependencies": { - "postcss": ">=7.0.0", - "postcss-syntax": ">=0.36.2" + "@types/connect": "*", + "@types/node": "*" } }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" + "@types/node": "*" } }, "node_modules/@types/cacheable-request": { @@ -1907,14 +2151,33 @@ } }, "node_modules/@types/chart.js": { - "version": "2.9.37", - "resolved": "https://registry.npmjs.org/@types/chart.js/-/chart.js-2.9.37.tgz", - "integrity": "sha512-9bosRfHhkXxKYfrw94EmyDQcdjMaQPkU1fH2tDxu8DWXxf1mjzWQAV4laJF51ZbC2ycYwNDvIm1rGez8Bug0vg==", + "version": "2.9.41", + "resolved": "https://registry.npmjs.org/@types/chart.js/-/chart.js-2.9.41.tgz", + "integrity": "sha512-3dvkDvueckY83UyUXtJMalYoH6faOLkWQoaTlJgB4Djde3oORmNP0Jw85HtzTuXyliUHcdp704s0mZFQKio/KQ==", "dev": true, "dependencies": { "moment": "^2.10.2" } }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, "node_modules/@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", @@ -1922,18 +2185,18 @@ "dev": true }, "node_modules/@types/cors": { - "version": "2.8.13", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", - "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/d3": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.0.tgz", - "integrity": "sha512-jIfNVK0ZlxcuRDKtRS/SypEyOQ6UHaFQBKv032X45VvxSJ6Yi5G9behy9h6tNTHTDGh5Vq+KbmBjUWLgY4meCA==", + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", "dev": true, "dependencies": { "@types/d3-array": "*", @@ -1969,45 +2232,45 @@ } }, "node_modules/@types/d3-array": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.6.tgz", - "integrity": "sha512-NHkizg870sKYQn45oZT5ItoHqcgRgJD7KAiWZp4Udc6YdrFH2W0tZ2vv4shRHP+SXHoJ1G8B4I1GWb5oQSGypA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", "dev": true }, "node_modules/@types/d3-axis": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.3.tgz", - "integrity": "sha512-SE3x/pLO/+GIHH17mvs1uUVPkZ3bHquGzvZpPAh4yadRy71J93MJBpgK/xY8l9gT28yTN1g9v3HfGSFeBMmwZw==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", "dev": true, "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-brush": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.3.tgz", - "integrity": "sha512-MQ1/M/B5ifTScHSe5koNkhxn2mhUPqXjGuKjjVYckplAPjP9t2I2sZafb/YVHDwhoXWZoSav+Q726eIbN3qprA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", "dev": true, "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-chord": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.3.tgz", - "integrity": "sha512-keuSRwO02c7PBV3JMWuctIfdeJrVFI7RpzouehvBWL4/GGUB3PBNg/9ZKPZAgJphzmS2v2+7vr7BGDQw1CAulw==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", "dev": true }, "node_modules/@types/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", "dev": true }, "node_modules/@types/d3-contour": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.3.tgz", - "integrity": "sha512-x7G/tdDZt4m09XZnG2SutbIuQqmkNYqR9uhDMdPlpJbcwepkEjEWG29euFcgVA1k6cn92CHdDL9Z+fOnxnbVQw==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", "dev": true, "dependencies": { "@types/d3-array": "*", @@ -2015,168 +2278,168 @@ } }, "node_modules/@types/d3-delaunay": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz", - "integrity": "sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", "dev": true }, "node_modules/@types/d3-dispatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.3.tgz", - "integrity": "sha512-Df7KW3Re7G6cIpIhQtqHin8yUxUHYAqiE41ffopbmU5+FifYUNV7RVyTg8rQdkEagg83m14QtS8InvNb95Zqug==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", + "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", "dev": true }, "node_modules/@types/d3-drag": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.3.tgz", - "integrity": "sha512-82AuQMpBQjuXeIX4tjCYfWjpm3g7aGCfx6dFlxX2JlRaiME/QWcHzBsINl7gbHCODA2anPYlL31/Trj/UnjK9A==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", "dev": true, "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-dsv": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.2.tgz", - "integrity": "sha512-DooW5AOkj4AGmseVvbwHvwM/Ltu0Ks0WrhG6r5FG9riHT5oUUTHz6xHsHqJSVU8ZmPkOqlUEY2obS5C9oCIi2g==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", "dev": true }, "node_modules/@types/d3-ease": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", - "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", "dev": true }, "node_modules/@types/d3-fetch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.3.tgz", - "integrity": "sha512-/EsDKRiQkby3Z/8/AiZq8bsuLDo/tYHnNIZkUpSeEHWV7fHUl6QFBjvMPbhkKGk9jZutzfOkGygCV7eR/MkcXA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", "dev": true, "dependencies": { "@types/d3-dsv": "*" } }, "node_modules/@types/d3-force": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.5.tgz", - "integrity": "sha512-EGG+IWx93ESSXBwfh/5uPuR9Hp8M6o6qEGU7bBQslxCvrdUBQZha/EFpu/VMdLU4B0y4Oe4h175nSm7p9uqFug==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", "dev": true }, "node_modules/@types/d3-format": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.1.tgz", - "integrity": "sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", "dev": true }, "node_modules/@types/d3-geo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.4.tgz", - "integrity": "sha512-kmUK8rVVIBPKJ1/v36bk2aSgwRj2N/ZkjDT+FkMT5pgedZoPlyhaG62J+9EgNIgUXE6IIL0b7bkLxCzhE6U4VQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", "dev": true, "dependencies": { "@types/geojson": "*" } }, "node_modules/@types/d3-hierarchy": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.3.tgz", - "integrity": "sha512-GpSK308Xj+HeLvogfEc7QsCOcIxkDwLhFYnOoohosEzOqv7/agxwvJER1v/kTC+CY1nfazR0F7gnHo7GE41/fw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", "dev": true }, "node_modules/@types/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", "dev": true, "dependencies": { "@types/d3-color": "*" } }, "node_modules/@types/d3-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", - "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==", "dev": true }, "node_modules/@types/d3-polygon": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.0.tgz", - "integrity": "sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", "dev": true }, "node_modules/@types/d3-quadtree": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.2.tgz", - "integrity": "sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", "dev": true }, "node_modules/@types/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", "dev": true }, "node_modules/@types/d3-scale": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.4.tgz", - "integrity": "sha512-eq1ZeTj0yr72L8MQk6N6heP603ubnywSDRfNpi5enouR112HzGLS6RIvExCzZTraFF4HdzNpJMwA/zGiMoHUUw==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", "dev": true, "dependencies": { "@types/d3-time": "*" } }, "node_modules/@types/d3-scale-chromatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", - "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz", + "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==", "dev": true }, "node_modules/@types/d3-selection": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.6.tgz", - "integrity": "sha512-2ACr96USZVjXR9KMD9IWi1Epo4rSDKnUtYn6q2SPhYxykvXTw9vR77lkFNruXVg4i1tzQtBxeDMx0oNvJWbF1w==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.10.tgz", + "integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==", "dev": true }, "node_modules/@types/d3-shape": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.2.tgz", - "integrity": "sha512-NN4CXr3qeOUNyK5WasVUV8NCSAx/CRVcwcb0BuuS1PiTqwIm6ABi1SyasLZ/vsVCFDArF+W4QiGzSry1eKYQ7w==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", + "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", "dev": true, "dependencies": { "@types/d3-path": "*" } }, "node_modules/@types/d3-time": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", - "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==", "dev": true }, "node_modules/@types/d3-time-format": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.0.tgz", - "integrity": "sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", "dev": true }, "node_modules/@types/d3-timer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", - "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", "dev": true }, "node_modules/@types/d3-transition": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.4.tgz", - "integrity": "sha512-512a4uCOjUzsebydItSXsHrPeQblCVk8IKjqCUmrlvBWkkVh3donTTxmURDo1YPwIVDh5YVwCAO6gR4sgimCPQ==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.8.tgz", + "integrity": "sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==", "dev": true, "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-zoom": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.4.tgz", - "integrity": "sha512-cqkuY1ah9ZQre2POqjSLcM8g40UVya/qwEUrNYP2/rCVljbmqKCVcv+ebvwhlI5azIbSEL7m+os6n+WlYA43aA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", "dev": true, "dependencies": { "@types/d3-interpolate": "*", @@ -2192,6 +2455,56 @@ "@types/ms": "*" } }, + "node_modules/@types/eslint": { + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, "node_modules/@types/extract-zip": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/@types/extract-zip/-/extract-zip-1.6.2.tgz", @@ -2208,9 +2521,9 @@ } }, "node_modules/@types/geojson": { - "version": "7946.0.10", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", - "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==", + "version": "7946.0.14", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", + "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==", "dev": true }, "node_modules/@types/glob": { @@ -2224,39 +2537,60 @@ } }, "node_modules/@types/hammerjs": { - "version": "2.0.41", - "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.41.tgz", - "integrity": "sha512-ewXv/ceBaJprikMcxCmWU1FKyMAQ2X7a9Gtmzw8fcg2kIePI1crERDM818W+XYrxqdBBOdlf2rm137bU+BltCA==", + "version": "2.0.45", + "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.45.tgz", + "integrity": "sha512-qkcUlZmX6c4J8q45taBKTL3p+LbITgyx7qhlPYOdOHZB7B31K0mXbP5YA7i7SgDeEGuI9MnumiKPEMrxg8j3KQ==", + "dev": true + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", "dev": true }, "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", "dev": true }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/inflection": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@types/inflection/-/inflection-1.13.0.tgz", - "integrity": "sha512-kZSETqAVS74XC/K3mPX/tbMEi/Zy1KP0Wc59dB1i5P72AHz4eSW+UIpzWxmQnDxipoKSX5eRgUXy+wUr+bY73g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@types/inflection/-/inflection-1.13.2.tgz", + "integrity": "sha512-VxXY8dNLrxn7nDvsud77K60uD3a9RSmKfa0k/N/zvP2G55R5/8DSO5Ferz3mQdlAo8jPnpQLilCx9rABdPHSVg==", "dev": true }, "node_modules/@types/jasmine": { - "version": "3.10.12", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.10.12.tgz", - "integrity": "sha512-t8aMY7ByoMCJycjhFTUL57QicS9/h+E67QfJsN67d2Haoqb/hhgYBEG+l3jGHeFu0vQ7/+p3t6hZ/3YPSnOTzw==", + "version": "3.10.18", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.10.18.tgz", + "integrity": "sha512-jOk52a1Kz+1oU5fNWwAcNe64/GsE7r/Q6ronwDox0D3ETo/cr4ICMQyeXrj7G6FPW1n8YjRoAZA2F0XBr6GicQ==", "dev": true }, "node_modules/@types/js-yaml": { - "version": "3.12.7", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-3.12.7.tgz", - "integrity": "sha512-S6+8JAYTE1qdsc9HMVsfY7+SgSuUU/Tp6TYTmITW0PZxiyIMvol3Gy//y69Wkhs0ti4py5qgR3uZH6uz/DNzJQ==", + "version": "3.12.10", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-3.12.10.tgz", + "integrity": "sha512-/Mtaq/wf+HxXpvhzFYzrzCqNRcA958sW++7JOFC8nPrZcvfi/TrzOaaGbvt27ltJB2NQbHVAg5a1wUCsyMH7NA==", "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/json5": { @@ -2280,14 +2614,11 @@ "integrity": "sha512-cPiXpOvPFDr2edMnOXlz3UBDApwUfR+cpizvxCy0n3vp9bz/qe8BWzHPIEFcy+ogUOyjKuCISgyq77ELZPmkkg==", "dev": true }, - "node_modules/@types/mdast": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", - "integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==", - "dev": true, - "dependencies": { - "@types/unist": "^2" - } + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true }, "node_modules/@types/minimatch": { "version": "5.1.2", @@ -2296,9 +2627,9 @@ "dev": true }, "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", "dev": true }, "node_modules/@types/ms": { @@ -2310,40 +2641,28 @@ "node_modules/@types/node": { "version": "18.11.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==" - }, - "node_modules/@types/node-fetch": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", - "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", - "dependencies": { - "@types/node": "*", - "form-data": "^3.0.0" - } + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "dev": true }, - "node_modules/@types/node-fetch/node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" + "@types/node": "*" } }, "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true }, "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "dev": true }, "node_modules/@types/plist": { @@ -2357,57 +2676,82 @@ "xmlbuilder": ">=11.0.1" } }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "node_modules/@types/proxyquire": { + "version": "1.3.31", + "resolved": "https://registry.npmjs.org/@types/proxyquire/-/proxyquire-1.3.31.tgz", + "integrity": "sha512-uALowNG2TSM1HNPMMOR0AJwv4aPYPhqB0xlEhkeRTMuto5hjoSPZkvgu1nbPUkz3gEPAHv4sy4DmKsurZiEfRQ==", "dev": true }, - "node_modules/@types/proxyquire": { - "version": "1.3.28", - "resolved": "https://registry.npmjs.org/@types/proxyquire/-/proxyquire-1.3.28.tgz", - "integrity": "sha512-SQaNzWQ2YZSr7FqAyPPiA3FYpux2Lqh3HWMZQk47x3xbMCqgC/w0dY3dw9rGqlweDDkrySQBcaScXWeR+Yb11Q==", + "node_modules/@types/qs": { + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true }, - "node_modules/@types/react": { - "version": "17.0.65", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.65.tgz", - "integrity": "sha512-oxur785xZYHvnI7TRS61dXbkIhDPnGfsXKv0cNXR/0ml4SipRIFpSMzA7HMEfOywFwJ5AOnPrXYTEiTRUQeGlQ==", + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", "dev": true, "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" + "@types/node": "*" } }, - "node_modules/@types/react-dom": { - "version": "17.0.20", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.20.tgz", - "integrity": "sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA==", + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, "dependencies": { - "@types/react": "^17" + "@types/mime": "^1", + "@types/node": "*" } }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "dev": true, "dependencies": { - "@types/node": "*" + "@types/express": "*" } }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", - "dev": true + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } }, - "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==" + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/strip-json-comments": { "version": "0.0.30", @@ -2416,29 +2760,15 @@ "dev": true }, "node_modules/@types/tinycolor2": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.3.tgz", - "integrity": "sha512-Kf1w9NE5HEgGxCRyIcRXR/ZYtDv0V8FVPtYHwLxl0O+maGX0erE77pQlD0gpP+/KByMZ87mOA79SjifhSB3PjQ==", + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.6.tgz", + "integrity": "sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==", "dev": true }, "node_modules/@types/triple-beam": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.2.tgz", - "integrity": "sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g==" - }, - "node_modules/@types/tunnel": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@types/tunnel/-/tunnel-0.0.3.tgz", - "integrity": "sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/unist": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.7.tgz", - "integrity": "sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==", - "dev": true + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" }, "node_modules/@types/verror": { "version": "1.10.10", @@ -2456,19 +2786,28 @@ "@types/node": "*" } }, + "node_modules/@types/ws": { + "version": "8.5.11", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.11.tgz", + "integrity": "sha512-4+q7P5h3SpJxaBft0Dzpbr6lmMaqh0Jr2tbhJZ/luAwvD7ohSCniYkwz/pLxuT2h0EOa6QADgJj1Ko+TzRfZ+w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/xml2js": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.11.tgz", - "integrity": "sha512-JdigeAKmCyoJUiQljjr7tQG3if9NkqGUgwEUqBvV0N7LM4HyQk7UXCnusRa1lnvXAEYJ8mw8GtZWioagNztOwA==", + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.14.tgz", + "integrity": "sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", "dev": true, "optional": true, "dependencies": { @@ -2551,39 +2890,6 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@typescript-eslint/utils": { "version": "5.27.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.27.1.tgz", @@ -2626,178 +2932,193 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, "dependencies": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", - "dev": true, - "dependencies": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "node_modules/@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", "dev": true }, - "node_modules/@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0" + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, - "node_modules/@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } } }, "node_modules/@xmldom/xmldom": { @@ -2858,6 +3179,15 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -2867,16 +3197,39 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "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==", + "node_modules/acorn-walk": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", "dev": true, "dependencies": { - "debug": "4" + "acorn": "^8.11.0" }, "engines": { - "node": ">= 6.0.0" + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk/node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" } }, "node_modules/aggregate-error": { @@ -2908,15 +3261,45 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, "peerDependencies": { - "ajv": ">=5.0.0" + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -2935,24 +3318,6 @@ "loader-utils": "^0.2.15" } }, - "node_modules/angular2-template-loader/node_modules/big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/angular2-template-loader/node_modules/emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/angular2-template-loader/node_modules/loader-utils": { "version": "0.2.17", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", @@ -3110,33 +3475,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/app-builder-lib/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/app-builder-lib/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/app-builder-lib/node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", @@ -3146,12 +3484,6 @@ "node": ">= 10.0.0" } }, - "node_modules/app-builder-lib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/append-transform": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", @@ -3175,12 +3507,6 @@ "diagnostic-channel-publishers": "0.4.4" } }, - "node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, "node_modules/archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", @@ -3214,62 +3540,39 @@ "node": ">=6.0" } }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -3288,35 +3591,18 @@ "node": ">=8" } }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz", - "integrity": "sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -3326,14 +3612,14 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -3344,14 +3630,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -3361,36 +3647,19 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.reduce": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", - "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", - "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" }, "engines": { @@ -3409,34 +3678,6 @@ "node": ">=0.10.0" } }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "dependencies": { - "object-assign": "^4.1.1", - "util": "0.10.3" - } - }, "node_modules/assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", @@ -3447,55 +3688,19 @@ "node": ">=0.8" } }, - "node_modules/assert/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", - "dev": true - }, - "node_modules/assert/node_modules/util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", - "dev": true, - "dependencies": { - "inherits": "2.0.1" - } - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" - }, - "node_modules/async-each": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", - "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, "node_modules/async-exit-hook": { "version": "2.0.1", @@ -3517,12 +3722,6 @@ "node": "^4.7 || >=6.9 || >=7.3" } }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, "node_modules/async-listener": { "version": "0.6.10", "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz", @@ -3546,7 +3745,8 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true }, "node_modules/at-least-node": { "version": "1.0.0", @@ -3557,51 +3757,14 @@ "node": ">= 4.0.0" } }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/autoprefixer": { - "version": "9.8.8", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", - "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "dependencies": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "picocolors": "^0.2.1", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" + "possible-typed-array-names": "^1.0.0" }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - }, - "node_modules/autoprefixer/node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -3610,9 +3773,9 @@ } }, "node_modules/axe-core": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz", - "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.9.1.tgz", + "integrity": "sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==", "dev": true, "engines": { "node": ">=4" @@ -3624,266 +3787,11 @@ "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", "dev": true }, - "node_modules/babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - } - }, - "node_modules/babel-code-frame/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-code-frame/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-code-frame/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-code-frame/node_modules/js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==", - "dev": true - }, - "node_modules/babel-code-frame/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-code-frame/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "dependencies": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - } - }, - "node_modules/babel-generator/node_modules/jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/babel-generator/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w==", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", - "dev": true, - "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "node_modules/babel-runtime/node_modules/regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "node_modules/babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg==", - "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "node_modules/babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA==", - "dev": true, - "dependencies": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - } - }, - "node_modules/babel-traverse/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/babel-traverse/node_modules/globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-traverse/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==", - "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "node_modules/babel-types/node_modules/to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true, - "bin": { - "babylon": "bin/babylon.js" - } - }, - "node_modules/bail": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -3924,30 +3832,23 @@ "integrity": "sha512-xoLQD8gmmR32MeuBHgH0Tzd5PuSZx71ZsbhVxOCRbgktZEPe4SQy7s9Z50uPp0F/f7iw2XmkHN2xkgbMfckMDA==" }, "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", "dev": true, "engines": { "node": "*" } }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "engines": { "node": ">=8" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bl": { @@ -3988,12 +3889,6 @@ "bluebird": "^3.5.5" } }, - "node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, "node_modules/body-parser": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", @@ -4045,18 +3940,14 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==", + "node_modules/bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", "dev": true, "dependencies": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" } }, "node_modules/boolbase": { @@ -4082,159 +3973,66 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "dev": true - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "node_modules/browserslist": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", + "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "caniuse-lite": "^1.0.30001640", + "electron-to-chromium": "^1.4.820", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "node_modules/browserify-sign/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "dependencies": { - "pako": "~1.0.5" - } - }, - "node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -4270,18 +4068,6 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, - "node_modules/buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "dev": true - }, "node_modules/builder-util": { "version": "24.13.1", "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.13.1.tgz", @@ -4319,6 +4105,18 @@ "node": ">=12.0.0" } }, + "node_modules/builder-util/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/builder-util/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -4391,6 +4189,20 @@ "node": ">=8" } }, + "node_modules/builder-util/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/builder-util/node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -4449,12 +4261,6 @@ "node": ">= 10.0.0" } }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", - "dev": true - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -4464,88 +4270,6 @@ "node": ">= 0.8" } }, - "node_modules/cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cacache/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/cacache/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/cacheable-lookup": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", @@ -4573,21 +4297,6 @@ "node": ">=8" } }, - "node_modules/cacheable-request/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/caching-transform": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", @@ -4618,14 +4327,29 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/caching-transform/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4641,13 +4365,13 @@ } }, "node_modules/camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "dev": true, "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" } }, "node_modules/camelcase": { @@ -4660,26 +4384,51 @@ } }, "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", + "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", "dev": true, "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" + "camelcase": "^6.3.0", + "map-obj": "^4.1.0", + "quick-lru": "^5.1.1", + "type-fest": "^1.2.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001522", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001522.tgz", - "integrity": "sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg==", + "version": "1.0.30001642", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz", + "integrity": "sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==", "dev": true, "funding": [ { @@ -4715,36 +4464,6 @@ "node": ">=4" } }, - "node_modules/character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/chart.js": { "version": "2.9.4", "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.9.4.tgz", @@ -4772,15 +4491,9 @@ } }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -4793,6 +4506,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -4807,9 +4523,9 @@ } }, "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, "engines": { "node": ">=6.0" @@ -4836,130 +4552,16 @@ "node": ">=8" } }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", "dev": true, "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" + "source-map": "~0.6.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/class-utils/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clean-css": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", - "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", - "dev": true, - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 4.0" + "node": ">= 10.0" } }, "node_modules/clean-stack": { @@ -4989,28 +4591,45 @@ } }, "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, - "node_modules/clone-regexp": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz", - "integrity": "sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==", + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, "dependencies": { - "is-regexp": "^2.0.0" + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" }, "engines": { "node": ">=6" } }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/clone-response": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", @@ -5044,19 +4663,6 @@ "semver": "bin/semver" } }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", - "dev": true, - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/color": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", @@ -5093,6 +4699,18 @@ "simple-swizzle": "^0.2.2" } }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, "node_modules/colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", @@ -5141,6 +4759,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -5180,12 +4799,6 @@ "node": ">=0.10.0" } }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -5348,21 +4961,6 @@ "node": ">=6" } }, - "node_modules/concurrently/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/concurrently/node_modules/p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", @@ -5490,9 +5088,9 @@ } }, "node_modules/config-file-ts/node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", "dev": true, "dependencies": { "cross-spawn": "^7.0.0", @@ -5506,31 +5104,29 @@ } }, "node_modules/config-file-ts/node_modules/glob": { - "version": "10.3.12", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", - "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.10.2" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/config-file-ts/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -5543,9 +5139,9 @@ } }, "node_modules/config-file-ts/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -5564,9 +5160,9 @@ } }, "node_modules/config-file-ts/node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", + "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -5592,9 +5188,9 @@ } }, "node_modules/connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "dev": true, "engines": { "node": ">=0.8" @@ -5615,18 +5211,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", - "dev": true - }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -5678,106 +5262,86 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true }, - "node_modules/copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "dependencies": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "node_modules/copy-concurrently/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/copy-webpack-plugin": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz", - "integrity": "sha512-MXyPCjdPVx5iiWyl40Va3JGh27bKzOTNY3NjUTrosD2q7dR/cLD0013uqJ3BpFbUjyONINjb6qI7nDIJujrMbA==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "dev": true, "dependencies": { - "cacache": "^15.0.5", - "fast-glob": "^3.2.4", - "find-cache-dir": "^3.3.1", - "glob-parent": "^5.1.1", - "globby": "^11.0.1", - "loader-utils": "^2.0.0", + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", "normalize-path": "^3.0.0", - "p-limit": "^3.0.2", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", - "webpack-sources": "^1.4.3" + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" + "webpack": "^5.1.0" } }, - "node_modules/copy-webpack-plugin/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=8.9.0" + "node": ">=10.13.0" } }, - "node_modules/copy-webpack-plugin/node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" } }, - "node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, - "hasInstallScript": true + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/core-js-pure": { - "version": "3.32.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.32.1.tgz", - "integrity": "sha512-f52QZwkFVDPf7UEQZGHKx6NYxsxmVGJe5DIvbzOdRMJlmT6yv0KDjR8rmy3ngr/t5wU54c7Sp/qIJH0ppbhVpQ==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.37.1.tgz", + "integrity": "sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA==", "dev": true, "hasInstallScript": true, "funding": { @@ -5804,19 +5368,19 @@ } }, "node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "dev": true, "dependencies": { "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", + "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", - "yaml": "^1.7.2" + "yaml": "^1.10.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/crc": { @@ -5829,49 +5393,12 @@ "buffer": "^5.1.0" } }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -5886,65 +5413,48 @@ "node": ">= 8" } }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "node_modules/css-functions-list": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz", + "integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==", "dev": true, - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, "engines": { - "node": "*" + "node": ">=12 || >=16" } }, "node_modules/css-loader": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.1.tgz", - "integrity": "sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", "dev": true, "dependencies": { - "camelcase": "^5.2.0", - "icss-utils": "^4.1.0", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.14", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^2.0.6", - "postcss-modules-scope": "^2.1.0", - "postcss-modules-values": "^2.0.0", - "postcss-value-parser": "^3.3.0", - "schema-utils": "^1.0.0" + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" }, "engines": { - "node": ">= 6.9.0" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.0.0" - } - }, - "node_modules/css-loader/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" }, - "engines": { - "node": ">= 4" + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/css-select": { @@ -5963,6 +5473,19 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, "node_modules/css-what": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", @@ -5987,12 +5510,6 @@ "node": ">=4" } }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "dev": true - }, "node_modules/custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", @@ -6007,16 +5524,10 @@ "node": ">=0.4.0" } }, - "node_modules/cyclist": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.2.tgz", - "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==", - "dev": true - }, "node_modules/d3": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.5.tgz", - "integrity": "sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", "dependencies": { "d3-array": "3", "d3-axis": "3", @@ -6221,9 +5732,9 @@ } }, "node_modules/d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", "dependencies": { "d3-array": "2.5.0 - 3" }, @@ -6298,9 +5809,9 @@ } }, "node_modules/d3-scale-chromatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", - "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", "dependencies": { "d3-color": "1 - 3", "d3-interpolate": "1 - 3" @@ -6391,6 +5902,57 @@ "node": ">=12" } }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/date-fns": { "version": "2.30.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", @@ -6417,9 +5979,9 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "dependencies": { "ms": "2.1.2" }, @@ -6499,23 +6061,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "dependencies": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -6540,16 +6085,15 @@ } }, "node_modules/default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dev": true, "dependencies": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" + "execa": "^5.0.0" }, "engines": { - "node": ">=6" + "node": ">= 10" } }, "node_modules/default-require-extensions": { @@ -6585,14 +6129,15 @@ "node": ">=10" } }, - "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -6601,95 +6146,45 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "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, - "dependencies": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/del/node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { - "array-uniq": "^1.0.1" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", - "dev": true, - "dependencies": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "node": ">= 0.4" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/globby/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/delaunator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", - "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", "dependencies": { - "robust-predicates": "^3.0.0" + "robust-predicates": "^3.0.2" } }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, "engines": { "node": ">=0.4.0" } @@ -6704,24 +6199,14 @@ } }, "node_modules/dependency-graph": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", - "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", "dev": true, "engines": { "node": ">= 0.6.0" } }, - "node_modules/des.js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", - "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -6732,31 +6217,10 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A==", - "dev": true, - "dependencies": { - "repeating": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/detect-libc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "engines": { "node": ">=8" } @@ -6806,23 +6270,6 @@ "node": ">=0.3.1" } }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, "node_modules/dir-compare": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", @@ -6963,29 +6410,16 @@ "node": ">=8" } }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, "node_modules/dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", - "dev": true, - "dependencies": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, "dependencies": { - "buffer-indexof": "^1.0.0" + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" } }, "node_modules/doctrine": { @@ -7035,16 +6469,6 @@ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true, - "engines": { - "node": ">=0.4", - "npm": ">=1.2" - } - }, "node_modules/domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", @@ -7091,6 +6515,16 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/dotenv": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", @@ -7106,18 +6540,6 @@ "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", "dev": true }, - "node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -7154,9 +6576,9 @@ } }, "node_modules/electron": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/electron/-/electron-29.3.1.tgz", - "integrity": "sha512-auge1/6RVqgUd6TgIq88wKdUCJi2cjESi3jy7d+6X4JzvBGprKBqMJ8JSSFpu/Px1YJrFUKAxfy6SC+TQf1uLw==", + "version": "29.4.5", + "resolved": "https://registry.npmjs.org/electron/-/electron-29.4.5.tgz", + "integrity": "sha512-DlEuzGbWBYl1Qr0qUYgNZdoixJg4YGHy2HC6fkRjSXSlb01UrQ5ORi8hNLzelzyYx8rNQyyE3zDUuk9EnZwYuA==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -7228,20 +6650,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/electron-builder/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/electron-builder/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -7302,41 +6710,14 @@ } }, "node_modules/electron-builder/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { "node": ">= 10.0.0" } }, - "node_modules/electron-builder/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-builder/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, "node_modules/electron-publish": { "version": "24.13.1", "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.13.1.tgz", @@ -7452,9 +6833,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.500", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.500.tgz", - "integrity": "sha512-P38NO8eOuWOKY1sQk5yE0crNtrjgjJj6r3NrbIKtG18KzCHmHE2Bt+aQA7/y0w3uYsHWxDa6icOohzjLJ4vJ4A==", + "version": "1.4.829", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.829.tgz", + "integrity": "sha512-5qp1N2POAfW0u1qGAxXEtz6P7bO1m6gpZr5hdf5ve6lxpLM7MpiM4jIPz7xcrNlClQMafbyUDDWjlIQZ1Mw0Rw==", "dev": true }, "node_modules/electron-updater": { @@ -7524,48 +6905,18 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/electron-updater/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/electron-updater/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/electron-updater/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "engines": { "node": ">= 10.0.0" } }, - "node_modules/electron-updater/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/electron/node_modules/@types/node": { - "version": "20.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", - "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "version": "20.14.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", + "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -7591,21 +6942,6 @@ "@types/yauzl": "^2.9.1" } }, - "node_modules/electron/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/element-resize-detector": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/element-resize-detector/-/element-resize-detector-1.2.4.tgz", @@ -7614,27 +6950,6 @@ "batch-processor": "1.0.0" } }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, "node_modules/emitter-listener": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", @@ -7650,12 +6965,12 @@ "dev": true }, "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==", "dev": true, "engines": { - "node": ">= 4" + "node": ">= 0.10" } }, "node_modules/enabled": { @@ -7681,9 +6996,9 @@ } }, "node_modules/engine.io": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.2.tgz", - "integrity": "sha512-IXsMcGpw/xRfjra46sVZVHiSWo/nJ/3g1337q9KNXtS6YRzbW5yIzTCb9DjhrBe7r3GZQR0I4+nq+4ODk5g/cA==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", + "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", "dev": true, "dependencies": { "@types/cookie": "^0.4.1", @@ -7695,25 +7010,25 @@ "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", - "ws": "~8.11.0" + "ws": "~8.17.1" }, "engines": { "node": ">=10.2.0" } }, "node_modules/engine.io-parser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", - "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "dev": true, "engines": { "node": ">=10.0.0" } }, "node_modules/enhanced-resolve": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.7.0.tgz", - "integrity": "sha512-6njwt/NsZFUKhM6j9U8hzVyD4E4r0x7NQzhTCbcWOJ0IQjNSAoalWmb0AE51Wn+fwan5qVESWi7t2ToBxs9vrw==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", + "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -7737,10 +7052,16 @@ } }, "node_modules/ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "dev": true + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.1.tgz", + "integrity": "sha512-QHuXVeZx9d+tIQAz/XztU0ZwZf2Agg9CcXcgE1rurqvdBeDBrpSwjl8/6XUqMg7tw2Y7uAdKb2sRv+bSEFqQ5A==", + "dev": true, + "dependencies": { + "punycode": "^1.4.1" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/entities": { "version": "2.2.0", @@ -7760,24 +7081,24 @@ "node": ">=6" } }, + "node_modules/envinfo": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", + "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/err-code": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "dev": true }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -7787,50 +7108,57 @@ } }, "node_modules/es-abstract": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", - "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.1", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.1", - "get-symbol-description": "^1.0.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "safe-array-concat": "^1.0.0", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.10" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -7839,33 +7167,66 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-array-method-boxes-properly": { + "node_modules/es-define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { @@ -7905,9 +7266,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true, "engines": { "node": ">=6" @@ -8017,9 +7378,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -8055,28 +7416,28 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.28.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", - "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.findlastindex": "^1.2.2", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", + "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.8.0", - "has": "^1.0.3", - "is-core-module": "^2.13.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.6", - "object.groupby": "^1.0.0", - "object.values": "^1.1.6", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" @@ -8128,6 +7489,15 @@ "node": "*" } }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/eslint-plugin-jsdoc": { "version": "37.9.7", "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-37.9.7.tgz", @@ -8162,39 +7532,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-jsdoc/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-plugin-jsdoc/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-plugin-jsdoc/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/eslint-plugin-prefer-arrow": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", @@ -8364,9 +7701,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -8387,18 +7724,6 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -8411,21 +7736,6 @@ "node": "*" } }, - "node_modules/eslint/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint/node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -8462,12 +7772,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/espree": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", @@ -8504,9 +7808,9 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -8586,150 +7890,101 @@ "node": ">=0.8.x" } }, - "node_modules/eventsource": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", - "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", - "dev": true, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/execa/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "node": ">=10" }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/execa/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/execa/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, "engines": { - "node": ">=4" - } - }, - "node_modules/execa/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/execa/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" + "node": ">=10" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/execa/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" + "node": ">=6" } }, - "node_modules/execall": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz", - "integrity": "sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==", + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dev": true, "dependencies": { - "clone-regexp": "^2.1.0" + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" }, "engines": { - "node": ">=8" + "node": ">= 0.10.0" } }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "node_modules/express/node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "dev": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/expand-brackets/node_modules/debug": { + "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", @@ -8738,287 +7993,40 @@ "ms": "2.0.0" } }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "node_modules/express/node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, "dependencies": { - "is-descriptor": "^0.1.0" + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/expand-brackets/node_modules/extend-shallow": { + "node_modules/express/node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/express/node_modules/statuses": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", - "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "node_modules/express/node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/express/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/express/node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, "engines": { "node": ">= 0.8" @@ -9030,71 +8038,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/extract-zip": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", @@ -9150,9 +8093,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -9182,19 +8125,46 @@ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, - "engines": { - "node": ">= 4.9.1" - } + "node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "dev": true + }, + "node_modules/fast-xml-parser": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.0.tgz", + "integrity": "sha512-kLY3jFlwIYwBNDojclKsNAC12sfD6NwW74QB2CoNGPvtVxjliYehVunB3HYyNi+n4Tt1dAcgwYvmKF/Z18flqg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -9225,12 +8195,6 @@ "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" }, - "node_modules/figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -9243,36 +8207,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/file-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz", - "integrity": "sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==", - "dev": true, - "dependencies": { - "loader-utils": "^1.0.2", - "schema-utils": "^1.0.0" - }, - "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "webpack": "^4.0.0" - } - }, - "node_modules/file-loader/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, "node_modules/file-stream-rotator": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.4.1.tgz", @@ -9281,13 +8215,6 @@ "moment": "^2.11.2" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, "node_modules/filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", @@ -9319,9 +8246,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -9406,6 +8333,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/find-cache-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -9428,164 +8364,23 @@ "micromatch": "^4.0.2" } }, - "node_modules/findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/findup-sync/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/findup-sync/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" + "bin": { + "flat": "cli.js" } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { @@ -9596,6 +8391,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.1.3" @@ -9608,21 +8404,11 @@ } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, - "node_modules/flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, "node_modules/fn.name": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", @@ -9634,9 +8420,9 @@ "integrity": "sha512-yo/njtk/BB4Z2euzaZe3CZrg4u5s5uEi7ZwbHBJS2quHx51N0mmcx9nTIiImUGlgy+vf26d0CcQluahBBBL/Fw==" }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true, "funding": [ { @@ -9670,15 +8456,6 @@ "is-callable": "^1.1.3" } }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", @@ -9693,26 +8470,31 @@ } }, "node_modules/fork-ts-checker-webpack-plugin": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-5.2.1.tgz", - "integrity": "sha512-SVi+ZAQOGbtAsUWrZvGzz38ga2YqjWvca1pXQFUArIVXqli0lLoDQ8uS0wg0kSpcwpZmaW5jVCZXQebkyUQSsw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz", + "integrity": "sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "cosmiconfig": "^6.0.0", + "@babel/code-frame": "^7.16.7", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cosmiconfig": "^7.0.1", "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "memfs": "^3.1.2", + "fs-extra": "^10.0.0", + "memfs": "^3.4.1", "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" + "node-abort-controller": "^3.0.1", + "schema-utils": "^3.1.1", + "semver": "^7.3.5", + "tapable": "^2.2.1" }, "engines": { - "node": ">=10", + "node": ">=12.13.0", "yarn": ">=1.0.0" + }, + "peerDependencies": { + "typescript": ">3.6.0", + "webpack": "^5.11.0" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { @@ -9769,18 +8551,17 @@ } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, "dependencies": { - "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { @@ -9804,18 +8585,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -9829,38 +8598,23 @@ } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">= 8.9.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -9873,34 +8627,20 @@ "node": ">=8" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { "node": ">= 10.0.0" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -9919,18 +8659,6 @@ "node": ">= 0.6" } }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", - "dev": true, - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -9940,16 +8668,6 @@ "node": ">= 0.6" } }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, "node_modules/fromentries": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", @@ -9976,14 +8694,17 @@ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, "node_modules/fs-extra": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", - "integrity": "sha512-wYid1zXctNLgas1pZ8q8ChdsnGg4DHZVqMzJ7pOE85q5BppAEXgQGSoOjVgrcw5yI7pzz49p9AfMhM7z5PRuaw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.2", + "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" } }, "node_modules/fs-minipass": { @@ -9998,33 +8719,39 @@ "node": ">= 8" } }, - "node_modules/fs-monkey": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", - "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", - "dev": true - }, - "node_modules/fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/fs-monkey": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", + "dev": true + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "hasInstallScript": true, "optional": true, "os": [ @@ -10035,21 +8762,24 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -10092,15 +8822,19 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10123,38 +8857,30 @@ "npm-conf": "~1.1.3" } }, - "node_modules/get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "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": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -10163,15 +8889,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", @@ -10181,6 +8898,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -10207,6 +8925,12 @@ "node": ">= 6" } }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, "node_modules/glob/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -10245,42 +8969,6 @@ "node": ">=10.0" } }, - "node_modules/global-agent/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/global-agent/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "optional": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/global-agent/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "optional": true - }, "node_modules/global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", @@ -10329,12 +9017,13 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -10364,9 +9053,9 @@ } }, "node_modules/globby/node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" @@ -10378,21 +9067,6 @@ "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", "dev": true }, - "node_modules/gonzales-pe": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", - "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "gonzales": "bin/gonzales.js" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -10464,39 +9138,6 @@ "node": ">=6" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -10515,21 +9156,21 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, "engines": { "node": ">= 0.4" @@ -10551,12 +9192,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -10565,113 +9206,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", - "dev": true, - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/has-values/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash-base/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, "node_modules/hasha": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", @@ -10697,6 +9231,18 @@ "node": ">=8" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -10706,29 +9252,6 @@ "he": "bin/he" } }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dev": true, - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/hosted-git-info": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", @@ -10772,10 +9295,20 @@ } }, "node_modules/html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", - "dev": true + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] }, "node_modules/html-escaper": { "version": "2.0.2", @@ -10783,33 +9316,27 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "node_modules/html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", - "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", "dev": true, "dependencies": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" }, "bin": { - "html-minifier": "cli.js" + "html-minifier-terser": "cli.js" }, "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/html-minifier/node_modules/commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - }, "node_modules/html-tags": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", @@ -10823,64 +9350,35 @@ } }, "node_modules/html-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", - "integrity": "sha512-Br4ifmjQojUP4EmHnRBoUIYcZ9J7M4bTMcm7u6xoIAIuq2Nte4TzXX0533owvkQKQD1WeMTTTyD4Ni4QKxS0Bg==", - "deprecated": "3.x is no longer supported", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", "dev": true, "dependencies": { - "html-minifier": "^3.2.3", - "loader-utils": "^0.2.16", - "lodash": "^4.17.3", - "pretty-error": "^2.0.2", - "tapable": "^1.0.0", - "toposort": "^1.0.0", - "util.promisify": "1.0.0" + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" }, "engines": { - "node": ">=6.9" + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" }, "peerDependencies": { - "webpack": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" - } - }, - "node_modules/html-webpack-plugin/node_modules/big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/html-webpack-plugin/node_modules/emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/html-webpack-plugin/node_modules/loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==", - "dev": true, - "dependencies": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - }, - "node_modules/html-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true, - "engines": { - "node": ">=6" + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/htmlparser2": { @@ -10960,168 +9458,51 @@ } }, "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "dev": true, - "dependencies": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dev": true, "dependencies": { - "is-extendable": "^0.1.0" + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "node": ">=12.0.0" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" + "peerDependencies": { + "@types/express": "^4.17.13" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/http-proxy-middleware/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } } }, - "node_modules/http-proxy-middleware/node_modules/is-number": { + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "node": ">=10" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/http2-wrapper": { @@ -11137,24 +9518,6 @@ "node": ">=10.19.0" } }, - "node_modules/http2-wrapper/node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", - "dev": true - }, "node_modules/https-proxy-agent": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", @@ -11186,6 +9549,15 @@ "ms": "^2.1.1" } }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, "node_modules/iconv-corefoundation": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", @@ -11214,22 +9586,16 @@ "node": ">=0.10.0" } }, - "node_modules/icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", - "dev": true - }, "node_modules/icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true, - "dependencies": { - "postcss": "^7.0.14" - }, "engines": { - "node": ">= 6" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, "node_modules/ieee754": { @@ -11251,12 +9617,6 @@ } ] }, - "node_modules/iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==", - "dev": true - }, "node_modules/ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -11300,94 +9660,24 @@ } }, "node_modules/import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "dependencies": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" }, "bin": { "import-local-fixture": "fixtures/cli.js" }, "engines": { - "node": ">=6" - } - }, - "node_modules/import-local/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/import-local/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/import-local/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-local/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/import-local/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-local/node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -11405,12 +9695,6 @@ "node": ">=8" } }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, "node_modules/inflection": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", @@ -11423,6 +9707,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -11439,9 +9724,9 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "node_modules/inline-source-map": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "integrity": "sha512-0mVWSSbNDvedDWIN4wxLsdPM4a7cIPcpyMxj3QZ406QRwQ6ePGB1YIHxVPjqpcUGbWQ5C+nHTwGNWAGvt7ggVA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.3.tgz", + "integrity": "sha512-1aVsPEsJWMJq/pdMU61CDlm1URcW702MTB4w9/zUjMus6H/Py8o7g68Pr9D4I6QluWGt/KdmswuRhaA05xVR1w==", "dev": true, "dependencies": { "source-map": "~0.5.3" @@ -11456,27 +9741,14 @@ "node": ">=0.10.0" } }, - "node_modules/internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dev": true, - "dependencies": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -11492,100 +9764,31 @@ } }, "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", - "dev": true - }, - "node_modules/ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, "engines": { - "node": ">=4" + "node": ">=10.13.0" } }, "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", "dev": true, "engines": { - "node": ">= 0.10" + "node": ">= 10" } }, - "node_modules/is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "dev": true, - "dependencies": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -11594,20 +9797,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -11652,29 +9841,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -11700,27 +9866,33 @@ } }, "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", "dev": true, "dependencies": { - "kind-of": "^6.0.0" + "is-typed-array": "^1.1.13" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-date-object": { @@ -11738,30 +9910,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "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", @@ -11777,18 +9925,6 @@ "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", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -11797,18 +9933,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -11829,20 +9953,10 @@ "node": ">=0.10.0" } }, - "node_modules/is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -11883,39 +9997,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "dependencies": { - "is-path-inside": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "dependencies": { - "path-is-inside": "^1.0.2" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -11926,13 +10007,10 @@ } }, "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, "engines": { "node": ">=0.10.0" } @@ -11953,22 +10031,16 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-regexp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz", - "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12016,12 +10088,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "dependencies": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -12036,18 +10108,6 @@ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -12113,42 +10173,15 @@ "node": ">=0.10.0" } }, - "node_modules/istanbul-instrumenter-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz", - "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==", - "dev": true, - "dependencies": { - "convert-source-map": "^1.5.0", - "istanbul-lib-instrument": "^1.7.3", - "loader-utils": "^1.1.0", - "schema-utils": "^0.3.0" - }, - "engines": { - "node": ">= 4.8 < 5.0.0 || >= 5.10" - }, - "peerDependencies": { - "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0" - } - }, - "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": "sha512-QaVYBaD9U8scJw2EBWnCBY+LJ0AD+/2edTaigDs0XLDLBfJmSUK9KGqktg1rb32U3z4j/XwvFwHHH1YfbYFd7Q==", + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, - "dependencies": { - "ajv": "^5.0.0" - }, "engines": { - "node": ">= 4.3 < 5.0.0 || >= 5.10" + "node": ">=8" } }, - "node_modules/istanbul-lib-coverage": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", - "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", - "dev": true - }, "node_modules/istanbul-lib-hook": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", @@ -12162,27 +10195,28 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", - "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "dependencies": { - "babel-generator": "^6.18.0", - "babel-template": "^6.16.0", - "babel-traverse": "^6.18.0", - "babel-types": "^6.18.0", - "babylon": "^6.18.0", - "istanbul-lib-coverage": "^1.2.1", - "semver": "^5.3.0" + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { - "semver": "bin/semver" + "semver": "bin/semver.js" } }, "node_modules/istanbul-lib-processinfo": { @@ -12202,31 +10236,11 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-processinfo/node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/istanbul-lib-processinfo/node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.1.3" @@ -12261,27 +10275,6 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-report/node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/istanbul-lib-report/node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -12297,21 +10290,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/istanbul-lib-report/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -12324,12 +10302,6 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-report/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", @@ -12344,19 +10316,10 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-source-maps/node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -12367,16 +10330,13 @@ } }, "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -12385,9 +10345,9 @@ } }, "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", + "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", "dev": true, "dependencies": { "async": "^3.2.3", @@ -12541,6 +10501,44 @@ "integrity": "sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA==", "dev": true }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/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-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/js-string-escape": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", @@ -12620,12 +10618,36 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/json-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", + "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/json-stable-stringify/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -12654,51 +10676,36 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/jsonwebtoken": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", - "integrity": "sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", "dependencies": { "jws": "^3.2.2", - "lodash": "^4.17.21", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", "ms": "^2.1.1", - "semver": "^7.3.8" + "semver": "^7.5.4" }, "engines": { "node": ">=12", "npm": ">=6" } }, - "node_modules/jsonwebtoken/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jsonwebtoken/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jsonwebtoken/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/jwa": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", @@ -12719,9 +10726,9 @@ } }, "node_modules/karma": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.2.tgz", - "integrity": "sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ==", + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.3.tgz", + "integrity": "sha512-LuucC/RE92tJ8mlCwqEoRWXP38UMAqpnq98vktmS9SznSoUPPUJQbc91dHcxcunROvfQjdORVA/YFviH+Xci9Q==", "dev": true, "dependencies": { "@colors/colors": "1.5.0", @@ -12743,7 +10750,7 @@ "qjobs": "^1.2.0", "range-parser": "^1.2.1", "rimraf": "^3.0.2", - "socket.io": "^4.4.1", + "socket.io": "^4.7.2", "source-map": "^0.6.1", "tmp": "^0.2.1", "ua-parser-js": "^0.7.30", @@ -12804,31 +10811,6 @@ "concat-map": "0.0.1" } }, - "node_modules/karma-coverage/node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/karma-coverage/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/karma-coverage/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -12904,9 +10886,9 @@ } }, "node_modules/karma-jasmine/node_modules/jasmine-core": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.0.tgz", - "integrity": "sha512-O236+gd0ZXS8YAjFx8xKaJ94/erqUliEkJTDedyE7iHvv4ZVqi+q+8acJxu05/WJDKm512EUNn809In37nWlAQ==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.1.tgz", + "integrity": "sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==", "dev": true }, "node_modules/karma-junit-reporter": { @@ -12979,42 +10961,35 @@ } }, "node_modules/karma-webpack": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-5.0.0.tgz", - "integrity": "sha512-+54i/cd3/piZuP3dr54+NcFeKOPnys5QeM1IY+0SPASwrtHsliXUiCL50iW+K9WWA7RvamC4macvvQ86l3KtaA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-5.0.1.tgz", + "integrity": "sha512-oo38O+P3W2mSPCSUrQdySSPv1LvPpXP+f+bBimNomS5sW+1V4SuhCuW8TfJzV+rDv921w2fDSDw0xJbPe6U+kQ==", "dev": true, "dependencies": { "glob": "^7.1.3", - "minimatch": "^3.0.4", + "minimatch": "^9.0.3", "webpack-merge": "^4.1.5" }, "engines": { - "node": ">= 6" + "node": ">= 18" }, "peerDependencies": { "webpack": "^5.0.0" } }, - "node_modules/karma-webpack/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/karma-webpack/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/karma/node_modules/brace-expansion": { @@ -13027,6 +11002,17 @@ "concat-map": "0.0.1" } }, + "node_modules/karma/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, "node_modules/karma/node_modules/isbinaryfile": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", @@ -13067,6 +11053,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.1.3" @@ -13078,6 +11065,24 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/karma/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/keypress": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.1.0.tgz", @@ -13100,20 +11105,14 @@ "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" }, "node_modules/keyv": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "dependencies": { "json-buffer": "3.0.1" } }, - "node_modules/killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -13132,19 +11131,10 @@ "graceful-fs": "^4.1.11" } }, - "node_modules/klona": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/klona/-/klona-1.1.2.tgz", - "integrity": "sha512-xf88rTeHiXk+XE2Vhi6yj8Wm3gMZrygGdKjJqN8HkV+PwF/t50/LdAKHoHpPcxFAlmQszTZ1CugrK25S7qDRLA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/known-css-properties": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.21.0.tgz", - "integrity": "sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==", + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz", + "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==", "dev": true }, "node_modules/kuler": { @@ -13152,6 +11142,16 @@ "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" }, + "node_modules/launch-editor": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.0.tgz", + "integrity": "sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, "node_modules/lazy-val": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", @@ -13204,26 +11204,21 @@ } }, "node_modules/loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" + "node": ">=6.11.5" } }, "node_modules/loader-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, "engines": { - "node": ">=4.0.0" + "node": ">= 12.13.0" } }, "node_modules/locate-path": { @@ -13254,11 +11249,41 @@ "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", "dev": true }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, "node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, "node_modules/lodash.memoize": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", @@ -13271,6 +11296,11 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", @@ -13306,59 +11336,38 @@ } }, "node_modules/logform": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz", - "integrity": "sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.1.tgz", + "integrity": "sha512-CdaO738xRapbKIMVn2m4F6KTj4j7ooJ8POVnebSgKo3KBz5axNXRAL7ZdRjIV6NOr2Uf4vjtRkxrFETOioCqSA==", "dependencies": { - "@colors/colors": "1.5.0", + "@colors/colors": "1.6.0", "@types/triple-beam": "^1.3.2", "fecha": "^4.2.0", "ms": "^2.1.1", "safe-stable-stringify": "^2.3.1", "triple-beam": "^1.3.0" - } - }, - "node_modules/loglevel": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", - "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==", - "dev": true, - "engines": { - "node": ">= 0.6.0" }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" + "engines": { + "node": ">= 12.0.0" } }, - "node_modules/longest-streak": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", - "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/logform/node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "engines": { + "node": ">=0.1.90" } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "dev": true, "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" + "tslib": "^2.0.3" } }, - "node_modules/lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", - "dev": true - }, "node_modules/lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", @@ -13420,15 +11429,6 @@ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/map-obj": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", @@ -13441,18 +11441,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", - "dev": true, - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/matcher": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", @@ -13489,75 +11477,25 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "engines": { + "node": ">= 0.6" } }, - "node_modules/mdast-util-from-markdown": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", - "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-string": "^2.0.0", - "micromark": "~2.11.0", - "parse-entities": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", - "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "longest-streak": "^2.0.0", - "mdast-util-to-string": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.0.0", - "zwitch": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, "dependencies": { "fs-monkey": "^1.0.4" @@ -13566,52 +11504,42 @@ "node": ">= 4.0.0" } }, - "node_modules/memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", - "dev": true, - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, "node_modules/meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", + "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", "dev": true, "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", + "@types/minimist": "^1.2.2", + "camelcase-keys": "^7.0.0", + "decamelize": "^5.0.0", "decamelize-keys": "^1.1.0", "hard-rejection": "^2.1.0", "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" + "normalize-package-data": "^3.0.2", + "read-pkg-up": "^8.0.0", + "redent": "^4.0.0", + "trim-newlines": "^4.0.2", + "type-fest": "^1.2.2", + "yargs-parser": "^20.2.9" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/meow/node_modules/decamelize": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", + "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/meow/node_modules/normalize-package-data": { @@ -13629,43 +11557,40 @@ "node": ">=10" } }, - "node_modules/meow/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/meow/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "dev": true, - "engines": { - "node": ">=10" - }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "node_modules/merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "dependencies": { + "source-map": "^0.6.1" + } }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, "node_modules/merge2": { @@ -13686,58 +11611,19 @@ "node": ">= 0.6" } }, - "node_modules/micromark": { - "version": "2.11.4", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", - "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "debug": "^4.0.0", - "parse-entities": "^2.0.0" - } - }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" } }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, "node_modules/mime": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", @@ -13754,6 +11640,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -13762,6 +11649,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -13769,6 +11657,15 @@ "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -13788,44 +11685,23 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz", - "integrity": "sha512-IuaLjruM0vMKhUUT51fQdQzBYTX49dLj8w68ALEAe2A4iYNpIC4eMac67mt3NzycvjOlf07/kYxJDc0RTl1Wqw==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz", + "integrity": "sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==", "dev": true, "dependencies": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" }, "engines": { - "node": ">= 6.9.0 <7.0.0 || >= 8.9.0" + "node": ">= 12.13.0" }, - "peerDependencies": { - "webpack": "^4.4.0" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "peerDependencies": { + "webpack": "^5.0.0" } }, "node_modules/minimalistic-assert": { @@ -13834,12 +11710,6 @@ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "dev": true - }, "node_modules/minimatch": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", @@ -13875,70 +11745,37 @@ } }, "node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, "engines": { "node": ">=8" } }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, "dependencies": { - "minipass": "^3.0.0" + "minipass": "^3.0.0", + "yallist": "^4.0.0" }, "engines": { "node": ">= 8" } }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { - "minipass": "^3.0.0", "yallist": "^4.0.0" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, "node_modules/minizlib/node_modules/yallist": { @@ -13971,40 +11808,6 @@ "node": ">= 0.6.x" } }, - "node_modules/mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "dependencies": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -14028,9 +11831,9 @@ "dev": true }, "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "engines": { "node": "*" } @@ -14041,18 +11844,36 @@ "integrity": "sha512-B/y4+b2O5G2gjuxIFtCE2EkM17R2NM7/3F8x0qcPsqy4V83bitJTIO4TIeZpYlzu/xy6INiY/+84BEm6+7Cmzg==" }, "node_modules/monaco-editor-webpack-plugin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/monaco-editor-webpack-plugin/-/monaco-editor-webpack-plugin-6.0.0.tgz", - "integrity": "sha512-vC886Mzpd2AkSM35XLkfQMjH+Ohz6RISVwhAejDUzZDheJAiz6G34lky1vyO8fZ702v7IrcKmsGwL1rRFnwvUA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/monaco-editor-webpack-plugin/-/monaco-editor-webpack-plugin-7.1.0.tgz", + "integrity": "sha512-ZjnGINHN963JQkFqjjcBtn1XBtUATDZBMgNQhDQwd78w2ukRhFXAPNgWuacaQiDZsUr4h1rWv5Mv6eriKuOSzA==", "dev": true, "dependencies": { - "loader-utils": "^2.0.0" + "loader-utils": "^2.0.2" }, "peerDependencies": { - "monaco-editor": "0.30.x", + "monaco-editor": ">= 0.31.0", "webpack": "^4.5.0 || 5.x" } }, + "node_modules/monaco-editor-webpack-plugin/node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/monaco-editor-webpack-plugin/node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/monaco-editor-webpack-plugin/node_modules/loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", @@ -14067,83 +11888,40 @@ "node": ">=8.9.0" } }, - "node_modules/move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", - "dev": true, - "dependencies": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "node_modules/move-concurrently/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "dev": true, "dependencies": { - "dns-packet": "^1.3.1", + "dns-packet": "^5.2.2", "thunky": "^1.0.2" }, "bin": { "multicast-dns": "cli.js" } }, - "node_modules/multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==", - "dev": true - }, - "node_modules/nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, - "optional": true - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, "node_modules/napi-build-utils": { @@ -14172,19 +11950,14 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "node_modules/no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "dev": true, "dependencies": { - "lower-case": "^1.1.1" + "lower-case": "^2.0.2", + "tslib": "^2.0.3" } }, "node_modules/node-abi": { @@ -14203,6 +11976,12 @@ "semver": "bin/semver" } }, + "node_modules/node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", + "dev": true + }, "node_modules/node-addon-api": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", @@ -14221,25 +12000,6 @@ "node": ">=14.18" } }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -14248,54 +12008,6 @@ "node": ">= 6.13.0" } }, - "node_modules/node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "dependencies": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - } - }, - "node_modules/node-libs-browser/node_modules/buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "node_modules/node-libs-browser/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true - }, "node_modules/node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", @@ -14309,9 +12021,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.17.tgz", + "integrity": "sha512-Ww6ZlOiEQfPfXM45v17oabk77Z7mg5bOt7AjDyzy7RjK9OrLrLC8dyZQoAPEOtFX9SaNf1Tdvr5gRJWdTJj7GA==", "dev": true }, "node_modules/normalize-package-data": { @@ -14349,21 +12061,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-selector": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz", - "integrity": "sha512-dxvWdI8gw6eAvk9BlPffgEoGfM7AdijoCwOEJge3e3ulT2XLgmU7KvvxprOaCu05Q1uGRHmOhHe1r6emZoKyFw==", - "dev": true - }, "node_modules/normalize-url": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", @@ -14397,24 +12094,15 @@ } }, "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "dependencies": { - "path-key": "^2.0.0" + "path-key": "^3.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/nth-check": { @@ -14429,12 +12117,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==", - "dev": true - }, "node_modules/nyc": { "version": "15.1.0", "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", @@ -14514,15 +12196,6 @@ "node": ">=7.0.0" } }, - "node_modules/nyc/node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/nyc/node_modules/istanbul-lib-instrument": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", @@ -14553,18 +12226,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nyc/node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/nyc/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -14578,6 +12239,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.1.3" @@ -14589,6 +12251,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/nyc/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/nyc/node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -14653,97 +12324,6 @@ "node": ">=0.10.0" } }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", - "dev": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/object-copy/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-hash": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", @@ -14753,23 +12333,10 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, "engines": { "node": ">= 0.4" }, @@ -14786,26 +12353,14 @@ "node": ">= 0.4" } }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", - "dev": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -14817,14 +12372,15 @@ } }, "node_modules/object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -14833,58 +12389,29 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz", - "integrity": "sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ==", - "dev": true, - "dependencies": { - "array.prototype.reduce": "^1.0.5", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.21.2", - "safe-array-concat": "^1.0.0" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object.groupby": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.0.tgz", - "integrity": "sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.21.2", - "get-intrinsic": "^1.2.1" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "dependencies": { - "isobject": "^3.0.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -14936,6 +12463,21 @@ "fn.name": "1.x.x" } }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/open": { "version": "7.4.2", "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", @@ -14952,50 +12494,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dev": true, - "dependencies": { - "is-wsl": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/opn/node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", - "dev": true - }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -15014,25 +12529,16 @@ "node": ">=8" } }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "dependencies": { - "yocto-queue": "^0.1.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -15050,46 +12556,38 @@ "node": ">=8" } }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "aggregate-error": "^3.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "dev": true, "dependencies": { - "aggregate-error": "^3.0.0" + "@types/retry": "0.12.0", + "retry": "^0.13.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, - "dependencies": { - "retry": "^0.12.0" - }, "engines": { - "node": ">=6" + "node": ">= 4" } }, "node_modules/p-try": { @@ -15116,30 +12614,20 @@ "node": ">=8" } }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", "dev": true }, - "node_modules/parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "dependencies": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, "node_modules/param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "dev": true, "dependencies": { - "no-case": "^2.2.0" + "dot-case": "^3.0.4", + "tslib": "^2.0.3" } }, "node_modules/parent-module": { @@ -15154,37 +12642,6 @@ "node": ">=6" } }, - "node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "dev": true, - "dependencies": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -15203,15 +12660,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/parse5": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", @@ -15227,41 +12675,43 @@ "node": ">= 0.8" } }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, "node_modules/patch-package": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.5.1.tgz", - "integrity": "sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.0.tgz", + "integrity": "sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA==", "dev": true, "dependencies": { "@yarnpkg/lockfile": "^1.1.0", "chalk": "^4.1.2", - "cross-spawn": "^6.0.5", + "ci-info": "^3.7.0", + "cross-spawn": "^7.0.3", "find-yarn-workspace-root": "^2.0.0", "fs-extra": "^9.0.0", - "is-ci": "^2.0.0", + "json-stable-stringify": "^1.0.2", "klaw-sync": "^6.0.0", "minimist": "^1.2.6", "open": "^7.4.2", "rimraf": "^2.6.3", - "semver": "^5.6.0", + "semver": "^7.5.3", "slash": "^2.0.0", "tmp": "^0.0.33", - "yaml": "^1.10.2" + "yaml": "^2.2.2" }, "bin": { "patch-package": "index.js" }, "engines": { - "node": ">=10", + "node": ">=14", "npm": ">5" } }, @@ -15296,12 +12746,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/patch-package/node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, "node_modules/patch-package/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -15314,22 +12758,6 @@ "node": ">=7.0.0" } }, - "node_modules/patch-package/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, "node_modules/patch-package/node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -15354,18 +12782,6 @@ "node": ">=8" } }, - "node_modules/patch-package/node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, "node_modules/patch-package/node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -15378,45 +12794,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/patch-package/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/patch-package/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/patch-package/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/patch-package/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/patch-package/node_modules/slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", @@ -15451,38 +12828,26 @@ } }, "node_modules/patch-package/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { "node": ">= 10.0.0" } }, - "node_modules/patch-package/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/patch-package/node_modules/yaml": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, "bin": { - "which": "bin/which" + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", - "dev": true - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -15500,12 +12865,6 @@ "node": ">=0.10.0" } }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "dev": true - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -15522,38 +12881,26 @@ "dev": true }, "node_modules/path-scurry": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", - "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/path-to-regexp": { "version": "0.1.7", @@ -15575,31 +12922,15 @@ "resolved": "https://registry.npmjs.org/patternomaly/-/patternomaly-1.3.2.tgz", "integrity": "sha512-70UhA5+ZrnNgdfDBKXIGbMHpP+naTzfx9vPT4KwIdhtWWs0x6FWZRJQMXXhV2jcK0mxl28FA/2LPAKArNG058Q==" }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" }, "node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, "node_modules/picomatch": { @@ -15621,27 +12952,6 @@ "node": ">=6" } }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "dev": true, - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -15655,33 +12965,47 @@ } }, "node_modules/playwright": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.43.1.tgz", - "integrity": "sha512-V7SoH0ai2kNt1Md9E3Gwas5B9m8KR2GVvwZnAI6Pg0m3sh7UvgiYhRrhsziCmqMJNouPckiOhk8T+9bSAK0VIA==", + "version": "1.45.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.45.2.tgz", + "integrity": "sha512-ReywF2t/0teRvNBpfIgh5e4wnrI/8Su8ssdo5XsQKpjxJj+jspm00jSoz9BTg91TT0c9HRjXO7LBNVrgYj9X0g==", "dev": true, "dependencies": { - "playwright-core": "1.43.1" + "playwright-core": "1.45.2" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" }, "optionalDependencies": { "fsevents": "2.3.2" } }, "node_modules/playwright-core": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.43.1.tgz", - "integrity": "sha512-EI36Mto2Vrx6VF7rm708qSnesVQKbxEWvPrfA1IPY6HgczBplDx7ENtx+K2n4kJ41sLLkuGfmb0ZLSSXlDhqPg==", + "version": "1.45.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.45.2.tgz", + "integrity": "sha512-ha175tAWb0dTK0X4orvBIqi3jGEt701SMxMhyujxNrgd8K0Uy5wMSwwcQHtyB4om7INUkfndx02XnQ2p6dvLDw==", "dev": true, "bin": { "playwright-core": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/plist": { @@ -15698,290 +13022,154 @@ "node": ">=10.4.0" } }, - "node_modules/portfinder": { - "version": "1.0.32", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", - "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "dev": true, - "dependencies": { - "async": "^2.6.4", - "debug": "^3.2.7", - "mkdirp": "^0.5.6" - }, "engines": { - "node": ">= 0.12.0" + "node": ">= 0.4" } }, - "node_modules/portfinder/node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "node_modules/postcss": { + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "lodash": "^4.17.14" + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" } }, - "node_modules/portfinder/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "dev": true, - "dependencies": { - "ms": "^2.1.1" + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/portfinder/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", "dev": true, "dependencies": { - "minimist": "^1.2.6" + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", - "dev": true, "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "node_modules/postcss-modules-scope": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", "dev": true, "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" + "postcss-selector-parser": "^6.0.4" }, "engines": { - "node": ">=6.0.0" + "node": "^10 || ^12 || >= 14" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/postcss-html": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.36.0.tgz", - "integrity": "sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==", + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, "dependencies": { - "htmlparser2": "^3.10.0" + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" }, "peerDependencies": { - "postcss": ">=5.0.0", - "postcss-syntax": ">=0.36.0" + "postcss": "^8.1.0" } }, - "node_modules/postcss-html/node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", + "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==", + "dev": true + }, + "node_modules/postcss-safe-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", + "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" } }, - "node_modules/postcss-html/node_modules/dom-serializer/node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "node_modules/postcss-scss": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", + "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", "dev": true, "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, { "type": "github", - "url": "https://github.com/sponsors/fb55" + "url": "https://github.com/sponsors/ai" } - ] - }, - "node_modules/postcss-html/node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/postcss-html/node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "node_modules/postcss-html/node_modules/domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "dependencies": { - "domelementtype": "1" - } - }, - "node_modules/postcss-html/node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/postcss-html/node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "node_modules/postcss-html/node_modules/htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dev": true, - "dependencies": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "node_modules/postcss-html/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss-less": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz", - "integrity": "sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==", - "dev": true, - "dependencies": { - "postcss": "^7.0.14" - }, - "engines": { - "node": ">=6.14.4" - } - }, - "node_modules/postcss-media-query-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", - "dev": true - }, - "node_modules/postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "dev": true, - "dependencies": { - "postcss": "^7.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz", - "integrity": "sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==", - "dev": true, - "dependencies": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0", - "postcss-value-parser": "^3.3.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss-modules-scope": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", - "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", - "dev": true, - "dependencies": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss-modules-values": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz", - "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==", - "dev": true, - "dependencies": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^7.0.6" - } - }, - "node_modules/postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==", - "dev": true - }, - "node_modules/postcss-safe-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz", - "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==", - "dev": true, - "dependencies": { - "postcss": "^7.0.26" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-sass": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.4.4.tgz", - "integrity": "sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==", - "dev": true, - "dependencies": { - "gonzales-pe": "^4.3.0", - "postcss": "^7.0.21" - } - }, - "node_modules/postcss-scss": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz", - "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==", - "dev": true, - "dependencies": { - "postcss": "^7.0.6" - }, - "engines": { - "node": ">=6.0.0" + ], + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.4.29" } }, "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", + "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -15991,25 +13179,16 @@ "node": ">=4" } }, - "node_modules/postcss-syntax": { - "version": "0.36.2", - "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz", - "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==", - "dev": true, - "peerDependencies": { - "postcss": ">=5.0.0" - } - }, "node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, "node_modules/prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", + "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", @@ -16031,21 +13210,10 @@ "node": ">=10" } }, - "node_modules/prebuild-install/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/prebuild-install/node_modules/node-abi": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz", - "integrity": "sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==", + "version": "3.65.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.65.0.tgz", + "integrity": "sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==", "dependencies": { "semver": "^7.3.5" }, @@ -16053,25 +13221,6 @@ "node": ">=10" } }, - "node_modules/prebuild-install/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prebuild-install/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -16097,21 +13246,13 @@ } }, "node_modules/pretty-error": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", - "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", "dev": true, "dependencies": { "lodash": "^4.17.20", - "renderkid": "^2.0.4" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" + "renderkid": "^3.0.0" } }, "node_modules/process-nextick-args": { @@ -16140,12 +13281,6 @@ "node": ">=0.4.0" } }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, "node_modules/promise-retry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", @@ -16177,6 +13312,15 @@ "node": ">= 0.10" } }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/proxyquire": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.3.tgz", @@ -16188,32 +13332,6 @@ "resolve": "^1.11.1" } }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -16223,35 +13341,11 @@ "once": "^1.3.1" } }, - "node_modules/pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "node_modules/pumpify/node_modules/pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true }, "node_modules/qjobs": { "version": "1.2.0", @@ -16277,21 +13371,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -16313,12 +13392,15 @@ ] }, "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/randombytes": { @@ -16330,16 +13412,6 @@ "safe-buffer": "^5.1.0" } }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -16376,36 +13448,6 @@ "node": ">=0.10.0" } }, - "node_modules/raw-loader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-1.0.0.tgz", - "integrity": "sha512-Uqy5AqELpytJTRxYT4fhltcKPj0TyaEpzJDcGz7DFJi+pQOOi3GjR/DOdxTkTsF+NzhnldIoG6TORaBlInUuqA==", - "dev": true, - "dependencies": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" - }, - "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "webpack": "^4.3.0" - } - }, - "node_modules/raw-loader/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -16470,53 +13512,126 @@ } }, "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", + "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", "dev": true, "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "find-up": "^5.0.0", + "read-pkg": "^6.0.0", + "type-fest": "^1.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg-up/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg-up/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, + "node_modules/read-pkg-up/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, "engines": { - "node": ">=8" + "node": ">=10" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/read-pkg": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", + "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg/node_modules/parse-json": { @@ -16571,52 +13686,67 @@ "node": ">=8.10.0" } }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" + "resolve": "^1.20.0" }, "engines": { - "node": ">=8" + "node": ">= 10.13.0" } }, - "node_modules/reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" - }, - "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", - "dev": true - }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "node_modules/redent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", + "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", "dev": true, "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" + "indent-string": "^5.0.0", + "strip-indent": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/redent/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/reflect-metadata": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", + "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==" + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -16667,115 +13797,17 @@ "node": ">=4" } }, - "node_modules/remark": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz", - "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==", - "dev": true, - "dependencies": { - "remark-parse": "^9.0.0", - "remark-stringify": "^9.0.0", - "unified": "^9.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", - "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", - "dev": true, - "dependencies": { - "mdast-util-from-markdown": "^0.8.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", - "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", - "dev": true, - "dependencies": { - "mdast-util-to-markdown": "^0.6.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "dev": true - }, "node_modules/renderkid": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", - "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", "dev": true, "dependencies": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", "htmlparser2": "^6.1.0", "lodash": "^4.17.21", - "strip-ansi": "^3.0.1" - } - }, - "node_modules/renderkid/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/renderkid/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", - "dev": true, - "dependencies": { - "is-finite": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "strip-ansi": "^6.0.1" } }, "node_modules/require-directory": { @@ -16818,9 +13850,9 @@ "dev": true }, "node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { "is-core-module": "^2.13.0", @@ -16841,79 +13873,24 @@ "dev": true }, "node_modules/resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==", - "dev": true, - "dependencies": { - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-dir/node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" + "resolve-from": "^5.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/resolve-dir/node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-dir/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" + "node": ">=8" } }, "node_modules/resolve-from": { @@ -16925,13 +13902,6 @@ "node": ">=4" } }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true - }, "node_modules/responselike": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", @@ -16944,15 +13914,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, "node_modules/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", @@ -16973,15 +13934,16 @@ } }, "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true }, "node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.1.3" @@ -16990,16 +13952,6 @@ "rimraf": "bin.js" } }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, "node_modules/roarr": { "version": "2.15.4", "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", @@ -17019,9 +13971,9 @@ } }, "node_modules/roarr/node_modules/sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", "dev": true, "optional": true }, @@ -17053,15 +14005,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", - "dev": true, - "dependencies": { - "aproba": "^1.1.1" - } - }, "node_modules/rw": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", @@ -17084,13 +14027,13 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/safe-array-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", - "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -17126,25 +14069,19 @@ } ] }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", - "dev": true, - "dependencies": { - "ret": "~0.1.10" - } - }, "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -17172,9 +14109,9 @@ } }, "node_modules/sass": { - "version": "1.66.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.66.1.tgz", - "integrity": "sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA==", + "version": "1.77.8", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.8.tgz", + "integrity": "sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -17189,19 +14126,15 @@ } }, "node_modules/sass-loader": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-9.0.3.tgz", - "integrity": "sha512-fOwsP98ac1VMme+V3+o0HaaMHp8Q/C9P+MUazLFVi3Jl7ORGHQXL1XeRZt3zLSGZQQPC8xE42Y2WptItvGjDQg==", + "version": "13.3.3", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.3.tgz", + "integrity": "sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA==", "dev": true, "dependencies": { - "klona": "^1.1.2", - "loader-utils": "^2.0.0", - "neo-async": "^2.6.2", - "schema-utils": "^2.7.0", - "semver": "^7.3.2" + "neo-async": "^2.6.2" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", @@ -17209,9 +14142,10 @@ }, "peerDependencies": { "fibers": ">= 3.1.0", - "node-sass": "^4.0.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", - "webpack": "^4.36.0 || ^5.0.0" + "sass-embedded": "*", + "webpack": "^5.0.0" }, "peerDependenciesMeta": { "fibers": { @@ -17222,103 +14156,76 @@ }, "sass": { "optional": true + }, + "sass-embedded": { + "optional": true } } }, - "node_modules/sass-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "node_modules/sass/node_modules/immutable": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", + "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==", + "dev": true + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" + }, + "node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/sass-loader/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/sass-loader/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 8.9.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, - "node_modules/sass-loader/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, - "engines": { - "node": ">=10" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/sass-loader/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/sass/node_modules/immutable": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.3.tgz", - "integrity": "sha512-808ZFYMsIRAjLAu5xkKo0TsbY9LBy9H5MazTKIEHerNkg0ymgilGfBPMR/3G7d/ihGmuK2Hw8S1izY2d3kd3wA==", - "dev": true - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" + "fast-deep-equal": "^3.1.3" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "peerDependencies": { + "ajv": "^8.8.2" } }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -17326,29 +14233,27 @@ "dev": true }, "node_modules/selfsigned": { - "version": "1.10.14", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz", - "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "dev": true, "dependencies": { - "node-forge": "^0.10.0" - } - }, - "node_modules/selfsigned/node_modules/node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", - "dev": true, + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, "engines": { - "node": ">= 6.0.0" + "node": ">=10" } }, "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/semver-compare": { @@ -17454,9 +14359,9 @@ } }, "node_modules/serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "dependencies": { "randombytes": "^2.1.0" @@ -17552,65 +14457,54 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "dependencies": { - "is-extendable": "^0.1.0" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "kind-of": "^6.0.2" }, - "bin": { - "sha.js": "bin.js" + "engines": { + "node": ">=8" } }, "node_modules/shebang-command": { @@ -17634,20 +14528,33 @@ "node": ">=8" } }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/shimmer": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -17726,39 +14633,6 @@ "node": ">=10" } }, - "node_modules/simple-update-notifier/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/simple-update-notifier/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -17823,398 +14697,143 @@ "npm": ">= 3.0.0" } }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "node_modules/socket.io": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", + "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", "dev": true, "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" }, "engines": { - "node": ">=0.10.0" + "node": ">=10.2.0" } }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "node_modules/socket.io-adapter": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", "dev": true, "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" + "debug": "~4.3.4", + "ws": "~8.17.1" } }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "dev": true, "dependencies": { - "is-descriptor": "^1.0.0" + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=10.0.0" } }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" } }, - "node_modules/snapdragon-util/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "node_modules/source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha512-liJwHPI9x9d9w5WSIjM58MqGmmb7XzNqwdUA3kSBQ4lmDngexlKwawGzK3J1mKXi6+sysoMDlpVyZh9sv5vRfw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "dev": true + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true + }, + "node_modules/spawn-command": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", + "dev": true + }, + "node_modules/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, "dependencies": { - "kind-of": "^3.0.2" + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "node_modules/spawn-wrap/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "dependencies": { - "is-buffer": "^1.1.5" + "semver": "^6.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/snapdragon/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/snapdragon/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/socket.io": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.2.tgz", - "integrity": "sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==", - "dev": true, - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "cors": "~2.8.5", - "debug": "~4.3.2", - "engine.io": "~6.5.2", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", - "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", - "dev": true, - "dependencies": { - "ws": "~8.11.0" - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", - "dev": true, - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/sockjs-client": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.1.tgz", - "integrity": "sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "eventsource": "^2.0.2", - "faye-websocket": "^0.11.4", - "inherits": "^2.0.4", - "url-parse": "^1.5.10" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://tidelift.com/funding/github/npm/sockjs-client" - } - }, - "node_modules/sockjs-client/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha512-liJwHPI9x9d9w5WSIjM58MqGmmb7XzNqwdUA3kSBQ4lmDngexlKwawGzK3J1mKXi6+sysoMDlpVyZh9sv5vRfw==", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead", - "dev": true - }, - "node_modules/spawn-command": { - "version": "0.0.2-1", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", - "dev": true - }, - "node_modules/spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/spawn-wrap/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/spawn-wrap/node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.1.3" @@ -18226,6 +14845,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/spawn-wrap/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -18237,9 +14865,9 @@ } }, "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true }, "node_modules/spdx-expression-parse": { @@ -18253,9 +14881,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", + "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", "dev": true }, "node_modules/spdy": { @@ -18302,44 +14930,11 @@ "node": ">= 6" } }, - "node_modules/specificity": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", - "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", - "dev": true, - "bin": { - "specificity": "bin/specificity" - } - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, - "node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "dev": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/stack-chain": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-1.3.7.tgz", @@ -18362,190 +14957,35 @@ "node": ">= 6" } }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", "dev": true, "dependencies": { - "is-descriptor": "^0.1.0" + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8.0" } }, - "node_modules/static-extend/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/static-extend/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "node_modules/stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "node_modules/streamroller": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", - "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", - "dev": true, - "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "fs-extra": "^8.1.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/streamroller/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.1.0" } }, "node_modules/string_decoder/node_modules/safe-buffer": { @@ -18583,14 +15023,15 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -18600,28 +15041,31 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -18660,25 +15104,28 @@ "node": ">=4" } }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", "dev": true, "dependencies": { - "min-indent": "^1.0.0" + "min-indent": "^1.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/strip-json-comments": { @@ -18689,31 +15136,25 @@ "node": ">=0.10.0" } }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, "node_modules/style-loader": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", - "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", "dev": true, - "dependencies": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" - }, "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/style-loader/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "node": ">= 12.13.0" }, - "engines": { - "node": ">= 4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" } }, "node_modules/style-search": { @@ -18723,85 +15164,68 @@ "dev": true }, "node_modules/stylelint": { - "version": "13.13.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.13.1.tgz", - "integrity": "sha512-Mv+BQr5XTUrKqAXmpqm6Ddli6Ief+AiPZkRsIrAoUKFuq/ElkUh9ZMYxXD0iQNZ5ADghZKLOWz1h7hTClB7zgQ==", + "version": "15.11.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.11.0.tgz", + "integrity": "sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==", "dev": true, "dependencies": { - "@stylelint/postcss-css-in-js": "^0.37.2", - "@stylelint/postcss-markdown": "^0.36.2", - "autoprefixer": "^9.8.6", + "@csstools/css-parser-algorithms": "^2.3.1", + "@csstools/css-tokenizer": "^2.2.0", + "@csstools/media-query-list-parser": "^2.1.4", + "@csstools/selector-specificity": "^3.0.0", "balanced-match": "^2.0.0", - "chalk": "^4.1.1", - "cosmiconfig": "^7.0.0", - "debug": "^4.3.1", - "execall": "^2.0.0", - "fast-glob": "^3.2.5", - "fastest-levenshtein": "^1.0.12", - "file-entry-cache": "^6.0.1", - "get-stdin": "^8.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^8.2.0", + "css-functions-list": "^3.2.1", + "css-tree": "^2.3.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.1", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^7.0.0", "global-modules": "^2.0.0", - "globby": "^11.0.3", + "globby": "^11.1.0", "globjoin": "^0.1.4", - "html-tags": "^3.1.0", - "ignore": "^5.1.8", + "html-tags": "^3.3.1", + "ignore": "^5.2.4", "import-lazy": "^4.0.0", "imurmurhash": "^0.1.4", - "known-css-properties": "^0.21.0", - "lodash": "^4.17.21", - "log-symbols": "^4.1.0", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.29.0", "mathml-tag-names": "^2.1.3", - "meow": "^9.0.0", - "micromatch": "^4.0.4", - "normalize-selector": "^0.2.0", - "postcss": "^7.0.35", - "postcss-html": "^0.36.0", - "postcss-less": "^3.1.4", - "postcss-media-query-parser": "^0.2.3", + "meow": "^10.1.5", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.28", "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^4.0.2", - "postcss-sass": "^0.4.4", - "postcss-scss": "^2.1.1", - "postcss-selector-parser": "^6.0.5", - "postcss-syntax": "^0.36.2", - "postcss-value-parser": "^4.1.0", + "postcss-safe-parser": "^6.0.0", + "postcss-selector-parser": "^6.0.13", + "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", - "slash": "^3.0.0", - "specificity": "^0.4.1", - "string-width": "^4.2.2", - "strip-ansi": "^6.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", "style-search": "^0.1.0", - "sugarss": "^2.0.0", + "supports-hyperlinks": "^3.0.0", "svg-tags": "^1.0.0", - "table": "^6.6.0", - "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^3.0.3" + "table": "^6.8.1", + "write-file-atomic": "^5.0.1" }, "bin": { - "stylelint": "bin/stylelint.js" + "stylelint": "bin/stylelint.mjs" }, "engines": { - "node": ">=10.13.0" + "node": "^14.13.1 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/stylelint" } }, - "node_modules/stylelint/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/stylelint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "node_modules/stylelint/node_modules/balanced-match": { "version": "2.0.0", @@ -18809,90 +15233,65 @@ "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", "dev": true }, - "node_modules/stylelint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/stylelint/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/stylelint/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" + "url": "https://github.com/sponsors/d-fischer" }, - "engines": { - "node": ">=7.0.0" + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/stylelint/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "node_modules/stylelint/node_modules/file-entry-cache": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.2.tgz", + "integrity": "sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==", "dev": true, "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "flat-cache": "^3.2.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/stylelint/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": ">=12.0.0" } }, "node_modules/stylelint/node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" } }, - "node_modules/stylelint/node_modules/log-symbols": { + "node_modules/stylelint/node_modules/js-yaml": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" + "argparse": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/stylelint/node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, "node_modules/stylelint/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -18902,25 +15301,29 @@ "node": ">=8" } }, - "node_modules/stylelint/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==", + "node_modules/stylelint/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/sugarss": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz", - "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==", + "node_modules/stylelint/node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "dev": true, "dependencies": { - "postcss": "^7.0.2" + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/sumchecker": { @@ -18946,9 +15349,43 @@ "node": ">=4" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "node_modules/supports-hyperlinks": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", + "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/supports-hyperlinks/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/supports-hyperlinks/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/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, "engines": { @@ -18965,9 +15402,9 @@ "dev": true }, "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", + "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", "dev": true, "dependencies": { "ajv": "^8.0.1", @@ -18981,15 +15418,15 @@ } }, "node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -19056,9 +15493,9 @@ } }, "node_modules/tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, "dependencies": { "chownr": "^2.0.0", @@ -19116,15 +15553,6 @@ "node": ">= 6" } }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/tar/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -19177,230 +15605,87 @@ } }, "node_modules/terser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", - "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "version": "5.31.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.3.tgz", + "integrity": "sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==", "dev": true, "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" }, "engines": { - "node": ">=6.0.0" + "node": ">=10" } }, "node_modules/terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", - "dev": true, - "dependencies": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "webpack": "^4.0.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "dependencies": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "node_modules/terser-webpack-plugin/node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/terser-webpack-plugin/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" + "node": ">= 10.13.0" }, - "engines": { - "node": ">=6" - } - }, - "node_modules/terser-webpack-plugin/node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/terser-webpack-plugin/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, - "engines": { - "node": ">=6" - } - }, - "node_modules/terser-webpack-plugin/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" + "peerDependencies": { + "webpack": "^5.1.0" }, - "bin": { - "mkdirp": "bin/cmd.js" + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } } }, - "node_modules/terser-webpack-plugin/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">=6" + "node": ">= 10.13.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser-webpack-plugin/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/terser-webpack-plugin/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/terser-webpack-plugin/node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "node_modules/terser/node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">= 4" - } - }, - "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "dependencies": { - "figgy-pudding": "^3.5.1" - } - }, - "node_modules/terser-webpack-plugin/node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "node": ">=0.4.0" } }, - "node_modules/terser-webpack-plugin/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -19454,49 +15739,24 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, - "node_modules/timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, - "dependencies": { - "setimmediate": "^1.0.4" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/tinycolor2": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==" }, "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "dev": true, - "dependencies": { - "rimraf": "^3.0.0" - }, "engines": { - "node": ">=8.17.0" + "node": ">=14.14" } }, "node_modules/tmp-promise": { @@ -19508,27 +15768,6 @@ "tmp": "^0.2.0" } }, - "node_modules/tmp/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/to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", - "dev": true - }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -19538,51 +15777,6 @@ "node": ">=4" } }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -19603,25 +15797,46 @@ "loader-utils": "^1.0.0" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "engines": { - "node": ">=0.6" + "node_modules/to-string-loader/node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" } }, - "node_modules/toposort": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", - "integrity": "sha512-FclLrw8b9bMWf4QlCJuHBEVhSRsqDj6u3nIjAzPeJvgl//1hBlffdlk0MALceL14+koWEdU4ofRAXofbODxQzg==", - "dev": true + "node_modules/to-string-loader/node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "node_modules/to-string-loader/node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } }, "node_modules/tree-kill": { "version": "1.2.2", @@ -19633,21 +15848,15 @@ } }, "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", + "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/triple-beam": { @@ -19658,16 +15867,6 @@ "node": ">= 14.0.0" } }, - "node_modules/trough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/truncate-utf8-bytes": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", @@ -19678,234 +15877,157 @@ } }, "node_modules/ts-loader": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-5.4.5.tgz", - "integrity": "sha512-XYsjfnRQCBum9AMRZpk2rTYSVpdZBpZK+kDh0TeT3kxmQNBDVIeUjdPjY5RZry4eIAb8XHc4gYSUiUWPYvzSRw==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", "dev": true, "dependencies": { - "chalk": "^2.3.0", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^1.0.2", - "micromatch": "^3.1.4", - "semver": "^5.0.1" + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" }, "engines": { - "node": ">=6.11.5" + "node": ">=12.0.0" }, "peerDependencies": { - "typescript": "*" + "typescript": "*", + "webpack": "^5.0.0" } }, - "node_modules/ts-loader/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "node_modules/ts-loader/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": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ts-loader/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" + "node": ">=8" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/ts-loader/node_modules/enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "node_modules/ts-loader/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": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/ts-loader/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "node": ">=10" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/ts-loader/node_modules/fill-range/node_modules/extend-shallow": { + "node_modules/ts-loader/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ts-loader/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/ts-loader/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ts-loader/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ts-loader/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ts-loader/node_modules/memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "color-name": "~1.1.4" }, "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" + "node": ">=7.0.0" } }, - "node_modules/ts-loader/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "node_modules/ts-loader/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, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ts-loader/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" + "node": ">=8" } }, - "node_modules/ts-loader/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "node_modules/ts-loader/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, "engines": { - "node": ">=6" + "node": ">= 8" } }, - "node_modules/ts-loader/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "node_modules/ts-loader/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": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/ts-node": { - "version": "8.10.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz", - "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==", - "dev": true, - "dependencies": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", "arg": "^4.1.0", + "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", - "source-map-support": "^0.5.17", + "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "bin": { "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js", "ts-script": "dist/bin-script-deprecated.js" }, - "engines": { - "node": ">=6.0.0" - }, "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "dependencies": { "@types/json5": "^0.0.29", @@ -19915,9 +16037,9 @@ } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -19940,20 +16062,6 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "node_modules/tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==", - "dev": true - }, - "node_modules/tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" - } - }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -19999,29 +16107,30 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -20031,16 +16140,17 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -20050,14 +16160,20 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -20091,9 +16207,9 @@ } }, "node_modules/ua-parser-js": { - "version": "0.7.35", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", - "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==", + "version": "0.7.38", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.38.tgz", + "integrity": "sha512-fYmIy7fKTSFAhG3fuPlubeGaMoAd6r0rSnfEsO5nEY55i26KSLt9EH7PLQiiqPUhNqYIJvSkTy1oArIcXAbPbA==", "dev": true, "funding": [ { @@ -20103,34 +16219,16 @@ { "type": "paypal", "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" } ], "engines": { "node": "*" } }, - "node_modules/uglify-js": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", - "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", - "dev": true, - "dependencies": { - "commander": "~2.19.0", - "source-map": "~0.6.1" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/uglify-js/node_modules/commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true - }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -20152,191 +16250,28 @@ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true }, - "node_modules/unified": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", - "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", - "dev": true, - "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unified/node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, "engines": { - "node": ">=8" + "node": ">= 4.0.0" } }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/union-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, - "node_modules/unist-util-find-all-after": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz", - "integrity": "sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==", - "dev": true, - "dependencies": { - "unist-util-is": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", - "dev": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", - "dev": true, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, "funding": [ { @@ -20353,8 +16288,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -20363,18 +16298,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/update-browserslist-db/node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", - "dev": true - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -20384,115 +16307,26 @@ "punycode": "^2.1.0" } }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true - }, - "node_modules/url": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.1.tgz", - "integrity": "sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==", - "dev": true, - "dependencies": { - "punycode": "^1.4.1", - "qs": "^6.11.0" - } - }, - "node_modules/url-loader": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", - "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", - "dev": true, - "dependencies": { - "loader-utils": "^1.1.0", - "mime": "^2.0.3", - "schema-utils": "^1.0.0" - }, - "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "webpack": "^3.0.0 || ^4.0.0" - } - }, - "node_modules/url-loader/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, "node_modules/utf8-byte-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", "dev": true }, - "node_modules/util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "dependencies": { - "inherits": "2.0.3" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "node_modules/util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "node_modules/util/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, "node_modules/utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", @@ -20522,6 +16356,12 @@ "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", "dev": true }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -20538,1656 +16378,347 @@ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, "engines": { - "node": ">= 0.8" - } - }, - "node_modules/verror": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", - "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", - "dev": true, - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true, - "optional": true - }, - "node_modules/vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "node_modules/void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - }, - "optionalDependencies": { - "chokidar": "^3.4.1", - "watchpack-chokidar2": "^2.0.1" - } - }, - "node_modules/watchpack-chokidar2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", - "dev": true, - "optional": true, - "dependencies": { - "chokidar": "^2.1.8" - } - }, - "node_modules/watchpack-chokidar2/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "optional": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/watchpack-chokidar2/node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dev": true, - "optional": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "optional": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "optional": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", - "dev": true, - "optional": true, - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" - } - }, - "node_modules/watchpack-chokidar2/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "optional": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "optional": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, - "engines": { - "node": ">= 4.0" - } - }, - "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": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", - "dev": true, - "optional": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", - "dev": true, - "optional": true, - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", - "dev": true, - "optional": true, - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true, - "optional": true - }, - "node_modules/watchpack-chokidar2/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "optional": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "optional": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "optional": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/watchpack-chokidar2/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "optional": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/webpack": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", - "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.5.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - }, - "webpack-command": { - "optional": true - } - } - }, - "node_modules/webpack-cli": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", - "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.1", - "findup-sync": "^3.0.0", - "global-modules": "^2.0.0", - "import-local": "^2.0.0", - "interpret": "^1.4.0", - "loader-utils": "^1.4.0", - "supports-color": "^6.1.0", - "v8-compile-cache": "^2.1.1", - "yargs": "^13.3.2" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=6.11.5" - }, - "peerDependencies": { - "webpack": "4.x.x" - } - }, - "node_modules/webpack-cli/node_modules/ansi-regex": { - "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" - } - }, - "node_modules/webpack-cli/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/webpack-cli/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/webpack-cli/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/webpack-cli/node_modules/enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/webpack-cli/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-cli/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-cli/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-cli/node_modules/memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - }, - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - } - }, - "node_modules/webpack-cli/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webpack-cli/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-cli/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-cli/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-cli/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/webpack-cli/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-cli/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-cli/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-cli/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-cli/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-cli/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-cli/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/webpack-cli/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-cli/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/webpack-cli/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/webpack-cli/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/webpack-dev-middleware": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", - "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", - "dev": true, - "dependencies": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/webpack-dev-server": { - "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-community": "0.0.8", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.8", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "^0.3.21", - "sockjs-client": "^1.5.0", - "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 6.11.5" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/webpack-dev-server/node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dev": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", - "dev": true, - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" - } - }, - "node_modules/webpack-dev-server/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/webpack-dev-server/node_modules/cliui/node_modules/ansi-regex": { - "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" - } - }, - "node_modules/webpack-dev-server/node_modules/cliui/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, - "engines": { - "node": ">= 4.0" - } - }, - "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": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", - "dev": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", - "dev": true, - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-dev-server/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webpack-dev-server/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-dev-server/node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/webpack-dev-server/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/string-width/node_modules/ansi-regex": { - "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" - } - }, - "node_modules/webpack-dev-server/node_modules/string-width/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/ansi-regex": { - "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" - } - }, - "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "dev": true, - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/webpack-dev-server/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/webpack-dev-server/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/webpack-inline-manifest-plugin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/webpack-inline-manifest-plugin/-/webpack-inline-manifest-plugin-4.0.1.tgz", - "integrity": "sha512-A6VRqhSDEUsqf6bJmrfNDmlVr+nkI2gfPsRC2/VorUeRMqyrSVvT7ltOjUcIG0VIigTNAcN2LbE83YwFH8VTHg==", - "dev": true, - "dependencies": { - "source-map-url": "0.4.0" - } - }, - "node_modules/webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "dependencies": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/webpack-log/node_modules/ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-log/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/webpack-merge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", - "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", - "dev": true, - "dependencies": { - "lodash": "^4.17.15" - } - }, - "node_modules/webpack-sources": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz", - "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==", - "dev": true, - "dependencies": { - "source-list-map": "^2.0.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" + "node": ">= 0.8" } }, - "node_modules/webpack/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "node_modules/verror": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", "dev": true, + "optional": true, "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.6.0" } }, - "node_modules/webpack/node_modules/braces/node_modules/extend-shallow": { + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "optional": true + }, + "node_modules/void-elements": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/webpack/node_modules/enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "node_modules/watchpack": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/enhanced-resolve/node_modules/memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webpack": { + "version": "5.93.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz", + "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" }, "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } } }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "node_modules/webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" }, "engines": { - "node": ">=4.0.0" + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } } }, - "node_modules/webpack/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=14" } }, - "node_modules/webpack/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "node_modules/webpack-cli/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dev": true, "dependencies": { - "is-extendable": "^0.1.0" + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10.0.0" } }, - "node_modules/webpack/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/webpack/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/webpack/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" + "node_modules/webpack-dev-server": { + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" }, "engines": { - "node": ">=0.10.0" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } } }, - "node_modules/webpack/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "node_modules/webpack-dev-server/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, "dependencies": { - "is-buffer": "^1.1.5" + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/webpack/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "node_modules/webpack-dev-server/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "glob": "^7.1.3" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/webpack/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "node_modules/webpack-inline-manifest-plugin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/webpack-inline-manifest-plugin/-/webpack-inline-manifest-plugin-4.0.1.tgz", + "integrity": "sha512-A6VRqhSDEUsqf6bJmrfNDmlVr+nkI2gfPsRC2/VorUeRMqyrSVvT7ltOjUcIG0VIigTNAcN2LbE83YwFH8VTHg==", "dev": true, "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" + "source-map-url": "0.4.0" } }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "node_modules/webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", "dev": true, "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" + "lodash": "^4.17.15" } }, - "node_modules/webpack/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, "engines": { - "node": ">=6" + "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "node_modules/webpack/node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.4.0" } }, - "node_modules/webpack/node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/websocket-driver": { @@ -22213,15 +16744,6 @@ "node": ">=0.8.0" } }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -22260,16 +16782,16 @@ "dev": true }, "node_modules/which-typed-array": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", - "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -22278,22 +16800,28 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, "node_modules/winston": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.10.0.tgz", - "integrity": "sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.1.tgz", + "integrity": "sha512-SvZit7VFNvXRzbqGHsv5KSmgbEYR5EiQfDAL9gxYkRqa934Hnk++zze0wANKtMHcy/gI4W/3xmSDwlhf865WGw==", "dependencies": { - "@colors/colors": "1.5.0", + "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.2", "async": "^3.2.3", "is-stream": "^2.0.0", - "logform": "^2.4.0", + "logform": "^2.6.0", "one-time": "^1.0.0", "readable-stream": "^3.4.0", "safe-stable-stringify": "^2.3.1", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", - "winston-transport": "^4.5.0" + "winston-transport": "^4.7.0" }, "engines": { "node": ">= 12.0.0" @@ -22348,17 +16876,25 @@ "winston": "^2 || ^3" } }, + "node_modules/winston-daily-rotate-file/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/winston-transport": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", - "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.1.tgz", + "integrity": "sha512-wQCXXVgfv/wUPOfb2x0ruxzwkcZfxcktz6JIMUaPLmcNhO4bZTwA/WtDWK74xV3F2dKu8YadrFv0qhwYjVEwhA==", "dependencies": { - "logform": "^2.3.2", - "readable-stream": "^3.6.0", + "logform": "^2.6.1", + "readable-stream": "^3.6.2", "triple-beam": "^1.3.0" }, "engines": { - "node": ">= 6.4.0" + "node": ">= 12.0.0" } }, "node_modules/winston-transport/node_modules/readable-stream": { @@ -22374,6 +16910,14 @@ "node": ">= 6" } }, + "node_modules/winston/node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/winston/node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -22387,13 +16931,13 @@ "node": ">= 6" } }, - "node_modules/worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, - "dependencies": { - "errno": "~0.1.7" + "engines": { + "node": ">=0.10.0" } }, "node_modules/wrap-ansi": { @@ -22549,16 +17093,16 @@ } }, "node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -22640,21 +17184,21 @@ } }, "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.0", + "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yargs-parser": { @@ -22666,6 +17210,15 @@ "node": ">=10" } }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", @@ -22676,9 +17229,9 @@ } }, "node_modules/yesno": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/yesno/-/yesno-0.0.1.tgz", - "integrity": "sha512-8wycrzlnjG7NotGDZYowY5+hB7zEbTCgkisfThgroVxW7FKcM0Mv1uldONjLmcx9A1yHJMSu//uSov2d8mWLwQ==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/yesno/-/yesno-0.4.0.tgz", + "integrity": "sha512-tdBxmHvbXPBKYIg81bMCB7bVeDmHkRzk5rVJyYYXurwKkHq/MCd8rz4HSJUP7hW0H2NlXiq8IFiWvYKEHhlotA==", "dev": true }, "node_modules/yn": { @@ -22709,16 +17262,6 @@ "dependencies": { "tslib": "^2.3.0" } - }, - "node_modules/zwitch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", - "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } } } } diff --git a/desktop/package.json b/desktop/package.json index 3b09080fa..a8865f332 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -4,6 +4,8 @@ "src/@batch-flask/extensions/*", "src/app/environment.ts", "src/app/commands/**/*", + "test/**/*", + "src/test/**/*", "*.scss" ], "productName": "Batch Explorer", @@ -41,7 +43,7 @@ "test-models": "npm run ts scripts/swagger/validate-models.ts", "build-client": " tsc -p tsconfig.node.json", "build-client:dev": " tsc -p tsconfig.node.json --noUnusedLocals false", - "build-app": "npm run webpack -- --profile --colors --display-error-details --display-cached", + "build-app": "npm run webpack -- --profile", "build-python": "pyinstaller python/main.spec -y --distpath=python/dist --workpath=python/build", "build": "npm run clean && npm run build-translations && npm run build-client && npm run build-app", "build:clean": "npm run build", @@ -49,21 +51,21 @@ "build:prod": "cross-env NODE_ENV=production npm run build", "build:test": "npm run build && npm run test", "build-translations": "bux build-translations --src src --dest i18n --outputPath resources/i18n", - "watch": "npm run webpack -- --watch --progress --profile --colors --display-error-details --display-cached", + "watch": "npm run webpack -- --watch --progress --profile", "electron": "electron build/client/main.js", "electron:prod": "cross-env NODE_ENV=production electron build/client/main.js", "dev": "concurrently --kill-others \"npm run dev-server\" \"npm run dev-electron\"", "dev-electron": "cross-env HOT=1 electron build/client/main.js", - "dev-server": "npm run webpack-dev-server -- --hot --inline --colors --content-base app/", + "dev-server": "npm run webpack-dev-server", "eslint": "eslint -c .eslintrc.js . --quiet", "eslint:verbose": "eslint -c .eslintrc.js .", - "stylelint": "stylelint --syntax scss \"src/app/**/*.scss\"", + "stylelint": "stylelint --custom-syntax postcss-scss \"src/app/**/*.scss\"", "lint": "npm run eslint && npm run stylelint", "lint:fix": "npm run eslint --fix && npm run stylelint", "package": "npm run ts scripts/package/package.ts", "postinstall": "npm run rebuild:app-deps && npx patch-package", "start-publish": "npm run ts scripts/publish/publish.ts", - "webpack": "cross-env NODE_OPTIONS=--openssl-legacy-provider node --trace-deprecation --max_old_space_size=4096 node_modules/webpack/bin/webpack.js", + "webpack": "cross-env node --trace-deprecation --max_old_space_size=4096 node_modules/webpack/bin/webpack.js", "webpack:stats": "cross-env NODE_ENV=production NODE_OPTIONS=--openssl-legacy-provider npm run webpack -- --profile --json > coverage/webpack-stats.json", "webpack-dev-server": "cross-env NODE_OPTIONS=--openssl-legacy-provider node --trace-deprecation --max_old_space_size=4096 node_modules/webpack-dev-server/bin/webpack-dev-server.js", "rebuild:app-deps": "electron-builder install-app-deps", @@ -89,9 +91,9 @@ "node": ">=18.0.0" }, "peerDependencies": { + "@fluentui/azure-themes": ">=8.6.34 < 9.0.0", "@fluentui/react": ">=8.97.2 <9.0.0", "@fluentui/react-theme-provider": ">=0.19.16 <1.0.0", - "@fluentui/azure-themes": ">=8.6.34 < 9.0.0", "mobx": "^6.3.2", "mobx-react-lite": "^3.2.0", "react": ">=17.0.2 <18.0.0", @@ -102,9 +104,10 @@ "@angular-eslint/eslint-plugin": "^13.2.1", "@angular-eslint/eslint-plugin-template": "^13.2.1", "@angular-eslint/template-parser": "^13.2.1", - "@angular/compiler-cli": "^11.2.12", + "@angular/compiler-cli": "^12.0.0", "@batch/common-config": "^1.0.0", - "@ngtools/webpack": "^11.2.12", + "@jsdevtools/coverage-istanbul-loader": "^3.0.5", + "@ngtools/webpack": "^12.0.0", "@playwright/test": "^1.43.1", "@types/chart.js": "^2.9.24", "@types/d3": "^7.4.0", @@ -116,10 +119,7 @@ "@types/js-yaml": "^3.12.5", "@types/luxon": "^1.27.1", "@types/node": "18.11.9", - "@types/node-fetch": "^2.5.7", "@types/proxyquire": "^1.3.28", - "@types/react": "^17.0.53", - "@types/react-dom": "^17.0.18", "@types/strip-json-comments": "^0.0.30", "@types/tinycolor2": "^1.4.2", "@types/webdriverio": "^4.13.3", @@ -127,8 +127,8 @@ "angular2-template-loader": "^0.6.2", "colors": "^1.4.0", "concurrently": "^5.3.0", - "copy-webpack-plugin": "^6.0.3", - "css-loader": "^2.1.1", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.8.1", "electron": "^29.3.1", "electron-builder": "^24.13.3", "eslint": "^7.19.0", @@ -137,10 +137,8 @@ "eslint-plugin-import": "^2.25.4", "eslint-plugin-jsdoc": "^37.9.6", "eslint-plugin-prefer-arrow": "^1.2.3", - "file-loader": "^3.0.1", - "fork-ts-checker-webpack-plugin": "^5.1.0", - "html-webpack-plugin": "^3.2.0", - "istanbul-instrumenter-loader": "^3.0.1", + "fork-ts-checker-webpack-plugin": "^8.0.0", + "html-webpack-plugin": "^5.5.3", "jasmine": "~3.5.0", "jasmine-axe": "^1.1.0", "jasmine-core": "^3.6.0", @@ -155,51 +153,49 @@ "karma-mocha-reporter": "^2.2.5", "karma-sourcemap-loader": "^0.4.0", "karma-webpack": "^5.0.0", - "loader-utils": "^1.4.2", + "loader-utils": "^3.2.1", "merge2": "^1.4.1", - "mini-css-extract-plugin": "^0.5.0", - "monaco-editor-webpack-plugin": "^6.0.0", - "node-fetch": "^2.6.7", + "mini-css-extract-plugin": "^2.7.6", + "monaco-editor-webpack-plugin": "^7.1.0", "nyc": "^15.1.0", - "patch-package": "^6.5.1", - "playwright": "^1.43.1", + "patch-package": "^8.0.0", + "playwright": "^1.18.1", + "postcss-scss": "^4.0.9", "prettier": "^2.2.1", "proxyquire": "^2.1.3", - "raw-loader": "^1.0.0", "rimraf": "^2.7.1", - "sass": "^1.26.10", - "sass-loader": "^9.0.3", - "style-loader": "^0.23.1", - "stylelint": "^13.6.1", - "to-string-loader": "^1.1.6", - "ts-loader": "^5.4.5", - "ts-node": "^8.10.2", + "sass": "^1.66.1", + "sass-loader": "^13.3.2", + "style-loader": "^3.3.3", + "stylelint": "^15.10.3", + "to-string-loader": "^1.2.0", + "ts-loader": "^9.4.4", + "ts-node": "^10.9.1", "typescript": "~4.6.0", - "url-loader": "^1.1.2", - "webpack": "^4.44.1", - "webpack-cli": "^3.3.12", - "webpack-dev-server": "^3.11.0", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^4.15.1", "webpack-inline-manifest-plugin": "^4.0.1", "webpack-merge": "^4.2.2", - "yesno": "^0.0.1" + "yesno": "^0.4.0" }, "dependencies": { - "@azure/core-util": "1.4.0", - "@angular/animations": "^11.2.12", - "@angular/cdk": "^11.2.12", - "@angular/common": "^11.2.12", - "@angular/compiler": "^11.2.12", - "@angular/core": "^11.2.12", - "@angular/forms": "^11.2.12", - "@angular/material": "^11.2.12", - "@angular/platform-browser": "^11.2.12", - "@angular/platform-browser-dynamic": "^11.2.12", - "@angular/platform-server": "^11.2.12", - "@angular/router": "^11.2.12", + "@angular/animations": "^12.0.0", + "@angular/cdk": "^12.0.0", + "@angular/common": "^12.0.0", + "@angular/compiler": "^12.0.0", + "@angular/core": "^12.0.0", + "@angular/forms": "^12.0.0", + "@angular/material": "^12.0.0", + "@angular/platform-browser": "^12.0.0", + "@angular/platform-browser-dynamic": "^12.0.0", + "@angular/platform-server": "^12.0.0", + "@angular/router": "^12.0.0", "@azure/bonito-core": "^1.0.0", "@azure/bonito-ui": "^1.0.0", + "@azure/core-util": "1.9.1", "@azure/msal-node": "^2.7.0", - "@azure/storage-blob": "^12.11.0", + "@azure/storage-blob": "^12.23.0", "@batch/ui-playground": "^1.0.0", "@batch/ui-react": "^1.0.0", "@batch/ui-service": "^1.0.0", @@ -236,16 +232,15 @@ "reflect-metadata": "^0.1.13", "rxjs": "^6.6.7", "strip-json-comments": "^2.0.1", - "tinycolor2": "^1.4.1", + "tinycolor2": "^1.6.0", "winston": "^3.3.3", "winston-daily-rotate-file": "^3.10.0", "write-file-webpack-plugin": "^4.5.1", "xml2js": "^0.5.0", - "zone.js": "^0.11.0" + "zone.js": "^0.11.4" }, "overrides": { "json5": "^2.2.3", - "ajv": "^6.12.6", - "@azure/core-util": "1.4.0" + "@azure/core-util": "1.9.1" } } diff --git a/desktop/patches/@azure+core-util+1.4.0.patch b/desktop/patches/@azure+core-util+1.4.0.patch deleted file mode 100644 index 63b2de852..000000000 --- a/desktop/patches/@azure+core-util+1.4.0.patch +++ /dev/null @@ -1,43 +0,0 @@ -diff --git a/node_modules/@azure/core-util/dist-esm/src/checkEnvironment.js b/node_modules/@azure/core-util/dist-esm/src/checkEnvironment.js -index 5a89b5f..1c62028 100644 ---- a/node_modules/@azure/core-util/dist-esm/src/checkEnvironment.js -+++ b/node_modules/@azure/core-util/dist-esm/src/checkEnvironment.js -@@ -17,7 +17,15 @@ export const isWebWorker = typeof self === "object" && - /** - * A constant that indicates whether the environment the code is running is Node.JS. - */ --export const isNode = typeof process !== "undefined" && Boolean(process.version) && Boolean((_d = process.versions) === null || _d === void 0 ? void 0 : _d.node); -+// KLUDGE: @azure/storage-blob uses isNode variable exported from @azure/core-util to -+// determine how it should process data. However, in the renderer process, isNode is -+// set to be true, which causes @azure/storage-blob fails to process data. Thus we need -+// to patch isNode to be false in the renderer process. -+// github issue: https://github.com/Azure/azure-sdk-for-js/issues/21110 -+export const isNode = -+ typeof process !== "undefined" && -+ !!process.env && -+ !process.env.RENDERER; - /** - * A constant that indicates whether the environment the code is running is Deno. - */ -diff --git a/node_modules/@azure/core-util/dist/index.js b/node_modules/@azure/core-util/dist/index.js -index 22d406a..b2f1205 100644 ---- a/node_modules/@azure/core-util/dist/index.js -+++ b/node_modules/@azure/core-util/dist/index.js -@@ -268,7 +268,16 @@ const isWebWorker = typeof self === "object" && - /** - * A constant that indicates whether the environment the code is running is Node.JS. - */ --const isNode = typeof process !== "undefined" && Boolean(process.version) && Boolean((_d = process.versions) === null || _d === void 0 ? void 0 : _d.node); -+// KLUDGE: @azure/storage-blob uses isNode variable exported from @azure/core-util to -+// determine how it should process data. However, in the renderer process, isNode is -+// set to be true, which causes @azure/storage-blob fails to process data. Thus we need -+// to patch isNode to be false in the renderer process. -+// github issue: https://github.com/Azure/azure-sdk-for-js/issues/21110 -+const isNode = -+ typeof process !== "undefined" && -+ !!process.env && -+ !process.env.RENDERER; -+ - /** - * A constant that indicates whether the environment the code is running is Deno. - */ diff --git a/desktop/patches/@azure+core-util+1.9.1.patch b/desktop/patches/@azure+core-util+1.9.1.patch new file mode 100644 index 000000000..f754f5682 --- /dev/null +++ b/desktop/patches/@azure+core-util+1.9.1.patch @@ -0,0 +1,56 @@ +diff --git a/node_modules/@azure/core-util/dist/browser/checkEnvironment.js b/node_modules/@azure/core-util/dist/browser/checkEnvironment.js +index b7feb20..2d280f2 100644 +--- a/node_modules/@azure/core-util/dist/browser/checkEnvironment.js ++++ b/node_modules/@azure/core-util/dist/browser/checkEnvironment.js +@@ -29,7 +29,8 @@ export const isBun = typeof Bun !== "undefined" && typeof Bun.version !== "undef + */ + export const isNodeLike = typeof globalThis.process !== "undefined" && + Boolean(globalThis.process.version) && +- Boolean((_d = globalThis.process.versions) === null || _d === void 0 ? void 0 : _d.node); ++ Boolean((_d = globalThis.process.versions) === null || _d === void 0 ? void 0 : _d.node) && ++ !Boolean(process.env.RENDERER); + /** + * A constant that indicates whether the environment the code is running is a Node.js compatible environment. + * @deprecated Use `isNodeLike` instead. +diff --git a/node_modules/@azure/core-util/dist/commonjs/checkEnvironment.js b/node_modules/@azure/core-util/dist/commonjs/checkEnvironment.js +index 3822c2c..337b32a 100644 +--- a/node_modules/@azure/core-util/dist/commonjs/checkEnvironment.js ++++ b/node_modules/@azure/core-util/dist/commonjs/checkEnvironment.js +@@ -32,7 +32,8 @@ exports.isBun = typeof Bun !== "undefined" && typeof Bun.version !== "undefined" + */ + exports.isNodeLike = typeof globalThis.process !== "undefined" && + Boolean(globalThis.process.version) && +- Boolean((_d = globalThis.process.versions) === null || _d === void 0 ? void 0 : _d.node); ++ Boolean((_d = globalThis.process.versions) === null || _d === void 0 ? void 0 : _d.node) && ++ !Boolean(process.env.RENDERER); + /** + * A constant that indicates whether the environment the code is running is a Node.js compatible environment. + * @deprecated Use `isNodeLike` instead. +diff --git a/node_modules/@azure/core-util/dist/esm/checkEnvironment.js b/node_modules/@azure/core-util/dist/esm/checkEnvironment.js +index b7feb20..2d280f2 100644 +--- a/node_modules/@azure/core-util/dist/esm/checkEnvironment.js ++++ b/node_modules/@azure/core-util/dist/esm/checkEnvironment.js +@@ -29,7 +29,8 @@ export const isBun = typeof Bun !== "undefined" && typeof Bun.version !== "undef + */ + export const isNodeLike = typeof globalThis.process !== "undefined" && + Boolean(globalThis.process.version) && +- Boolean((_d = globalThis.process.versions) === null || _d === void 0 ? void 0 : _d.node); ++ Boolean((_d = globalThis.process.versions) === null || _d === void 0 ? void 0 : _d.node) && ++ !Boolean(process.env.RENDERER); + /** + * A constant that indicates whether the environment the code is running is a Node.js compatible environment. + * @deprecated Use `isNodeLike` instead. +diff --git a/node_modules/@azure/core-util/dist/react-native/checkEnvironment.js b/node_modules/@azure/core-util/dist/react-native/checkEnvironment.js +index b7feb20..2d280f2 100644 +--- a/node_modules/@azure/core-util/dist/react-native/checkEnvironment.js ++++ b/node_modules/@azure/core-util/dist/react-native/checkEnvironment.js +@@ -29,7 +29,8 @@ export const isBun = typeof Bun !== "undefined" && typeof Bun.version !== "undef + */ + export const isNodeLike = typeof globalThis.process !== "undefined" && + Boolean(globalThis.process.version) && +- Boolean((_d = globalThis.process.versions) === null || _d === void 0 ? void 0 : _d.node); ++ Boolean((_d = globalThis.process.versions) === null || _d === void 0 ? void 0 : _d.node) && ++ !Boolean(process.env.RENDERER); + /** + * A constant that indicates whether the environment the code is running is a Node.js compatible environment. + * @deprecated Use `isNodeLike` instead. diff --git a/desktop/scripts/lca/generate-third-party.ts b/desktop/scripts/lca/generate-third-party.ts index 826cb3cad..aec27807b 100644 --- a/desktop/scripts/lca/generate-third-party.ts +++ b/desktop/scripts/lca/generate-third-party.ts @@ -2,7 +2,6 @@ import { program } from "commander"; import * as fs from "fs"; -import fetch, { HeaderInit } from "node-fetch"; import * as path from "path"; import { Constants } from "../../src/client/client-constants"; @@ -147,7 +146,7 @@ async function loadLicense(dependency: Dependency, anonymous = false): const { repoUrl = null } = dependency; const repoName = getRepoName(repoUrl); const licenseUrl = `https://api.github.com/repos/${repoName}/license`; - const headers: HeaderInit = anonymous ? {} : + const headers: HeadersInit = anonymous ? {} : { Authorization: `token ${process.env.GH_TOKEN}` }; return fetch(licenseUrl, { headers }).then(async (res) => { diff --git a/desktop/scripts/publish/github-api.ts b/desktop/scripts/publish/github-api.ts index 03f3883d6..ba1c67fdd 100644 --- a/desktop/scripts/publish/github-api.ts +++ b/desktop/scripts/publish/github-api.ts @@ -1,4 +1,3 @@ -import fetch from "node-fetch"; import { issuesUrl, milestoneIssuesUrl, milestoneUrl, pullRequestsUrl } from "./github-urls"; import { Issue, Milestone } from "./models"; diff --git a/desktop/scripts/swagger/validate-models.ts b/desktop/scripts/swagger/validate-models.ts index 19e9bce82..0f0913280 100644 --- a/desktop/scripts/swagger/validate-models.ts +++ b/desktop/scripts/swagger/validate-models.ts @@ -10,7 +10,6 @@ import "zone.js"; console.log("Nodepath", process.env.NODE_PATH); import { Duration } from "luxon"; -import fetch from "node-fetch"; import { metadataForCtr } from "../../src/@batch-flask/core/record/helpers"; import * as models from "../../src/app/models"; import { Constants } from "../../src/common"; @@ -64,7 +63,7 @@ async function getSpecs() { const baseUrl = `https://raw.githubusercontent.com/Azure/azure-rest-api-specs/master/specification/batch`; const url = `${baseUrl}/data-plane/Microsoft.Batch/stable/${dataPlaneVersion}/BatchService.json`; const response = await fetch(url); - return response.json(); + return response.json() as unknown as { definitions: Record; }; } async function getMapping() { diff --git a/desktop/src/@batch-flask/ui/form/complex-form/complex-form.component.ts b/desktop/src/@batch-flask/ui/form/complex-form/complex-form.component.ts index fa7181d1e..8ae3a360a 100644 --- a/desktop/src/@batch-flask/ui/form/complex-form/complex-form.component.ts +++ b/desktop/src/@batch-flask/ui/form/complex-form/complex-form.component.ts @@ -1,5 +1,16 @@ import { - AfterViewInit, ChangeDetectorRef, Component, ContentChildren, ElementRef, HostBinding, Input, OnChanges, QueryList, Type, ViewChild, + AfterViewInit, + ChangeDetectorRef, + Component, + ContentChildren, + ElementRef, + forwardRef, + HostBinding, + Input, + OnChanges, + QueryList, + Type, + ViewChild, } from "@angular/core"; import { FormControl } from "@angular/forms"; import { AsyncTask, Dto, ServerError, autobind } from "@batch-flask/core"; @@ -69,7 +80,7 @@ export class ComplexFormComponent extends FormBase implements AfterViewInit, OnC @Input() @HostBinding("class.sticky-footer") public stickyFooter: boolean = true; - @ContentChildren(FormPageComponent) public pages: QueryList; + @ContentChildren(forwardRef(() => FormPageComponent)) public pages: QueryList; @ViewChild('formElement') formElement: ElementRef; diff --git a/desktop/src/@batch-flask/ui/form/complex-form/footer/form-footer.component.ts b/desktop/src/@batch-flask/ui/form/complex-form/footer/form-footer.component.ts index 022274987..71ab283c8 100644 --- a/desktop/src/@batch-flask/ui/form/complex-form/footer/form-footer.component.ts +++ b/desktop/src/@batch-flask/ui/form/complex-form/footer/form-footer.component.ts @@ -1,5 +1,5 @@ import { - ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, OnChanges, OnDestroy, Output, + ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Inject, Input, OnChanges, OnDestroy, Output, forwardRef, } from "@angular/core"; import { FormControl } from "@angular/forms"; import { AsyncTask, ServerError } from "@batch-flask/core"; @@ -68,7 +68,11 @@ export class FormFooterComponent implements OnChanges, OnDestroy { private _actionConfig: FormActionConfig; private _statusSub: Subscription; - constructor(public form: ComplexFormComponent, private changeDetector: ChangeDetectorRef) { } + public form: ComplexFormComponent; + + constructor(@Inject(forwardRef(() => ComplexFormComponent)) form: ComplexFormComponent, private changeDetector: ChangeDetectorRef) { + this.form = form; + } public ngOnChanges(changes) { if (changes.currentPage) { diff --git a/desktop/src/@batch-flask/ui/form/form-page/form-page.component.ts b/desktop/src/@batch-flask/ui/form/form-page/form-page.component.ts index 64c5b7a44..f2a27e627 100644 --- a/desktop/src/@batch-flask/ui/form/form-page/form-page.component.ts +++ b/desktop/src/@batch-flask/ui/form/form-page/form-page.component.ts @@ -76,9 +76,12 @@ export class FormPageComponent implements OnChanges, AfterContentInit, OnDestroy public _statusSub: Subscription; private _valid = new BehaviorSubject(false); + private form: ComplexFormComponent; + constructor( - @Inject(forwardRef(() => ComplexFormComponent)) private form: ComplexFormComponent, + @Inject(forwardRef(() => ComplexFormComponent)) form: ComplexFormComponent, private changeDetector: ChangeDetectorRef) { + this.form = form; // Workaround for circular dep issues. See: https://github.com/angular/angular-cli/issues/14247#issuecomment-486582423 this.valid = this._valid.asObservable(); } diff --git a/desktop/src/@batch-flask/ui/form/form.module.ts b/desktop/src/@batch-flask/ui/form/form.module.ts index ccfd5fa0b..4f1b36901 100644 --- a/desktop/src/@batch-flask/ui/form/form.module.ts +++ b/desktop/src/@batch-flask/ui/form/form.module.ts @@ -9,6 +9,7 @@ import { ServerErrorModule } from "@batch-flask/ui/server-error"; import { ButtonsModule } from "../buttons"; import { CopyableModule } from "../copyable"; import { I18nUIModule } from "../i18n"; +import { FormPageComponent } from "./form-page"; import { ComplexFormComponent } from "./complex-form"; import { FormFooterComponent } from "./complex-form/footer"; import { EditableTableModule } from "./editable-table"; @@ -16,7 +17,6 @@ import { ExpandingTextareaComponent } from "./expanding-textarea"; import { FormErrorComponent } from "./form-error"; import { FormFieldComponent, FormFieldPrefixDirective, FormFieldSuffixDirective } from "./form-field"; import { FormJsonEditorComponent } from "./form-json-editor"; -import { FormPageComponent } from "./form-page"; import { FormMultiPickerComponent, FormPickerComponent, FormPickerItemTemplateDirective } from "./form-picker"; import { FormSectionComponent } from "./form-section"; import { HintComponent } from "./hint"; diff --git a/desktop/src/@batch-flask/ui/table/table.component.ts b/desktop/src/@batch-flask/ui/table/table.component.ts index bae15e616..13e31f01c 100644 --- a/desktop/src/@batch-flask/ui/table/table.component.ts +++ b/desktop/src/@batch-flask/ui/table/table.component.ts @@ -6,6 +6,7 @@ import { ContentChildren, ElementRef, EventEmitter, + forwardRef, HostBinding, HostListener, Input, @@ -80,7 +81,7 @@ export class TableComponent extends AbstractListBase implements AfterContentInit @Output() public dropOnRow = new EventEmitter(); @ViewChild(TableHeadComponent, { static: false }) public head: TableHeadComponent; - @ContentChildren(TableColumnComponent) public columnComponents: QueryList; + @ContentChildren(forwardRef(() => TableColumnComponent)) public columnComponents: QueryList; @HostBinding("class.drag-hover") public isDraging = 0; @HostBinding("class.activable") public get activable() { return this.config.activable; diff --git a/desktop/src/app/components/account/details/programmatic-usage/programming-sample/samples/index.ts b/desktop/src/app/components/account/details/programmatic-usage/programming-sample/samples/index.ts index 01c7ec5ea..e4607956b 100644 --- a/desktop/src/app/components/account/details/programmatic-usage/programming-sample/samples/index.ts +++ b/desktop/src/app/components/account/details/programmatic-usage/programming-sample/samples/index.ts @@ -1,17 +1,17 @@ /* eslint-disable @typescript-eslint/no-var-requires */ export const sampleTemplates = { sharedKey: { - python: require("raw-loader!./shared-key/python.py.template"), - csharp: require("raw-loader!./shared-key/csharp.cs.template"), - nodejs: require("raw-loader!./shared-key/node.js.template"), - doAzureParallel: require("raw-loader!./shared-key/doAzureParallel.json.template"), + python: require("./shared-key/python.py.template"), + csharp: require("./shared-key/csharp.cs.template"), + nodejs: require("./shared-key/node.js.template"), + doAzureParallel: require("./shared-key/doAzureParallel.json.template"), }, aad: { - python: require("raw-loader!./aad/python.py.template"), - csharp: require("raw-loader!./aad/csharp.cs.template"), - nodejs: require("raw-loader!./aad/node.js.template"), - aztk: require("raw-loader!./aad/aztk.yaml.template"), - doAzureParallel: require("raw-loader!./aad/doAzureParallel.json.template"), + python: require("./aad/python.py.template"), + csharp: require("./aad/csharp.cs.template"), + nodejs: require("./aad/node.js.template"), + aztk: require("./aad/aztk.yaml.template"), + doAzureParallel: require("./aad/doAzureParallel.json.template"), }, }; diff --git a/desktop/src/app/components/application/action/create/application-create-dialog.component.spec.ts b/desktop/src/app/components/application/action/create/application-create-dialog.component.spec.ts index 2ee1d7f98..3d679304c 100644 --- a/desktop/src/app/components/application/action/create/application-create-dialog.component.spec.ts +++ b/desktop/src/app/components/application/action/create/application-create-dialog.component.spec.ts @@ -17,7 +17,7 @@ import * as TestConstants from "test/test-constants"; import { validateControl } from "test/utils/helpers"; import { MockedFile } from "test/utils/mocks"; import { ServerErrorMockComponent, complexFormMockComponents } from "test/utils/mocks/components"; -import { isNode } from '@azure/core-http'; +import { isNode } from '@azure/core-util'; describe("ApplicationCreateDialogComponent ", () => { let fixture: ComponentFixture; diff --git a/desktop/src/app/components/job/graphs/all-job-graphs-home/all-job-graphs-home.scss b/desktop/src/app/components/job/graphs/all-job-graphs-home/all-job-graphs-home.scss index c71e3f11e..8d4f53681 100644 --- a/desktop/src/app/components/job/graphs/all-job-graphs-home/all-job-graphs-home.scss +++ b/desktop/src/app/components/job/graphs/all-job-graphs-home/all-job-graphs-home.scss @@ -3,7 +3,7 @@ bl-all-job-graphs-home { $padding: 10px; $graph-header-height: 40px; - $graphs-content-height: calc(100% - #{$graph-header-height + $padding * 2}); + $graphs-content-height: calc(100% - #{$graph-header-height + $padding * 2}); display: block; width: 100%; diff --git a/desktop/src/app/components/misc/theme-colors/theme-colors.component.ts b/desktop/src/app/components/misc/theme-colors/theme-colors.component.ts index 3ec4c14e5..c9ec3ae3f 100644 --- a/desktop/src/app/components/misc/theme-colors/theme-colors.component.ts +++ b/desktop/src/app/components/misc/theme-colors/theme-colors.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy } from "@angular/core"; import { ThemeService } from "app/services"; import { Subscription } from "rxjs"; -import * as tinycolor from "tinycolor2"; +import tinycolor from "tinycolor2"; import "./theme-colors.scss"; diff --git a/desktop/src/app/services/azure-batch/certificate/certificate.service.ts b/desktop/src/app/services/azure-batch/certificate/certificate.service.ts index f1eabfd7c..927919775 100644 --- a/desktop/src/app/services/azure-batch/certificate/certificate.service.ts +++ b/desktop/src/app/services/azure-batch/certificate/certificate.service.ts @@ -185,6 +185,8 @@ export class CertificateService { const p12Der = forge.util.decode64(data); // Set parseAllBytes to false to avoid regression. // See: https://github.com/digitalbazaar/forge/issues/975 + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore parseAllBytes is not in the @types/node-forge const p12Asn1 = forge.asn1.fromDer(p12Der, {parseAllBytes: false}); const outCert = forge.pkcs12.pkcs12FromAsn1(p12Asn1, false, password); const keyBags = outCert.getBags({ bagType: forge.pki.oids.certBag }); @@ -195,6 +197,8 @@ export class CertificateService { case CertificateFormat.cer: // Set parseAllBytes to false to avoid regression. // See: https://github.com/digitalbazaar/forge/issues/975 + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore parseAllBytes is not in the @types/node-forge const outAsn1 = forge.asn1.fromDer(data, {parseAllBytes: false}); certDer = forge.asn1.toDer(outAsn1).getBytes(); break; @@ -203,6 +207,8 @@ export class CertificateService { current certificate type is not supported.`); } const md = forge.md.sha1.create(); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore start is not in the @types/node-forge md.start(); md.update(certDer); const digest = md.digest(); diff --git a/desktop/src/app/services/themes/theme.model.ts b/desktop/src/app/services/themes/theme.model.ts index bc269224c..8bbdbcfcd 100644 --- a/desktop/src/app/services/themes/theme.model.ts +++ b/desktop/src/app/services/themes/theme.model.ts @@ -1,5 +1,5 @@ import { CssColor, ThemeElement } from "app/services/themes/theme-core"; -import * as tinycolor from "tinycolor2"; +import tinycolor from "tinycolor2"; import { ChartColors } from "./chart-colors"; import { EntityColorDefinition, ThemeDefinition } from "./theme-definition.model"; diff --git a/desktop/src/client/core/storage/storage-blob-adapter.spec.ts b/desktop/src/client/core/storage/storage-blob-adapter.spec.ts index 08ac30859..0cf5e1423 100644 --- a/desktop/src/client/core/storage/storage-blob-adapter.spec.ts +++ b/desktop/src/client/core/storage/storage-blob-adapter.spec.ts @@ -1,5 +1,5 @@ import { StorageBlobAdapter } from "./storage-blob-adapter"; -import { isNode } from "@azure/core-http"; +import { isNode } from "@azure/core-util"; describe("StorageBlobAdapter", () => { let adapter: StorageBlobAdapter; diff --git a/desktop/test/app/spec-runner.ts b/desktop/test/app/spec-runner.ts index 0677a0739..6af9b2a30 100644 --- a/desktop/test/app/spec-runner.ts +++ b/desktop/test/app/spec-runner.ts @@ -10,7 +10,11 @@ TestBed.initTestEnvironment( platformBrowserDynamicTesting(), ); -const webpackRequire: any = require; +declare global { + interface NodeRequire { + context: any; + } +} /* * Ok, this is kinda crazy. We can use the context method on @@ -21,11 +25,11 @@ const webpackRequire: any = require; * any file that ends with spec.ts and get its path. By passing in true * we say do this recursivelyf */ -const testContext = webpackRequire.context(".", true, /\.spec\.ts/); -const testAppContext = webpackRequire.context("../../src/app", true, /\.spec\.ts/); -const testCommonContext = webpackRequire.context("../../src/common", true, /\.spec\.ts/); +const testContext = require.context(".", true, /\.spec\.ts/); +const testAppContext = require.context("../../src/app", true, /\.spec\.ts/); +const testCommonContext = require.context("../../src/common", true, /\.spec\.ts/); // Exclude the @batch-flask/compiler folder -const testBlCommonContext = webpackRequire.context("../../src/@batch-flask", true, +const testBlCommonContext = require.context("../../src/@batch-flask", true, /^\.\/(?!compiler)(?!.*node\.spec\.ts).*\.spec\.ts$/); /* diff --git a/desktop/tsconfig.browser.json b/desktop/tsconfig.browser.json index 0123de454..98c7ced86 100644 --- a/desktop/tsconfig.browser.json +++ b/desktop/tsconfig.browser.json @@ -1,8 +1,13 @@ { "extends": "./tsconfig.json", + "include": [ + "src/app", + "src/@batch-flask/utils/logging", + ], "exclude": [ "**/*.spec.ts", "src/test/**/*.ts", + "src/client", "test/**/*.ts", "**/testing**/*" ], diff --git a/desktop/tsconfig.json b/desktop/tsconfig.json index 6415bf5fc..c2f0ddf79 100644 --- a/desktop/tsconfig.json +++ b/desktop/tsconfig.json @@ -49,7 +49,7 @@ "files": [ "definitions/index.d.ts", "definitions/missing-defs.d.ts", - "node_modules/monaco-editor/monaco.d.ts" + "../node_modules/monaco-editor/monaco.d.ts" ], // This is not actually used for building but to let the editor know what files use this config "include": [ diff --git a/desktop/tsconfig.test.json b/desktop/tsconfig.test.json index 162e5494b..d62eb7385 100644 --- a/desktop/tsconfig.test.json +++ b/desktop/tsconfig.test.json @@ -2,7 +2,7 @@ "extends": "./tsconfig.json", "files": [ "definitions/index.d.ts", - "node_modules/monaco-editor/monaco.d.ts" + "../node_modules/monaco-editor/monaco.d.ts" ], "include": [ "app/**/*.ts", diff --git a/packages/bonito-ui/package-lock.json b/packages/bonito-ui/package-lock.json index 3b164c87c..39c9a9c4e 100644 --- a/packages/bonito-ui/package-lock.json +++ b/packages/bonito-ui/package-lock.json @@ -12,8 +12,6 @@ "@types/jest": "^27.0.1", "@types/jest-axe": "^3.5.1", "@types/node": "20.5.4", - "@types/react": "^17.0.53", - "@types/react-dom": "^17.0.18", "jest": "^27.1.0", "jest-axe": "^7.0.1", "jest-junit": "^12.2.0", @@ -1116,38 +1114,6 @@ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "dev": true }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "dev": true - }, - "node_modules/@types/react": { - "version": "17.0.65", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.65.tgz", - "integrity": "sha512-oxur785xZYHvnI7TRS61dXbkIhDPnGfsXKv0cNXR/0ml4SipRIFpSMzA7HMEfOywFwJ5AOnPrXYTEiTRUQeGlQ==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "17.0.20", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.20.tgz", - "integrity": "sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA==", - "dev": true, - "dependencies": { - "@types/react": "^17" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", - "dev": true - }, "node_modules/@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -1682,12 +1648,6 @@ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "dev": true - }, "node_modules/data-urls": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", diff --git a/packages/bonito-ui/package.json b/packages/bonito-ui/package.json index 9891d88b9..c63e7a996 100644 --- a/packages/bonito-ui/package.json +++ b/packages/bonito-ui/package.json @@ -79,8 +79,6 @@ "@types/jest": "^27.0.1", "@types/jest-axe": "^3.5.1", "@types/node": "20.5.4", - "@types/react": "^17.0.53", - "@types/react-dom": "^17.0.18", "jest": "^27.1.0", "jest-axe": "^7.0.1", "jest-junit": "^12.2.0", diff --git a/packages/playground/package-lock.json b/packages/playground/package-lock.json index ed1b5fc34..dc3f0be96 100644 --- a/packages/playground/package-lock.json +++ b/packages/playground/package-lock.json @@ -12,8 +12,6 @@ "@types/jest": "^27.0.1", "@types/jest-axe": "^3.5.1", "@types/node": "20.5.4", - "@types/react": "^17.0.53", - "@types/react-dom": "^17.0.18", "jest": "^27.1.0", "jest-axe": "^7.0.1", "jest-junit": "^12.2.0", @@ -1115,38 +1113,6 @@ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "dev": true }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "dev": true - }, - "node_modules/@types/react": { - "version": "17.0.65", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.65.tgz", - "integrity": "sha512-oxur785xZYHvnI7TRS61dXbkIhDPnGfsXKv0cNXR/0ml4SipRIFpSMzA7HMEfOywFwJ5AOnPrXYTEiTRUQeGlQ==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "17.0.20", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.20.tgz", - "integrity": "sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA==", - "dev": true, - "dependencies": { - "@types/react": "^17" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", - "dev": true - }, "node_modules/@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -1681,12 +1647,6 @@ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "dev": true - }, "node_modules/data-urls": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", diff --git a/packages/playground/package.json b/packages/playground/package.json index 3f94de6c1..85ab7967f 100644 --- a/packages/playground/package.json +++ b/packages/playground/package.json @@ -78,8 +78,6 @@ "@types/jest": "^27.0.1", "@types/jest-axe": "^3.5.1", "@types/node": "20.5.4", - "@types/react": "^17.0.53", - "@types/react-dom": "^17.0.18", "jest": "^27.1.0", "jest-axe": "^7.0.1", "jest-junit": "^12.2.0", diff --git a/packages/react/package-lock.json b/packages/react/package-lock.json index a7d127324..381634856 100644 --- a/packages/react/package-lock.json +++ b/packages/react/package-lock.json @@ -12,8 +12,6 @@ "@types/jest": "^27.0.1", "@types/jest-axe": "^3.5.1", "@types/node": "20.5.4", - "@types/react": "^17.0.53", - "@types/react-dom": "^17.0.18", "jest": "^27.1.0", "jest-axe": "^7.0.1", "jest-junit": "^12.2.0", @@ -1116,38 +1114,6 @@ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "dev": true }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "dev": true - }, - "node_modules/@types/react": { - "version": "17.0.65", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.65.tgz", - "integrity": "sha512-oxur785xZYHvnI7TRS61dXbkIhDPnGfsXKv0cNXR/0ml4SipRIFpSMzA7HMEfOywFwJ5AOnPrXYTEiTRUQeGlQ==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "17.0.20", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.20.tgz", - "integrity": "sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA==", - "dev": true, - "dependencies": { - "@types/react": "^17" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", - "dev": true - }, "node_modules/@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -1682,12 +1648,6 @@ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "dev": true - }, "node_modules/data-urls": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", diff --git a/packages/react/package.json b/packages/react/package.json index ba61d6ff6..47906a5b3 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -82,8 +82,6 @@ "@types/jest": "^27.0.1", "@types/jest-axe": "^3.5.1", "@types/node": "20.5.4", - "@types/react": "^17.0.53", - "@types/react-dom": "^17.0.18", "jest": "^27.1.0", "jest-axe": "^7.0.1", "jest-junit": "^12.2.0", diff --git a/web/package-lock.json b/web/package-lock.json index 30ca5e1f5..d713903bc 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -14,8 +14,6 @@ "devDependencies": { "@types/jest": "^27.0.1", "@types/node": "20.5.4", - "@types/react": "^17.0.53", - "@types/react-dom": "^17.0.18", "@types/react-router-dom": "^5.1.7", "css-loader": "^6.8.1", "esbuild-loader": "^4.0.1", @@ -1661,15 +1659,6 @@ "csstype": "^3.0.2" } }, - "node_modules/@types/react-dom": { - "version": "17.0.20", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.20.tgz", - "integrity": "sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA==", - "dev": true, - "dependencies": { - "@types/react": "^17" - } - }, "node_modules/@types/react-router": { "version": "5.1.20", "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", diff --git a/web/package.json b/web/package.json index baf57d8b9..1dfafb59d 100644 --- a/web/package.json +++ b/web/package.json @@ -71,8 +71,6 @@ "devDependencies": { "@types/jest": "^27.0.1", "@types/node": "20.5.4", - "@types/react": "^17.0.53", - "@types/react-dom": "^17.0.18", "@types/react-router-dom": "^5.1.7", "css-loader": "^6.8.1", "esbuild-loader": "^4.0.1", From d63220029a39ee3694ad34d0aba0acef9678f9f0 Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Thu, 7 Nov 2024 10:04:10 -0500 Subject: [PATCH 46/57] Fixes broken proxy config window (#2938) * Fixes broken proxy config window * Refactors proxy window class and adds unit tests --- .../manual-proxy-configuration-window.css | 1 + .../manual-proxy-configuration-window.html | 50 ++++++--- .../manual-proxy-configuration-window.spec.ts | 92 ++++++++++++++++ .../manual-proxy-configuration-window.ts | 103 ++++++++++++------ 4 files changed, 194 insertions(+), 52 deletions(-) create mode 100644 desktop/src/client/proxy/manual-proxy-configuration-window/manual-proxy-configuration-window.spec.ts diff --git a/desktop/src/client/proxy/manual-proxy-configuration-window/manual-proxy-configuration-window.css b/desktop/src/client/proxy/manual-proxy-configuration-window/manual-proxy-configuration-window.css index 756d0a851..127c1a534 100644 --- a/desktop/src/client/proxy/manual-proxy-configuration-window/manual-proxy-configuration-window.css +++ b/desktop/src/client/proxy/manual-proxy-configuration-window/manual-proxy-configuration-window.css @@ -1,4 +1,5 @@ body { + margin-top: 2em; /* Compensates for MacOS native title bar buttons */ background: #f5f5f5; font-family: "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif; } diff --git a/desktop/src/client/proxy/manual-proxy-configuration-window/manual-proxy-configuration-window.html b/desktop/src/client/proxy/manual-proxy-configuration-window/manual-proxy-configuration-window.html index fdd01be6e..7ebcbb205 100644 --- a/desktop/src/client/proxy/manual-proxy-configuration-window/manual-proxy-configuration-window.html +++ b/desktop/src/client/proxy/manual-proxy-configuration-window/manual-proxy-configuration-window.html @@ -5,22 +5,36 @@