diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 97e79712..8a121244 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1,13 @@ -* @celonis/navi @gencblakqorip9 @celonis/astro +* @celonis/astro + +/* @celonis/astro +/src @celonis/astro +/src/core @celonis/astro +/src/commands/configuration-management/ @celonis/astro +/src/commands/profile/ @celonis/astro +/src/commands/action-flows/ @celonis/process-automation +/tests/commands/action-flows/ @celonis/process-automation +/src/commands/analysis/ @celonis/process-analytics +/src/commands/cpm4/ @celonis/cpm4 +/src/commands/data-pipeline/ @Dusan-r @IvanGandacov @EktaCelonis @gorasoCelonis +/src/commands/studio/ @celonis/navi diff --git a/.github/action/bump-npm-version/action.yml b/.github/action/bump-npm-version/action.yml new file mode 100644 index 00000000..80997004 --- /dev/null +++ b/.github/action/bump-npm-version/action.yml @@ -0,0 +1,38 @@ +name: Bump NPM Version + + +inputs: + bump: + description: 'Which version bump (patch, minor, major)' + required: true + default: 'patch' + type: choice + options: + - patch + - minor + - major + +jobs: + bump: + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Configure Git + run: | + git config user.name 'celobot' + git config user.email 'github-celobot@celonis.com' + git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }} + + - name: Run npm version + run: | + npm install + npm version ${{ inputs.bump }} -m "chore: bump version to %s" + git push origin HEAD + git push origin --tags diff --git a/.github/workflows/build-and-publish.yml b/.github/workflows/build-and-publish.yml index f3988125..cd4df093 100644 --- a/.github/workflows/build-and-publish.yml +++ b/.github/workflows/build-and-publish.yml @@ -1,13 +1,29 @@ -name: Build and publish Workflow +name: Build and Publish Workflow on: - push: - branches: [ master ] - paths-ignore: - - 'package.json' - - '.github/**' + workflow_dispatch: + inputs: + bump: + description: 'Which version bump (patch, minor, major)' + required: true + default: 'patch' + type: choice + options: + - patch + - minor + - major + jobs: + version-bump: + runs-on: ubuntu-latest + steps: + - name: Bump NPM version + uses: ./.github/action/bump-npm-version + with: + bump: ${{ inputs.bump }} + build: + needs: version-bump runs-on: ubuntu-latest name: Npm install and npm build diff --git a/package.json b/package.json index c7cbea82..940b3942 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "dependencies": { "@datadog/datadog-ci": "2.48.0", "adm-zip": "0.5.14", - "axios": "1.7.9", + "axios": "1.8.4", "commander": "13.1.0", "form-data": "4.0.1", "openid-client": "5.6.1", diff --git a/src/.gitkeep b/src/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/src/api/action-flow-api.ts b/src/api/action-flow-api.ts deleted file mode 100644 index ad602008..00000000 --- a/src/api/action-flow-api.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { httpClientV2 } from "../services/http-client-service.v2"; -import { FatalError } from "../util/logger"; -import * as FormData from "form-data"; - -class ActionFlowApi { - public static readonly INSTANCE = new ActionFlowApi(); - - public async exportRawAssets(packageId: string): Promise { - return httpClientV2.getFile(`/ems-automation/api/root/${packageId}/export/assets`).catch(e => { - throw new FatalError(`Problem getting Action Flow assets: ${e}`); - }); - } - - public async analyzeAssets(packageId: string): Promise { - return httpClientV2.get(`/ems-automation/api/root/${packageId}/export/assets/analyze`).catch(e => { - throw new FatalError(`Problem analyzing Action Flow assets: ${e}`); - }); - } - - public async importAssets(packageId: string, data: FormData, dryRun: boolean): Promise { - const params = { - dryRun: dryRun, - }; - - return httpClientV2.postFile(`/ems-automation/api/root/${packageId}/import/assets`, data, params).catch(e => { - throw new FatalError(`Problem importing Action Flow assets: ${e}`); - }); - } -} - -export const actionFlowApi = ActionFlowApi.INSTANCE; \ No newline at end of file diff --git a/src/api/batch-import-export-api.ts b/src/api/batch-import-export-api.ts deleted file mode 100644 index ce23e145..00000000 --- a/src/api/batch-import-export-api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { - PackageExportTransport, - PackageKeyAndVersionPair, PostPackageImportData, - VariableManifestTransport -} from "../interfaces/package-export-transport"; -import {httpClientV2} from "../services/http-client-service.v2"; -import {FatalError} from "../util/logger"; -import * as FormData from "form-data"; - -class BatchImportExportApi { - public static readonly INSTANCE = new BatchImportExportApi(); - - public findAllActivePackages(flavors: string[], withDependencies: boolean = false): Promise { - const queryParams = new URLSearchParams(); - - queryParams.set("withDependencies", withDependencies.toString()); - flavors.forEach(flavor => queryParams.append("flavors", flavor)) - - return httpClientV2.get(`/package-manager/api/core/packages/export/list?${queryParams.toString()}`).catch(e => { - throw new FatalError(`Problem getting active packages: ${e}`); - }); - } - - public findActivePackagesByVariableValue(flavors: string[], variableValue: string, variableType: string): Promise { - const queryParams = new URLSearchParams(); - - queryParams.set("variableValue", variableValue); - if (variableType) { - queryParams.set("variableType", variableType); - } - flavors.forEach(flavor => queryParams.append("flavors", flavor)) - - return httpClientV2.get(`/package-manager/api/core/packages/export/list-by-variable-value?${queryParams.toString()}`).catch(e => { - throw new FatalError(`Problem getting active packages by variable value: ${e}`); - }); - } - - public findActivePackagesByKeys(packageKeys: string[], withDependencies: boolean = false): Promise { - const queryParams = new URLSearchParams(); - - packageKeys.forEach(key => queryParams.append("packageKeys", key)) - queryParams.set("withDependencies", withDependencies.toString()); - - return httpClientV2.get(`/package-manager/api/core/packages/export/list-by-keys?${queryParams.toString()}`).catch(e => { - throw new FatalError(`Problem getting active packages by keys: ${e}`); - }); - } - - public exportPackages(packageKeys: string[], withDependencies: boolean = false): Promise { - const queryParams = new URLSearchParams(); - packageKeys.forEach(packageKey => queryParams.append("packageKeys", packageKey)); - queryParams.set("withDependencies", withDependencies.toString()); - - return httpClientV2.getFile(`/package-manager/api/core/packages/export/batch?${queryParams.toString()}`).catch(e => { - throw new FatalError(`Problem exporting packages: ${e}`); - }); - } - - public importPackages(data: FormData, overwrite: boolean): Promise { - return httpClientV2.postFile( - "/package-manager/api/core/packages/import/batch", - data, - {overwrite} - ); - } - - public findVariablesWithValuesByPackageKeysAndVersion(packagesByKeyAndVersion: PackageKeyAndVersionPair[]): Promise { - return httpClientV2.post("/package-manager/api/core/packages/export/batch/variables-with-assignments", packagesByKeyAndVersion).catch(e => { - throw new FatalError(`Problem exporting package variables: ${e}`); - }) - } -} - -export const batchImportExportApi = BatchImportExportApi.INSTANCE; \ No newline at end of file diff --git a/src/api/compute-pool-api.ts b/src/api/compute-pool-api.ts deleted file mode 100644 index 714f0f89..00000000 --- a/src/api/compute-pool-api.ts +++ /dev/null @@ -1,15 +0,0 @@ -import {StudioComputeNodeDescriptor} from "../interfaces/package-manager.interfaces"; -import {httpClientV2} from "../services/http-client-service.v2"; - -class ComputePoolApi { - public static readonly INSTANCE = new ComputePoolApi(); - - public async findAllDataModelsDetails(): Promise { - return httpClientV2.get("/package-manager/api/compute-pools/data-models/details") - .catch(e => { - return null; - }); - } -} - -export const computePoolApi = ComputePoolApi.INSTANCE; \ No newline at end of file diff --git a/src/api/node-api.ts b/src/api/node-api.ts deleted file mode 100644 index 53a15680..00000000 --- a/src/api/node-api.ts +++ /dev/null @@ -1,22 +0,0 @@ -import {ContentNodeTransport} from "../interfaces/package-manager.interfaces"; -import {httpClientV2} from "../services/http-client-service.v2"; -import {FatalError} from "../util/logger"; - -class NodeApi { - public static readonly INSTANCE = new NodeApi(); - - public async findAllNodesOfType(assetType?: string): Promise { - return httpClientV2.get(`/package-manager/api/nodes?assetType=${assetType}`) - .catch(e => { - throw new FatalError(`Problem getting nodes of type ${assetType}: ${e}`); - }); - } - - public async findOneByKeyAndRootNodeKey(packageKey: string, nodeKey: string): Promise { - return httpClientV2.get(`/package-manager/api/nodes/${packageKey}/${nodeKey}`).catch(e => { - return null; - }); - } -} - -export const nodeApi = NodeApi.INSTANCE; \ No newline at end of file diff --git a/src/api/space-api.ts b/src/api/space-api.ts deleted file mode 100644 index 4914d763..00000000 --- a/src/api/space-api.ts +++ /dev/null @@ -1,28 +0,0 @@ -import {httpClientV2} from "../services/http-client-service.v2"; -import {FatalError} from "../util/logger"; -import {SpaceTransport} from "../interfaces/save-space.interface"; - -class SpaceApi { - public static readonly INSTANCE = new SpaceApi(); - - public async findOne(spaceId: string): Promise { - return httpClientV2.get(`/package-manager/api/spaces/${spaceId}`).catch(e => { - throw new FatalError(`Problem getting space: ${spaceId} ${e}`); - }); - } - - public async findAllSpaces(): Promise { - return httpClientV2.get("/package-manager/api/spaces").catch(e => { - throw new FatalError(`Problem getting spaces: ${e}`); - }); - } - - public async createSpace(space: SpaceTransport): Promise { - return httpClientV2.post("/package-manager/api/spaces", space).catch(e => { - throw new FatalError(`Problem space creation: ${e}`); - }); - } - -} - -export const spaceApi = SpaceApi.INSTANCE; diff --git a/src/api/variables-api.ts b/src/api/variables-api.ts deleted file mode 100644 index b1489f5b..00000000 --- a/src/api/variables-api.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { - ContentNodeTransport, - VariablesAssignments -} from "../interfaces/package-manager.interfaces"; -import {httpClientV2} from "../services/http-client-service.v2"; -import {FatalError} from "../util/logger"; -import {variableAssignmentApis} from "./variable-assignment-apis"; -import {URLSearchParams} from "url"; - -class VariablesApi { - public static readonly INSTANCE = new VariablesApi(); - public static readonly ASSIGNMENT_APIS = variableAssignmentApis; - - - public async assignVariableValues(packageKey: string, variablesAssignments: VariablesAssignments[]): Promise { - return httpClientV2.post(`/package-manager/api/nodes/by-package-key/${packageKey}/variables/values`, variablesAssignments).catch(e => { - throw new FatalError(`Problem updating variables of package ${packageKey}: ${e}`); - }); - } - - public async getCandidateAssignments(type: string, params: URLSearchParams): Promise { - if (!VariablesApi.ASSIGNMENT_APIS[type]) { - throw new FatalError(`Variable type ${type} not supported.`); - } - - const apiUrl: string = VariablesApi.ASSIGNMENT_APIS[type].url + (params.toString().length ? `?${params.toString()}` : ""); - - return httpClientV2.get(apiUrl).catch(e => { - throw new FatalError(`Problem getting variables assignment values for type ${type}: ${e}`); - }); - } - - public getRuntimeVariableValues(packageKey: string, appMode: string): Promise { - const queryParams = new URLSearchParams(); - queryParams.set("appMode", appMode); - - return httpClientV2.get(`/package-manager/api/nodes/by-package-key/${packageKey}/variables/runtime-values?${queryParams.toString()}`).catch(e => { - throw new FatalError(`Problem getting runtime variables of package ${packageKey}: ${e}`); - }); - } -} - -export const variablesApi = VariablesApi.INSTANCE; \ No newline at end of file diff --git a/src/commands/action-flow.command.ts b/src/commands/action-flow.command.ts deleted file mode 100644 index 6d0b4313..00000000 --- a/src/commands/action-flow.command.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { actionFlowService } from "../services/action-flow/action-flow-service"; - -export class ActionFlowCommand { - - public async exportActionFlows(packageId: string, metadataFile: string): Promise { - await actionFlowService.exportActionFlows(packageId, metadataFile); - } - - public async analyzeActionFlows(packageId: string, outputToJsonFile: boolean): Promise { - await actionFlowService.analyzeActionFlows(packageId, outputToJsonFile); - } - - public async importActionFlows(packageId: string, filePath: string, dryRun: boolean, outputToJsonFile: boolean): Promise { - await actionFlowService.importActionFlows(packageId, filePath, dryRun, outputToJsonFile); - } -} \ No newline at end of file diff --git a/src/commands/action-flows/action-flow/action-flow-api.ts b/src/commands/action-flows/action-flow/action-flow-api.ts new file mode 100644 index 00000000..04c90486 --- /dev/null +++ b/src/commands/action-flows/action-flow/action-flow-api.ts @@ -0,0 +1,35 @@ +import * as FormData from "form-data"; +import { HttpClient } from "../../../core/http/http-client"; +import { Context } from "../../../core/command/cli-context"; +import { FatalError } from "../../../core/utils/logger"; + +export class ActionFlowApi { + + private httpClient: HttpClient; + + constructor(context: Context) { + this.httpClient = context.httpClient; + } + + public async exportRawAssets(packageId: string): Promise { + return this.httpClient.getFile(`/ems-automation/api/root/${packageId}/export/assets`).catch(e => { + throw new FatalError(`Problem getting Action Flow assets: ${e}`); + }); + } + + public async analyzeAssets(packageId: string): Promise { + return this.httpClient.get(`/ems-automation/api/root/${packageId}/export/assets/analyze`).catch(e => { + throw new FatalError(`Problem analyzing Action Flow assets: ${e}`); + }); + } + + public async importAssets(packageId: string, data: FormData, dryRun: boolean): Promise { + const params = { + dryRun: dryRun, + }; + + return this.httpClient.postFile(`/ems-automation/api/root/${packageId}/import/assets`, data, params).catch(e => { + throw new FatalError(`Problem importing Action Flow assets: ${e}`); + }); + } +} diff --git a/src/commands/action-flows/action-flow/action-flow-command.service.ts b/src/commands/action-flows/action-flow/action-flow-command.service.ts new file mode 100644 index 00000000..1a69b678 --- /dev/null +++ b/src/commands/action-flows/action-flow/action-flow-command.service.ts @@ -0,0 +1,23 @@ +import { Context } from "../../../core/command/cli-context"; +import { ActionFlowService } from "./action-flow.service"; + +export class ActionFlowCommandService { + + private actionFlowService: ActionFlowService; + + constructor(context: Context) { + this.actionFlowService = new ActionFlowService(context); + } + + public async exportActionFlows(packageId: string, metadataFile: string): Promise { + await this.actionFlowService.exportActionFlows(packageId, metadataFile); + } + + public async analyzeActionFlows(packageId: string, outputToJsonFile: boolean): Promise { + await this.actionFlowService.analyzeActionFlows(packageId, outputToJsonFile); + } + + public async importActionFlows(packageId: string, filePath: string, dryRun: boolean, outputToJsonFile: boolean): Promise { + await this.actionFlowService.importActionFlows(packageId, filePath, dryRun, outputToJsonFile); + } +} \ No newline at end of file diff --git a/src/services/action-flow/action-flow-service.ts b/src/commands/action-flows/action-flow/action-flow.service.ts similarity index 79% rename from src/services/action-flow/action-flow-service.ts rename to src/commands/action-flows/action-flow/action-flow.service.ts index c3e1c162..29365dc8 100644 --- a/src/services/action-flow/action-flow-service.ts +++ b/src/commands/action-flows/action-flow/action-flow.service.ts @@ -1,16 +1,23 @@ -import { logger } from "../../util/logger"; import { v4 as uuidv4 } from "uuid"; -import { FileService, fileService } from "../file-service"; -import { actionFlowApi } from "../../api/action-flow-api"; import * as AdmZip from "adm-zip"; import * as FormData from "form-data"; import * as fs from "fs"; +import { Context } from "../../../core/command/cli-context"; +import { ActionFlowApi } from "./action-flow-api"; +import { fileService, FileService } from "../../../core/utils/file-service"; +import { logger } from "../../../core/utils/logger"; -class ActionFlowService { +export class ActionFlowService { public static readonly METADATA_FILE_NAME = "metadata.json"; + private actionFlowApi: ActionFlowApi; + + constructor(context: Context) { + this.actionFlowApi = new ActionFlowApi(context); + } + public async exportActionFlows(packageId: string, metadataFilePath: string): Promise { - const exportedActionFlowsData = await actionFlowApi.exportRawAssets(packageId); + const exportedActionFlowsData = await this.actionFlowApi.exportRawAssets(packageId); const tmpZip: AdmZip = new AdmZip(exportedActionFlowsData); const zip = new AdmZip(); @@ -28,7 +35,7 @@ class ActionFlowService { } public async analyzeActionFlows(packageId: string, outputToJsonFile: boolean): Promise { - const actionFlowsMetadata = await actionFlowApi.analyzeAssets(packageId); + const actionFlowsMetadata = await this.actionFlowApi.analyzeAssets(packageId); const actionFlowsMetadataString = JSON.stringify(actionFlowsMetadata, null, 4); if (outputToJsonFile) { @@ -42,7 +49,7 @@ class ActionFlowService { public async importActionFlows(packageId: string, filePath: string, dryRun: boolean, outputToJsonFile: boolean): Promise { const actionFlowsZip = this.createBodyForImport(filePath); - const eventLog = await actionFlowApi.importAssets(packageId, actionFlowsZip, dryRun); + const eventLog = await this.actionFlowApi.importAssets(packageId, actionFlowsZip, dryRun); const eventLogString = JSON.stringify(eventLog, null, 4); if (outputToJsonFile) { @@ -70,6 +77,3 @@ class ActionFlowService { zip.addFile(ActionFlowService.METADATA_FILE_NAME, Buffer.from(metadata)); } } - -export const actionFlowService = new ActionFlowService(); -export const metadataFileName = ActionFlowService.METADATA_FILE_NAME; \ No newline at end of file diff --git a/src/commands/action-flows/module.ts b/src/commands/action-flows/module.ts new file mode 100644 index 00000000..b08f33e5 --- /dev/null +++ b/src/commands/action-flows/module.ts @@ -0,0 +1,73 @@ +/** + * Commands related to the Action Flows area. + */ + +import { Configurator, IModule } from "../../core/command/module-handler"; +import { Context } from "../../core/command/cli-context"; +import { Command, OptionValues } from "commander"; +import { ActionFlowCommandService } from "./action-flow/action-flow-command.service"; +import { SkillCommandService } from "./skill/skill-command.service"; + +class Module extends IModule { + + public register(context: Context, configurator: Configurator): void { + const analyzeCommand = configurator.command("analyze"); + analyzeCommand.command("action-flows") + .description("Analyze Action Flows dependencies for a certain package") + .requiredOption("--packageId ", "ID of the package from which you want to export Action Flows") + .option("-o, --outputToJsonFile", "Output the analyze result in a JSON file") + .action(this.analyzeActionFlows); + + const exportCommand = configurator.command("export"); + exportCommand.command("action-flows") + .description("Command to export all Action Flows in a package with their objects and dependencies") + .requiredOption("--packageId ", "ID of the package from which you want to export Action Flows") + .option("-f, --file ", "Action flows metadata file (relative path)") + .action(this.exportActionFlows); + + const importCommand = configurator.command("import"); + importCommand.command("action-flows") + .description("Command to import all Action Flows in a package with their objects and dependencies") + .requiredOption("--packageId ", "ID of the package to which you want to export Action Flows") + .requiredOption("-f, --file ", "Exported Action Flows file (relative path)") + .requiredOption("-d, --dryRun ", "Execute the import on dry run mode") + .option("-o, --outputToJsonFile", "Output the import result in a JSON file") + .action(this.importActionFlows); + + const pullCommand = configurator.command("pull"); + pullCommand.command("skill") + .description("Command to pull a skill") + .requiredOption("--projectId ", "Id of the project you want to pull") + .requiredOption("--skillId ", "Id of the skill you want to pull") + .action(this.pullSkill); + + const pushCommand = configurator.command("push"); + pushCommand.command("skill") + .description("Command to push a skill to a project") + .requiredOption("--projectId ", "Id of the project you want to push") + .requiredOption("-f, --file ", "The file you want to push") + .action(this.pushSkill); + } + + private async analyzeActionFlows(context: Context, command: Command, options: OptionValues): Promise { + await new ActionFlowCommandService(context).analyzeActionFlows(options.packageId, options.outputToJsonFile); + } + + private async exportActionFlows(context: Context, command: Command, options: OptionValues): Promise { + await new ActionFlowCommandService(context).exportActionFlows(options.packageId, options.file); + } + + private async importActionFlows(context: Context, command: Command, options: OptionValues): Promise { + await new ActionFlowCommandService(context).importActionFlows(options.packageId, options.file, options.dryRun, options.outputToJsonFile); + } + + private async pullSkill(context: Context, command: Command, options: OptionValues): Promise { + await new SkillCommandService(context).pullSkill(options.profile, options.projectId, options.skillId); + } + + private async pushSkill(context: Context, command: Command, options: OptionValues): Promise { + await new SkillCommandService(context).pushSkill(options.profile, options.projectId, options.file); + } +} + +export = Module; \ No newline at end of file diff --git a/src/commands/action-flows/skill/skill-command.service.ts b/src/commands/action-flows/skill/skill-command.service.ts new file mode 100644 index 00000000..29b9fcf7 --- /dev/null +++ b/src/commands/action-flows/skill/skill-command.service.ts @@ -0,0 +1,18 @@ +import { Context } from "../../../core/command/cli-context"; +import { SkillManagerFactory } from "./skill.manager-factory"; + +export class SkillCommandService { + private skillManagerFactory: SkillManagerFactory; + + constructor(context: Context) { + this.skillManagerFactory = new SkillManagerFactory(context); + } + + public async pullSkill(profile: string, projectId: string, skillId: string): Promise { + await this.skillManagerFactory.createManager(projectId, skillId, null).pull(); + } + + public async pushSkill(profile: string, projectId: string, filename: string): Promise { + await this.skillManagerFactory.createManager(projectId, null, filename).push(); + } +} diff --git a/src/content/factory/skill-manager.factory.ts b/src/commands/action-flows/skill/skill.manager-factory.ts similarity index 68% rename from src/content/factory/skill-manager.factory.ts rename to src/commands/action-flows/skill/skill.manager-factory.ts index ba26a889..e3897494 100644 --- a/src/content/factory/skill-manager.factory.ts +++ b/src/commands/action-flows/skill/skill.manager-factory.ts @@ -1,12 +1,20 @@ import * as fs from "fs"; import * as path from "path"; -import { FatalError, logger } from "../../util/logger"; -import { SkillManager } from "../manager/skill.manager"; import { Stream } from "stream"; +import { Context } from "../../../core/command/cli-context"; +import { FatalError, logger } from "../../../core/utils/logger"; +import { SkillManager } from "./skill.manager"; export class SkillManagerFactory { + + private readonly context: Context; + + constructor(context: Context) { + this.context = context; + } + public createManager(projectId: string, skillId: string, filename: string): SkillManager { - const skillManager = new SkillManager(); + const skillManager = new SkillManager(this.context); skillManager.skillId = skillId; skillManager.projectId = projectId; if (filename !== null) { diff --git a/src/content/manager/skill.manager.ts b/src/commands/action-flows/skill/skill.manager.ts similarity index 72% rename from src/content/manager/skill.manager.ts rename to src/commands/action-flows/skill/skill.manager.ts index fd6ae237..5a83ae2e 100644 --- a/src/content/manager/skill.manager.ts +++ b/src/commands/action-flows/skill/skill.manager.ts @@ -1,6 +1,7 @@ -import { BaseManager } from "./base.manager"; -import { ManagerConfig } from "../../interfaces/manager-config.interface"; import * as FormData from "form-data"; +import { Context } from "../../../core/command/cli-context"; +import { BaseManager } from "../../../core/http/http-shared/base.manager"; +import { ManagerConfig } from "../../../core/http/http-shared/manager-config.interface"; export class SkillManager extends BaseManager { private static BASE_URL = "/action-engine/api/projects"; @@ -8,6 +9,10 @@ export class SkillManager extends BaseManager { private _projectId: string; private _content: any; + constructor(context: Context) { + super(context); + } + public get content(): any { return this._content; } @@ -33,11 +38,8 @@ export class SkillManager extends BaseManager { public getConfig(): ManagerConfig { return { - pushUrl: this.profile.team.replace(/\/?$/, `${SkillManager.BASE_URL}/${this.projectId}/skills/import-file`), - pullUrl: this.profile.team.replace( - /\/?$/, - `${SkillManager.BASE_URL}/${this.projectId}/skills/${this.skillId}/export` - ), + pushUrl: `${SkillManager.BASE_URL}/${this.projectId}/skills/import-file`, + pullUrl: `${SkillManager.BASE_URL}/${this.projectId}/skills/${this.skillId}/export`, exportFileName: "skill_" + this.skillId + ".json", onPushSuccessMessage: (skill: any): string => { return "Skill was pushed successfully. New ID: " + skill.id; diff --git a/src/commands/analysis-bookmarks.command.ts b/src/commands/analysis-bookmarks.command.ts deleted file mode 100644 index cbc62044..00000000 --- a/src/commands/analysis-bookmarks.command.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { ContentService } from "../services/content.service"; -import { AnalysisBookmarksManagerFactory } from "../content/factory/analysis-bookmarks-manager.factory"; - -export class AnalysisBookmarksCommand { - private contentService = new ContentService(); - private analysisBookmarksManagerFactory = new AnalysisBookmarksManagerFactory(); - - public async pullAnalysisBookmarks(profile: string, analysisId: string, type: string): Promise { - await this.contentService.pull( - profile, - this.analysisBookmarksManagerFactory.createAnalysisBookmarksManager(null, analysisId, type) - ); - } - - public async pushAnalysisBookmarks(profile: string, analysisId: string, filename: string): Promise { - await this.contentService.push(profile, this.analysisBookmarksManagerFactory.createAnalysisBookmarksManager(filename, analysisId)); - } -} diff --git a/src/commands/analysis/analysis-bookmarks-command.service.ts b/src/commands/analysis/analysis-bookmarks-command.service.ts new file mode 100644 index 00000000..c121aa24 --- /dev/null +++ b/src/commands/analysis/analysis-bookmarks-command.service.ts @@ -0,0 +1,18 @@ +import { AnalysisBookmarksManagerFactory } from "./analysis-bookmarks.manager-factory"; +import { Context } from "../../core/command/cli-context"; + +export class AnalysisBookmarksCommandService { + private analysisBookmarksManagerFactory: AnalysisBookmarksManagerFactory; + + constructor(context: Context) { + this.analysisBookmarksManagerFactory = new AnalysisBookmarksManagerFactory(context); + } + + public async pullAnalysisBookmarks(analysisId: string, type: string): Promise { + await this.analysisBookmarksManagerFactory.createAnalysisBookmarksManager(null, analysisId, type).pull(); + } + + public async pushAnalysisBookmarks(analysisId: string, filename: string): Promise { + await this.analysisBookmarksManagerFactory.createAnalysisBookmarksManager(filename, analysisId).push(); + } +} diff --git a/src/content/factory/analysis-bookmarks-manager.factory.ts b/src/commands/analysis/analysis-bookmarks.manager-factory.ts similarity index 74% rename from src/content/factory/analysis-bookmarks-manager.factory.ts rename to src/commands/analysis/analysis-bookmarks.manager-factory.ts index c29e3653..36f84aec 100644 --- a/src/content/factory/analysis-bookmarks-manager.factory.ts +++ b/src/commands/analysis/analysis-bookmarks.manager-factory.ts @@ -1,15 +1,23 @@ import * as fs from "fs"; import * as path from "path"; -import { FatalError, logger } from "../../util/logger"; -import { AnalysisBookmarksManager } from "../manager/analysis-bookmarks.manager"; +import { AnalysisBookmarksManager } from "./analysis-bookmarks.manager"; +import { FatalError, logger } from "../../core/utils/logger"; +import { Context } from "../../core/command/cli-context"; export class AnalysisBookmarksManagerFactory { + + private readonly context: Context; + + constructor(context: Context) { + this.context = context; + } + public createAnalysisBookmarksManager( filename: string, analysisId: string, type?: string ): AnalysisBookmarksManager { - const analysisBookmarksManager = new AnalysisBookmarksManager(); + const analysisBookmarksManager = new AnalysisBookmarksManager(this.context); analysisBookmarksManager.analysisId = analysisId; if (type === undefined || type === null) { type = "user"; diff --git a/src/content/manager/analysis-bookmarks.manager.ts b/src/commands/analysis/analysis-bookmarks.manager.ts similarity index 76% rename from src/content/manager/analysis-bookmarks.manager.ts rename to src/commands/analysis/analysis-bookmarks.manager.ts index 81a820a5..a1d0297d 100644 --- a/src/content/manager/analysis-bookmarks.manager.ts +++ b/src/commands/analysis/analysis-bookmarks.manager.ts @@ -1,7 +1,8 @@ -import { BaseManager } from "./base.manager"; -import { ManagerConfig } from "../../interfaces/manager-config.interface"; import * as fs from "fs"; import * as FormData from "form-data"; +import { Context } from "../../core/command/cli-context"; +import { BaseManager } from "../../core/http/http-shared/base.manager"; +import { ManagerConfig } from "../../core/http/http-shared/manager-config.interface"; export class AnalysisBookmarksManager extends BaseManager { private static BASE_URL = "/process-analytics/api/bookmarks"; @@ -11,6 +12,10 @@ export class AnalysisBookmarksManager extends BaseManager { private _fileName: string; private _type: string; + constructor(context: Context) { + super(context); + } + public get fileName(): string { return this._fileName; } @@ -38,12 +43,9 @@ export class AnalysisBookmarksManager extends BaseManager { public getConfig(): ManagerConfig { const pullUrl = `${AnalysisBookmarksManager.BASE_URL}/export?analysisId=${this.analysisId}&type=${this.type}`; return { - pushUrl: this.profile.team.replace( - /\/?$/, - `${AnalysisBookmarksManager.BASE_URL}/import?analysisId=${this.analysisId}` - ), - pullUrl: this.profile.team.replace(/\/?$/, pullUrl), - exportFileName: `${AnalysisBookmarksManager.ANALYSIS_BOOKMARKS_FILE_PREFIX}${this.analysisId}${".json"}`, + pushUrl: `${AnalysisBookmarksManager.BASE_URL}/import?analysisId=${this.analysisId}`, + pullUrl: pullUrl, + exportFileName: `${AnalysisBookmarksManager.ANALYSIS_BOOKMARKS_FILE_PREFIX}${this.analysisId}.json`, onPushSuccessMessage: (): string => { return "Analysis Bookmarks was pushed successfully."; }, diff --git a/src/commands/analysis/module.ts b/src/commands/analysis/module.ts new file mode 100644 index 00000000..8671e330 --- /dev/null +++ b/src/commands/analysis/module.ts @@ -0,0 +1,37 @@ +/** + * Commands related to the Analysis feature. + */ + +import { Configurator, IModule } from "../../core/command/module-handler"; +import { Context } from "../../core/command/cli-context"; +import { Command, OptionValues } from "commander"; +import { AnalysisBookmarksCommandService } from "./analysis-bookmarks-command.service"; + +class Module extends IModule { + + public register(context: Context, configurator: Configurator): void { + const pullCommand = configurator.command("pull"); + pullCommand.command("bookmarks") + .description("Command to pull an analysis bookmarks") + .option("--type ", "Pull shared/all Analysis Bookmarks, else by default get user bookmarks") + .requiredOption("--id ", "Id of the analysis you want to pull") + .action(this.pullAnalysisBookmarks); + + const pushCommand = configurator.command("push"); + pushCommand.command("bookmarks") + .description("Command to push an analysis to a workspace") + .requiredOption("--id ", "Id of the Analysis to which you want to push the analysis bookmarks") + .requiredOption("-f, --file ", "The file you want to push") + .action(this.pushAnalysisBookmarks); + } + + private async pullAnalysisBookmarks(context: Context, command: Command, options: OptionValues): Promise { + await new AnalysisBookmarksCommandService(context).pullAnalysisBookmarks(options.id, options.type); + } + + private async pushAnalysisBookmarks(context: Context, command: Command, options: OptionValues): Promise { + await new AnalysisBookmarksCommandService(context).pushAnalysisBookmarks(options.id, options.file); + } +} + +export = Module; \ No newline at end of file diff --git a/src/commands/asset.command.ts b/src/commands/asset.command.ts deleted file mode 100644 index 19f2d6ea..00000000 --- a/src/commands/asset.command.ts +++ /dev/null @@ -1,28 +0,0 @@ -import {ContentService} from "../services/content.service"; -import {AssetManagerFactory} from "../content/factory/asset-manager.factory"; -import {assetService} from "../services/package-manager/asset-service"; - -export class AssetCommand { - private contentService = new ContentService(); - private assetManagerFactory = new AssetManagerFactory(); - - public async pullAsset(profile: string, key: string): Promise { - await this.contentService.pull(profile, this.assetManagerFactory.createManager(key)); - } - - public async pushAsset(profile: string, fileName: string, packageKey: string): Promise { - await this.contentService.push(profile, this.assetManagerFactory.createManager(null, fileName, packageKey)); - } - - public async pushAssets(profile: string, packageKey: string): Promise { - await this.contentService.batchPush(profile, this.assetManagerFactory.createManagers(packageKey)); - } - - public async listAssets(profile: string, jsonResponse: boolean, assetType: string): Promise { - if (jsonResponse) { - await assetService.findAndExportAllAssets(assetType); - } else { - await assetService.listAssets(assetType); - } - } -} diff --git a/src/commands/config.command.ts b/src/commands/config.command.ts deleted file mode 100644 index b77071e2..00000000 --- a/src/commands/config.command.ts +++ /dev/null @@ -1,47 +0,0 @@ -import {batchImportExportService} from "../services/package-manager/batch-import-export-service"; -import {variableService} from "../services/package-manager/variable-service"; -import {diffService} from "../services/package-manager/diff-service"; - -export class ConfigCommand { - - public async listActivePackages(jsonResponse: boolean, flavors: string[], withDependencies: boolean, packageKeys: string[], variableValue: string, variableType: string): Promise { - if (variableValue) { - await this.listPackagesByVariableValue(jsonResponse, flavors, variableValue, variableType); - return; - } - - if (jsonResponse) { - await batchImportExportService.findAndExportListOfActivePackages(flavors ?? [], packageKeys ?? [], withDependencies) - } else { - await batchImportExportService.listActivePackages(flavors ?? []); - } - } - - public async listVariables(jsonResponse: boolean, keysByVersion: string[], keysByVersionFile: string): Promise { - if (jsonResponse) { - await variableService.exportVariables(keysByVersion, keysByVersionFile); - } else { - await variableService.listVariables(keysByVersion, keysByVersionFile); - } - } - - public batchExportPackages(packageKeys: string[], withDependencies: boolean = false): Promise { - return batchImportExportService.batchExportPackages(packageKeys, withDependencies); - } - - public batchImportPackages(file: string, overwrite: boolean): Promise { - return batchImportExportService.batchImportPackages(file, overwrite); - } - - public diffPackages(file: string, hasChanges: boolean, jsonResponse: boolean): Promise { - return diffService.diffPackages(file, hasChanges, jsonResponse); - } - - private async listPackagesByVariableValue(jsonResponse: boolean, flavors: string[], variableValue: string, variableType: string): Promise { - if (jsonResponse) { - await batchImportExportService.findAndExportListOfActivePackagesByVariableValue(flavors ?? [], variableValue, variableType ) - } else { - await batchImportExportService.listActivePackagesByVariableValue(flavors ?? [], variableValue, variableType); - } - } -} \ No newline at end of file diff --git a/src/commands/configuration-management/api/batch-import-export-api.ts b/src/commands/configuration-management/api/batch-import-export-api.ts new file mode 100644 index 00000000..2c0e4d7e --- /dev/null +++ b/src/commands/configuration-management/api/batch-import-export-api.ts @@ -0,0 +1,78 @@ +import * as FormData from "form-data"; +import { + PackageExportTransport, + PackageKeyAndVersionPair, + PostPackageImportData, VariableManifestTransport, +} from "../interfaces/package-export.interfaces"; +import { FatalError } from "../../../core/utils/logger"; +import { HttpClient } from "../../../core/http/http-client"; +import { Context } from "../../../core/command/cli-context"; + +export class BatchImportExportApi { + + private httpClient: HttpClient; + + constructor(context: Context) { + this.httpClient = context.httpClient; + } + + public async findAllActivePackages(flavors: string[], withDependencies: boolean = false): Promise { + const queryParams = new URLSearchParams(); + + queryParams.set("withDependencies", withDependencies.toString()); + flavors.forEach(flavor => queryParams.append("flavors", flavor)) + + return this.httpClient.get(`/package-manager/api/core/packages/export/list?${queryParams.toString()}`).catch(e => { + throw new FatalError(`Problem getting active packages: ${e}`); + }); + } + + public async findActivePackagesByVariableValue(flavors: string[], variableValue: string, variableType: string): Promise { + const queryParams = new URLSearchParams(); + + queryParams.set("variableValue", variableValue); + if (variableType) { + queryParams.set("variableType", variableType); + } + flavors.forEach(flavor => queryParams.append("flavors", flavor)) + + return this.httpClient.get(`/package-manager/api/core/packages/export/list-by-variable-value?${queryParams.toString()}`).catch(e => { + throw new FatalError(`Problem getting active packages by variable value: ${e}`); + }); + } + + public async findActivePackagesByKeys(packageKeys: string[], withDependencies: boolean = false): Promise { + const queryParams = new URLSearchParams(); + + packageKeys.forEach(key => queryParams.append("packageKeys", key)) + queryParams.set("withDependencies", withDependencies.toString()); + + return this.httpClient.get(`/package-manager/api/core/packages/export/list-by-keys?${queryParams.toString()}`).catch(e => { + throw new FatalError(`Problem getting active packages by keys: ${e}`); + }); + } + + public async exportPackages(packageKeys: string[], withDependencies: boolean = false): Promise { + const queryParams = new URLSearchParams(); + packageKeys.forEach(packageKey => queryParams.append("packageKeys", packageKey)); + queryParams.set("withDependencies", withDependencies.toString()); + + return this.httpClient.getFile(`/package-manager/api/core/packages/export/batch?${queryParams.toString()}`).catch(e => { + throw new FatalError(`Problem exporting packages: ${e}`); + }); + } + + public async importPackages(data: FormData, overwrite: boolean): Promise { + return this.httpClient.postFile( + "/package-manager/api/core/packages/import/batch", + data, + {overwrite} + ); + } + + public async findVariablesWithValuesByPackageKeysAndVersion(packagesByKeyAndVersion: PackageKeyAndVersionPair[]): Promise { + return this.httpClient.post("/package-manager/api/core/packages/export/batch/variables-with-assignments", packagesByKeyAndVersion).catch(e => { + throw new FatalError(`Problem exporting package variables: ${e}`); + }) + } +} diff --git a/src/api/diff-api.ts b/src/commands/configuration-management/api/diff-api.ts similarity index 55% rename from src/api/diff-api.ts rename to src/commands/configuration-management/api/diff-api.ts index 9dcc2c09..211757f5 100644 --- a/src/api/diff-api.ts +++ b/src/commands/configuration-management/api/diff-api.ts @@ -1,23 +1,27 @@ -import { PackageDiffMetadata, PackageDiffTransport } from "../interfaces/diff-package.transport"; -import {httpClientV2} from "../services/http-client-service.v2"; import * as FormData from "form-data"; +import { HttpClient } from "../../../core/http/http-client"; +import { Context } from "../../../core/command/cli-context"; +import { PackageDiffMetadata, PackageDiffTransport } from "../interfaces/diff-package.interfaces"; -class DiffApi { - public static readonly INSTANCE = new DiffApi(); +export class DiffApi { + + private httpClient: HttpClient; + + constructor(context: Context) { + this.httpClient = context.httpClient; + } public async diffPackages(data: FormData): Promise { - return httpClientV2.postFile( + return this.httpClient.postFile( "/package-manager/api/core/packages/diff/configuration", data ); } public async hasChanges(data: FormData): Promise { - return httpClientV2.postFile( + return this.httpClient.postFile( "/package-manager/api/core/packages/diff/configuration/has-changes", data ); } } - -export const diffApi = DiffApi.INSTANCE; \ No newline at end of file diff --git a/src/commands/configuration-management/api/variable-assignment-candidates-api.ts b/src/commands/configuration-management/api/variable-assignment-candidates-api.ts new file mode 100644 index 00000000..0f44a890 --- /dev/null +++ b/src/commands/configuration-management/api/variable-assignment-candidates-api.ts @@ -0,0 +1,26 @@ +import {URLSearchParams} from "url"; +import { variableAssignmentApis } from "../interfaces/variable-assignment-apis.constants"; +import { HttpClient } from "../../../core/http/http-client"; +import { Context } from "../../../core/command/cli-context"; +import { FatalError } from "../../../core/utils/logger"; + +export class VariableAssignmentCandidatesApi { + + private httpClient: HttpClient; + + constructor(context: Context) { + this.httpClient = context.httpClient; + } + + public async getCandidateAssignments(type: string, params: URLSearchParams): Promise { + if (!variableAssignmentApis[type]) { + throw new FatalError(`Variable type ${type} not supported.`); + } + + const apiUrl: string = variableAssignmentApis[type].url + (params.toString().length ? `?${params.toString()}` : ""); + + return this.httpClient.get(apiUrl).catch(e => { + throw new FatalError(`Problem getting variables assignment values for type ${type}: ${e}`); + }); + } +} diff --git a/src/services/package-manager/batch-import-export-service.ts b/src/commands/configuration-management/batch-import-export.service.ts similarity index 67% rename from src/services/package-manager/batch-import-export-service.ts rename to src/commands/configuration-management/batch-import-export.service.ts index b52a4fff..2b8b70ba 100644 --- a/src/services/package-manager/batch-import-export-service.ts +++ b/src/commands/configuration-management/batch-import-export.service.ts @@ -1,26 +1,37 @@ -import {batchImportExportApi} from "../../api/batch-import-export-api"; -import {logger} from "../../util/logger"; import {v4 as uuidv4} from "uuid"; -import { - PackageExportTransport, - PackageKeyAndVersionPair, - PackageManifestTransport, - StudioPackageManifest, - VariableManifestTransport -} from "../../interfaces/package-export-transport"; -import {FileService, fileService} from "../file-service"; -import {studioService} from "../studio/studio.service"; -import {parse, stringify} from "../../util/json" import * as FormData from "form-data"; -import {BatchExportImportConstants} from "../../interfaces/batch-export-import-constants"; -import {packageApi} from "../../api/package-api"; import {Readable} from "stream"; import * as AdmZip from "adm-zip"; +import { Context } from "../../core/command/cli-context"; +import { + PackageExportTransport, PackageKeyAndVersionPair, + PackageManifestTransport, + StudioPackageManifest, VariableManifestTransport, +} from "./interfaces/package-export.interfaces"; +import { BatchExportImportConstants } from "./interfaces/batch-export-import.constants"; +import { fileService, FileService } from "../../core/utils/file-service"; +import { logger } from "../../core/utils/logger"; +import { parse, stringify } from "../../core/utils/json"; +import { PackageApi } from "../studio/api/package-api"; +import { BatchImportExportApi } from "./api/batch-import-export-api"; +import { StudioService } from "./studio.service"; + +export class BatchImportExportService { -class BatchImportExportService { + private batchImportExportApi: BatchImportExportApi; + + private studioPackageApi: PackageApi; + private studioService: StudioService; + + constructor(context: Context) { + this.batchImportExportApi = new BatchImportExportApi(context); + + this.studioPackageApi = new PackageApi(context); + this.studioService = new StudioService(context); + } public async listActivePackages(flavors: string[]): Promise { - const activePackages = await batchImportExportApi.findAllActivePackages(flavors); + const activePackages = await this.batchImportExportApi.findAllActivePackages(flavors); activePackages.forEach(pkg => { logger.info(`${pkg.name} - Key: "${pkg.key}"`) }); @@ -30,18 +41,18 @@ class BatchImportExportService { let packagesToExport: PackageExportTransport[]; if (packageKeys.length) { - packagesToExport = await batchImportExportApi.findActivePackagesByKeys(packageKeys, withDependencies); + packagesToExport = await this.batchImportExportApi.findActivePackagesByKeys(packageKeys, withDependencies); } else { - packagesToExport = await batchImportExportApi.findAllActivePackages(flavors, withDependencies); + packagesToExport = await this.batchImportExportApi.findAllActivePackages(flavors, withDependencies); } - packagesToExport = await studioService.getExportPackagesWithStudioData(packagesToExport, withDependencies); + packagesToExport = await this.studioService.getExportPackagesWithStudioData(packagesToExport, withDependencies); this.exportListOfPackages(packagesToExport); } public async batchExportPackages(packageKeys: string[], withDependencies: boolean = false): Promise { - const exportedPackagesData: Buffer = await batchImportExportApi.exportPackages(packageKeys, withDependencies); + const exportedPackagesData: Buffer = await this.batchImportExportApi.exportPackages(packageKeys, withDependencies); const exportedPackagesZip: AdmZip = new AdmZip(exportedPackagesData); const manifest: PackageManifestTransport[] = parse( @@ -51,13 +62,13 @@ class BatchImportExportService { const versionsByPackageKey = this.getVersionsByPackageKey(manifest); let exportedVariables = await this.getVersionedVariablesForPackagesWithKeys(versionsByPackageKey); - exportedVariables = studioService.fixConnectionVariables(exportedVariables); + exportedVariables = this.studioService.fixConnectionVariables(exportedVariables); exportedPackagesZip.addFile(BatchExportImportConstants.VARIABLES_FILE_NAME, Buffer.from(stringify(exportedVariables), "utf8")); const studioPackageKeys = manifest.filter(packageManifest => packageManifest.flavor === BatchExportImportConstants.STUDIO) .map(packageManifest => packageManifest.packageKey); - const studioData = await studioService.getStudioPackageManifests(studioPackageKeys); + const studioData = await this.studioService.getStudioPackageManifests(studioPackageKeys); exportedPackagesZip.addFile(BatchExportImportConstants.STUDIO_FILE_NAME, Buffer.from(stringify(studioData), "utf8")); exportedPackagesZip.getEntries().forEach(entry => { @@ -66,7 +77,7 @@ class BatchImportExportService { const packageKey = entry.name.substring(0, lastUnderscoreIndex); if (studioPackageKeys.includes(packageKey)) { - const updatedPackage = studioService.processPackageForExport(entry, exportedVariables); + const updatedPackage = this.studioService.processPackageForExport(entry, exportedVariables); exportedPackagesZip.updateFile(entry, updatedPackage.toBuffer()); } } @@ -83,12 +94,12 @@ class BatchImportExportService { const studioManifests = this.parseEntryData(configs, BatchExportImportConstants.STUDIO_FILE_NAME) as StudioPackageManifest[]; const variablesManifests: VariableManifestTransport[] = this.parseEntryData(configs, BatchExportImportConstants.VARIABLES_FILE_NAME) as VariableManifestTransport[]; - configs = await studioService.mapSpaces(configs, studioManifests); - const existingStudioPackages = await packageApi.findAllPackages(); + configs = await this.studioService.mapSpaces(configs, studioManifests); + const existingStudioPackages = await this.studioPackageApi.findAllPackages(); const formData = this.buildBodyForImport(configs, variablesManifests); - const postPackageImportData = await batchImportExportApi.importPackages(formData, overwrite); - await studioService.processImportedPackages(configs, existingStudioPackages, studioManifests); + const postPackageImportData = await this.batchImportExportApi.importPackages(formData, overwrite); + await this.studioService.processImportedPackages(configs, existingStudioPackages, studioManifests); const reportFileName = "config_import_report_" + uuidv4() + ".json"; fileService.writeToFileWithGivenName(JSON.stringify(postPackageImportData), reportFileName); @@ -96,15 +107,15 @@ class BatchImportExportService { } public async findAndExportListOfActivePackagesByVariableValue(flavors: string[], variableValue: string, variableType: string): Promise { - let packagesToExport = await batchImportExportApi.findActivePackagesByVariableValue(flavors, variableValue, variableType); + let packagesToExport = await this.batchImportExportApi.findActivePackagesByVariableValue(flavors, variableValue, variableType); - packagesToExport = await studioService.getExportPackagesWithStudioData(packagesToExport, false); + packagesToExport = await this.studioService.getExportPackagesWithStudioData(packagesToExport, false); this.exportListOfPackages(packagesToExport); } public async listActivePackagesByVariableValue(flavors: string[], variableValue: string, variableType: string) : Promise { - const packagesByVariableValue = await batchImportExportApi.findActivePackagesByVariableValue(flavors, variableValue, variableType); + const packagesByVariableValue = await this.batchImportExportApi.findActivePackagesByVariableValue(flavors, variableValue, variableType); packagesByVariableValue.forEach(pkg => { logger.info(`${pkg.name} - Key: "${pkg.key}"`) }); @@ -136,7 +147,7 @@ class BatchImportExportService { }) }); - return batchImportExportApi.findVariablesWithValuesByPackageKeysAndVersion(variableExportRequest) + return this.batchImportExportApi.findVariablesWithValuesByPackageKeysAndVersion(variableExportRequest) } private buildBodyForImport(configs: AdmZip, variablesManifests: VariableManifestTransport[]): FormData { @@ -171,5 +182,3 @@ class BatchImportExportService { return null; } } - -export const batchImportExportService = new BatchImportExportService(); \ No newline at end of file diff --git a/src/commands/configuration-management/config-command.service.ts b/src/commands/configuration-management/config-command.service.ts new file mode 100644 index 00000000..b63fe82f --- /dev/null +++ b/src/commands/configuration-management/config-command.service.ts @@ -0,0 +1,58 @@ +import { Context } from "../../core/command/cli-context"; +import { BatchImportExportService } from "./batch-import-export.service"; +import { VariableService } from "./variable.service"; +import { DiffService } from "./diff.service"; + +export class ConfigCommandService { + + private batchImportExportService: BatchImportExportService; + private variableService: VariableService; + private diffService: DiffService; + + constructor(context: Context) { + this.batchImportExportService = new BatchImportExportService(context); + this.variableService = new VariableService(context); + this.diffService = new DiffService(context); + } + + public async listActivePackages(jsonResponse: boolean, flavors: string[], withDependencies: boolean, packageKeys: string[], variableValue: string, variableType: string): Promise { + if (variableValue) { + await this.listPackagesByVariableValue(jsonResponse, flavors, variableValue, variableType); + return; + } + + if (jsonResponse) { + await this.batchImportExportService.findAndExportListOfActivePackages(flavors ?? [], packageKeys ?? [], withDependencies) + } else { + await this.batchImportExportService.listActivePackages(flavors ?? []); + } + } + + public async listVariables(jsonResponse: boolean, keysByVersion: string[], keysByVersionFile: string): Promise { + if (jsonResponse) { + await this.variableService.exportVariables(keysByVersion, keysByVersionFile); + } else { + await this.variableService.listVariables(keysByVersion, keysByVersionFile); + } + } + + public batchExportPackages(packageKeys: string[], withDependencies: boolean = false): Promise { + return this.batchImportExportService.batchExportPackages(packageKeys, withDependencies); + } + + public batchImportPackages(file: string, overwrite: boolean): Promise { + return this.batchImportExportService.batchImportPackages(file, overwrite); + } + + public diffPackages(file: string, hasChanges: boolean, jsonResponse: boolean): Promise { + return this.diffService.diffPackages(file, hasChanges, jsonResponse); + } + + private async listPackagesByVariableValue(jsonResponse: boolean, flavors: string[], variableValue: string, variableType: string): Promise { + if (jsonResponse) { + await this.batchImportExportService.findAndExportListOfActivePackagesByVariableValue(flavors ?? [], variableValue, variableType ) + } else { + await this.batchImportExportService.listActivePackagesByVariableValue(flavors ?? [], variableValue, variableType); + } + } +} diff --git a/src/services/package-manager/diff-service.ts b/src/commands/configuration-management/diff.service.ts similarity index 81% rename from src/services/package-manager/diff-service.ts rename to src/commands/configuration-management/diff.service.ts index aa178791..23f676e7 100644 --- a/src/services/package-manager/diff-service.ts +++ b/src/commands/configuration-management/diff.service.ts @@ -1,13 +1,20 @@ import * as AdmZip from "adm-zip"; import {Readable} from "stream"; import * as FormData from "form-data"; -import {diffApi} from "../../api/diff-api"; -import {FileService, fileService} from "../file-service"; -import {logger} from "../../util/logger"; -import { PackageDiffMetadata, PackageDiffTransport } from "../../interfaces/diff-package.transport"; import {v4 as uuidv4} from "uuid"; +import { logger } from "../../core/utils/logger"; +import { fileService, FileService } from "../../core/utils/file-service"; +import { Context } from "../../core/command/cli-context"; +import { PackageDiffMetadata, PackageDiffTransport } from "./interfaces/diff-package.interfaces"; +import { DiffApi } from "./api/diff-api"; -class DiffService { +export class DiffService { + + private diffApi: DiffApi; + + constructor(context: Context) { + this.diffApi = new DiffApi(context); + } public async diffPackages(file: string, hasChanges: boolean, jsonResponse: boolean): Promise { if (hasChanges) { @@ -20,7 +27,7 @@ class DiffService { private async hasChanges(file: string, jsonResponse: boolean): Promise { const packages = new AdmZip(file); const formData = this.buildBodyForDiff(packages); - const returnedHasChangesData = await diffApi.hasChanges(formData); + const returnedHasChangesData = await this.diffApi.hasChanges(formData); if (jsonResponse) { this.exportListOfPackageDiffMetadata(returnedHasChangesData); @@ -32,7 +39,7 @@ class DiffService { private async diffPackagesAndReturnDiff(file: string, jsonResponse: boolean): Promise { const packages = new AdmZip(file); const formData = this.buildBodyForDiff(packages); - const returnedHasChangesData = await diffApi.diffPackages(formData); + const returnedHasChangesData = await this.diffApi.diffPackages(formData); if (jsonResponse) { this.exportListOfPackageDiffs(returnedHasChangesData); @@ -79,5 +86,3 @@ class DiffService { return "\n" + JSON.stringify(packageDiffMetadata, null, 2); } } - -export const diffService = new DiffService(); \ No newline at end of file diff --git a/src/interfaces/batch-export-import-constants.ts b/src/commands/configuration-management/interfaces/batch-export-import.constants.ts similarity index 100% rename from src/interfaces/batch-export-import-constants.ts rename to src/commands/configuration-management/interfaces/batch-export-import.constants.ts diff --git a/src/interfaces/diff-package.transport.ts b/src/commands/configuration-management/interfaces/diff-package.interfaces.ts similarity index 100% rename from src/interfaces/diff-package.transport.ts rename to src/commands/configuration-management/interfaces/diff-package.interfaces.ts diff --git a/src/interfaces/package-export-transport.ts b/src/commands/configuration-management/interfaces/package-export.interfaces.ts similarity index 88% rename from src/interfaces/package-export-transport.ts rename to src/commands/configuration-management/interfaces/package-export.interfaces.ts index 9f20c518..ec6d54ab 100644 --- a/src/interfaces/package-export-transport.ts +++ b/src/commands/configuration-management/interfaces/package-export.interfaces.ts @@ -1,5 +1,9 @@ -import {StudioComputeNodeDescriptor, VariableDefinition, VariablesAssignments} from "./package-manager.interfaces"; -import {SpaceTransport} from "./save-space.interface"; +import { + StudioComputeNodeDescriptor, + VariableDefinition, + VariablesAssignments, +} from "../../studio/interfaces/package-manager.interfaces"; +import { SpaceTransport } from "../../studio/interfaces/space.interface"; export interface DependencyTransport { key: string; diff --git a/src/api/variable-assignment-apis.ts b/src/commands/configuration-management/interfaces/variable-assignment-apis.constants.ts similarity index 75% rename from src/api/variable-assignment-apis.ts rename to src/commands/configuration-management/interfaces/variable-assignment-apis.constants.ts index c6b8b659..ae930750 100644 --- a/src/api/variable-assignment-apis.ts +++ b/src/commands/configuration-management/interfaces/variable-assignment-apis.constants.ts @@ -1,4 +1,6 @@ -import {VariableAssignmentApi} from "../interfaces/variable-assignment-api.interface"; +export interface VariableAssignmentApi { + url: string; +} export const variableAssignmentApis: { [key: string]: VariableAssignmentApi } = { DATA_MODEL: { diff --git a/src/commands/configuration-management/module.ts b/src/commands/configuration-management/module.ts new file mode 100644 index 00000000..9afb71ba --- /dev/null +++ b/src/commands/configuration-management/module.ts @@ -0,0 +1,88 @@ +/** + * Commands related to Celonis configuration management. + */ + +import { Configurator, IModule } from "../../core/command/module-handler"; +import { Context } from "../../core/command/cli-context"; +import { Command, OptionValues } from "commander"; +import { ConfigCommandService } from "./config-command.service"; +import { VariableCommandService } from "./variable-command.service"; + +class Module extends IModule { + + public register(context: Context, configurator: Configurator): void { + const configCommand = configurator.command("config"); + configCommand.command("list") + .description("Command to list active packages that can be exported") + .option("--json", "Return response as json type", "") + .option("--flavors ", "Lists only active packages of the given flavors") + .option("--withDependencies", "Include dependencies", "") + .option("--packageKeys ", "Lists only given package keys") + .option("--variableValue ", "Variable value for filtering packages by.") + .option("--variableType ", "Variable type for filtering packages by.") + .action(this.listActivePackages); + + configCommand.command("export") + .description("Command to export package configs") + .requiredOption("--packageKeys ", "Keys of packages to export") + .option("--withDependencies", "Include variables and dependencies", "") + .action(this.batchExportPackages); + + configCommand.command("import") + .description("Command to import package configs") + .option("--overwrite", "Flag to allow overwriting of packages") + .requiredOption("-f, --file ", "Exported packages file (relative path)") + .action(this.batchImportPackages); + + configCommand.command("diff") + .description("Command to diff configs of packages") + .option("--hasChanges", "Flag to return only the information if the package has changes without the actual changes") + .option("--json", "Return the response as a JSON file") + .requiredOption("-f, --file ", "Exported packages file (relative or absolute path)") + .action(this.diffPackages); + + const variablesCommand = configCommand.command("variables") + .description("Commands related to variable configs"); + + variablesCommand.command("list") + .description("Command to list versioned variables of packages") + .option("--json", "Return response as json type", "") + .option("--keysByVersion ", "Mapping of package keys and versions", "") + .option("--keysByVersionFile ", "Package keys by version mappings file path.", "") + .action(this.listVariables); + + const listCommand = configurator.command("list"); + listCommand.command("assignments") + .description("Command to list possible variable assignments for a type") + .option("--json", "Return response as json type", "") + .requiredOption("--type ", "Type of variable") + .option("--params ", "Variable query params") + .action(this.listAssignments); + } + + private async listActivePackages(context: Context, command: Command, options: OptionValues): Promise { + await new ConfigCommandService(context).listActivePackages(options.json, options.flavors, options.withDependencies, options.packageKeys, options.variableValue, options.variableType); + } + + private async batchExportPackages(context: Context, command: Command, options: OptionValues): Promise { + await new ConfigCommandService(context).batchExportPackages(options.packageKeys, options.withDependencies); + } + + private async batchImportPackages(context: Context, command: Command, options: OptionValues): Promise { + await new ConfigCommandService(context).batchImportPackages(options.file, options.overwrite); + } + + private async diffPackages(context: Context, command: Command, options: OptionValues): Promise { + await new ConfigCommandService(context).diffPackages(options.file, options.hasChanges, options.json); + } + + private async listVariables(context: Context, command: Command, options: OptionValues): Promise { + await new ConfigCommandService(context).listVariables(options.json, options.keysByVersion, options.keysByVersionFile); + } + + private async listAssignments(context: Context, command: Command, options: OptionValues): Promise { + await new VariableCommandService(context).listAssignments(options.type, options.json, options.params); + } +} + +export = Module; \ No newline at end of file diff --git a/src/services/studio/studio.service.ts b/src/commands/configuration-management/studio.service.ts similarity index 75% rename from src/services/studio/studio.service.ts rename to src/commands/configuration-management/studio.service.ts index 83b659ba..c19c95bd 100644 --- a/src/services/studio/studio.service.ts +++ b/src/commands/configuration-management/studio.service.ts @@ -1,43 +1,59 @@ +import {IZipEntry} from "adm-zip"; +import * as AdmZip from "adm-zip"; import { NodeConfiguration, NodeExportTransport, - PackageExportTransport, - PackageKeyAndVersionPair, - StudioPackageManifest, - VariableExportTransport, + PackageExportTransport, PackageKeyAndVersionPair, + StudioPackageManifest, VariableExportTransport, VariableManifestTransport, -} from "../../interfaces/package-export-transport"; - -import {packageApi} from "../../api/package-api"; +} from "./interfaces/package-export.interfaces"; import { ContentNodeTransport, PackageManagerVariableType, - PackageWithVariableAssignments, - StudioComputeNodeDescriptor -} from "../../interfaces/package-manager.interfaces"; -import {dataModelService} from "../package-manager/datamodel-service"; -import {IZipEntry} from "adm-zip"; -import {parse, stringify} from "../../util/json"; -import {nodeApi} from "../../api/node-api"; -import {variablesApi} from "../../api/variables-api"; -import {spaceApi} from "../../api/space-api"; -import {SpaceTransport} from "../../interfaces/save-space.interface"; -import {spaceService} from "../package-manager/space-service"; -import {variableService} from "../package-manager/variable-service"; -import {BatchExportImportConstants} from "../../interfaces/batch-export-import-constants"; -import * as AdmZip from "adm-zip"; - - -class StudioService { + PackageWithVariableAssignments, StudioComputeNodeDescriptor, +} from "../studio/interfaces/package-manager.interfaces"; +import { BatchExportImportConstants } from "./interfaces/batch-export-import.constants"; +import { SpaceTransport } from "../studio/interfaces/space.interface"; +import { parse, stringify } from "../../core/utils/json"; +import { Context } from "../../core/command/cli-context"; +import { PackageApi } from "../studio/api/package-api"; +import { DataModelService } from "../studio/service/data-model.service"; +import { NodeApi } from "../studio/api/node-api"; +import { SpaceApi } from "../studio/api/space-api"; +import { StudioVariablesApi } from "../studio/api/studio-variables-api"; +import { SpaceService } from "../studio/service/space.service"; +import { StudioVariableService } from "../studio/service/studio-variable.service"; + +export class StudioService { + + private studioPackageApi: PackageApi; + private studioNodeApi: NodeApi; + private studioSpaceApi: SpaceApi; + private studioVariablesApi: StudioVariablesApi; + + private studioDataModelService: DataModelService; + private studioSpaceService: SpaceService; + private studioVariableService: StudioVariableService; + + constructor(context: Context) { + this.studioPackageApi = new PackageApi(context); + this.studioNodeApi = new NodeApi(context); + this.studioSpaceApi = new SpaceApi(context); + this.studioVariablesApi = new StudioVariablesApi(context); + + this.studioDataModelService = new DataModelService(context); + this.studioSpaceService = new SpaceService(context); + this.studioVariableService = new StudioVariableService(context); + } public async getExportPackagesWithStudioData(packagesToExport: PackageExportTransport[], withDependencies: boolean): Promise { - const studioPackagesWithDataModels = await packageApi.findAllPackagesWithVariableAssignments(PackageManagerVariableType.DATA_MODEL); + const studioPackagesWithDataModels = await this.studioPackageApi.findAllPackagesWithVariableAssignments(PackageManagerVariableType.DATA_MODEL); - packagesToExport = studioService.setSpaceIdForStudioPackages(packagesToExport, studioPackagesWithDataModels); + packagesToExport = this.setSpaceIdForStudioPackages(packagesToExport, studioPackagesWithDataModels); if (withDependencies) { - const dataModelDetailsByNode = await dataModelService.getDataModelDetailsForPackages(studioPackagesWithDataModels); - packagesToExport = studioService.setDataModelsForStudioPackages(packagesToExport, studioPackagesWithDataModels, dataModelDetailsByNode); + const dataModelDetailsByNode = await this.studioDataModelService.getDataModelDetailsForPackages(studioPackagesWithDataModels); + packagesToExport = this.setDataModelsForStudioPackages(packagesToExport, studioPackagesWithDataModels, dataModelDetailsByNode); } return packagesToExport; @@ -58,9 +74,9 @@ class StudioService { public async getStudioPackageManifests(studioPackageKeys: string[]): Promise { return Promise.all(studioPackageKeys.map(async packageKey => { - const node = await nodeApi.findOneByKeyAndRootNodeKey(packageKey, packageKey); - const nodeSpace: SpaceTransport = await spaceApi.findOne(node.spaceId); - const variableAssignments = await variablesApi.getRuntimeVariableValues(packageKey, BatchExportImportConstants.APP_MODE_VIEWER); + const node = await this.studioNodeApi.findOneByKeyAndRootNodeKey(packageKey, packageKey); + const nodeSpace: SpaceTransport = await this.studioSpaceApi.findOne(node.spaceId); + const variableAssignments = await this.studioVariablesApi.getRuntimeVariableValues(packageKey, BatchExportImportConstants.APP_MODE_VIEWER); return { packageKey: packageKey, @@ -88,7 +104,7 @@ class StudioService { for (const manifest of studioManifests) { const existingPackage = existingStudioPackages.find(existingPackage => existingPackage.key === manifest.packageKey); if (existingPackage) { - await packageApi.movePackageToSpace(existingPackage.id, manifest.space.id); + await this.studioPackageApi.movePackageToSpace(existingPackage.id, manifest.space.id); } await this.assignRuntimeVariables(manifest); } @@ -229,7 +245,7 @@ class StudioService { } private async findDesiredSpaceIdForPackage(studioPackageManifest: StudioPackageManifest): Promise { - const allSpaces = await spaceService.refreshAndGetAllSpaces(); + const allSpaces = await this.studioSpaceService.refreshAndGetAllSpaces(); if (studioPackageManifest.space.id) { const targetSpace = allSpaces.find(space => space.id === studioPackageManifest.space.id); @@ -244,13 +260,13 @@ class StudioService { return targetSpaceByName.id; } - const spaceTransport = await spaceService.createSpace(studioPackageManifest.space.name, studioPackageManifest.space.iconReference); + const spaceTransport = await this.studioSpaceService.createSpace(studioPackageManifest.space.name, studioPackageManifest.space.iconReference); return spaceTransport.id; } private async assignRuntimeVariables(manifest: StudioPackageManifest): Promise { if (manifest.runtimeVariableAssignments.length) { - await variableService.assignVariableValues(manifest.packageKey, manifest.runtimeVariableAssignments); + await this.studioVariableService.assignVariableValues(manifest.packageKey, manifest.runtimeVariableAssignments); } } @@ -262,5 +278,3 @@ class StudioService { return nodeContent; } } - -export const studioService = new StudioService(); \ No newline at end of file diff --git a/src/commands/configuration-management/variable-command.service.ts b/src/commands/configuration-management/variable-command.service.ts new file mode 100644 index 00000000..dbf699dd --- /dev/null +++ b/src/commands/configuration-management/variable-command.service.ts @@ -0,0 +1,19 @@ +import { VariableService } from "./variable.service"; +import { Context } from "../../core/command/cli-context"; + +export class VariableCommandService { + + private variableService: VariableService; + + constructor(context: Context) { + this.variableService = new VariableService(context); + } + + public async listAssignments(variableType: string, jsonResponse: boolean, params: string): Promise { + if (jsonResponse) { + await this.variableService.findAndExportCandidateAssignments(variableType, params); + } else { + await this.variableService.listCandidateAssignments(variableType, params); + } + } +} diff --git a/src/services/package-manager/variable-service.ts b/src/commands/configuration-management/variable.service.ts similarity index 68% rename from src/services/package-manager/variable-service.ts rename to src/commands/configuration-management/variable.service.ts index 2c0b09ff..77c8b85a 100644 --- a/src/services/package-manager/variable-service.ts +++ b/src/commands/configuration-management/variable.service.ts @@ -1,31 +1,36 @@ -import {packageApi} from "../../api/package-api"; -import { - PackageManagerVariableType, - PackageWithVariableAssignments, - VariablesAssignments -} from "../../interfaces/package-manager.interfaces"; -import {variablesApi} from "../../api/variables-api"; import { v4 as uuidv4 } from "uuid"; -import {FatalError, logger} from "../../util/logger"; -import {FileService, fileService} from "../file-service"; -import {URLSearchParams} from "url"; -import {studioService} from "../studio/studio.service"; -import {batchImportExportApi} from "../../api/batch-import-export-api"; -import {PackageKeyAndVersionPair, VariableManifestTransport} from "../../interfaces/package-export-transport"; - -class VariableService { - - public async getVariableAssignmentsForNodes(type?: PackageManagerVariableType): Promise { - return await packageApi.findAllPackagesWithVariableAssignments(type); +import { Context } from "../../core/command/cli-context"; +import { FatalError, logger } from "../../core/utils/logger"; +import { StudioService } from "./studio.service"; +import { FileService, fileService } from "../../core/utils/file-service"; +import { PackageKeyAndVersionPair, VariableManifestTransport } from "./interfaces/package-export.interfaces"; +import { BatchImportExportApi } from "./api/batch-import-export-api"; +import { URLSearchParams } from "url"; +import { VariableAssignmentCandidatesApi } from "./api/variable-assignment-candidates-api"; + +export class VariableService { + + private batchImportExportApi: BatchImportExportApi; + private variableAssignmentCandidatesApi: VariableAssignmentCandidatesApi; + private studioService: StudioService; + + constructor(context: Context) { + this.batchImportExportApi = new BatchImportExportApi(context); + this.variableAssignmentCandidatesApi = new VariableAssignmentCandidatesApi(context); + this.studioService = new StudioService(context); } - public async assignVariableValues(packageKey: string, variablesAssignments: VariablesAssignments[]): Promise { - await variablesApi.assignVariableValues(packageKey, variablesAssignments); + public async listVariables(keysByVersion: string[], keysByVersionFile: string): Promise { + const variableManifests = await this.getVersionedVariablesByKeyVersionPairs(keysByVersion, keysByVersionFile); + + variableManifests.forEach(variableManifest => { + logger.info(JSON.stringify(variableManifest)); + }); } public async listCandidateAssignments(type: string, params: string): Promise { const parsedParams = this.parseParams(params); - const assignments = await variablesApi.getCandidateAssignments(type, parsedParams); + const assignments = await this.variableAssignmentCandidatesApi.getCandidateAssignments(type, parsedParams); assignments.forEach(assignment => { logger.info(JSON.stringify(assignment)); @@ -34,47 +39,22 @@ class VariableService { public async findAndExportCandidateAssignments(type: string, params: string): Promise { const parsedParams = this.parseParams(params); - const assignments = await variablesApi.getCandidateAssignments(type, parsedParams); + const assignments = await this.variableAssignmentCandidatesApi.getCandidateAssignments(type, parsedParams); this.exportToJson(assignments) } - public async listVariables(keysByVersion: string[], keysByVersionFile: string): Promise { - const variableManifests = await this.getVersionedVariablesByKeyVersionPairs(keysByVersion, keysByVersionFile); - - variableManifests.forEach(variableManifest => { - logger.info(JSON.stringify(variableManifest)); - }); - } - public async exportVariables(keysByVersion: string[], keysByVersionFile: string): Promise { const variableManifests = await this.getVersionedVariablesByKeyVersionPairs(keysByVersion, keysByVersionFile); this.exportToJson(variableManifests); } - private parseParams(params?: string): URLSearchParams { - const queryParams = new URLSearchParams(); - - if (params) { - try { - params.split(",").forEach((param: string) => { - const paramKeyValuePair: string[] = param.split("="); - queryParams.set(paramKeyValuePair[0], paramKeyValuePair[1]); - }) - } catch (e) { - throw new FatalError(`Problem parsing query params: ${e}`); - } - } - - return queryParams; - } - private async getVersionedVariablesByKeyVersionPairs(keysByVersion: string[], keysByVersionFile: string): Promise { const variablesExportRequest: PackageKeyAndVersionPair[] = await this.buildKeyVersionPairs(keysByVersion, keysByVersionFile); - const variableManifests = await batchImportExportApi.findVariablesWithValuesByPackageKeysAndVersion(variablesExportRequest); - return studioService.fixConnectionVariables(variableManifests); + const variableManifests = await this.batchImportExportApi.findVariablesWithValuesByPackageKeysAndVersion(variablesExportRequest); + return this.studioService.fixConnectionVariables(variableManifests); } private async buildKeyVersionPairs(keysByVersion: string[], keysByVersionFile: string): Promise { @@ -106,6 +86,21 @@ class VariableService { fileService.writeToFileWithGivenName(JSON.stringify(data), filename); logger.info(FileService.fileDownloadedMessage + filename); } -} -export const variableService = new VariableService(); + private parseParams(params?: string): URLSearchParams { + const queryParams = new URLSearchParams(); + + if (params) { + try { + params.split(",").forEach((param: string) => { + const paramKeyValuePair: string[] = param.split("="); + queryParams.set(paramKeyValuePair[0], paramKeyValuePair[1]); + }) + } catch (e) { + throw new FatalError(`Problem parsing query params: ${e}`); + } + } + + return queryParams; + } +} diff --git a/src/commands/connection.command.ts b/src/commands/connection.command.ts deleted file mode 100644 index ab71d3a5..00000000 --- a/src/commands/connection.command.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { ContentService } from "../services/content.service"; -import { DataPoolManagerFactory } from "../content/factory/data-pool-manager.factory"; -import { connectionService } from "../services/connection/connection.service"; - -export class ConnectionCommand { - - public async updateProperty(profile: string, dataPoolId: string, connectionId: string, property: string, value: string): Promise{ - await connectionService.updateProperty(dataPoolId, connectionId, property, value); - } - - public async getProperties(profile: string, dataPoolId: string, connectionId: string): Promise { - await connectionService.listProperties(dataPoolId, connectionId); - } - - public async listConnections(profile: string, dataPoolId: string): Promise { - return await connectionService.findAllConnections(dataPoolId); - } -} diff --git a/src/commands/ctp.command.ts b/src/commands/cpm4/ctp-command.service.ts similarity index 53% rename from src/commands/ctp.command.ts rename to src/commands/cpm4/ctp-command.service.ts index e4744ff5..6def57e8 100644 --- a/src/commands/ctp.command.ts +++ b/src/commands/cpm4/ctp-command.service.ts @@ -1,13 +1,15 @@ -import { ContentService } from "../services/content.service"; -import { CTPManagerFactory } from "../content/factory/ctp-manager.factory"; -import { FatalError, logger } from "../util/logger"; +import { Context } from "../../core/command/cli-context"; +import { FatalError, logger } from "../../core/utils/logger"; +import { CTPManagerFactory } from "./ctp.manager-factory"; -export class CTPCommand { - private contentService = new ContentService(); - private ctpManagerFactory = new CTPManagerFactory(); +export class CTPCommandService { + private ctpManagerFactory: CTPManagerFactory; + + constructor(context: Context) { + this.ctpManagerFactory = new CTPManagerFactory(context); + } public async pushCTPFile( - profile: string, filename: string, password: string, pushAnalysis: boolean, @@ -17,18 +19,12 @@ export class CTPCommand { spaceKey: string ): Promise { if (pushAnalysis) { - await this.contentService.push( - profile, - this.ctpManagerFactory.createCtpAnalysisManager(filename, password, spaceKey) - ); + await this.ctpManagerFactory.createCtpAnalysisManager(filename, password, spaceKey).push(); } if (pushDataModels) { this.validateParamsForDataModelPush(existingPoolId, globalPoolName); - await this.contentService.push( - profile, - this.ctpManagerFactory.createCtpDataModelManager(filename, password, existingPoolId, globalPoolName) - ); + await this.ctpManagerFactory.createCtpDataModelManager(filename, password, existingPoolId, globalPoolName).push(); } } diff --git a/src/content/manager/ctp.analysis.manager.ts b/src/commands/cpm4/ctp.analysis.manager.ts similarity index 81% rename from src/content/manager/ctp.analysis.manager.ts rename to src/commands/cpm4/ctp.analysis.manager.ts index e6044325..86fc0e70 100644 --- a/src/content/manager/ctp.analysis.manager.ts +++ b/src/commands/cpm4/ctp.analysis.manager.ts @@ -1,9 +1,14 @@ import { CtpManager } from "./ctp.manager"; import * as FormData from "form-data"; +import { Context } from "../../core/command/cli-context"; export class CtpAnalysisManager extends CtpManager { private static BASE_URL = "/process-analytics/import/ctp"; + constructor(context: Context) { + super(context); + } + protected getUrl(): string { return CtpAnalysisManager.BASE_URL; } diff --git a/src/content/manager/ctp.datamodel.manager.ts b/src/commands/cpm4/ctp.datamodel.manager.ts similarity index 83% rename from src/content/manager/ctp.datamodel.manager.ts rename to src/commands/cpm4/ctp.datamodel.manager.ts index 43ee759f..501b2bf3 100644 --- a/src/content/manager/ctp.datamodel.manager.ts +++ b/src/commands/cpm4/ctp.datamodel.manager.ts @@ -1,13 +1,14 @@ import { CtpManager } from "./ctp.manager"; import * as FormData from "form-data"; +import { Context } from "../../core/command/cli-context"; export class CtpDataModelManager extends CtpManager { private static BASE_URL = "/cpm-ems-migrator/migration/api/ctp"; private readonly existingPoolId: string; private readonly globalPoolName: string; - constructor(existingPoolId: string, globalPoolName: string) { - super(); + constructor(context: Context, existingPoolId: string, globalPoolName: string) { + super(context); this.existingPoolId = existingPoolId; this.globalPoolName = globalPoolName; } diff --git a/src/content/factory/ctp-manager.factory.ts b/src/commands/cpm4/ctp.manager-factory.ts similarity index 67% rename from src/content/factory/ctp-manager.factory.ts rename to src/commands/cpm4/ctp.manager-factory.ts index c751b94b..085b6472 100644 --- a/src/content/factory/ctp-manager.factory.ts +++ b/src/commands/cpm4/ctp.manager-factory.ts @@ -1,14 +1,22 @@ import * as fs from "fs"; import * as path from "path"; -import { FatalError, logger } from "../../util/logger"; -import { CtpAnalysisManager } from "../manager/ctp.analysis.manager"; import { ReadStream } from "fs"; -import { CtpManager } from "../manager/ctp.manager"; -import { CtpDataModelManager } from "../manager/ctp.datamodel.manager"; +import { Context } from "../../core/command/cli-context"; +import { CtpAnalysisManager } from "./ctp.analysis.manager"; +import { CtpDataModelManager } from "./ctp.datamodel.manager"; +import { CtpManager } from "./ctp.manager"; +import { FatalError, logger } from "../../core/utils/logger"; export class CTPManagerFactory { + + private readonly context: Context; + + constructor(context: Context) { + this.context = context; + } + public createCtpAnalysisManager(filename: string, password: string, spaceKey: string): CtpManager { - const ctpManager = new CtpAnalysisManager(); + const ctpManager = new CtpAnalysisManager(this.context); return this.initManager(ctpManager, filename, password, spaceKey); } @@ -18,7 +26,7 @@ export class CTPManagerFactory { existingPoolId: string, globalPoolName: string ): CtpManager { - const ctpManager = new CtpDataModelManager(existingPoolId, globalPoolName); + const ctpManager = new CtpDataModelManager(this.context, existingPoolId, globalPoolName); return this.initManager(ctpManager, filename, password); } diff --git a/src/content/manager/ctp.manager.ts b/src/commands/cpm4/ctp.manager.ts similarity index 74% rename from src/content/manager/ctp.manager.ts rename to src/commands/cpm4/ctp.manager.ts index 663be129..52ceb20b 100644 --- a/src/content/manager/ctp.manager.ts +++ b/src/commands/cpm4/ctp.manager.ts @@ -1,11 +1,16 @@ -import { BaseManager } from "./base.manager"; -import { ManagerConfig } from "../../interfaces/manager-config.interface"; +import { Context } from "../../core/command/cli-context"; +import { BaseManager } from "../../core/http/http-shared/base.manager"; +import { ManagerConfig } from "../../core/http/http-shared/manager-config.interface"; export abstract class CtpManager extends BaseManager { protected _content: any; protected _password: string; protected _spaceKey?: string; + protected constructor(context: Context) { + super(context); + } + public get content(): any { return this._content; } @@ -31,9 +36,8 @@ export abstract class CtpManager extends BaseManager { } public getConfig(): ManagerConfig { - const baseUrl = this.getUrl(); return { - pushUrl: this.profile.team.replace(/\/?$/, `${baseUrl}`), + pushUrl: this.getUrl(), onPushSuccessMessage: (): string => { return "CTP File was pushed successfully"; }, diff --git a/src/commands/cpm4/module.ts b/src/commands/cpm4/module.ts new file mode 100644 index 00000000..4fc87387 --- /dev/null +++ b/src/commands/cpm4/module.ts @@ -0,0 +1,51 @@ +/** + * Commands related to the CPM4 area. + */ + +import { Configurator, IModule } from "../../core/command/module-handler"; +import { Context } from "../../core/command/cli-context"; +import { Command, OptionValues } from "commander"; +import { CTPCommandService } from "./ctp-command.service"; + +class Module extends IModule { + + public register(context: Context, configurator: Configurator): void { + const pushCommand = configurator.command("push") + pushCommand.command("ctp") + .description("Command to push a .ctp (Celonis 4 transport file) to create a package") + .option("-a, --pushAnalysis", "Specify this option if you want to push analysis from the CTP file") + .option("-d, --pushDataModels", "Specify this option if you want to push data models from the CTP file") + .option( + "--globalPoolName ", + "Specify this option if you want to push all Data models into one newly created pool along with value to set the name of the pool to be created", + null + ) + .option( + "--existingPoolId ", + "Specify this option if you want to push all Data models into one already existing pool with provided ID", + null + ) + .option( + "-s, --spaceKey ", + "The key of the destination space where the analyses from .ctp file will be created.", + "" + ) + .requiredOption("-f, --file ", "The .ctp file you want to push") + .requiredOption("--password ", "The password used for extracting the .ctp file") + .action(this.pushCTPFile); + } + + private async pushCTPFile(context: Context, command: Command, options: OptionValues): Promise { + await new CTPCommandService(context).pushCTPFile( + options.file, + options.password, + options.pushAnalysis, + options.pushDataModels, + options.existingPoolId, + options.globalPoolName, + options.spaceKey + ); + } +} + +export = Module; \ No newline at end of file diff --git a/src/commands/data-pipeline/connection/connection-command.service.ts b/src/commands/data-pipeline/connection/connection-command.service.ts new file mode 100644 index 00000000..739e4602 --- /dev/null +++ b/src/commands/data-pipeline/connection/connection-command.service.ts @@ -0,0 +1,23 @@ +import { Context } from "../../../core/command/cli-context"; +import { ConnectionService } from "./connection.service"; + +export class ConnectionCommandService { + + private connectionService: ConnectionService; + + constructor(context: Context) { + this.connectionService = new ConnectionService(context); + } + + public async updateProperty(dataPoolId: string, connectionId: string, property: string, value: string): Promise{ + await this.connectionService.updateProperty(dataPoolId, connectionId, property, value); + } + + public async getProperties(dataPoolId: string, connectionId: string): Promise { + await this.connectionService.listProperties(dataPoolId, connectionId); + } + + public async listConnections(dataPoolId: string): Promise { + await this.connectionService.findAllConnections(dataPoolId); + } +} diff --git a/src/commands/data-pipeline/connection/connection.commands.ts b/src/commands/data-pipeline/connection/connection.commands.ts new file mode 100644 index 00000000..98c44d23 --- /dev/null +++ b/src/commands/data-pipeline/connection/connection.commands.ts @@ -0,0 +1,47 @@ +/** + * Commands related to the Data Pool Connections. + */ + +import { Command, OptionValues } from "commander"; +import { Configurator } from "../../../core/command/module-handler"; +import { ConnectionCommandService } from "./connection-command.service"; +import { Context } from "../../../core/command/cli-context"; + +export class ConnectionCommands { + + public register(context: Context, configurator: Configurator): void { + const listCommand = configurator.command("list"); + listCommand.command("connection") + .description("Command to list all connections in a Data Pool") + .requiredOption("--dataPoolId ", "ID of the data pool") + .action(this.listConnections); + + const getCommand = configurator.command("get"); + getCommand.command("connection") + .description("Programmatically read properties of your connections") + .requiredOption("--dataPoolId ", "Id of the data pool you want to update") + .requiredOption("--connectionId ", "Id of the connection you want to update") + .action(this.getCommandProperties); + + const setCommand = configurator.command("set"); + setCommand.command("connection") + .description("Programmatically update properties of your connections") + .requiredOption("--dataPoolId ", "Id of the data pool you want to update") + .requiredOption("--connectionId ", "Id of the connection you want to update") + .requiredOption("--property ", "The property you want to update") + .requiredOption("--value ", "The value you want to update") + .action(this.updateConnectionProperty); + } + + private async getCommandProperties(context: Context, command: Command, options: OptionValues): Promise { + await new ConnectionCommandService(context).getProperties(options.dataPoolId, options.connectionId); + } + + private async listConnections(context: Context, command: Command, options: OptionValues): Promise { + await new ConnectionCommandService(context).listConnections(options.dataPoolId); + } + + private async updateConnectionProperty(context: Context, command: Command, options: OptionValues): Promise { + await new ConnectionCommandService(context).updateProperty(options.dataPoolId, options.connectionId, options.property, options.value); + } +} diff --git a/src/services/connection/connection.service.ts b/src/commands/data-pipeline/connection/connection.service.ts similarity index 57% rename from src/services/connection/connection.service.ts rename to src/commands/data-pipeline/connection/connection.service.ts index 7882c022..422dcdb7 100644 --- a/src/services/connection/connection.service.ts +++ b/src/commands/data-pipeline/connection/connection.service.ts @@ -1,9 +1,17 @@ -import { dataPoolApi } from "../../api/data-pool-api"; -import { logger } from "../../util/logger"; +import { logger } from "../../../core/utils/logger"; +import { Context } from "../../../core/command/cli-context"; +import { DataPoolApi } from "../data-pool/data-pool-api"; + +export class ConnectionService { + + private dataPoolApi: DataPoolApi; + + constructor(context: Context) { + this.dataPoolApi = new DataPoolApi(context) + } -class ConnectionService { public async findAllConnections(dataPoolId: string): Promise { - const connections = await dataPoolApi.listConnections(dataPoolId); + const connections = await this.dataPoolApi.listConnections(dataPoolId); connections.forEach(connection => { logger.info(`Connection ID: ${connection.id} - Name: ${connection.name} - Type: ${connection.type}`); }) @@ -11,14 +19,14 @@ class ConnectionService { } public async listProperties(dataPoolId: string, connectionId: string): Promise { - const connection = await dataPoolApi.getConnection(dataPoolId, connectionId); + const connection = await this.dataPoolApi.getConnection(dataPoolId, connectionId); const type = connection.type; - const typedConnection = await dataPoolApi.getTypedConnection(dataPoolId, connectionId, type); + const typedConnection = await this.dataPoolApi.getTypedConnection(dataPoolId, connectionId, type); logger.info(`Connection ID: ${connection.id} - Name: ${connection.name} - Type: ${connection.type}`); - logger.info(`Properties:`) - for (let k in typedConnection) { - if (typeof typedConnection[k] === 'object') { - for (let o in typedConnection[k]) { + logger.info("Properties:") + for (const k in typedConnection) { + if (typeof typedConnection[k] === "object") { + for (const o in typedConnection[k]) { logger.info(` ${k}.${o} : ${typeof typedConnection[k][o]} := ${typedConnection[k][o]}`) } } else { @@ -28,10 +36,10 @@ class ConnectionService { return typedConnection; } - public async updateProperty(dataPoolId: string, connectionId: string, property: string, value: string) { - const connection = await dataPoolApi.getConnection(dataPoolId, connectionId); + public async updateProperty(dataPoolId: string, connectionId: string, property: string, value: string): Promise { + const connection = await this.dataPoolApi.getConnection(dataPoolId, connectionId); const type = connection.type; - const typedConnection = await dataPoolApi.getTypedConnection(dataPoolId, connectionId, type); + const typedConnection = await this.dataPoolApi.getTypedConnection(dataPoolId, connectionId, type); const parts = property.split("."); // update the typed connection object let currentObject = typedConnection; @@ -48,9 +56,7 @@ class ConnectionService { return; } } - await dataPoolApi.updateTypedConnection(dataPoolId, connectionId, type, typedConnection); + await this.dataPoolApi.updateTypedConnection(dataPoolId, connectionId, type, typedConnection); logger.info(`Property ${property} updated.`); } } - -export const connectionService = new ConnectionService(); \ No newline at end of file diff --git a/src/api/data-pool-api.ts b/src/commands/data-pipeline/data-pool/data-pool-api.ts similarity index 54% rename from src/api/data-pool-api.ts rename to src/commands/data-pipeline/data-pool/data-pool-api.ts index e63cd6be..77c41b1a 100644 --- a/src/api/data-pool-api.ts +++ b/src/commands/data-pipeline/data-pool/data-pool-api.ts @@ -1,51 +1,55 @@ -import { httpClientV2 } from "../services/http-client-service.v2"; -import { FatalError } from "../util/logger"; -import { DataPoolInstallVersionReport, DataPoolPageTransport } from "../interfaces/data-pool-manager.interfaces"; +import { DataPoolInstallVersionReport, DataPoolPageTransport } from "./data-pool-manager.interfaces"; +import { FatalError } from "../../../core/utils/logger"; +import { Context } from "../../../core/command/cli-context"; +import { HttpClient } from "../../../core/http/http-client"; -class DataPoolApi { - public static readonly INSTANCE = new DataPoolApi(); +export class DataPoolApi { + + private httpClient: HttpClient; + + constructor(context: Context) { + this.httpClient = context.httpClient; + } public async findAllPagedPools(limit: string, page: string): Promise { - return httpClientV2.get(`/integration/api/pools/paged?limit=${limit}&page=${page}`).catch(e => { + return this.httpClient.get(`/integration/api/pools/paged?limit=${limit}&page=${page}`).catch(e => { throw new FatalError(`Problem getting data pools: : ${e}`); }); } public async executeDataPoolsBatchImport(importRequest: string): Promise { - return httpClientV2.post("/integration/api/pool/batch-import", importRequest).catch(e => { + return this.httpClient.post("/integration/api/pool/batch-import", importRequest).catch(e => { throw new FatalError(`Data Pool batch import failed: : ${e}`); }); } public async exportDataPool(poolId: string): Promise { - return httpClientV2.get(`/integration/api/pools/${poolId}/v2/export`).catch(e => { + return this.httpClient.get(`/integration/api/pools/${poolId}/v2/export`).catch(e => { throw new FatalError(`Data Pool export failed: : ${e}`); }); } public async listConnections(poolId: string): Promise { - return httpClientV2.get(`/integration/api/pools/${poolId}/overviews/data-sources`).catch(e => { + return this.httpClient.get(`/integration/api/pools/${poolId}/overviews/data-sources`).catch(e => { throw new FatalError(`Can not list connections: : ${e}`); }); } public async getConnection(poolId: string, connectionId: string): Promise { - return httpClientV2.get(`/integration/api/pools/${poolId}/data-sources/${connectionId}`).catch(e => { + return this.httpClient.get(`/integration/api/pools/${poolId}/data-sources/${connectionId}`).catch(e => { throw new FatalError(`Can not get connection: : ${e}`); }); } public async getTypedConnection(poolId: string, connectionId: string, type: string): Promise { - return httpClientV2.get(`/integration/api/datasource/${type}/${connectionId}`).catch(e => { + return this.httpClient.get(`/integration/api/datasource/${type}/${connectionId}`).catch(e => { throw new FatalError(`Can get typed connection: : ${e}`); }); } public async updateTypedConnection(poolId: string, connectionId: string, type: string, data: any): Promise { - return httpClientV2.put(`/integration/api/datasource/${type}/${connectionId}`, data).catch(e => { + return this.httpClient.put(`/integration/api/datasource/${type}/${connectionId}`, data).catch(e => { throw new FatalError(`Can not update typed connection: ${e}`); }); } } - -export const dataPoolApi = DataPoolApi.INSTANCE; diff --git a/src/commands/data-pipeline/data-pool/data-pool-command.service.ts b/src/commands/data-pipeline/data-pool/data-pool-command.service.ts new file mode 100644 index 00000000..8fb4a698 --- /dev/null +++ b/src/commands/data-pipeline/data-pool/data-pool-command.service.ts @@ -0,0 +1,48 @@ +import { DataPoolManagerFactory } from "./data-pool-manager.factory"; +import { Context } from "../../../core/command/cli-context"; +import { DataPoolService } from "./data-pool-service"; +import { BaseManagerHelper } from "../../../core/http/http-shared/base.manager.helper"; + +export class DataPoolCommandService { + private baseManagerHelper = new BaseManagerHelper(); + private dataPoolManagerFactory: DataPoolManagerFactory; + private dataPoolService: DataPoolService; + + constructor(context: Context) { + this.dataPoolManagerFactory = new DataPoolManagerFactory(context); + this.dataPoolService = new DataPoolService(context); + } + + public async pullDataPool(id: string): Promise { + await this.dataPoolManagerFactory.createManager(id, null).pull(); + } + + public async pushDataPool(filename: string): Promise { + await this.dataPoolManagerFactory.createManager(null, filename).push(); + } + + public async exportDataPool(poolId: string, outputToJsonFile: boolean): Promise { + await this.dataPoolService.exportDataPool(poolId, outputToJsonFile); + } + + public async pushDataPools(): Promise { + const dataPoolManagers = this.dataPoolManagerFactory.createManagers(); + await this.baseManagerHelper.batchPush(dataPoolManagers); + } + + public async batchImportDataPools(requestFile: string, outputToJsonFile: boolean): Promise { + await this.dataPoolService.batchImportDataPools(requestFile, outputToJsonFile); + } + + public async updateDataPool(id: string, filename: string): Promise { + await this.dataPoolManagerFactory.createManager(id, filename).update(); + } + + public async listDataPools(jsonResponse: boolean): Promise { + if (jsonResponse) { + await this.dataPoolService.findAndExportAllPools(); + } else { + await this.dataPoolService.listDataPools(); + } + } +} diff --git a/src/content/factory/data-pool-manager.factory.ts b/src/commands/data-pipeline/data-pool/data-pool-manager.factory.ts similarity index 74% rename from src/content/factory/data-pool-manager.factory.ts rename to src/commands/data-pipeline/data-pool/data-pool-manager.factory.ts index f0506d7e..9a367007 100644 --- a/src/content/factory/data-pool-manager.factory.ts +++ b/src/commands/data-pipeline/data-pool/data-pool-manager.factory.ts @@ -1,11 +1,19 @@ -import * as fs from "fs"; import * as path from "path"; -import { FatalError, logger } from "../../util/logger"; -import { DataPoolManager } from "../manager/data-pool.manager"; +import { DataPoolManager } from "./data-pool.manager"; +import { FatalError, logger } from "../../../core/utils/logger"; +import * as fs from "fs"; +import { Context } from "../../../core/command/cli-context"; export class DataPoolManagerFactory { + + private readonly context: Context; + + constructor(context: Context) { + this.context = context; + } + public createManager(id: string, filename: string): DataPoolManager { - const dataPoolManager = new DataPoolManager(); + const dataPoolManager = new DataPoolManager(this.context); dataPoolManager.id = id; if (filename !== null) { dataPoolManager.content = this.readFile(filename); @@ -24,7 +32,7 @@ export class DataPoolManagerFactory { return false; }) .map(dataPool => { - const dataPoolManager = new DataPoolManager(); + const dataPoolManager = new DataPoolManager(this.context); dataPoolManager.content = this.readFile(dataPool); return dataPoolManager; }); diff --git a/src/interfaces/data-pool-manager.interfaces.ts b/src/commands/data-pipeline/data-pool/data-pool-manager.interfaces.ts similarity index 64% rename from src/interfaces/data-pool-manager.interfaces.ts rename to src/commands/data-pipeline/data-pool/data-pool-manager.interfaces.ts index 71c00bff..14929380 100644 --- a/src/interfaces/data-pool-manager.interfaces.ts +++ b/src/commands/data-pipeline/data-pool/data-pool-manager.interfaces.ts @@ -2,10 +2,10 @@ export declare type DataPoolStatus = "CANCEL" | "FAIL" | "QUEUED" | "RUNNING" | export type Tag = {}; export declare class DataSourceSlimTransport { - id: string; - name: string; - imported: boolean; - importedPoolId: string; + public id: string; + public name: string; + public imported: boolean; + public importedPoolId: string; } export interface DataPoolSlimTransport { @@ -19,12 +19,12 @@ export interface DataPoolSlimTransport { dataSources: DataSourceSlimTransport[]; } export declare class DataPoolPageTransport { - content: DataPoolSlimTransport[]; - pageSize: number; - pageNumber: number; - totalCount: number; + public content: DataPoolSlimTransport[]; + public pageSize: number; + public pageNumber: number; + public totalCount: number; } export declare class DataPoolInstallVersionReport { - dataModelIdMappings: Map; + public dataModelIdMappings: Map; } diff --git a/src/services/data-pool/data-pool-service.ts b/src/commands/data-pipeline/data-pool/data-pool-service.ts similarity index 72% rename from src/services/data-pool/data-pool-service.ts rename to src/commands/data-pipeline/data-pool/data-pool-service.ts index 21e10c8d..38caf886 100644 --- a/src/services/data-pool/data-pool-service.ts +++ b/src/commands/data-pipeline/data-pool/data-pool-service.ts @@ -1,13 +1,21 @@ -import { dataPoolApi } from "../../api/data-pool-api"; -import { logger } from "../../util/logger"; import { v4 as uuidv4 } from "uuid"; -import { FileService, fileService } from "../file-service"; -import { DataPoolSlimTransport } from "../../interfaces/data-pool-manager.interfaces"; +import { FileService, fileService } from "../../../core/utils/file-service"; +import { logger } from "../../../core/utils/logger"; +import { DataPoolSlimTransport } from "./data-pool-manager.interfaces"; +import { Context } from "../../../core/command/cli-context"; +import { DataPoolApi } from "./data-pool-api"; + +export class DataPoolService { + + private dataPoolApi: DataPoolApi; + + constructor(context: Context) { + this.dataPoolApi = new DataPoolApi(context); + } -class DataPoolService { public async batchImportDataPools(requestFilePath: string, outputToJsonFile: boolean): Promise { const requestFileContent: string = fileService.readFile(requestFilePath); - const importReport = await dataPoolApi.executeDataPoolsBatchImport(requestFileContent); + const importReport = await this.dataPoolApi.executeDataPoolsBatchImport(requestFileContent); const importReportString = JSON.stringify(importReport, null, 4); if (outputToJsonFile) { @@ -20,7 +28,7 @@ class DataPoolService { } public async exportDataPool(poolId: string, outputToJsonFile: boolean): Promise { - const exportedDataPool = await dataPoolApi.exportDataPool(poolId); + const exportedDataPool = await this.dataPoolApi.exportDataPool(poolId); const exportedDataPoolString = JSON.stringify(exportedDataPool, null, 4); if (outputToJsonFile) { @@ -47,10 +55,10 @@ class DataPoolService { private async findAllPools(): Promise { let page = 0; const dataPools: DataPoolSlimTransport[] = []; - let tmpPage = await dataPoolApi.findAllPagedPools("100", page.toString()); + let tmpPage = await this.dataPoolApi.findAllPagedPools("100", page.toString()); while (tmpPage.pageNumber < tmpPage.totalCount) { dataPools.push(...tmpPage.content); - tmpPage = await dataPoolApi.findAllPagedPools("100", (++page).toString()); + tmpPage = await this.dataPoolApi.findAllPagedPools("100", (++page).toString()); } return dataPools; } @@ -60,6 +68,4 @@ class DataPoolService { fileService.writeToFileWithGivenName(JSON.stringify(nodes), filename); logger.info(FileService.fileDownloadedMessage + filename); } -} - -export const dataPoolService = new DataPoolService(); +} \ No newline at end of file diff --git a/src/commands/data-pipeline/data-pool/data-pool.commands.ts b/src/commands/data-pipeline/data-pool/data-pool.commands.ts new file mode 100644 index 00000000..15c401fd --- /dev/null +++ b/src/commands/data-pipeline/data-pool/data-pool.commands.ts @@ -0,0 +1,83 @@ +/** + * Commands related to the Data Pools. + */ +import { Context } from "../../../core/command/cli-context"; +import { Configurator } from "../../../core/command/module-handler"; +import { Command, OptionValues } from "commander"; +import { DataPoolCommandService } from "./data-pool-command.service"; + +export class DataPoolCommands { + + public register(context: Context, configurator: Configurator): void { + const exportCommand = configurator.command("export"); + exportCommand.command("data-pool") + .description("Command to export a data pool") + .requiredOption("--id ", "ID of the data pool you want to export") + .option("--outputToJsonFile", "Output the exported data pool to a JSON file") + .action(this.exportDataPool); + + const importCommand = configurator.command("import"); + importCommand.command("data-pools") + .description("Command to batch import multiple data pools with their objects and dependencies") + .requiredOption("-f, --jsonFile ", "The file with the JSON data pool batch import request") + .option("--outputToJsonFile", "Output the batch import result in a JSON file") + .action(this.batchImportDataPools); + + const listCommand = configurator.command("list"); + listCommand.command("data-pools") + .description("Command to list all Data Pools") + .option("--json", "Return response as json type", "") + .action(this.listDataPools); + + const pullCommand = configurator.command("pull"); + pullCommand.command("data-pool") + .description("Command to pull a data pool") + .requiredOption("--id ", "Id of the data pool you want to pull") + .action(this.pullDataPool); + + const pushCommand = configurator.command("push"); + pushCommand.command("data-pool") + .description("Command to push a data pool") + .requiredOption("-f, --file ", "The file you want to push") + .action(this.pushDataPool); + + pushCommand.command("data-pools") + .description("Command to push data pools") + .action(this.pushDataPools); + + const updateCommand = configurator.command("update"); + updateCommand.command("data-pool") + .description("Command to update a data pool using a data pool configuration file") + .requiredOption("--id ", "Id of the data pool you want to update") + .requiredOption("-f, --file ", "The file you want to push") + .action(this.updateDataPool); + } + + private async exportDataPool(context: Context, command: Command, options: OptionValues): Promise { + await new DataPoolCommandService(context).exportDataPool(options.id, options.outputToJsonFile); + } + + private async batchImportDataPools(context: Context, command: Command, options: OptionValues): Promise { + await new DataPoolCommandService(context).batchImportDataPools(options.jsonFile, options.outputToJsonFile); + } + + private async listDataPools(context: Context, command: Command, options: OptionValues): Promise { + await new DataPoolCommandService(context).listDataPools(options.json); + } + + private async pullDataPool(context: Context, command: Command, options: OptionValues): Promise { + await new DataPoolCommandService(context).pullDataPool(options.id); + } + + private async pushDataPool(context: Context, command: Command, options: OptionValues): Promise { + await new DataPoolCommandService(context).pushDataPool(options.file); + } + + private async pushDataPools(context: Context, command: Command, options: OptionValues): Promise { + await new DataPoolCommandService(context).pushDataPools(); + } + + private async updateDataPool(context: Context, command: Command, options: OptionValues): Promise { + await new DataPoolCommandService(context).updateDataPool(options.id, options.file); + } +} diff --git a/src/content/manager/data-pool.manager.ts b/src/commands/data-pipeline/data-pool/data-pool.manager.ts similarity index 74% rename from src/content/manager/data-pool.manager.ts rename to src/commands/data-pipeline/data-pool/data-pool.manager.ts index 435512cb..eb0a46f4 100644 --- a/src/content/manager/data-pool.manager.ts +++ b/src/commands/data-pipeline/data-pool/data-pool.manager.ts @@ -1,5 +1,6 @@ -import { BaseManager } from "./base.manager"; -import { ManagerConfig } from "../../interfaces/manager-config.interface"; +import { BaseManager } from "../../../core/http/http-shared/base.manager"; +import { ManagerConfig } from "../../../core/http/http-shared/manager-config.interface"; +import { Context } from "../../../core/command/cli-context"; export class DataPoolManager extends BaseManager { public static DATA_POOL_FILE_NAME_PREFIX = "data-pool_"; @@ -11,6 +12,10 @@ export class DataPoolManager extends BaseManager { private _id: string; private _content: string; + constructor(context: Context) { + super(context); + } + public get content(): string { return this._content; } @@ -29,13 +34,9 @@ export class DataPoolManager extends BaseManager { public getConfig(): ManagerConfig { return { - pushUrl: this.profile.team.replace(/\/?$/, `${DataPoolManager.DATA_POOL_PUSH_URL}`), - pullUrl: this.profile.team - .replace(/\/?$/, `${DataPoolManager.DATA_POOL_PULL_URL}`) - .replace("{id}", this.id), - updateUrl: this.profile.team - .replace(/\/?$/, DataPoolManager.DATA_POOL_ACTIONS_URL) - .replace("{id}", this.id), + pushUrl: DataPoolManager.DATA_POOL_PUSH_URL, + pullUrl: DataPoolManager.DATA_POOL_PULL_URL.replace("{id}", this.id), + updateUrl: DataPoolManager.DATA_POOL_ACTIONS_URL.replace("{id}", this.id), exportFileName: DataPoolManager.DATA_POOL_FILE_NAME_PREFIX + this.id + ".json", onPushSuccessMessage: (data: any): string => { return "Data Pool was pushed successfully. New ID: " + data.id; diff --git a/src/commands/data-pipeline/module.ts b/src/commands/data-pipeline/module.ts new file mode 100644 index 00000000..6b011ea8 --- /dev/null +++ b/src/commands/data-pipeline/module.ts @@ -0,0 +1,18 @@ +/** + * Commands related to the Data Pipeline area. + */ + +import { Configurator, IModule } from "../../core/command/module-handler"; +import { Context } from "../../core/command/cli-context"; +import { ConnectionCommands } from "./connection/connection.commands"; +import { DataPoolCommands } from "./data-pool/data-pool.commands"; + +class Module extends IModule { + + public register(context: Context, configurator: Configurator): void { + new DataPoolCommands().register(context, configurator); + new ConnectionCommands().register(context, configurator); + } +} + +export = Module; diff --git a/src/commands/data-pool.command.ts b/src/commands/data-pool.command.ts deleted file mode 100644 index 185591a2..00000000 --- a/src/commands/data-pool.command.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { ContentService } from "../services/content.service"; -import { DataPoolManagerFactory } from "../content/factory/data-pool-manager.factory"; -import { dataPoolService } from "../services/data-pool/data-pool-service"; - -export class DataPoolCommand { - private contentService = new ContentService(); - private dataPoolManagerFactory = new DataPoolManagerFactory(); - - public async pullDataPool(profile: string, id: string): Promise { - await this.contentService.pull(profile, this.dataPoolManagerFactory.createManager(id, null)); - } - - public async pushDataPool(profile: string, filename: string): Promise { - await this.contentService.push(profile, this.dataPoolManagerFactory.createManager(null, filename)); - } - - public async exportDataPool(poolId: string, outputToJsonFile: boolean): Promise { - await dataPoolService.exportDataPool(poolId, outputToJsonFile); - } - - public async pushDataPools(profile: string): Promise { - await this.contentService.batchPush(profile, this.dataPoolManagerFactory.createManagers()); - } - - public async batchImportDataPools(requestFile: string, outputToJsonFile: boolean): Promise { - await dataPoolService.batchImportDataPools(requestFile, outputToJsonFile); - } - - public async updateDataPool(profile: string, id: string, filename: string): Promise { - await this.contentService.update(profile, this.dataPoolManagerFactory.createManager(id, filename)); - } - - public async listDataPools(profile: string, jsonResponse: boolean): Promise { - if (jsonResponse) { - await dataPoolService.findAndExportAllPools(); - } else { - await dataPoolService.listDataPools(); - } - } -} diff --git a/src/commands/package.command.ts b/src/commands/package.command.ts deleted file mode 100644 index 4ddfe94d..00000000 --- a/src/commands/package.command.ts +++ /dev/null @@ -1,54 +0,0 @@ -import {ContentService} from "../services/content.service"; -import {PackageManagerFactory} from "../content/factory/package-manager.factory"; -import {packageService} from "../services/package-manager/package-service"; - -export class PackageCommand { - private contentService = new ContentService(); - private packageManagerFactory = new PackageManagerFactory(); - - public async pullPackage( - profile: string, - key: string, - store: boolean, - newKey: string, - draft: boolean - ): Promise { - await this.contentService.pullFile( - profile, - this.packageManagerFactory.createPullManager(key, store, newKey, draft) - ); - } - - public async pushPackage( - profile: string, - spaceKey: string, - fileName: string, - newKey: string, - overwrite: boolean - ): Promise { - await this.contentService.push( - profile, - this.packageManagerFactory.createPushManager(spaceKey, fileName, newKey, overwrite) - ); - } - - public async pushPackages(profile: string, spaceKey: string): Promise { - await this.contentService.batchPush(profile, this.packageManagerFactory.createPushManagers(spaceKey)); - } - - public async listPackages(jsonResponse: boolean, includeDependencies: boolean, packageKeys: string[]): Promise { - if (jsonResponse) { - await packageService.findAndExportListOfAllPackages(includeDependencies, packageKeys ?? []); - } else { - await packageService.listPackages(); - } - } - - public async batchExportPackages(packageKeys: string[], includeDependencies: boolean, excludeActionFlows?: boolean): Promise { - await packageService.batchExportPackages(packageKeys, includeDependencies, excludeActionFlows); - } - - public async batchImportPackages(spaceMappings: string[], dataModelMappingsFilePath: string, exportedPackagesFile: string, overwrite: boolean, excludeActionFlows?: boolean): Promise { - await packageService.batchImportPackages(spaceMappings ?? [], dataModelMappingsFilePath, exportedPackagesFile, overwrite, excludeActionFlows); - } -} diff --git a/src/commands/profile.command.ts b/src/commands/profile.command.ts deleted file mode 100644 index 5a51ff8b..00000000 --- a/src/commands/profile.command.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { QuestionService } from "../services/question.service"; -import {Profile, ProfileType} from "../interfaces/profile.interface"; -import { ProfileService } from "../services/profile.service"; -import { ProfileValidator } from "../validators/profile.validator"; -import { FatalError, logger } from "../util/logger"; - -export class ProfileCommand { - private profileService = new ProfileService(); - - public async createProfile(setAsDefault: boolean): Promise { - const profile: Profile = {} as Profile; - profile.name = await QuestionService.ask("Name of the profile: "); - profile.team = await QuestionService.ask("Your team (please provide the full url): "); - const type = await QuestionService.ask("Profile type: OAuth Device Code (1), OAuth Client Credentials (2) or Application Key / API Key (3): " ); - switch (type) { - case "1": - profile.type = ProfileType.DEVICE_CODE; - break; - case "2": - profile.type = ProfileType.CLIENT_CREDENTIALS; - profile.clientId = await QuestionService.ask("Your client id: "); - profile.clientSecret = await QuestionService.ask("Your client secret: "); - break; - case "3": - profile.type = ProfileType.KEY; - profile.apiToken = await QuestionService.ask("Your api token: "); - break; - default: - logger.error(new FatalError("Invalid type")); - break; - } - profile.authenticationType = await ProfileValidator.validateProfile(profile); - await this.profileService.authorizeProfile(profile); - - this.profileService.storeProfile(profile); - if (setAsDefault) { - await this.makeDefaultProfile(profile.name); - } - logger.info("Profile created successfully!"); - } - - public async listProfiles(): Promise { - this.profileService.readAllProfiles().then((profiles: string[]) => { - const defaultProfile = this.profileService.getDefaultProfile(); - if (profiles) { - profiles.forEach(profile => { - if (defaultProfile && defaultProfile === profile) { - logger.info(profile + " (default)"); - } else { - logger.info(profile); - } - }); - } - }); - } - - public async makeDefaultProfile(profile: string): Promise { - await this.profileService.makeDefaultProfile(profile); - logger.info("Default profile: " + profile); - } -} diff --git a/src/commands/profile/module.ts b/src/commands/profile/module.ts new file mode 100644 index 00000000..5f8c07a9 --- /dev/null +++ b/src/commands/profile/module.ts @@ -0,0 +1,46 @@ +/** + * Commands to create and list access profiles. + */ + +import { Command, OptionValues } from "commander"; +import { Configurator, IModule } from "../../core/command/module-handler"; +import { logger } from "../../core/utils/logger"; +import { Context } from "../../core/command/cli-context"; +import { ProfileCommandService } from "./profile-command.service"; + +class Module extends IModule { + + public register(context: Context, configurator: Configurator): void { + const command = configurator.command("profile") + .description("Manage profiles required to access a system."); + + command.command("list") + .description("Command to list all stored profiles") + .action(this.listProfiles); + + command.command("create") + .description("Command to create a new profile") + .option("--setAsDefault", "Set this profile as default") + .action(this.createProfile); + + command.command("default ") + .description("Command to set a profile as default") + .action(this.defaultProfile); + } + + private async defaultProfile(context: Context, command: Command): Promise { + const profile = command.args[0]; + await new ProfileCommandService().makeDefaultProfile(profile); + } + + private async createProfile(context: Context, command: Command, options: OptionValues): Promise { + await new ProfileCommandService().createProfile(options.setAsDefault); + } + + private async listProfiles(context: Context, command: Command): Promise { + logger.debug("List profiles"); + await new ProfileCommandService().listProfiles(); + } +} + +export = Module; \ No newline at end of file diff --git a/src/commands/profile/profile-command.service.ts b/src/commands/profile/profile-command.service.ts new file mode 100644 index 00000000..253bb70a --- /dev/null +++ b/src/commands/profile/profile-command.service.ts @@ -0,0 +1,66 @@ +import { QuestionService } from "../../core/utils/question.service"; +import { ProfileService } from "../../core/profile/profile.service"; +import { FatalError, logger } from "../../core/utils/logger"; +import {Profile, ProfileType} from "../../core/profile/profile.interface"; +import {ProfileValidator} from "../../core/profile/profile.validator"; + +export class ProfileCommandService { + private profileService = new ProfileService(); + + public async createProfile(setAsDefault: boolean): Promise { + const profile: Profile = {} as Profile; + const questions = new QuestionService(); + try { + profile.name = await questions.ask("Name of the profile: "); + profile.team = await questions.ask("Your team (please provide the full url): "); + const type = await questions.ask("Profile type: OAuth Device Code (1), OAuth Client Credentials (2) or Application Key / API Key (3): " ); + switch (type) { + case "1": + profile.type = ProfileType.DEVICE_CODE; + break; + case "2": + profile.type = ProfileType.CLIENT_CREDENTIALS; + profile.clientId = await questions.ask("Your client id: "); + profile.clientSecret = await questions.ask("Your client secret: "); + break; + case "3": + profile.type = ProfileType.KEY; + profile.apiToken = await questions.ask("Your api token: "); + break; + default: + logger.error(new FatalError("Invalid type")); + break; + } + profile.authenticationType = await ProfileValidator.validateProfile(profile); + await this.profileService.authorizeProfile(profile); + + this.profileService.storeProfile(profile); + if (setAsDefault) { + await this.makeDefaultProfile(profile.name); + } + } finally { + questions.close(); + } + logger.info("Profile created successfully!"); + } + + public async listProfiles(): Promise { + this.profileService.readAllProfiles().then((profiles: string[]) => { + const defaultProfile = this.profileService.getDefaultProfile(); + if (profiles) { + profiles.forEach(profile => { + if (defaultProfile && defaultProfile === profile) { + logger.info(profile + " (default)"); + } else { + logger.info(profile); + } + }); + } + }); + } + + public async makeDefaultProfile(profile: string): Promise { + await this.profileService.makeDefaultProfile(profile); + logger.info("Default profile: " + profile); + } +} diff --git a/src/commands/skill.command.ts b/src/commands/skill.command.ts deleted file mode 100644 index 6c3a9762..00000000 --- a/src/commands/skill.command.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { ContentService } from "../services/content.service"; -import { SkillManagerFactory } from "../content/factory/skill-manager.factory"; - -export class SkillCommand { - private contentService = new ContentService(); - private skillManagerFactory = new SkillManagerFactory(); - - public async pullSkill(profile: string, projectId: string, skillId: string): Promise { - await this.contentService.pull(profile, this.skillManagerFactory.createManager(projectId, skillId, null)); - } - - public async pushSkill(profile: string, projectId: string, filename: string): Promise { - await this.contentService.push(profile, this.skillManagerFactory.createManager(projectId, null, filename)); - } -} diff --git a/src/commands/space.command.ts b/src/commands/space.command.ts deleted file mode 100644 index 2aede049..00000000 --- a/src/commands/space.command.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { ContentService } from "../services/content.service"; -import { SpaceManagerFactory } from "../content/factory/space-manager.factory"; - -export class SpaceCommand { - private contentService = new ContentService(); - private spaceManagerFactory = new SpaceManagerFactory(); - - public async listSpaces(profile: string, jsonResponse: boolean): Promise { - await this.contentService.findAll(profile, this.spaceManagerFactory.createListManager(jsonResponse)); - } -} diff --git a/src/api/asset-api.ts b/src/commands/studio/api/asset-api.ts similarity index 55% rename from src/api/asset-api.ts rename to src/commands/studio/api/asset-api.ts index fc3cb2bd..d8749758 100644 --- a/src/api/asset-api.ts +++ b/src/commands/studio/api/asset-api.ts @@ -1,12 +1,18 @@ -import {httpClientV2} from "../services/http-client-service.v2"; -import {FatalError} from "../util/logger"; import {SaveContentNode} from "../interfaces/save-content-node.interface"; +import { HttpClient } from "../../../core/http/http-client"; +import { Context } from "../../../core/command/cli-context"; +import { FatalError } from "../../../core/utils/logger"; -class AssetApi { - public static readonly INSTANCE = new AssetApi(); +export class AssetApi { + + private httpClient: HttpClient; + + constructor(context: Context) { + this.httpClient = context.httpClient; + } public async findAllAssets(assetType: string): Promise { - return httpClientV2.get(this.getFindAllAssetsUrl(assetType)).catch(e => { + return this.httpClient.get(this.getFindAllAssetsUrl(assetType)).catch(e => { throw new FatalError(`Problem getting assets: ${e}`); }); } @@ -19,5 +25,3 @@ class AssetApi { return findAllAssetsUrl; } } - -export const assetApi = AssetApi.INSTANCE; \ No newline at end of file diff --git a/src/commands/studio/api/compute-pool-api.ts b/src/commands/studio/api/compute-pool-api.ts new file mode 100644 index 00000000..35044527 --- /dev/null +++ b/src/commands/studio/api/compute-pool-api.ts @@ -0,0 +1,19 @@ +import {StudioComputeNodeDescriptor} from "../interfaces/package-manager.interfaces"; +import { HttpClient } from "../../../core/http/http-client"; +import { Context } from "../../../core/command/cli-context"; + +export class ComputePoolApi { + + private httpClient: HttpClient; + + constructor(context: Context) { + this.httpClient = context.httpClient; + } + + public async findAllDataModelsDetails(): Promise { + return this.httpClient.get("/package-manager/api/compute-pools/data-models/details") + .catch(e => { + return null; + }); + } +} diff --git a/src/commands/studio/api/node-api.ts b/src/commands/studio/api/node-api.ts new file mode 100644 index 00000000..d73be9c5 --- /dev/null +++ b/src/commands/studio/api/node-api.ts @@ -0,0 +1,26 @@ +import {ContentNodeTransport} from "../interfaces/package-manager.interfaces"; +import { HttpClient } from "../../../core/http/http-client"; +import { Context } from "../../../core/command/cli-context"; +import { FatalError } from "../../../core/utils/logger"; + +export class NodeApi { + + private httpClient: HttpClient; + + constructor(context: Context) { + this.httpClient = context.httpClient; + } + + public async findAllNodesOfType(assetType?: string): Promise { + return this.httpClient.get(`/package-manager/api/nodes?assetType=${assetType}`) + .catch(e => { + throw new FatalError(`Problem getting nodes of type ${assetType}: ${e}`); + }); + } + + public async findOneByKeyAndRootNodeKey(packageKey: string, nodeKey: string): Promise { + return this.httpClient.get(`/package-manager/api/nodes/${packageKey}/${nodeKey}`).catch(e => { + return null; + }); + } +} diff --git a/src/api/package-api.ts b/src/commands/studio/api/package-api.ts similarity index 61% rename from src/api/package-api.ts rename to src/commands/studio/api/package-api.ts index 8c19a5e5..8a31097d 100644 --- a/src/api/package-api.ts +++ b/src/commands/studio/api/package-api.ts @@ -1,19 +1,22 @@ -import {httpClientV2} from "../services/http-client-service.v2"; import { ActivatePackageTransport, ContentNodeTransport, - PackageHistoryTransport, - PackageManagerVariableType, - PackageWithVariableAssignments + PackageHistoryTransport, PackageManagerVariableType, PackageWithVariableAssignments, } from "../interfaces/package-manager.interfaces"; -import {FatalError} from "../util/logger"; +import { HttpClient } from "../../../core/http/http-client"; +import { Context } from "../../../core/command/cli-context"; +import { FatalError } from "../../../core/utils/logger"; +export class PackageApi { -class PackageApi { - public static readonly INSTANCE = new PackageApi(); + private httpClient: HttpClient; + + constructor(context: Context) { + this.httpClient = context.httpClient; + } public async findAllPackages(): Promise { - return httpClientV2.get("/package-manager/api/packages").catch(e => { + return this.httpClient.get("/package-manager/api/packages").catch(e => { throw new FatalError(`Problem getting packages: ${e}`); }); } @@ -24,8 +27,8 @@ class PackageApi { queryParams.set("version", version ?? ""); queryParams.set("excludeActionFlows", excludeActionFlows ? "true" : "false"); - return await httpClientV2.downloadFile(`/package-manager/api/packages/${rootPackageKey}/export?${queryParams.toString()}`).catch(e => { - throw new FatalError(`Pacakge ${rootPackageKey}_${version} failed to export.`) + return await this.httpClient.downloadFile(`/package-manager/api/packages/${rootPackageKey}/export?${queryParams.toString()}`).catch(e => { + throw new FatalError(`Package ${rootPackageKey}_${version} failed to export.`) }); } @@ -35,37 +38,37 @@ class PackageApi { queryParams.set("type", type); } - return httpClientV2.get(`/package-manager/api/packages/with-variable-assignments?${queryParams.toString()}`).catch(e => { + return this.httpClient.get(`/package-manager/api/packages/with-variable-assignments?${queryParams.toString()}`).catch(e => { throw new FatalError(`Problem getting variables of packages: : ${e}`); }); } public async findLatestVersionById(nodeId: string): Promise { - return httpClientV2.get(`/package-manager/api/packages/${nodeId}/latest-version`).catch(e => { + return this.httpClient.get(`/package-manager/api/packages/${nodeId}/latest-version`).catch(e => { throw new FatalError(`Problem getting latest version of package: ${e}`); }); } public async findActiveVersionById(nodeId: string): Promise { - return httpClientV2.get(`/package-manager/api/packages/${nodeId}/active`).catch(e => { + return this.httpClient.get(`/package-manager/api/packages/${nodeId}/active`).catch(e => { throw new FatalError(`Problem getting latest version of package: ${e}`); }); } public async findActiveVersionByIds(nodeIds: string[]): Promise { - return httpClientV2.post("/package-manager/api/packages/active/by-ids", nodeIds).catch(e => { + return this.httpClient.post("/package-manager/api/packages/active/by-ids", nodeIds).catch(e => { throw new FatalError(`Problem getting latest version of packages: ${e}`); }); } public async findNextVersion(nodeId: string): Promise { - return httpClientV2.get(`/package-manager/api/packages/${nodeId}/next-version`).catch(e => { + return this.httpClient.get(`/package-manager/api/packages/${nodeId}/next-version`).catch(e => { throw new FatalError(`Problem getting latest version of package: ${e}`); }); } public async importPackage(nodeContent: any, spaceId: string, overwrite: boolean, excludeActionFlows?: boolean): Promise { - await httpClientV2.postFile("/package-manager/api/packages/import", nodeContent, { + await this.httpClient.postFile("/package-manager/api/packages/import", nodeContent, { spaceId: spaceId, overwrite: overwrite, excludeActionFlows: excludeActionFlows @@ -75,16 +78,14 @@ class PackageApi { } public async movePackageToSpace(nodeId: string, spaceId: string): Promise { - await httpClientV2.put(`/package-manager/api/packages/${nodeId}/move/${spaceId}`, {}).catch(e => { + await this.httpClient.put(`/package-manager/api/packages/${nodeId}/move/${spaceId}`, {}).catch(e => { throw new FatalError(`Problem moving package: ${e}`); }); } public async publishPackage(activatePackage: ActivatePackageTransport): Promise { - await httpClientV2.post(`/package-manager/api/packages/${activatePackage.packageKey}/activate`, activatePackage).catch(e => { + await this.httpClient.post(`/package-manager/api/packages/${activatePackage.packageKey}/activate`, activatePackage).catch(e => { throw new FatalError(`Problem activating package with key ${activatePackage.packageKey}: ${e}`); }); } } - -export const packageApi = PackageApi.INSTANCE; diff --git a/src/api/package-dependencies-api.ts b/src/commands/studio/api/package-dependencies-api.ts similarity index 54% rename from src/api/package-dependencies-api.ts rename to src/commands/studio/api/package-dependencies-api.ts index 9223e922..9fb84be8 100644 --- a/src/api/package-dependencies-api.ts +++ b/src/commands/studio/api/package-dependencies-api.ts @@ -1,41 +1,45 @@ import {PackageDependencyTransport} from "../interfaces/package-manager.interfaces"; -import {httpClientV2} from "../services/http-client-service.v2"; -import {FatalError} from "../util/logger"; +import { HttpClient } from "../../../core/http/http-client"; +import { Context } from "../../../core/command/cli-context"; +import { FatalError } from "../../../core/utils/logger"; -class PackageDependenciesApi { - public static readonly INSTANCE = new PackageDependenciesApi(); +export class PackageDependenciesApi { + + private httpClient: HttpClient; + + constructor(context: Context) { + this.httpClient = context.httpClient; + } public async findDependenciesOfPackage(nodeId: string, draftId: string): Promise { - return httpClientV2.get(`/package-manager/api/package-dependencies/${nodeId}/by-root-draft-id/${draftId}`) + return this.httpClient.get(`/package-manager/api/package-dependencies/${nodeId}/by-root-draft-id/${draftId}`) .catch(e=> { throw new FatalError(`Problem getting dependencies of package: ${e}`); }); } public async findPackageDependenciesByIds(nodeDraftIdMap: Map): Promise> { - return await httpClientV2.post("/package-manager/api/package-dependencies/by-ids", Object.fromEntries(nodeDraftIdMap)) + return await this.httpClient.post("/package-manager/api/package-dependencies/by-ids", Object.fromEntries(nodeDraftIdMap)) .catch(e=> { throw new FatalError(`Problem getting dependencies of package: ${e}`); }); } public async updatePackageDependency(nodeId: string, packageDependency: PackageDependencyTransport): Promise { - await httpClientV2.put(`/package-manager/api/package-dependencies/${nodeId}/dependency/by-key/${packageDependency.key}`, packageDependency).catch(e => { + await this.httpClient.put(`/package-manager/api/package-dependencies/${nodeId}/dependency/by-key/${packageDependency.key}`, packageDependency).catch(e => { throw new FatalError(`Problem updating package dependency: ${e}`); }); } public async createDependencies(packageId: string, packageDependency: PackageDependencyTransport[]): Promise { - await httpClientV2.post(`/package-manager/api/package-dependencies/${packageId}`, packageDependency).catch(e => { + await this.httpClient.post(`/package-manager/api/package-dependencies/${packageId}`, packageDependency).catch(e => { throw new FatalError(`Problem updating package dependency: ${e}`); }); } public async deleteDependency(packageId: string, packageDependencyKey: string): Promise { - await httpClientV2.delete(`/package-manager/api/package-dependencies/${packageId}/dependency/by-key/${packageDependencyKey}`).catch(e => { + await this.httpClient.delete(`/package-manager/api/package-dependencies/${packageId}/dependency/by-key/${packageDependencyKey}`).catch(e => { throw new FatalError(`Problem updating package dependency: ${e}`); }); } } - -export const packageDependenciesApi = PackageDependenciesApi.INSTANCE; \ No newline at end of file diff --git a/src/commands/studio/api/space-api.ts b/src/commands/studio/api/space-api.ts new file mode 100644 index 00000000..641668cd --- /dev/null +++ b/src/commands/studio/api/space-api.ts @@ -0,0 +1,31 @@ +import { HttpClient } from "../../../core/http/http-client"; +import { Context } from "../../../core/command/cli-context"; +import { SpaceTransport } from "../interfaces/space.interface"; +import { FatalError } from "../../../core/utils/logger"; + +export class SpaceApi { + + private httpClient: HttpClient; + + constructor(context: Context) { + this.httpClient = context.httpClient; + } + + public async findOne(spaceId: string): Promise { + return this.httpClient.get(`/package-manager/api/spaces/${spaceId}`).catch(e => { + throw new FatalError(`Problem getting space: ${spaceId} ${e}`); + }); + } + + public async findAllSpaces(): Promise { + return this.httpClient.get("/package-manager/api/spaces").catch(e => { + throw new FatalError(`Problem getting spaces: ${e}`); + }); + } + + public async createSpace(space: SpaceTransport): Promise { + return this.httpClient.post("/package-manager/api/spaces", space).catch(e => { + throw new FatalError(`Problem space creation: ${e}`); + }); + } +} diff --git a/src/commands/studio/api/studio-variables-api.ts b/src/commands/studio/api/studio-variables-api.ts new file mode 100644 index 00000000..51833fc2 --- /dev/null +++ b/src/commands/studio/api/studio-variables-api.ts @@ -0,0 +1,31 @@ +import { + ContentNodeTransport, + VariablesAssignments +} from "../interfaces/package-manager.interfaces"; +import {URLSearchParams} from "url"; +import { HttpClient } from "../../../core/http/http-client"; +import { Context } from "../../../core/command/cli-context"; +import { FatalError } from "../../../core/utils/logger"; + +export class StudioVariablesApi { + private httpClient: HttpClient; + + constructor(context: Context) { + this.httpClient = context.httpClient; + } + + public async assignVariableValues(packageKey: string, variablesAssignments: VariablesAssignments[]): Promise { + return this.httpClient.post(`/package-manager/api/nodes/by-package-key/${packageKey}/variables/values`, variablesAssignments).catch(e => { + throw new FatalError(`Problem updating variables of package ${packageKey}: ${e}`); + }); + } + + public async getRuntimeVariableValues(packageKey: string, appMode: string): Promise { + const queryParams = new URLSearchParams(); + queryParams.set("appMode", appMode); + + return this.httpClient.get(`/package-manager/api/nodes/by-package-key/${packageKey}/variables/runtime-values?${queryParams.toString()}`).catch(e => { + throw new FatalError(`Problem getting runtime variables of package ${packageKey}: ${e}`); + }); + } +} diff --git a/src/commands/studio/command-service/asset-command.service.ts b/src/commands/studio/command-service/asset-command.service.ts new file mode 100644 index 00000000..88e20f16 --- /dev/null +++ b/src/commands/studio/command-service/asset-command.service.ts @@ -0,0 +1,37 @@ +import { Context } from "../../../core/command/cli-context"; +import { AssetManagerFactory } from "../manager/asset.manager-factory"; +import { AssetService } from "../service/asset-service"; +import { BaseManagerHelper } from "../../../core/http/http-shared/base.manager.helper"; + +export class AssetCommandService { + private baseManagerHelper = new BaseManagerHelper(); + private assetManagerFactory: AssetManagerFactory; + + private assetService: AssetService; + + constructor(context: Context) { + this.assetManagerFactory = new AssetManagerFactory(context); + this.assetService = new AssetService(context); + } + + public async pullAsset(key: string): Promise { + await this.assetManagerFactory.createManager(key).pull(); + } + + public async pushAsset(fileName: string, packageKey: string): Promise { + await this.assetManagerFactory.createManager(null, fileName, packageKey).push(); + } + + public async pushAssets(packageKey: string): Promise { + const assetManagers = this.assetManagerFactory.createManagers(packageKey); + await this.baseManagerHelper.batchPush(assetManagers); + } + + public async listAssets(jsonResponse: boolean, assetType: string): Promise { + if (jsonResponse) { + await this.assetService.findAndExportAllAssets(assetType); + } else { + await this.assetService.listAssets(assetType); + } + } +} diff --git a/src/commands/studio/command-service/package-command.service.ts b/src/commands/studio/command-service/package-command.service.ts new file mode 100644 index 00000000..c8a9535f --- /dev/null +++ b/src/commands/studio/command-service/package-command.service.ts @@ -0,0 +1,55 @@ +import { Context } from "../../../core/command/cli-context"; +import { PackageManagerFactory } from "../manager/package.manager-factory"; +import { PackageService } from "../service/package.service"; +import { BaseManagerHelper } from "../../../core/http/http-shared/base.manager.helper"; + +export class PackageCommandService { + private baseManagerHelper = new BaseManagerHelper(); + private packageManagerFactory: PackageManagerFactory; + + private packageService: PackageService; + + constructor(context: Context) { + this.packageManagerFactory = new PackageManagerFactory(context); + this.packageService = new PackageService(context); + } + + public async pullPackage( + key: string, + store: boolean, + newKey: string, + draft: boolean + ): Promise { + await this.packageManagerFactory.createPullManager(key, store, newKey, draft).pullFile(); + } + + public async pushPackage( + spaceKey: string, + fileName: string, + newKey: string, + overwrite: boolean + ): Promise { + await this.packageManagerFactory.createPushManager(spaceKey, fileName, newKey, overwrite).push(); + } + + public async pushPackages(spaceKey: string): Promise { + const packageManagers = this.packageManagerFactory.createPushManagers(spaceKey); + await this.baseManagerHelper.batchPush(packageManagers); + } + + public async listPackages(jsonResponse: boolean, includeDependencies: boolean, packageKeys: string[]): Promise { + if (jsonResponse) { + await this.packageService.findAndExportListOfAllPackages(includeDependencies, packageKeys ?? []); + } else { + await this.packageService.listPackages(); + } + } + + public async batchExportPackages(packageKeys: string[], includeDependencies: boolean, excludeActionFlows?: boolean): Promise { + await this.packageService.batchExportPackages(packageKeys, includeDependencies, excludeActionFlows); + } + + public async batchImportPackages(spaceMappings: string[], dataModelMappingsFilePath: string, exportedPackagesFile: string, overwrite: boolean, excludeActionFlows?: boolean): Promise { + await this.packageService.batchImportPackages(spaceMappings ?? [], dataModelMappingsFilePath, exportedPackagesFile, overwrite, excludeActionFlows); + } +} diff --git a/src/commands/studio/command-service/space-command.service.ts b/src/commands/studio/command-service/space-command.service.ts new file mode 100644 index 00000000..87a9d34c --- /dev/null +++ b/src/commands/studio/command-service/space-command.service.ts @@ -0,0 +1,14 @@ +import { SpaceManagerFactory } from "../manager/space.manager-factory"; +import { Context } from "../../../core/command/cli-context"; + +export class SpaceCommandService { + private spaceManagerFactory: SpaceManagerFactory; + + constructor(context: Context) { + this.spaceManagerFactory = new SpaceManagerFactory(context); + } + + public async listSpaces(jsonResponse: boolean): Promise { + await this.spaceManagerFactory.createListManager(jsonResponse).findAll(); + } +} diff --git a/src/commands/studio/command-service/widget.command.ts b/src/commands/studio/command-service/widget.command.ts new file mode 100644 index 00000000..add8316d --- /dev/null +++ b/src/commands/studio/command-service/widget.command.ts @@ -0,0 +1,36 @@ +import { execSync } from "child_process"; +import { GracefulError, logger } from "../../../core/utils/logger"; +import * as fs from "fs"; +import * as path from "path"; +import { Context } from "../../../core/command/cli-context"; +import { WidgetManagerFactory } from "../manager/widget.manager-factory"; + +export class WidgetCommand { + private widgetManagerFactory: WidgetManagerFactory; + + constructor(context: Context) { + this.widgetManagerFactory = new WidgetManagerFactory(context); + } + + public async pushWidget(tenantIndependent: boolean, userSpecific: boolean): Promise { + await this.widgetManagerFactory.createManager(tenantIndependent, userSpecific).push(); + await this.pushToAwsIfAuthorized(); + } + + private async pushToAwsIfAuthorized(): Promise { + if (process.env.AWS_ACCESS_KEY_ID_CDN && process.env.AWS_SECRET_ACCESS_KEY_CDN) { + try { + const dir = path.resolve(process.cwd()); + const pushToS3stdout = execSync( + `aws s3 cp ${dir} s3://celonis-static-origin/static/package-manager/ --recursive --exclude="*.map" --exclude="*.yaml" --profile default` + ).toString("utf-8"); + logger.info(pushToS3stdout); + } catch (error) { + logger.error(new GracefulError(error.stderr?.toString() || error.message)); + } + } + + const zipFileName = path.resolve(process.cwd(), "output.zip"); + fs.unlinkSync(zipFileName); + } +} diff --git a/src/interfaces/batch-export-node-transport.ts b/src/commands/studio/interfaces/batch-export-node.interfaces.ts similarity index 67% rename from src/interfaces/batch-export-node-transport.ts rename to src/commands/studio/interfaces/batch-export-node.interfaces.ts index 91fc4a22..92a5122d 100644 --- a/src/interfaces/batch-export-node-transport.ts +++ b/src/commands/studio/interfaces/batch-export-node.interfaces.ts @@ -5,7 +5,7 @@ import { StudioComputeNodeDescriptor, VariablesAssignments } from "./package-manager.interfaces"; -import {SpaceTransport} from "./save-space.interface"; +import { SpaceTransport } from "./space.interface"; export interface BatchExportNodeTransport extends ContentNodeTransport { workingDraftId: string; @@ -16,13 +16,3 @@ export interface BatchExportNodeTransport extends ContentNodeTransport { variables?: VariablesAssignments[]; space?: SpaceTransport; } - -export interface PackageAndAssetTransport { - rootNode: ContentNodeTransport, - nodes: ContentNodeTransport[] -} - -export interface SpaceMappingTransport { - packageKey: string, - spaceId: string -} \ No newline at end of file diff --git a/src/interfaces/manifest-transport.ts b/src/commands/studio/interfaces/manifest.interface.ts similarity index 100% rename from src/interfaces/manifest-transport.ts rename to src/commands/studio/interfaces/manifest.interface.ts diff --git a/src/interfaces/package-manager.interfaces.ts b/src/commands/studio/interfaces/package-manager.interfaces.ts similarity index 100% rename from src/interfaces/package-manager.interfaces.ts rename to src/commands/studio/interfaces/package-manager.interfaces.ts diff --git a/src/interfaces/save-content-node.interface.ts b/src/commands/studio/interfaces/save-content-node.interface.ts similarity index 76% rename from src/interfaces/save-content-node.interface.ts rename to src/commands/studio/interfaces/save-content-node.interface.ts index efca40d4..2c514d0d 100644 --- a/src/interfaces/save-content-node.interface.ts +++ b/src/commands/studio/interfaces/save-content-node.interface.ts @@ -1,4 +1,4 @@ -import {AssetMetadataTransport} from "./package-manager.interfaces"; +import { AssetMetadataTransport } from "./package-manager.interfaces"; export interface SaveContentNode { key: string; diff --git a/src/interfaces/save-space.interface.ts b/src/commands/studio/interfaces/space.interface.ts similarity index 100% rename from src/interfaces/save-space.interface.ts rename to src/commands/studio/interfaces/space.interface.ts diff --git a/src/content/factory/asset-manager.factory.ts b/src/commands/studio/manager/asset.manager-factory.ts similarity index 80% rename from src/content/factory/asset-manager.factory.ts rename to src/commands/studio/manager/asset.manager-factory.ts index 45b35e07..12c732b7 100644 --- a/src/content/factory/asset-manager.factory.ts +++ b/src/commands/studio/manager/asset.manager-factory.ts @@ -1,12 +1,19 @@ import * as fs from "fs"; import * as path from "path"; - -import { FatalError, logger } from "../../util/logger"; -import { AssetManager } from "../manager/asset.manager"; +import { AssetManager } from "./asset.manager"; +import { FatalError, logger } from "../../../core/utils/logger"; +import { Context } from "../../../core/command/cli-context"; export class AssetManagerFactory { + + private readonly context: Context; + + constructor(context: Context) { + this.context = context; + } + public createManager(key?: string, fileName?: string, packageKey?: string): AssetManager { - const assetManager = new AssetManager(); + const assetManager = new AssetManager(this.context); assetManager.key = key; if (fileName) { diff --git a/src/content/manager/asset.manager.ts b/src/commands/studio/manager/asset.manager.ts similarity index 75% rename from src/content/manager/asset.manager.ts rename to src/commands/studio/manager/asset.manager.ts index 9db91c25..bc8f5a7b 100644 --- a/src/content/manager/asset.manager.ts +++ b/src/commands/studio/manager/asset.manager.ts @@ -1,7 +1,8 @@ -import { BaseManager } from "./base.manager"; -import { ManagerConfig } from "../../interfaces/manager-config.interface"; -import { SaveContentNode } from "../../interfaces/save-content-node.interface"; -import { parse, stringify } from "../../util/yaml"; +import { BaseManager } from "../../../core/http/http-shared/base.manager"; +import { Context } from "../../../core/command/cli-context"; +import { ManagerConfig } from "../../../core/http/http-shared/manager-config.interface"; +import { SaveContentNode } from "../interfaces/save-content-node.interface"; +import { parse, stringify } from "../../../core/utils/yaml"; export class AssetManager extends BaseManager { public static ASSET_FILE_PREFIX = "asset_"; @@ -14,6 +15,10 @@ export class AssetManager extends BaseManager { private _content: string; private _packageKey: string; + constructor(context: Context) { + super(context); + } + public get key(): string { return this._key; } @@ -45,8 +50,8 @@ export class AssetManager extends BaseManager { public getConfig(): ManagerConfig { return { - pushUrl: this.profile.team.replace(/\/?$/, AssetManager.PUSH_URL), - pullUrl: this.profile.team.replace(/\/?$/, `${AssetManager.PULL_URL}/${this.key}`), + pushUrl: AssetManager.PUSH_URL, + pullUrl: `${AssetManager.PULL_URL}/${this.key}`, exportFileName: `${AssetManager.ASSET_FILE_PREFIX}${this.onlyKey}.yml`, onPushSuccessMessage: (data: any): string => { return "Asset was pushed successfully. New key: " + data.rootWithKey; diff --git a/src/content/factory/package-manager.factory.ts b/src/commands/studio/manager/package.manager-factory.ts similarity index 85% rename from src/content/factory/package-manager.factory.ts rename to src/commands/studio/manager/package.manager-factory.ts index b42ff471..0cfe19de 100644 --- a/src/content/factory/package-manager.factory.ts +++ b/src/commands/studio/manager/package.manager-factory.ts @@ -1,10 +1,17 @@ import * as fs from "fs"; import * as path from "path"; - -import {FatalError, logger} from "../../util/logger"; -import {PackageManager} from "../manager/package.manager"; +import { Context } from "../../../core/command/cli-context"; +import { PackageManager } from "./package.manager"; +import { FatalError, logger } from "../../../core/utils/logger"; export class PackageManagerFactory { + + private readonly context: Context; + + constructor(context: Context) { + this.context = context; + } + public createPullManager(key: string, store?: boolean, newKey?: string, draft?: boolean): PackageManager { return this.createManager(key, null, null, store, newKey, false, draft); } @@ -39,7 +46,7 @@ export class PackageManagerFactory { overwrite?: boolean, draft?: boolean, ): PackageManager { - const packageManager = new PackageManager(); + const packageManager = new PackageManager(this.context); if (fileName) { packageManager.fileName = this.resolvePackageFilePath(fileName); diff --git a/src/content/manager/package.manager.ts b/src/commands/studio/manager/package.manager.ts similarity index 84% rename from src/content/manager/package.manager.ts rename to src/commands/studio/manager/package.manager.ts index 0c822320..46e5f750 100644 --- a/src/content/manager/package.manager.ts +++ b/src/commands/studio/manager/package.manager.ts @@ -1,11 +1,10 @@ -import {ManagerConfig} from "../../interfaces/manager-config.interface"; -import {BaseManager} from "./base.manager"; import * as fs from "fs"; -import {logger} from "../../util/logger"; -import { - SaveContentNode, -} from "../../interfaces/save-content-node.interface"; import * as FormData from "form-data"; +import { BaseManager } from "../../../core/http/http-shared/base.manager"; +import { ManagerConfig } from "../../../core/http/http-shared/manager-config.interface"; +import { SaveContentNode } from "../interfaces/save-content-node.interface"; +import { logger } from "../../../core/utils/logger"; +import { Context } from "../../../core/command/cli-context"; export class PackageManager extends BaseManager { public static PACKAGE_FILE_PREFIX = "package_"; @@ -24,6 +23,10 @@ export class PackageManager extends BaseManager { private _overwrite: boolean; private _draft: boolean; + constructor(context: Context) { + super(context); + } + public get key(): string { return this._key; } @@ -82,14 +85,11 @@ export class PackageManager extends BaseManager { public getConfig(): ManagerConfig { return { - pushUrl: this.profile.team.replace(/\/?$/, this.buildPushUrl()), - pullUrl: this.profile.team.replace( - /\/?$/, - `${PackageManager.BASE_URL}/${this.key}/${PackageManager.EXPORT_ENDPOINT_PATH}?store=${ + pushUrl: this.buildPushUrl(), + pullUrl: `${PackageManager.BASE_URL}/${this.key}/${PackageManager.EXPORT_ENDPOINT_PATH}?store=${ this.store - }&draft=${this.draft}${this.newKey ? `&newKey=${this.newKey}` : ""}` - ), - findAllUrl: this.profile.team.replace(/\/?$/, PackageManager.BASE_URL), + }&draft=${this.draft}${this.newKey ? `&newKey=${this.newKey}` : ""}`, + findAllUrl: PackageManager.BASE_URL, exportFileName: PackageManager.PACKAGE_FILE_PREFIX + (this.newKey ? this.newKey : this.key) + diff --git a/src/commands/studio/manager/space.manager-factory.ts b/src/commands/studio/manager/space.manager-factory.ts new file mode 100644 index 00000000..c6160772 --- /dev/null +++ b/src/commands/studio/manager/space.manager-factory.ts @@ -0,0 +1,21 @@ +import { SpaceManager } from "./space.manager"; +import { Context } from "../../../core/command/cli-context"; + +export class SpaceManagerFactory { + + private readonly context: Context; + + constructor(context: Context) { + this.context = context; + } + + public createListManager(jsonResponse: boolean): SpaceManager { + return this.createManager(jsonResponse); + } + + public createManager(jsonResponse?: boolean): SpaceManager { + const spaceManager = new SpaceManager(this.context); + spaceManager.jsonResponse = jsonResponse; + return spaceManager; + } +} \ No newline at end of file diff --git a/src/content/manager/space.manager.ts b/src/commands/studio/manager/space.manager.ts similarity index 70% rename from src/content/manager/space.manager.ts rename to src/commands/studio/manager/space.manager.ts index 63b70d43..3bdeaca9 100644 --- a/src/content/manager/space.manager.ts +++ b/src/commands/studio/manager/space.manager.ts @@ -1,8 +1,9 @@ -import {ManagerConfig} from "../../interfaces/manager-config.interface"; -import {BaseManager} from "./base.manager"; -import {logger} from "../../util/logger"; import {v4 as uuidv4} from "uuid"; -import {SpaceTransport} from "../../interfaces/save-space.interface"; +import { Context } from "../../../core/command/cli-context"; +import { BaseManager } from "../../../core/http/http-shared/base.manager"; +import { ManagerConfig } from "../../../core/http/http-shared/manager-config.interface"; +import { SpaceTransport } from "../interfaces/space.interface"; +import { logger } from "../../../core/utils/logger"; export class SpaceManager extends BaseManager { @@ -10,6 +11,10 @@ export class SpaceManager extends BaseManager { private _jsonResponse: boolean; + constructor(context: Context) { + super(context); + } + public get jsonResponse(): boolean { return this._jsonResponse; } @@ -20,7 +25,7 @@ export class SpaceManager extends BaseManager { public getConfig(): ManagerConfig { return { - findAllUrl: this.profile.team.replace(/\/?$/, SpaceManager.BASE_URL), + findAllUrl: SpaceManager.BASE_URL, onFindAll: (data: SpaceTransport[]) => this.listSpaces(data), }; } @@ -44,5 +49,4 @@ export class SpaceManager extends BaseManager { protected getSerializedFileContent(data: any): string { return data; } - } diff --git a/src/content/factory/widget-manager.factory.ts b/src/commands/studio/manager/widget.manager-factory.ts similarity index 86% rename from src/content/factory/widget-manager.factory.ts rename to src/commands/studio/manager/widget.manager-factory.ts index beb28417..f58336d6 100644 --- a/src/content/factory/widget-manager.factory.ts +++ b/src/commands/studio/manager/widget.manager-factory.ts @@ -1,27 +1,21 @@ import * as fs from "fs"; import * as path from "path"; -import { FatalError, logger } from "../../util/logger"; -import { WidgetManager } from "../manager/widget.manager"; +import { WidgetManager } from "./widget.manager"; +import { FatalError, logger } from "../../../core/utils/logger"; +import { Context } from "../../../core/command/cli-context"; import * as AdmZip from "adm-zip"; -import {parse} from "../../util/yaml"; +import { parse } from "../../../core/utils/yaml"; -interface Manifest { - key: string; - name: string; - bundle: string; - version: string; - externalResource: string; - widgets: ManifestWidget[]; -} +export class WidgetManagerFactory { -interface ManifestWidget { - widgetId: string; - name: string; -} + private readonly context: Context; + + constructor(context: Context) { + this.context = context; + } -export class WidgetManagerFactory { public createManager(tenantIndependent: boolean = false, userSpecific: boolean = false): WidgetManager { - const widgetManager = new WidgetManager(); + const widgetManager = new WidgetManager(this.context); widgetManager.content = this.readContent(); widgetManager.tenantIndependent = tenantIndependent; widgetManager.userSpecific = userSpecific; @@ -85,3 +79,17 @@ export class WidgetManagerFactory { } } } + +interface Manifest { + key: string; + name: string; + bundle: string; + version: string; + externalResource: string; + widgets: ManifestWidget[]; +} + +interface ManifestWidget { + widgetId: string; + name: string; +} diff --git a/src/content/manager/widget.manager.ts b/src/commands/studio/manager/widget.manager.ts similarity index 83% rename from src/content/manager/widget.manager.ts rename to src/commands/studio/manager/widget.manager.ts index 0a38680f..9ae32c48 100644 --- a/src/content/manager/widget.manager.ts +++ b/src/commands/studio/manager/widget.manager.ts @@ -1,6 +1,7 @@ -import { BaseManager } from "./base.manager"; -import { ManagerConfig } from "../../interfaces/manager-config.interface"; import * as FormData from "form-data"; +import { BaseManager } from "../../../core/http/http-shared/base.manager"; +import { Context } from "../../../core/command/cli-context"; +import { ManagerConfig } from "../../../core/http/http-shared/manager-config.interface"; export class WidgetManager extends BaseManager { private static PACKAGE_MANAGER_BASE_URL = "/package-manager"; @@ -11,6 +12,10 @@ export class WidgetManager extends BaseManager { private _tenantIndependent = false; private _userSpecific = false; + constructor(context: Context) { + super(context); + } + public get content(): any { return this._content; } @@ -43,7 +48,7 @@ export class WidgetManager extends BaseManager { ? WidgetManager.WIDGET_TENANT_INDEPENDENT_API : WidgetManager.WIDGET_API; return { - pushUrl: this.profile.team.replace(/\/?$/, `${baseUrl}${widgetUrl}`), + pushUrl: `${baseUrl}${widgetUrl}`, onPushSuccessMessage: (): string => { return "Widget was pushed successfully"; }, diff --git a/src/commands/studio/module.ts b/src/commands/studio/module.ts new file mode 100644 index 00000000..f9523a15 --- /dev/null +++ b/src/commands/studio/module.ts @@ -0,0 +1,156 @@ +/** + * Commands related to the Studio area. + */ + +import { Configurator, IModule } from "../../core/command/module-handler"; +import { Context } from "../../core/command/cli-context"; +import { Command, OptionValues } from "commander"; +import { PackageCommandService } from "./command-service/package-command.service"; +import { AssetCommandService } from "./command-service/asset-command.service"; +import { WidgetCommand } from "./command-service/widget.command"; +import { SpaceCommandService } from "./command-service/space-command.service"; + +class Module extends IModule { + + public register(context: Context, configurator: Configurator): void { + const exportCommand = configurator.command("export"); + exportCommand.command("packages") + .description("Command to export all given packages") + .requiredOption("--packageKeys ", "Exports only given package keys") + .option("--includeDependencies", "Include variables and dependencies", "") + .option("--excludeActionFlows", "Don't export action flows") + .deprecationNotice("`content-cli export packages` is deprecated and is expected to be removed in subsequent updates around: 01-09-2025.\n" + + "Please use `content-cli config export` instead.\n") + .action(this.batchExportPackages); + + const importCommand = configurator.command("import"); + importCommand.command("packages") + .description("Command to import all given packages") + .option( + "--spaceMappings ", + "List of mappings for importing packages to different target spaces. Mappings should follow format 'packageKey:targetSpaceKey'" + ) + .option("--overwrite", "Flag to allow overwriting of packages") + .option("--excludeActionFlows", "Skip overwrite of action flows of package") + .option("--dataModelMappingsFile ", "DataModel variable mappings file path. If missing, variables will be mapped from manifest file.") + .requiredOption("-f, --file ", "Exported packages file (relative path)") + .deprecationNotice("`content-cli import packages` is deprecated and is expected to be removed in subsequent updates around: 01-09-2025.\n" + + "Please use `content-cli config import` instead.\n") + .action(this.batchImportPackages); + + const listCommand = configurator.command("list"); + listCommand.command("packages") + .description("Command to list all packages") + .option("--json", "Return response as json type", "") + .option("--includeDependencies", "Include variables and dependencies", "") + .option("--packageKeys ", "Lists only given package keys") + .action(this.listPackages); + + listCommand.command("spaces") + .description("Command to list all spaces") + .option("--json", "Return response as json type", "") + .action(this.listSpaces); + + listCommand.command("assets") + .description("Command to list all assets") + .option("--json", "Return response as json type", "") + .option("--assetType ", "type of assets") + .action(this.listAssets); + + const pullCommand = configurator.command("pull"); + pullCommand.command("asset") + .description("Command to pull an asset from Studio") + .requiredOption("--key ", "Key of asset you want to pull") + .action(this.pullAsset); + + pullCommand.command("package") + .description("Command to pull a package") + .requiredOption("--key ", "Key of the package you want to pull") + .option("--store", "Pull package with store deployment metadata") + .option("--newKey ", "Define a new key for your package") + .option("--draft", "Pull draft version of package") + .action(this.pullPackage); + + const pushCommand = configurator.command("push"); + pushCommand.command("asset") + .description("Command to push an asset to Studio") + .requiredOption("-f, --file ", "The file you want to push") + .requiredOption("--package ", "Key of the package you want to push asset to") + .action(this.pushAsset); + + pushCommand.command("assets") + .description("Command to push assets to Studio") + .requiredOption("--package ", "Key of the package you want to push assets to") + .action(this.pushAssets); + + pushCommand.command("package") + .description("Command to push a package to Studio") + .option("--newKey ", "Define a new key for your package") + .option("--overwrite", "Overwrite package and its assets") + .requiredOption("-f, --file ", "The file you want to push") + .requiredOption("--spaceKey ", "The key of the destination space") + .action(this.pushPackage); + + pushCommand.command("packages") + .description("Command to push packages to Studio") + .requiredOption("--spaceKey ", "The key of the destination space") + .action(this.pushPackages); + + pushCommand.command("widget") + .description("Command to push a widget") + .option("--tenantIndependent", "Upload widget tenant independently") + .option("--userSpecific", "Upload widget only for the user in the provided api token") + .option("--packageManager", "Upload widget to package manager (deprecated)") // Deprecated + .action(this.pushWidget); + } + + private async batchExportPackages(context: Context, command: Command, options: OptionValues): Promise { + await new PackageCommandService(context).batchExportPackages(options.packageKeys, options.includeDependencies, options.excludeActionFlows ?? false); + } + + private async batchImportPackages(context: Context, command: Command, options: OptionValues): Promise { + await new PackageCommandService(context).batchImportPackages(options.spaceMappings, options.dataModelMappingsFile, options.file, options.overwrite, options.excludeActionFlows); + } + + private async listPackages(context: Context, command: Command, options: OptionValues): Promise { + await new PackageCommandService(context).listPackages(options.json, options.includeDependencies, options.packageKeys); + } + + private async listSpaces(context: Context, command: Command, options: OptionValues): Promise { + await new SpaceCommandService(context).listSpaces(options.json); + } + + private async listAssets(context: Context, command: Command, options: OptionValues): Promise { + await new AssetCommandService(context).listAssets(options.json, options.assetType); + } + + private async pullAsset(context: Context, command: Command, options: OptionValues): Promise { + await new AssetCommandService(context).pullAsset(options.key); + } + + private async pullPackage(context: Context, command: Command, options: OptionValues): Promise { + await new PackageCommandService(context).pullPackage(options.key, !!options.store, options.newKey, !!options.draft); + } + + private async pushAsset(context: Context, command: Command, options: OptionValues): Promise { + await new AssetCommandService(context).pushAsset(options.file, options.package); + } + + private async pushAssets(context: Context, command: Command, options: OptionValues): Promise { + await new AssetCommandService(context).pushAssets(options.package); + } + + private async pushPackage(context: Context, command: Command, options: OptionValues): Promise { + await new PackageCommandService(context).pushPackage(options.spaceKey, options.file, options.newKey, options.overwrite); + } + + private async pushPackages(context: Context, command: Command, options: OptionValues): Promise { + await new PackageCommandService(context).pushPackages(options.spaceKey); + } + + private async pushWidget(context: Context, command: Command, options: OptionValues): Promise { + await new WidgetCommand(context).pushWidget(!!options.tenantIndependent, !!options.userSpecific); + } +} + +export = Module; \ No newline at end of file diff --git a/src/services/package-manager/asset-service.ts b/src/commands/studio/service/asset-service.ts similarity index 53% rename from src/services/package-manager/asset-service.ts rename to src/commands/studio/service/asset-service.ts index 274bbf80..d5fa1c81 100644 --- a/src/services/package-manager/asset-service.ts +++ b/src/commands/studio/service/asset-service.ts @@ -1,14 +1,21 @@ -import {logger} from "../../util/logger"; -import {assetApi} from "../../api/asset-api"; import {v4 as uuidv4} from "uuid"; -import {fileService} from "../file-service"; -import {SaveContentNode} from "../../interfaces/save-content-node.interface"; +import { Context } from "../../../core/command/cli-context"; +import { SaveContentNode } from "../interfaces/save-content-node.interface"; +import { AssetApi } from "../api/asset-api"; +import { logger } from "../../../core/utils/logger"; +import { fileService } from "../../../core/utils/file-service"; -class AssetService { +export class AssetService { protected readonly fileDownloadedMessage = "File downloaded successfully. New filename: "; + private assetApi: AssetApi; + + constructor(context: Context) { + this.assetApi = new AssetApi(context); + } + public async listAssets(assetType: string): Promise { - const nodes = await assetApi.findAllAssets(assetType); + const nodes = await this.assetApi.findAllAssets(assetType); nodes.forEach(node => { logger.info(`${node.name} - Key: "${node.key}"`); }); @@ -17,12 +24,10 @@ class AssetService { public async findAndExportAllAssets(assetType: string): Promise { const fieldsToInclude = ["key", "name", "assetType", "rootNodeKey", "activatedDraftId"]; - const nodes: SaveContentNode[] = await assetApi.findAllAssets(assetType); + const nodes: SaveContentNode[] = await this.assetApi.findAllAssets(assetType); const filename = uuidv4() + ".json"; fileService.writeToFileWithGivenName(JSON.stringify(nodes, fieldsToInclude), filename); logger.info(this.fileDownloadedMessage + filename); } } - -export const assetService = new AssetService(); \ No newline at end of file diff --git a/src/services/package-manager/datamodel-service.ts b/src/commands/studio/service/data-model.service.ts similarity index 62% rename from src/services/package-manager/datamodel-service.ts rename to src/commands/studio/service/data-model.service.ts index 1f6854cf..3d010f94 100644 --- a/src/services/package-manager/datamodel-service.ts +++ b/src/commands/studio/service/data-model.service.ts @@ -1,15 +1,18 @@ -import {computePoolApi} from "../../api/compute-pool-api"; -import { - PackageWithVariableAssignments, - StudioComputeNodeDescriptor -} from "../../interfaces/package-manager.interfaces"; +import { PackageWithVariableAssignments, StudioComputeNodeDescriptor } from "../interfaces/package-manager.interfaces"; +import { Context } from "../../../core/command/cli-context"; +import { ComputePoolApi } from "../api/compute-pool-api"; -class DataModelService { - public static readonly INSTANCE = new DataModelService(); +export class DataModelService { + + private computePoolApi: ComputePoolApi; + + constructor(context: Context) { + this.computePoolApi = new ComputePoolApi(context); + } public async getDataModelDetailsForPackages(packagesWithDataModelVariables: PackageWithVariableAssignments[]): Promise> { const dataModelsMap = new Map(); - const allAvailableDataModels = await computePoolApi.findAllDataModelsDetails(); + const allAvailableDataModels = await this.computePoolApi.findAllDataModelsDetails(); for (const node of packagesWithDataModelVariables) { const variablesOfPackage = packagesWithDataModelVariables.find(nodeWithVariablesAssignment => nodeWithVariablesAssignment.key === node.key)?.variableAssignments; @@ -21,5 +24,3 @@ class DataModelService { return dataModelsMap; } } - -export const dataModelService = DataModelService.INSTANCE; \ No newline at end of file diff --git a/src/services/package-manager/package-service.ts b/src/commands/studio/service/package.service.ts similarity index 81% rename from src/services/package-manager/package-service.ts rename to src/commands/studio/service/package.service.ts index bba49197..6fef2d77 100644 --- a/src/services/package-manager/package-service.ts +++ b/src/commands/studio/service/package.service.ts @@ -1,34 +1,53 @@ -import {FatalError, logger} from "../../util/logger"; -import {packageApi} from "../../api/package-api"; import {v4 as uuidv4} from "uuid"; -import {FileService, fileService} from "../file-service"; -import {BatchExportNodeTransport} from "../../interfaces/batch-export-node-transport"; -import {dataModelService} from "./datamodel-service"; -import { - ContentNodeTransport, - PackageDependencyTransport, - PackageManagerVariableType -} from "../../interfaces/package-manager.interfaces"; -import {nodeApi} from "../../api/node-api"; -import {packageDependenciesApi} from "../../api/package-dependencies-api"; -import {variableService} from "./variable-service"; -import {spaceService} from "./space-service"; import * as fs from "fs"; import AdmZip = require("adm-zip"); import * as path from "path"; import {tmpdir} from "os"; -import {SpaceTransport} from "../../interfaces/save-space.interface"; -import {ManifestDependency, ManifestNodeTransport} from "../../interfaces/manifest-transport"; -import {DataPoolInstallVersionReport} from "../../interfaces/data-pool-manager.interfaces"; -import {SemanticVersioning} from "../../util/semantic-versioning" -import {stringify} from "../../util/yaml"; import * as FormData from "form-data"; - -class PackageService { +import { Context } from "../../../core/command/cli-context"; +import { PackageApi } from "../api/package-api"; +import { FatalError, logger } from "../../../core/utils/logger"; +import { + ContentNodeTransport, + PackageDependencyTransport, + PackageManagerVariableType, +} from "../interfaces/package-manager.interfaces"; +import { DataPoolInstallVersionReport } from "../../data-pipeline/data-pool/data-pool-manager.interfaces"; +import { FileService, fileService } from "../../../core/utils/file-service"; +import { BatchExportNodeTransport } from "../interfaces/batch-export-node.interfaces"; +import { ManifestDependency, ManifestNodeTransport } from "../interfaces/manifest.interface"; +import { parse } from "../../../core/utils/yaml"; +import { stringify } from "yaml"; +import { SemanticVersioning } from "../utils/semantic-versioning"; +import { SpaceTransport } from "../interfaces/space.interface"; +import { NodeApi } from "../api/node-api"; +import { PackageDependenciesApi } from "../api/package-dependencies-api"; +import { DataModelService } from "./data-model.service"; +import { StudioVariableService } from "./studio-variable.service"; +import { SpaceService } from "./space.service"; + +export class PackageService { protected readonly fileDownloadedMessage = "File downloaded successfully. New filename: "; + private packageApi: PackageApi; + private nodeApi: NodeApi; + private packageDependenciesApi: PackageDependenciesApi; + + private dataModelService: DataModelService; + private variableService: StudioVariableService; + private spaceService: SpaceService; + + constructor(context: Context) { + this.packageApi = new PackageApi(context); + this.nodeApi = new NodeApi(context); + this.packageDependenciesApi = new PackageDependenciesApi(context); + this.dataModelService = new DataModelService(context); + this.variableService = new StudioVariableService(context); + this.spaceService = new SpaceService(context); + } + public async listPackages(): Promise { - const nodes = await packageApi.findAllPackages(); + const nodes = await this.packageApi.findAllPackages(); nodes.forEach(node => { logger.info(`${node.name} - Key: "${node.key}"`); }); @@ -37,7 +56,7 @@ class PackageService { public async findAndExportListOfAllPackages(includeDependencies: boolean, packageKeys: string[]): Promise { const fieldsToInclude = ["key", "name", "changeDate", "activatedDraftId", "workingDraftId", "spaceId"]; - let nodesListToExport: BatchExportNodeTransport[] = await packageApi.findAllPackages(); + let nodesListToExport: BatchExportNodeTransport[] = await this.packageApi.findAllPackages(); if (packageKeys.length > 0) { nodesListToExport = nodesListToExport.filter(node => packageKeys.includes(node.rootNodeKey)); } @@ -49,8 +68,8 @@ class PackageService { publishedNodes = await this.getNodesWithActiveVersion(publishedNodes); nodesListToExport = [...publishedNodes, ...unPublishedNodes]; - const packageWithDataModelVariableAssignments = await variableService.getVariableAssignmentsForNodes(PackageManagerVariableType.DATA_MODEL); - const dataModelDetailsByNode = await dataModelService.getDataModelDetailsForPackages(packageWithDataModelVariableAssignments); + const packageWithDataModelVariableAssignments = await this.variableService.getVariableAssignmentsForNodes(PackageManagerVariableType.DATA_MODEL); + const dataModelDetailsByNode = await this.dataModelService.getDataModelDetailsForPackages(packageWithDataModelVariableAssignments); nodesListToExport.forEach(node => { node.datamodels = dataModelDetailsByNode.get(node.key); }); @@ -75,10 +94,10 @@ class PackageService { await fs.mkdirSync(importedFilePath); await zip.extractAllTo(importedFilePath); - const manifestNodes = await fileService.readManifestFile(importedFilePath); + const manifestNodes = await this.readManifestFile(importedFilePath); if (!overwrite) { - const allTargetPackages = await packageApi.findAllPackages(); + const allTargetPackages = await this.packageApi.findAllPackages(); const manifestNodeKeys = manifestNodes.map(node => node.packageKey); const packagesWithDraftChanges = allTargetPackages .filter(node => manifestNodeKeys.includes(node.key) && node.workingDraftId !== node.activatedDraftId) @@ -182,18 +201,18 @@ class PackageService { const targetSpace = await this.getTargetSpaceForExportedPackage(packageToImport, spaceMappings); - let nodeInTargetTeam = await nodeApi.findOneByKeyAndRootNodeKey(packageToImport.packageKey, packageToImport.packageKey); + let nodeInTargetTeam = await this.nodeApi.findOneByKeyAndRootNodeKey(packageToImport.packageKey, packageToImport.packageKey); const pathToZipFile = path.resolve(importedFilePath, packageToImport.packageKey + "_" + versionOfPackageBeingImported + ".zip"); const packageZip = this.createBodyForImport(pathToZipFile); - await packageApi.importPackage(packageZip, targetSpace.id, !!nodeInTargetTeam, excludeActionFlows); + await this.packageApi.importPackage(packageZip, targetSpace.id, !!nodeInTargetTeam, excludeActionFlows); if (nodeInTargetTeam) { - await packageApi.movePackageToSpace(nodeInTargetTeam.id, targetSpace.id) + await this.packageApi.movePackageToSpace(nodeInTargetTeam.id, targetSpace.id) } - nodeInTargetTeam = await nodeApi.findOneByKeyAndRootNodeKey(packageToImport.packageKey, packageToImport.packageKey); + nodeInTargetTeam = await this.nodeApi.findOneByKeyAndRootNodeKey(packageToImport.packageKey, packageToImport.packageKey); if (this.isLatestVersion(versionOfPackageBeingImported, [...packageToImport.dependenciesByVersion.keys()])) { if (dmTargetIdsBySourceIds.size > 0) { @@ -203,9 +222,9 @@ class PackageService { return variable; }) - await variableService.assignVariableValues(nodeInTargetTeam.key, variableAssignments); + await this.variableService.assignVariableValues(nodeInTargetTeam.key, variableAssignments); } else { - await variableService.assignVariableValues(nodeInTargetTeam.key, packageToImport.variables); + await this.variableService.assignVariableValues(nodeInTargetTeam.key, packageToImport.variables); } } @@ -214,7 +233,7 @@ class PackageService { await this.updateDependencyVersions(packageToImport, versionOfPackageBeingImported, sourceToTargetVersionsByNodeKey, draftIdsByPackageKeyAndVersion); await this.publishPackage(packageToImport); - const packageVersionInTargetTeam = await packageApi.findActiveVersionById(nodeInTargetTeam.id); + const packageVersionInTargetTeam = await this.packageApi.findActiveVersionById(nodeInTargetTeam.id); const mappedVersions = sourceToTargetVersionsByNodeKey.get(packageToImport.packageKey) ?? new Map(); mappedVersions.set(versionOfPackageBeingImported, packageVersionInTargetTeam.version); @@ -259,7 +278,7 @@ class PackageService { continue; } - const dependentPackage = manifestNodes.find((node) => node.packageKey === dependency.key); + const dependentPackage = manifestNodes.find(node => node.packageKey === dependency.key); await this.importPackage(dependentPackage, manifestNodes, sourceToTargetVersionsByNodeKey, spaceMappings, dmTargetIdsBySourceIds, importedVersionsByNodeKey, draftIdsByPackageKeyAndVersion, importedFilePath, excludeActionFlows); } } @@ -279,8 +298,8 @@ class PackageService { } private async getTargetSpaceForExportedPackage(packageToImport: ManifestNodeTransport, spaceMappings: Map): Promise { - let targetSpace; - const allSpaces = await spaceService.refreshAndGetAllSpaces(); + let targetSpace: SpaceTransport; + const allSpaces = await this.spaceService.refreshAndGetAllSpaces(); if (spaceMappings.has(packageToImport.packageKey)) { const customSpaceId = spaceMappings.get(packageToImport.packageKey); const customSpace = allSpaces.find(space => space.id === customSpaceId); @@ -294,7 +313,7 @@ class PackageService { targetSpace = allSpaces.find(space => space.name === packageToImport.space.spaceName); if (!targetSpace) { - targetSpace = await spaceService.createSpace(packageToImport.space.spaceName, packageToImport.space.spaceIcon); + targetSpace = await this.spaceService.createSpace(packageToImport.space.spaceName, packageToImport.space.spaceIcon); } } @@ -307,10 +326,10 @@ class PackageService { sourceToTargetVersionsByNodeKey: Map>, draftIdsByPackageKeyAndVersion: Map): Promise { - const createdNode = await nodeApi.findOneByKeyAndRootNodeKey(node.packageKey, node.packageKey); + const createdNode = await this.nodeApi.findOneByKeyAndRootNodeKey(node.packageKey, node.packageKey); const newDependencies = []; for (const dependency of [...node.dependenciesByVersion.get(versionOfPackage)]) { - const nodeInTargetTeam = await nodeApi.findOneByKeyAndRootNodeKey(dependency.key, dependency.key); + const nodeInTargetTeam = await this.nodeApi.findOneByKeyAndRootNodeKey(dependency.key, dependency.key); const draftIdOfVersionedDependency = draftIdsByPackageKeyAndVersion.get(`${dependency.key}_${dependency.version}`); dependency.version = sourceToTargetVersionsByNodeKey.get(dependency.key).get(dependency.version); dependency.updateAvailable = dependency.updateAvailable; @@ -319,18 +338,18 @@ class PackageService { dependency.draftId = draftIdOfVersionedDependency; newDependencies.push(dependency); - await packageDependenciesApi.deleteDependency(createdNode.id, dependency.key); + await this.packageDependenciesApi.deleteDependency(createdNode.id, dependency.key); } if (newDependencies.length) { - await packageDependenciesApi.createDependencies(createdNode.id, newDependencies); + await this.packageDependenciesApi.createDependencies(createdNode.id, newDependencies); } } public async publishPackage(packageToImport: ManifestNodeTransport): Promise { - const nodeInTargetTeam = await nodeApi.findOneByKeyAndRootNodeKey(packageToImport.packageKey, packageToImport.packageKey); - const nextVersion = await packageApi.findNextVersion(nodeInTargetTeam.id); - await packageApi.publishPackage({ + const nodeInTargetTeam = await this.nodeApi.findOneByKeyAndRootNodeKey(packageToImport.packageKey, packageToImport.packageKey); + const nextVersion = await this.packageApi.findNextVersion(nodeInTargetTeam.id); + await this.packageApi.publishPackage({ packageKey: packageToImport.packageKey, version: nextVersion.version, publishMessage: "Published package after import", @@ -339,7 +358,7 @@ class PackageService { } public async batchExportPackages(packageKeys: string[], includeDependencies: boolean, excludeActionFlows?: boolean): Promise { - const allPackages = await packageApi.findAllPackages(); + const allPackages = await this.packageApi.findAllPackages(); let nodesListToExport: BatchExportNodeTransport[] = allPackages.filter(node => packageKeys.includes(node.key)); const versionsByNodeKey = new Map(); @@ -358,7 +377,7 @@ class PackageService { nodesListToExport.push(...dependencyPackages); } - const packagesWithVariableAssignments = await variableService.getVariableAssignmentsForNodes(); + const packagesWithVariableAssignments = await this.variableService.getVariableAssignmentsForNodes(); nodesListToExport.forEach(node => { node.variables = packagesWithVariableAssignments.find(nodeWithVariablesAssignment => nodeWithVariablesAssignment.key === node.key)?.variableAssignments; @@ -368,18 +387,18 @@ class PackageService { packageWithVariablesAssignments.variableAssignments = packageWithVariablesAssignments.variableAssignments.filter(variable => variable.value && variable.type === PackageManagerVariableType.DATA_MODEL); return packageWithVariablesAssignments; }); - const dataModelDetailsByNode = await dataModelService.getDataModelDetailsForPackages(packagesWithDataModelVariables); + const dataModelDetailsByNode = await this.dataModelService.getDataModelDetailsForPackages(packagesWithDataModelVariables); nodesListToExport.forEach(node => { node.datamodels = dataModelDetailsByNode.get(node.key); }); - nodesListToExport = await spaceService.getParentSpaces(nodesListToExport); + nodesListToExport = await this.spaceService.getParentSpaces(nodesListToExport); await this.exportToZip(nodesListToExport, versionsByNodeKey, excludeActionFlows); } public async getNodesWithActiveVersion(nodes: BatchExportNodeTransport[]): Promise { - const activeVersionsOfPackage = await packageApi.findActiveVersionByIds(nodes.map(node => node.id)); + const activeVersionsOfPackage = await this.packageApi.findActiveVersionByIds(nodes.map(node => node.id)); nodes.forEach(node => { node.version = activeVersionsOfPackage.find(packageVersion => packageVersion.id === node.id); @@ -389,8 +408,7 @@ class PackageService { } public async getPackagesWithDependencies(draftIdByNodeId: Map): Promise> { - const allPackageDependencies: Map = await packageDependenciesApi.findPackageDependenciesByIds(draftIdByNodeId); - return allPackageDependencies; + return await this.packageDependenciesApi.findPackageDependenciesByIds(draftIdByNodeId); } private async getDependencyPackages(nodesToResolve: BatchExportNodeTransport[], dependencyPackages: BatchExportNodeTransport[], allPackages: ContentNodeTransport[], resolvedDependencies: string[], versionsByNodeKey: Map): Promise { @@ -451,7 +469,7 @@ class PackageService { private async exportPackagesAndAssets(nodes: BatchExportNodeTransport[], excludeActionFlows?: boolean): Promise { const zips = []; for (const rootPackage of nodes) { - const exportedPackage = await packageApi.exportPackage(rootPackage.key, rootPackage.version.version, excludeActionFlows) + const exportedPackage = await this.packageApi.exportPackage(rootPackage.key, rootPackage.version.version, excludeActionFlows) zips.push({ data: exportedPackage, packageKey: rootPackage.key, @@ -480,7 +498,7 @@ class PackageService { private exportManifestOfPackages(nodes: BatchExportNodeTransport[], dependencyVersionsByNodeKey: Map): ManifestNodeTransport[] { const manifestNodesByPackageKey = new Map(); - nodes.forEach((node) => { + nodes.forEach(node => { const manifestNode = manifestNodesByPackageKey.get(node.key) ?? {} as ManifestNodeTransport; manifestNode.packageKey = node.key; manifestNode.packageId = node.id; @@ -488,7 +506,7 @@ class PackageService { spaceName: node.space.name, spaceIcon: node.space.iconReference } - manifestNode.variables = node.variables?.map((variable) => { + manifestNode.variables = node.variables?.map(variable => { if (variable.type === PackageManagerVariableType.DATA_MODEL) { // @ts-ignore const dataModel = node.datamodels?.find(dataModel => dataModel.dataModelId === variable.value); @@ -508,6 +526,11 @@ class PackageService { return [...manifestNodesByPackageKey.values()]; } -} -export const packageService = new PackageService(); + private readManifestFile(importedFileName: string): Promise { + const manifest: ManifestNodeTransport[] = parse( + fs.readFileSync(path.resolve(importedFileName + "/manifest.yml"), { encoding: "utf-8" }) + ); + return Promise.all(manifest); + } +} diff --git a/src/services/package-manager/space-service.ts b/src/commands/studio/service/space.service.ts similarity index 60% rename from src/services/package-manager/space-service.ts rename to src/commands/studio/service/space.service.ts index 466476db..f6634232 100644 --- a/src/services/package-manager/space-service.ts +++ b/src/commands/studio/service/space.service.ts @@ -1,19 +1,25 @@ -import {spaceApi} from "../../api/space-api"; -import {BatchExportNodeTransport} from "../../interfaces/batch-export-node-transport"; -import {SpaceTransport} from "../../interfaces/save-space.interface"; import {v4 as uuidv4} from "uuid"; +import { Context } from "../../../core/command/cli-context"; +import { SpaceTransport } from "../interfaces/space.interface"; +import { BatchExportNodeTransport } from "../interfaces/batch-export-node.interfaces"; +import { SpaceApi } from "../api/space-api"; -class SpaceService { - public static readonly INSTANCE = new SpaceService(); +export class SpaceService { private allSpaces: SpaceTransport[] = []; + private spaceApi: SpaceApi; + + constructor(context: Context) { + this.spaceApi = new SpaceApi(context); + } + public async getParentSpaces(nodes: BatchExportNodeTransport[]): Promise { const promises = []; nodes.forEach(node => { promises.push(new Promise(async resolve => { - node.space = await spaceApi.findOne(node.spaceId); + node.space = await this.spaceApi.findOne(node.spaceId); resolve(node); })); }) @@ -22,7 +28,7 @@ class SpaceService { } public async createSpace(spaceName: string, spaceIcon: string): Promise { - const newSpace = await spaceApi.createSpace({ + const newSpace = await this.spaceApi.createSpace({ id: uuidv4(), name: spaceName, iconReference: spaceIcon @@ -37,9 +43,7 @@ class SpaceService { if (this.allSpaces.length) { return this.allSpaces; } - this.allSpaces = await spaceApi.findAllSpaces(); + this.allSpaces = await this.spaceApi.findAllSpaces(); return this.allSpaces; } } - -export const spaceService = SpaceService.INSTANCE; \ No newline at end of file diff --git a/src/commands/studio/service/studio-variable.service.ts b/src/commands/studio/service/studio-variable.service.ts new file mode 100644 index 00000000..ff325772 --- /dev/null +++ b/src/commands/studio/service/studio-variable.service.ts @@ -0,0 +1,27 @@ +import { + PackageManagerVariableType, + PackageWithVariableAssignments, + VariablesAssignments, +} from "../interfaces/package-manager.interfaces"; +import { Context } from "../../../core/command/cli-context"; +import { PackageApi } from "../api/package-api"; +import { StudioVariablesApi } from "../api/studio-variables-api"; + +export class StudioVariableService { + + private packageApi: PackageApi; + private variablesApi: StudioVariablesApi; + + constructor(context: Context) { + this.packageApi = new PackageApi(context); + this.variablesApi = new StudioVariablesApi(context); + } + + public async getVariableAssignmentsForNodes(type?: PackageManagerVariableType): Promise { + return await this.packageApi.findAllPackagesWithVariableAssignments(type); + } + + public async assignVariableValues(packageKey: string, variablesAssignments: VariablesAssignments[]): Promise { + await this.variablesApi.assignVariableValues(packageKey, variablesAssignments); + } +} diff --git a/src/util/semantic-versioning.ts b/src/commands/studio/utils/semantic-versioning.ts similarity index 100% rename from src/util/semantic-versioning.ts rename to src/commands/studio/utils/semantic-versioning.ts diff --git a/src/commands/variable.command.ts b/src/commands/variable.command.ts deleted file mode 100644 index 0f8426b8..00000000 --- a/src/commands/variable.command.ts +++ /dev/null @@ -1,12 +0,0 @@ -import {variableService} from "../services/package-manager/variable-service"; - -export class VariableCommand { - - public async listAssignments(variableType: string, jsonResponse: boolean, params: string): Promise { - if (jsonResponse) { - await variableService.findAndExportCandidateAssignments(variableType, params); - } else { - await variableService.listCandidateAssignments(variableType, params); - } - } -} diff --git a/src/commands/widget.command.ts b/src/commands/widget.command.ts deleted file mode 100644 index 69c5d0e2..00000000 --- a/src/commands/widget.command.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ContentService } from "../services/content.service"; -import { WidgetManagerFactory } from "../content/factory/widget-manager.factory"; - -export class WidgetCommand { - private contentService = new ContentService(); - private widgetManagerFactory = new WidgetManagerFactory(); - - public async pushWidget(profile: string, tenantIndependent: boolean, userSpecific: boolean): Promise { - await this.contentService.push( - profile, - this.widgetManagerFactory.createManager(tenantIndependent, userSpecific) - ); - } -} diff --git a/src/content-cli-analyze.ts b/src/content-cli-analyze.ts deleted file mode 100644 index 8010c57d..00000000 --- a/src/content-cli-analyze.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { ContextInitializer } from "./util/context-initializer"; -import { logger } from "./util/logger"; -import { ActionFlowCommand } from "./commands/action-flow.command"; -import { program } from "./util/program"; -import { Command } from "commander"; - -class Analyze { - public static actionFlows(program: Command): Command { - program - .command("action-flows") - .description("Analyze Action Flows dependencies for a certain package") - .option("-p, --profile ", "Profile which you want to use to analyze Action Flows") - .requiredOption("--packageId ", "ID of the package from which you want to export Action Flows") - .option("-o, --outputToJsonFile", "Output the analyze result in a JSON file") - .action(async cmd => { - await new ActionFlowCommand().analyzeActionFlows(cmd.packageId, cmd.outputToJsonFile); - process.exit(); - }); - return program; - } -} - -const loadCommands = () => { - getAllCommands(); -}; - -ContextInitializer.initContext() - .then(loadCommands, loadCommands) - .catch(e => { - logger.error(e); - }); - -if (!process.argv.slice(2).length) { - program.outputHelp(); - process.exit(1); -} - -function getAllCommands(): void { - Analyze.actionFlows(program); - - program.parse(process.argv); -} diff --git a/src/content-cli-config.ts b/src/content-cli-config.ts deleted file mode 100644 index 6908ed8c..00000000 --- a/src/content-cli-config.ts +++ /dev/null @@ -1,110 +0,0 @@ -import {ConfigCommand} from "./commands/config.command"; -import { program } from "./util/program"; -import {logger} from "./util/logger"; -import {ContextInitializer} from "./util/context-initializer"; -import { Command } from "commander"; - -export class Config { - public static list(program: Command): Command { - program - .command("list") - .description("Command to list active packages that can be exported") - .option("-p, --profile ", "Profile which you want to use to list possible variable assignments") - .option("--json", "Return response as json type", "") - .option("--flavors ", "Lists only active packages of the given flavors") - .option("--withDependencies", "Include dependencies", "") - .option("--packageKeys ", "Lists only given package keys") - .option("--variableValue ", "Variable value for filtering packages by.") - .option("--variableType ", "Variable type for filtering packages by.") - .action(async cmd => { - await new ConfigCommand().listActivePackages(cmd.json, cmd.flavors, cmd.withDependencies, cmd.packageKeys, cmd.variableValue, cmd.variableType); - process.exit(); - }); - - return program; - } - - public static listVariables(program: Command): Command { - program - .command("variables") - .description("Commands related to variable configs") - .command("list") - .description("Command to list versioned variables of packages") - .option("-p, --profile ", "Profile which you want to use to list packages") - .option("--json", "Return response as json type", "") - .option("--keysByVersion ", "Mapping of package keys and versions", "") - .option("--keysByVersionFile ", "Package keys by version mappings file path.", "") - .action(async cmd => { - await new ConfigCommand().listVariables(cmd.json, cmd.keysByVersion, cmd.keysByVersionFile); - process.exit(); - }); - - return program; - } - - public static export(program: Command): Command { - program - .command("export") - .description("Command to export package configs") - .option("-p, --profile ", "Profile which you want to use to export packages") - .requiredOption("--packageKeys ", "Keys of packages to export") - .option("--withDependencies", "Include variables and dependencies", "") - .action(async cmd => { - await new ConfigCommand().batchExportPackages(cmd.packageKeys, cmd.withDependencies); - process.exit(); - }); - - return program; - } - - public static import(program: Command): Command { - program - .command("import") - .description("Command to import package configs") - .option("-p, --profile ", "Profile which you want to use to import packages") - .option("--overwrite", "Flag to allow overwriting of packages") - .requiredOption("-f, --file ", "Exported packages file (relative path)") - .action(async cmd => { - await new ConfigCommand().batchImportPackages(cmd.file, cmd.overwrite); - process.exit(); - }); - - return program; - } - - public static diff(program: Command): Command { - program - .command("diff") - .description("Command to diff configs of packages") - .option("-p, --profile ", "Profile of the team/realm which you want to use to diff the packages with") - .option("--hasChanges", "Flag to return only the information if the package has changes without the actual changes") - .option("--json", "Return the response as a JSON file") - .requiredOption("-f, --file ", "Exported packages file (relative or absolute path)") - .action(async cmd => { - await new ConfigCommand().diffPackages(cmd.file, cmd.hasChanges, cmd.json); - process.exit(); - }); - - return program; - } -} - -const loadAllCommands = () => { - Config.list(program); - Config.listVariables(program); - Config.export(program); - Config.import(program); - Config.diff(program) - program.parse(process.argv); -}; - -ContextInitializer.initContext() - .then(loadAllCommands, loadAllCommands) - .catch(e => { - logger.error(e); - }); - -if (!process.argv.slice(2).length) { - program.outputHelp(); - process.exit(1); -} diff --git a/src/content-cli-export.ts b/src/content-cli-export.ts deleted file mode 100644 index 3dc91a07..00000000 --- a/src/content-cli-export.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { Command } from "commander"; -import { PackageCommand } from "./commands/package.command"; -import { logger } from "./util/logger"; -import { DataPoolCommand } from "./commands/data-pool.command"; -import { ContextInitializer } from "./util/context-initializer"; -import { ActionFlowCommand } from "./commands/action-flow.command"; -import { program } from "./util/program"; - -export class Export { - public static packages(program: Command): Command { - program - .command("packages") - .description("Command to export all given packages") - .option("-p, --profile ", "Profile which you want to use to list packages") - .requiredOption("--packageKeys ", "Exports only given package keys") - .option("--includeDependencies", "Include variables and dependencies", "") - .option("--excludeActionFlows", "Don't export action flows") - .action(async cmd => { - await new PackageCommand().batchExportPackages(cmd.packageKeys, cmd.includeDependencies, cmd.excludeActionFlows ?? false); - process.exit(); - }); - - return program; - } - - public static dataPool(program: Command): Command { - program - .command("data-pool") - .description("Command to export a data pool") - .option("-p, --profile ", "Profile which you want to use to export the data pool") - .requiredOption("--id ", "ID of the data pool you want to export") - .option("--outputToJsonFile", "Output the exported data pool to a JSON file") - .action(async cmd => { - await new DataPoolCommand().exportDataPool(cmd.id, cmd.outputToJsonFile); - process.exit(); - }); - - return program; - } - - public static actionFlows(program: Command): Command { - program - .command("action-flows") - .description("Command to export all Action Flows in a package with their objects and dependencies") - .option("-p, --profile ", "Profile which you want to use to export Action Flows") - .requiredOption("--packageId ", "ID of the package from which you want to export Action Flows") - .option("-f, --file ", "Action flows metadata file (relative path)") - .action(async cmd => { - await new ActionFlowCommand().exportActionFlows(cmd.packageId, cmd.file); - process.exit(); - }); - - return program; - } -} - -const loadCommands = () => { - getAllCommands(); -}; - -ContextInitializer.initContext() - .then(loadCommands, loadCommands) - .catch(e => { - logger.error(e); - }); - -if (!process.argv.slice(2).length) { - program.outputHelp(); - process.exit(1); -} - -function getAllCommands(): void { - Export.packages(program); - Export.dataPool(program); - Export.actionFlows(program); - - program.parse(process.argv); -} diff --git a/src/content-cli-get.ts b/src/content-cli-get.ts deleted file mode 100644 index 176e6e32..00000000 --- a/src/content-cli-get.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { ConnectionCommand } from "./commands/connection.command"; - -import { ContextInitializer } from "./util/context-initializer"; -import { logger } from "./util/logger"; -import { program } from "./util/program"; -import { Command } from "commander"; - -class Get { - public static connection(program: Command): Command { - program - .command("connection") - .description("Programmatically read properties of your connections") - .option("-p, --profile ", "Profile which you want to use to update the data pool configuration") - .requiredOption("--dataPoolId ", "Id of the data pool you want to update") - .requiredOption("--connectionId ", "Id of the connection you want to update") - .action(async cmd => { - await new ConnectionCommand().getProperties(cmd.profile, cmd.dataPoolId, cmd.connectionId); - process.exit(); - }); - return program; - } -} - -ContextInitializer.initContext() - .then(() => { - Get.connection(program); - program.parse(process.argv); - }) - .catch(e => { - logger.error(e); - }); - -if (!process.argv.slice(2).length) { - program.outputHelp(); - process.exit(1); -} diff --git a/src/content-cli-import.ts b/src/content-cli-import.ts deleted file mode 100644 index bf6350cf..00000000 --- a/src/content-cli-import.ts +++ /dev/null @@ -1,86 +0,0 @@ -import * as commander from "commander"; -import { Command } from "commander"; -import { PackageCommand } from "./commands/package.command"; -import { DataPoolCommand } from "./commands/data-pool.command"; -import { ContextInitializer } from "./util/context-initializer"; -import { logger } from "./util/logger"; -import { ActionFlowCommand } from "./commands/action-flow.command"; -import { program } from "./util/program"; - -export class Import { - public static packages(program: Command): Command { - program - .command("packages") - .description("Command to import all given packages") - .option("-p, --profile ", "Profile which you want to use to list packages") - .option( - "--spaceMappings ", - "List of mappings for importing packages to different target spaces. Mappings should follow format 'packageKey:targetSpaceKey'" - ) - .option("--overwrite", "Flag to allow overwriting of packages") - .option("--excludeActionFlows", "Skip overwrite of action flows of package") - .option("--dataModelMappingsFile ", "DataModel variable mappings file path. If missing, variables will be mapped from manifest file.") - .requiredOption("-f, --file ", "Exported packages file (relative path)") - .action(async cmd => { - await new PackageCommand().batchImportPackages(cmd.spaceMappings, cmd.dataModelMappingsFile, cmd.file, cmd.overwrite, cmd.excludeActionFlows); - process.exit(); - }); - - return program; - } - - public static dataPools(program: Command): Command { - program - .command("data-pools") - .description("Command to batch import multiple data pools with their objects and dependencies") - .option("-p, --profile ", "Profile which you want to use to import the data pools") - .requiredOption("-f, --jsonFile ", "The file with the JSON data pool batch import request") - .option("--outputToJsonFile", "Output the batch import result in a JSON file") - .action(async cmd => { - await new DataPoolCommand().batchImportDataPools(cmd.jsonFile, cmd.outputToJsonFile); - process.exit(); - }); - - return program; - } - - public static actionFlows(program: Command): Command { - program - .command("action-flows") - .description("Command to import all Action Flows in a package with their objects and dependencies") - .option("-p, --profile ", "Profile which you want to use to import Action Flows") - .requiredOption("--packageId ", "ID of the package to which you want to export Action Flows") - .requiredOption("-f, --file ", "Exported Action Flows file (relative path)") - .requiredOption("-d, --dryRun ", "Execute the import on dry run mode") - .option("-o, --outputToJsonFile", "Output the import result in a JSON file") - .action(async cmd => { - await new ActionFlowCommand().importActionFlows(cmd.packageId, cmd.file, cmd.dryRun, cmd.outputToJsonFile); - process.exit(); - }); - - return program; - } -} - -const loadCommands = () => { - getAllCommands(); -}; - -ContextInitializer.initContext() - .then(loadCommands, loadCommands) - .catch(e => { - logger.error(e); - }); - -if (!process.argv.slice(2).length) { - program.outputHelp(); - process.exit(1); -} - -function getAllCommands(): void { - Import.packages(program); - Import.dataPools(program); - Import.actionFlows(program); - - program.parse(process.argv); -} diff --git a/src/content-cli-list.ts b/src/content-cli-list.ts deleted file mode 100644 index 169723eb..00000000 --- a/src/content-cli-list.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { PackageCommand } from "./commands/package.command"; -import { SpaceCommand } from "./commands/space.command"; -import { DataPoolCommand } from "./commands/data-pool.command"; -import { AssetCommand } from "./commands/asset.command"; -import { logger } from "./util/logger"; -import { ContextInitializer } from "./util/context-initializer"; -import { ConnectionCommand } from "./commands/connection.command"; -import { VariableCommand } from "./commands/variable.command"; -import { Command } from "commander"; -import { program } from "./util/program"; - -export class List { - public static packages(program: Command): Command { - program - .command("packages") - .description("Command to list all packages") - .option("-p, --profile ", "Profile which you want to use to list packages") - .option("--json", "Return response as json type", "") - .option("--includeDependencies", "Include variables and dependencies", "") - .option("--packageKeys ", "Lists only given package keys") - .action(async cmd => { - await new PackageCommand().listPackages(cmd.json, cmd.includeDependencies, cmd.packageKeys); - process.exit(); - }); - - return program; - } - - public static spaces(program: Command): Command { - program - .command("spaces") - .description("Command to list all spaces") - .option("-p, --profile ", "Profile which you want to use to list spaces") - .option("--json", "Return response as json type", "") - .action(async cmd => { - await new SpaceCommand().listSpaces(cmd.profile, cmd.json); - process.exit(); - }); - - return program; - } - - public static dataPools(program: Command): Command { - program - .command("data-pools") - .description("Command to list all Data Pools") - .option("-p, --profile ", "Profile which you want to use to list data pools") - .option("--json", "Return response as json type", "") - .action(async cmd => { - await new DataPoolCommand().listDataPools(cmd.profile, cmd.json); - process.exit(); - }); - - return program; - } - - public static connections(program: Command):Command { - program - .command("connection") - .description("Command to list all connections in a Data Pool") - .option("-p, --profile ", "Profile which you want to use to list connections") - .requiredOption("--dataPoolId ", "ID of the data pool") - .action(async cmd => { - await new ConnectionCommand().listConnections(cmd.profile, cmd.dataPoolId); - process.exit(); - }); - return program; - } - - public static assets(program: Command): Command { - program - .command("assets") - .description("Command to list all assets") - .option("-p, --profile ", "Profile which you want to use to list assets") - .option("--json", "Return response as json type", "") - .option("--assetType ", "type of assets") - .action(async cmd => { - await new AssetCommand().listAssets(cmd.profile, cmd.json, cmd.assetType); - process.exit(); - }); - - return program; - } - - public static assignments(program: Command): Command { - program - .command("assignments") - .description("Command to list possible variable assignments for a type") - .option("-p, --profile ", "Profile which you want to use to list possible variable assignments") - .option("--json", "Return response as json type", "") - .requiredOption("--type ", "Type of variable") - .option("--params ", "Variable query params") - .action(async cmd => { - await new VariableCommand().listAssignments(cmd.type, cmd.json, cmd.params); - process.exit(); - }); - - return program; - } -} - -const loadAllCommands = () => { - List.packages(program); - List.spaces(program); - List.dataPools(program); - List.assets(program); - List.connections(program); - List.assignments(program); - program.parse(process.argv); -}; - -ContextInitializer.initContext() - .then(loadAllCommands, loadAllCommands) - .catch(e => { - logger.error(e); - }); - -if (!process.argv.slice(2).length) { - program.outputHelp(); - process.exit(1); -} diff --git a/src/content-cli-profile.ts b/src/content-cli-profile.ts deleted file mode 100644 index 5bf8d69a..00000000 --- a/src/content-cli-profile.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { ProfileCommand } from "./commands/profile.command"; -import { Command } from "commander"; -import { program } from "./util/program"; - -class Profile { - public static listProfile(program: Command): Command { - program - .command("list") - .description("Command to list all stored profiles") - .action(async () => { - await new ProfileCommand().listProfiles(); - process.exit(); - }); - - return program; - } - - public static createProfile(program: Command): Command { - program - .command("create") - .description("Command to create a new profile") - .option("--setAsDefault", "Set this profile as default") - .action(async cmd => { - await new ProfileCommand().createProfile(cmd.setAsDefault); - process.exit(); - }); - - return program; - } - - public static defaultProfile(program: Command): Command { - program - .command("default ") - .description("Command to set a profile as default") - .action(async profile => { - await new ProfileCommand().makeDefaultProfile(profile); - process.exit(); - }); - - return program; - } -} - -Profile.listProfile(program); -Profile.createProfile(program); -Profile.defaultProfile(program); - -program.parse(process.argv); - -if (!process.argv.slice(2).length) { - program.outputHelp(); - process.exit(1); -} diff --git a/src/content-cli-pull.ts b/src/content-cli-pull.ts deleted file mode 100644 index 0b4f5a31..00000000 --- a/src/content-cli-pull.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { SkillCommand } from "./commands/skill.command"; -import { DataPoolCommand } from "./commands/data-pool.command"; -import { AssetCommand } from "./commands/asset.command"; -import { PackageCommand } from "./commands/package.command"; -import { AnalysisBookmarksCommand } from "./commands/analysis-bookmarks.command"; -import { Command } from "commander"; -import { program } from "./util/program"; - -class Pull { - public static analysisBookmarks(program: Command): Command { - program - .command("bookmarks") - .description("Command to pull an analysis bookmarks") - .option("-p, --profile ", "Profile which you want to use to pull the analysis bookmarks") - .option("--type ", "Pull shared/all Analysis Bookmarks, else by default get user bookmarks") - .requiredOption("--id ", "Id of the analysis you want to pull") - .action(async cmd => { - await new AnalysisBookmarksCommand().pullAnalysisBookmarks(cmd.profile, cmd.id, cmd.type); - process.exit(); - }); - - return program; - } - - public static skill(program: Command): Command { - program - .command("skill") - .description("Command to pull a skill") - .option("-p, --profile ", "Profile which you want to use to pull the skill") - .requiredOption("--projectId ", "Id of the project you want to pull") - .requiredOption("--skillId ", "Id of the skill you want to pull") - .action(async cmd => { - await new SkillCommand().pullSkill(cmd.profile, cmd.projectId, cmd.skillId); - process.exit(); - }); - - return program; - } - - public static dataPool(program: Command): Command { - program - .command("data-pool") - .description("Command to pull a data pool") - .option("-p, --profile ", "Profile which you want to use to pull the data pool") - .requiredOption("--id ", "Id of the data pool you want to pull") - .action(async cmd => { - await new DataPoolCommand().pullDataPool(cmd.profile, cmd.id); - process.exit(); - }); - - return program; - } - - public static asset(program: Command): Command { - program - .command("asset") - .description("Command to pull an asset from Studio") - .option("-p, --profile ", "Profile which you want to use to pull the asset") - .requiredOption("--key ", "Key of asset you want to pull") - .action(async cmd => { - await new AssetCommand().pullAsset(cmd.profile, cmd.key); - process.exit(); - }); - - return program; - } - - public static package(program: Command): Command { - program - .command("package") - .description("Command to pull a package") - .option("-p, --profile ", "Profile which you want to use to pull the package") - .requiredOption("--key ", "Key of the package you want to pull") - .option("--store", "Pull package with store deployment metadata") - .option("--newKey ", "Define a new key for your package") - .option("--draft", "Pull draft version of package") - .action(async cmd => { - await new PackageCommand().pullPackage(cmd.profile, cmd.key, !!cmd.store, cmd.newKey, !!cmd.draft); - process.exit(); - }); - - return program; - } -} - -Pull.analysisBookmarks(program); -Pull.skill(program); -Pull.dataPool(program); -Pull.asset(program); -Pull.package(program); - -program.parse(process.argv); - -if (!process.argv.slice(2).length) { - program.outputHelp(); - process.exit(1); -} diff --git a/src/content-cli-push.ts b/src/content-cli-push.ts deleted file mode 100644 index 5e907e21..00000000 --- a/src/content-cli-push.ts +++ /dev/null @@ -1,223 +0,0 @@ -import * as fs from "fs"; -import * as path from "path"; - -import { SkillCommand } from "./commands/skill.command"; -import { WidgetCommand } from "./commands/widget.command"; -import { DataPoolCommand } from "./commands/data-pool.command"; -import { AssetCommand } from "./commands/asset.command"; -import { PackageCommand } from "./commands/package.command"; -import { CTPCommand } from "./commands/ctp.command"; -import { AnalysisBookmarksCommand } from "./commands/analysis-bookmarks.command"; -import { execSync } from "child_process"; -import { GracefulError, logger } from "./util/logger"; -import { Command } from "commander"; -import { program } from "./util/program"; - -class Push { - - public static analysisBookmarks(program: Command): Command { - program - .command("bookmarks") - .description("Command to push an analysis to a workspace") - .option("-p, --profile ", "Profile which you want to use to push the analysis") - .requiredOption("--id ", "Id of the Analysis to which you want to push the analysis bookmarks") - .requiredOption("-f, --file ", "The file you want to push") - .action(async cmd => { - await new AnalysisBookmarksCommand().pushAnalysisBookmarks(cmd.profile, cmd.id, cmd.file); - process.exit(); - }); - - return program; - } - - public static ctp(program: Command): Command { - program - .command("ctp") - .description("Command to push a .ctp (Celonis 4 transport file) to create a package") - .option("-p, --profile ", "Profile which you want to use to push the analysis") - .option("-a, --pushAnalysis", "Specify this option if you want to push analysis from the CTP file") - .option("-d, --pushDataModels", "Specify this option if you want to push data models from the CTP file") - .option( - "--globalPoolName ", - "Specify this option if you want to push all Data models into one newly created pool along with value to set the name of the pool to be created", - null - ) - .option( - "--existingPoolId ", - "Specify this option if you want to push all Data models into one already existing pool with provided ID", - null - ) - .option( - "-s, --spaceKey ", - "The key of the destination space where the analyses from .ctp file will be created.", - "" - ) - .requiredOption("-f, --file ", "The .ctp file you want to push") - .requiredOption("--password ", "The password used for extracting the .ctp file") - .action(async cmd => { - await new CTPCommand().pushCTPFile( - cmd.profile, - cmd.file, - cmd.password, - cmd.pushAnalysis, - cmd.pushDataModels, - cmd.existingPoolId, - cmd.globalPoolName, - cmd.spaceKey - ); - process.exit(); - }); - - return program; - } - - public static skill(program: Command): Command { - program - .command("skill") - .description("Command to push a skill to a project") - .option("-p, --profile ", "Profile which you want to use to push the skill") - .requiredOption("--projectId ", "Id of the project you want to push") - .requiredOption("-f, --file ", "The file you want to push") - .action(async cmd => { - await new SkillCommand().pushSkill(cmd.profile, cmd.projectId, cmd.file); - process.exit(); - }); - - return program; - } - - public static widget(program: Command): Command { - program - .command("widget") - .description("Command to push a widget") - .option("-p, --profile ", "Profile which you want to use to push the widget") - .option("--tenantIndependent", "Upload widget tenant independently") - .option("--userSpecific", "Upload widget only for the user in the provided api token") - .option("--packageManager", "Upload widget to package manager (deprecated)") // Deprecated - .action(async cmd => { - await new WidgetCommand().pushWidget(cmd.profile, !!cmd.tenantIndependent, !!cmd.userSpecific); - - if (process.env.AWS_ACCESS_KEY_ID_CDN && process.env.AWS_SECRET_ACCESS_KEY_CDN) { - try { - const dir = path.resolve(process.cwd()); - const pushToS3stdout = execSync( - `aws s3 cp ${dir} s3://celonis-static-origin/static/package-manager/ --recursive --exclude="*.map" --exclude="*.yaml" --profile default` - ).toString("utf-8"); - logger.info(pushToS3stdout); - } catch (error) { - logger.error(new GracefulError(error.stderr?.toString() || error.message)); - } - } - - const zipFileName = path.resolve(process.cwd(), "output.zip"); - fs.unlinkSync(zipFileName); - process.exit(); - }); - - return program; - } - - public static dataPool(program: Command): Command { - program - .command("data-pool") - .description("Command to push a data pool") - .option("-p, --profile ", "Profile which you want to use to push the data pool") - .requiredOption("-f, --file ", "The file you want to push") - .action(async cmd => { - await new DataPoolCommand().pushDataPool(cmd.profile, cmd.file); - process.exit(); - }); - return program; - } - - public static dataPools(program: Command): Command { - program - .command("data-pools") - .description("Command to push data pools") - .option("-p, --profile ", "Profile which you want to use to push the data pools") - .action(async cmd => { - await new DataPoolCommand().pushDataPools(cmd.profile); - process.exit(); - }); - - return program; - } - - public static asset(program: Command): Command { - program - .command("asset") - .description("Command to push an asset to Studio") - .option("-p, --profile ", "Profile which you want to use to push the asset") - .requiredOption("-f, --file ", "The file you want to push") - .requiredOption("--package ", "Key of the package you want to push asset to") - .action(async cmd => { - await new AssetCommand().pushAsset(cmd.profile, cmd.file, cmd.package); - process.exit(); - }); - - return program; - } - - public static assets(program: Command): Command { - program - .command("assets") - .description("Command to push assets to Studio") - .option("-p, --profile ", "Profile which you want to use to push the assets") - .requiredOption("--package ", "Key of the package you want to push assets to") - .action(async cmd => { - await new AssetCommand().pushAssets(cmd.profile, cmd.package); - process.exit(); - }); - - return program; - } - - public static package(program: Command): Command { - program - .command("package") - .description("Command to push a package to Studio") - .option("-p, --profile ", "Profile which you want to use to push the package") - .option("--newKey ", "Define a new key for your package") - .option("--overwrite", "Overwrite package and its assets") - .requiredOption("-f, --file ", "The file you want to push") - .requiredOption("--spaceKey ", "The key of the destination space") - .action(async cmd => { - await new PackageCommand().pushPackage(cmd.profile, cmd.spaceKey, cmd.file, cmd.newKey, cmd.overwrite); - process.exit(); - }); - - return program; - } - - public static packages(program: Command): Command { - program - .command("packages") - .description("Command to push packages to Studio") - .option("-p, --profile ", "Profile which you want to use to push the packages") - .requiredOption("--spaceKey ", "The key of the destination space") - .action(async cmd => { - await new PackageCommand().pushPackages(cmd.profile, cmd.spaceKey); - process.exit(); - }); - - return program; - } -} - -Push.analysisBookmarks(program); -Push.ctp(program); -Push.skill(program); -Push.widget(program); -Push.dataPool(program); -Push.dataPools(program); -Push.asset(program); -Push.assets(program); -Push.package(program); -Push.packages(program); - -program.parse(process.argv); - -if (!process.argv.slice(2).length) { - program.outputHelp(); - process.exit(1); -} diff --git a/src/content-cli-set.ts b/src/content-cli-set.ts deleted file mode 100644 index 7671731f..00000000 --- a/src/content-cli-set.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { ConnectionCommand } from "./commands/connection.command"; -import { ContextInitializer } from "./util/context-initializer"; -import { logger } from "./util/logger"; -import { Command } from "commander"; -import { program } from "./util/program"; - -class Set { - public static connection(program: Command): Command { - program - .command("connection") - .description("Programmatically update properties of your connections") - .option("-p, --profile ", "Profile which you want to use to update the data pool configuration") - .requiredOption("--dataPoolId ", "Id of the data pool you want to update") - .requiredOption("--connectionId ", "Id of the connection you want to update") - .requiredOption("--property ", "The property you want to update") - .requiredOption("--value ", "The value you want to update") - .action(async cmd => { - await new ConnectionCommand().updateProperty(cmd.profile, cmd.dataPoolId, cmd.connectionId, cmd.property, cmd.value); - process.exit(); - }); - - return program; - } -} - -const loadAllCommands = () => { - Set.connection(program); - program.parse(process.argv); -}; - -ContextInitializer.initContext() - .then(loadAllCommands, loadAllCommands) - .catch(e => { - logger.error(e); - }); - -if (!process.argv.slice(2).length) { - program.outputHelp(); - process.exit(1); -} diff --git a/src/content-cli-update.ts b/src/content-cli-update.ts deleted file mode 100644 index 25d2d785..00000000 --- a/src/content-cli-update.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { DataPoolCommand } from "./commands/data-pool.command"; -import { Command } from "commander"; -import { program } from "./util/program"; - -class Update { - public static dataPool(program: Command): Command { - program - .command("data-pool") - .description("Command to update a data pool using a data pool configuration file") - .option("-p, --profile ", "Profile which you want to use to update the data pool configuration") - .requiredOption("--id ", "Id of the data pool you want to update") - .requiredOption("-f, --file ", "The file you want to push") - .action(async cmd => { - await new DataPoolCommand().updateDataPool(cmd.profile, cmd.id, cmd.file); - process.exit(); - }); - - return program; - } -} - -Update.dataPool(program); -program.parse(process.argv); - -if (!process.argv.slice(2).length) { - program.outputHelp(); - process.exit(1); -} diff --git a/src/content-cli.ts b/src/content-cli.ts index e920b061..3bf4cd41 100644 --- a/src/content-cli.ts +++ b/src/content-cli.ts @@ -1,10 +1,19 @@ #!/usr/bin/env node -import { logger } from "./util/logger"; import semverSatisfies = require("semver/functions/satisfies"); -import { program } from "./util/program"; -import {VersionUtils} from "./util/version"; +import { Command } from "commander"; +import { Configurator, ModuleHandler } from "./core/command/module-handler"; +import { Context } from "./core/command/cli-context"; +import { VersionUtils } from "./core/utils/version"; +import { logger } from "./core/utils/logger"; +/** + * Celonis Content CLI. + * + * This is the main entry point for the CLI. + */ + +// Check if the Node.js version satisfies the minimum requirements const requiredVersion = ">=10.10.0"; if (!semverSatisfies(process.version, requiredVersion)) { logger.error( @@ -13,32 +22,59 @@ if (!semverSatisfies(process.version, requiredVersion)) { process.exit(1); } -program.command("profile", "Commands related to profiles."); - -program.command("pull", "Commands to pull content."); - -program.command("export", "Commands to export content.") -program.command("import", "Commands to import content.") - -program.command("push", "Commands to push content."); +// Global configuration options +const program: Command = new Command(); +program.version(VersionUtils.getCurrentCliVersion()); +program.option("-q, --quietmode", "Reduce output to a minimum", false); +program.option("-p, --profile [profile]"); +program.option("--debug", "Print debug messages", false); +program.option("--dev", "Development Mode", false); +program.parseOptions(process.argv); -program.command("update", "Commands to update content."); +if (!program.opts().quietmode) { + console.log(`Content CLI - (C) Copyright 2025 - Celonis SE - Version ${VersionUtils.getCurrentCliVersion()}`); + console.log(); +} -program.command("list", "Commands to list content.").alias("ls"); +if (program.opts().debug) { + logger.transports.forEach(t => { + t.level = "debug"; + }); +} -program.command("get", "Commands to get configuration properties."); +/** + * To support the legacy command structure, we have to configure some root commands + * that the individual modules will extend. + */ +function configureRootCommands(configurator: Configurator): void { + configurator.command("list") + .description("Commands to list content.") + .alias("ls"); +} -program.command("set", "Commands to set configuration properties."); +async function run(): Promise { + const context = new Context(program.opts()); + await context.init(); -program.command("config", "Commands related to config management.") + const moduleHandler = new ModuleHandler(program, context); + + configureRootCommands(moduleHandler.configurator); -program.command("analyze", "Commands to analyze assets dependencies."); + moduleHandler.discoverAndRegisterModules(__dirname, program.opts().dev); + + try { + program.parse(process.argv); + } catch (error) { + logger.error(`An unexpected error occurred: ${error}`); + } +} -program.version(VersionUtils.getCurrentCliVersion()); -program.parse(process.argv); +run(); -if (!process.argv.slice(2).length) { - program.outputHelp(); +// catch uncaught exceptions +process.on("uncaughtException", (error: Error, origin: NodeJS.UncaughtExceptionOrigin) => { + console.error("\n💥 UNCAUGHT EXCEPTION!\n"); + console.error("Error:", error); + console.error("Origin:", origin); process.exit(1); -} - +}); \ No newline at end of file diff --git a/src/content/factory/space-manager.factory.ts b/src/content/factory/space-manager.factory.ts deleted file mode 100644 index b064dc6a..00000000 --- a/src/content/factory/space-manager.factory.ts +++ /dev/null @@ -1,16 +0,0 @@ -import {SpaceManager} from "../manager/space.manager"; - -export class SpaceManagerFactory { - - public createListManager(jsonResponse: boolean): SpaceManager { - return this.createManager(jsonResponse); - } - - public createManager( - jsonResponse?: boolean - ): SpaceManager { - const spaceManager = new SpaceManager(); - spaceManager.jsonResponse = jsonResponse; - return spaceManager; - } -} \ No newline at end of file diff --git a/src/core/command/cli-context.ts b/src/core/command/cli-context.ts new file mode 100644 index 00000000..c49bea76 --- /dev/null +++ b/src/core/command/cli-context.ts @@ -0,0 +1,55 @@ +import { HttpClient } from "../http/http-client"; +import {ProfileService} from "../profile/profile.service"; +import {logger} from "../utils/logger"; +import {Profile} from "../profile/profile.interface"; + +/** + * The execution context object is passed to the modules to access + * foundational services such as APIs, profiles, logging etc. It is + * configured upon the start of the CLI. + */ + +export class Context { + + public httpClient: HttpClient; + public profile: Profile; + + private log = logger; + private profileName: string | undefined; + + private profileService = new ProfileService(); + + constructor(options: any) { + this.profileName = options.profile; + } + + public async init(): Promise { + await this.loadProfile(this.profileName); + + if (this.profile) { + // only if a profile is available, it makes sense to provide an initialized + // HttpClient API. + this.httpClient = new HttpClient(this); + } + } + + private async loadProfile(profileName: string | undefined): Promise { + if (!profileName) { + this.log.debug("Profile name not specified, using default profile name"); + profileName = this.profileService.getDefaultProfile(); + if (!profileName) { + this.log.debug("A default profile is not configured."); + } + } + try { + this.profile = await this.profileService.findProfile(profileName); + this.profileName = profileName; + this.log.debug(`Using profile ${profileName}`); + } catch (err) { + this.log.error(err); + this.profile = undefined; + this.profileName = undefined; + } + } + +} \ No newline at end of file diff --git a/src/core/command/module-handler.ts b/src/core/command/module-handler.ts new file mode 100644 index 00000000..d88d384b --- /dev/null +++ b/src/core/command/module-handler.ts @@ -0,0 +1,214 @@ +import path = require("path"); +import * as fs from "fs"; +import { Command, CommandOptions, OptionValues } from "commander"; +import { Context } from "./cli-context"; +import { logger } from "../utils/logger"; + +export abstract class IModule { + public abstract register(context: Context, commandConfig: Configurator): void; +} + +export type IModuleConstructor = new () => IModule; + +export class ModuleHandler { + public configurator: Configurator; + + constructor( + public program: Command, + public context: Context + ) { + this.configurator = new Configurator(this.program, this.context); + } + + // Store registered module instances if needed later + public registeredModules: IModule[] = []; + + /** + * Discovers modules in the specified directory, imports them, + * instantiates the default exported class, and calls its register method. + * + * @param {any} rootPath - __dirname when invoked from the main entry file + * @param devMode - Use uncompiled modules for development debug mode + */ + public discoverAndRegisterModules(rootPath: string, devMode: boolean = false): void { + const modulesDirPath = path.resolve(rootPath, "commands"); + + try { + const moduleFolders = fs.readdirSync(modulesDirPath, { withFileTypes: true }); + + for (const dirent of moduleFolders) { + if (dirent.isDirectory()) { + const moduleFolderName = dirent.name; + + const moduleFileName = devMode ? "module.ts" : "module.js"; + + // Calculate path relative to *this file's location in dist* + let potentialModuleJsPath: any; + potentialModuleJsPath = path.resolve( + rootPath, + "commands", + moduleFolderName, + moduleFileName // Look for the compiled JS file + ); + try { + fs.accessSync(potentialModuleJsPath); + } catch (err) { + // apparently the file does not exist of is not accessible + potentialModuleJsPath = null; + } + + if (!potentialModuleJsPath) { + logger.debug( + `Module folder ${moduleFolderName} does not contain a valid entry point and is skipped.` + ); + } else { + // Check if the compiled JS file exists + try { + logger.debug(`Found potential module definition: ${potentialModuleJsPath}`); + + // Dynamically require the module + const requiredModule = require(potentialModuleJsPath); + + // With 'export =' or 'module.exports =', the required value *is* the class + const ModuleClass = requiredModule as IModuleConstructor; // Cast for TS check + + // Basic check: Is it a class (function)? + if (typeof ModuleClass === "function" && ModuleClass.prototype) { + const moduleInstance: IModule = new ModuleClass(); // Instantiate + + // Check if the instance has the register method + if (typeof moduleInstance.register === "function") { + logger.debug(`Registering module: ${moduleFolderName}`); + // Call register - can still be async even if require() is sync + moduleInstance.register(this.context, this.configurator); + this.registeredModules.push(moduleInstance); + } else { + logger.warn(`Module ${moduleFolderName} export does not have a 'register' method.`); + } + } else { + logger.warn(`Module ${moduleFolderName} export is not a class/constructor function.`); + } + } catch (error: any) { + if (error.code === "ENOENT") { + // Compiled module.js not found, maybe folder doesn't contain a valid module + logger.warn( + `Directory ${moduleFolderName} does not contain a compiled module.js file.` + ); + } else if (error.code === "MODULE_NOT_FOUND") { + logger.debug("Error details", error); + logger.warn( + `Could not require module ${moduleFolderName}. Check dependencies or compilation. Path: ${potentialModuleJsPath}` + ); + } else { + logger.error(`Error processing module in ${moduleFolderName}:`, error); + } + } + } + } + } + } catch (error: any) { + if (error.code === "ENOENT") { + logger.error( + `Modules directory not found relative to JS output: ${path.resolve(path.dirname(__filename), "commands")}` + ); + } else { + logger.error("Failed to read modules directory:", error); + } + } + logger.debug(`Module discovery complete. ${this.registeredModules.length} modules registered.`); + } +} + +type CommandHandler = (context: Context, command: Command, options: OptionValues) => Promise; + +/** + * Allows the creation of root level commands. + */ +export class Configurator { + public rootCommandMap = new Map(); + + constructor( + private program: Command, + private ctx: Context + ) {} + + /** + * Get or create a root level command. + * @param name + * @returns + */ + public command(name: string): CommandConfig { + if (this.rootCommandMap.has(name)) { + return this.rootCommandMap.get(name); + } + const cmd = this.program.command(name); + const cmdConfig = new CommandConfig(cmd, this.ctx); + this.rootCommandMap.set(name, cmdConfig); + return cmdConfig; + } +} + +/** + * Delegate wrapper around the Command object, to simply change the way the program is + * executed. + */ +export class CommandConfig { + private deprecationMessage: string; + + constructor( + private cmd: Command, + private ctx: Context + ) {} + + public command(nameAndArgs: string, opts?: CommandOptions): CommandConfig { + return new CommandConfig(this.cmd.command(nameAndArgs, opts), this.ctx) + .option("-p, --profile ", "Profile which you want to use"); + } + + public alias(alias: string): CommandConfig { + this.cmd.alias(alias); + return this; + } + + public description(description: string): CommandConfig { + this.cmd.description(description); + return this; + } + + public argument(name: string, description?: string, defaultValue?: unknown): CommandConfig { + this.cmd.argument(name, description, defaultValue); + return this; + } + + public option(flags: string, description?: string, defaultValue?: string | boolean | string[]): CommandConfig { + this.cmd.option(flags, description, defaultValue); + return this; + } + + public requiredOption(flags: string, description?: string, defaultValue?: string | boolean | string[]): CommandConfig { + this.cmd.requiredOption(flags, description, defaultValue); + return this; + } + + public deprecationNotice(deprecationMessage: string): CommandConfig { + this.deprecationMessage = deprecationMessage; + return this; + } + + public action(handler: CommandHandler): void { + this.cmd.action(async (): Promise => { + try { + this.printDeprecationNoticeIfDeprecated(); + await handler(this.ctx, this.cmd, this.cmd.opts()); + } catch (error) { + logger.error(`An unexpected error occured executing a command: ${error}`); + } + }); + } + + private printDeprecationNoticeIfDeprecated(): void { + if (this.deprecationMessage) { + logger.warn("⚠️ [DEPRECATION NOTICE] \n" + this.deprecationMessage); + } + } +} diff --git a/src/util/axios-initializer.ts b/src/core/http/axios-initializer.ts similarity index 100% rename from src/util/axios-initializer.ts rename to src/core/http/axios-initializer.ts diff --git a/src/core/http/base-api.ts b/src/core/http/base-api.ts new file mode 100644 index 00000000..dd47bfa0 --- /dev/null +++ b/src/core/http/base-api.ts @@ -0,0 +1,113 @@ +/** + * Base API implementation, which provides basic error handling for common problems. + */ + +import { logger } from "../utils/logger"; +import { HttpClient } from "./http-client"; + +export class ForbiddenError extends Error { + constructor(message: string = "Access Forbidden") { + super(message); + this.name = "ForbiddenError"; + // Maintains proper stack trace in V8 environments (Node, Chrome) + if (Error.captureStackTrace) { + Error.captureStackTrace(this, ForbiddenError); + } + } +} + +// Custom error for Server (5xx) responses. +export class ServerError extends Error { + constructor(message: string = "Internal Server Error") { + super(message); + this.name = "ServerError"; + if (Error.captureStackTrace) { + Error.captureStackTrace(this, ServerError); + } + } +} + +// Custom error for Not Found (404) responses. +export class NotFoundError extends Error { + constructor(message: string = "Resource Not Found") { + super(message); + this.name = "NotFoundError"; + if (Error.captureStackTrace) { + Error.captureStackTrace(this, NotFoundError); + } + } +} + +// Custom error for general network or unexpected issues. +export class NetworkError extends Error { + constructor(message: string = "Network or unexpected error occurred") { + super(message); + this.name = "NetworkError"; + if (Error.captureStackTrace) { + Error.captureStackTrace(this, NetworkError); + } + } +} + +interface HttpError extends Error { + status?: number; // HTTP status code (e.g., 404, 500) + response?: any; // Optional: Include the full response body/details +} + + +export abstract class BaseApi { + + protected readonly httpClient: HttpClient; + + /** + * Constructor for BaseApiService. + * @param httpClient - An instance of HttpClient to be used for requests. + */ + constructor(httpClient: HttpClient) { + this.httpClient = httpClient; + } + + /** + * Handles errors from HttpClient requests. + * Logs the error and throws specific custom errors based on HTTP status codes. + * Subclasses can override this for more specific error handling. + * @param error - The error object caught from the HttpClient promise. + * @returns Never, as this method always throws an error. + */ + protected handleError(error: any): never { + logger.debug("API Error:", error); // Basic logging + + // Check if it looks like an HTTP error with a status code + if (error && typeof error.status === "number") { + const httpError = error as HttpError; + switch (httpError.status) { + case 401: + // Handle Unauthorized (e.g., redirect to login) + // Depending on the app, might not throw, but trigger auth flow + // Example: throw new AuthenticationError('Authentication required'); + throw new Error(`Unauthorized (401): ${httpError.message || "Authentication required"}`); // Placeholder + case 403: + throw new ForbiddenError(`Forbidden (403): ${httpError.message || "Access denied"}`); + case 404: + throw new NotFoundError(`Not Found (404): ${httpError.message || "Resource not found"}`); + case 500: + case 501: + case 502: + case 503: + case 504: + throw new ServerError(`Server Error (${httpError.status}): ${httpError.message || "Server issue"}`); + default: + // Handle other HTTP errors (e.g., 400 Bad Request) + throw new Error(`HTTP Error (${httpError.status}): ${httpError.message || "An HTTP error occurred"}`); + } + } else if (error instanceof Error) { + // Handle non-HTTP errors (e.g., network issues, client-side errors) + console.debug("Non-HTTP Error:", error.message); + throw new NetworkError(`Network or client-side error: ${error.message}`); + } else { + // Handle cases where the caught object is not an Error instance + console.debug("Unknown error structure:", error); + throw new Error("An unknown error occurred"); + } + } +} \ No newline at end of file diff --git a/src/services/http-client-service.v2.ts b/src/core/http/http-client.ts similarity index 71% rename from src/services/http-client-service.v2.ts rename to src/core/http/http-client.ts index 63b128fc..284ba98a 100644 --- a/src/services/http-client-service.v2.ts +++ b/src/core/http/http-client.ts @@ -1,23 +1,33 @@ -import { AuthenticationType, Profile } from "../interfaces/profile.interface"; -import { contextService } from "./context.service"; -import { FatalError, logger } from "../util/logger"; -import {TracingUtils} from "../util/tracing"; -import {VersionUtils} from "../util/version"; import {AxiosResponse, RawAxiosRequestHeaders} from "axios"; import * as FormData from "form-data"; -import { AxiosInitializer } from "../util/axios-initializer"; +import { Context } from "../command/cli-context"; +import {AxiosInitializer} from "./axios-initializer"; +import {FatalError, logger} from "../utils/logger"; +import {TracingUtils} from "./tracing"; +import {AuthenticationType, Profile} from "../profile/profile.interface"; +import {VersionUtils} from "../utils/version"; + +/** + * Http client configured based upon the CLI context. It will authenticate + * based on the profile in the context and also use the base URL accordingly. + */ +export class HttpClient { -class HttpClientServiceV2 { - private axios = AxiosInitializer.initializeAxios(); + constructor(private context: Context) {} + public async get(url: string): Promise { + const fullUrl = this.resolveUrl(url); + logger.debug(`HttpClient - GET ${fullUrl}`); return new Promise((resolve, reject) => { - this.axios.get(this.resolveUrl(url), { - headers: this.buildHeaders(contextService.getContext().profile) + this.axios.get(fullUrl, { + headers: this.buildHeaders() }).then(response => { + logger.debug(`Response ${response.status}`); this.handleResponse(response, resolve, reject); }).catch(err => { + logger.debug("HTTP GET resulted in error", err); this.handleError(err, resolve, reject); }) }).catch(e => { @@ -28,7 +38,7 @@ class HttpClientServiceV2 { public async getFile(url: string): Promise { return new Promise((resolve, reject) => { this.axios.get(this.resolveUrl(url), { - headers: this.buildHeaders(contextService.getContext().profile), + headers: this.buildHeaders(), responseType: "stream", validateStatus: status => status >= 200 }).then(response => { @@ -38,11 +48,11 @@ class HttpClientServiceV2 { }); response.data.on("end", () => { if (response.status !== 200) { - reject(Buffer.concat(data).toString()); + reject(Buffer.concat(data as any).toString()); return; } - this.handleResponseStreamData(Buffer.concat(data), resolve, reject); + this.handleResponseStreamData(Buffer.concat(data as any), resolve, reject); }); }).catch(err => { this.handleError(err, resolve, reject); @@ -57,7 +67,7 @@ class HttpClientServiceV2 { formData, { headers: { - ...this.buildHeaders(contextService.getContext().profile, "multipart/form-data"), + ...this.buildHeaders("multipart/form-data"), ...formData.getHeaders() }, params: parameters @@ -73,12 +83,18 @@ class HttpClientServiceV2 { } public async post(url: string, body: any): Promise { + const contentType = body instanceof FormData + ? "multipart/form-data" + : "application/json;charset=utf-8"; + const requestBody = typeof body === "string" || body instanceof String || body instanceof FormData + ? body + : JSON.stringify(body) return new Promise((resolve, reject) => { this.axios.post( this.resolveUrl(url), - typeof body === "string" || body instanceof String ? body : JSON.stringify(body), + requestBody, { - headers: this.buildHeaders(contextService.getContext().profile, "application/json;charset=utf-8") + headers: this.buildHeaders(contentType) } ).then(response => { this.handleResponse(response, resolve, reject); @@ -96,7 +112,7 @@ class HttpClientServiceV2 { this.resolveUrl(url), JSON.stringify(body), { - headers: this.buildHeaders(contextService.getContext().profile, "application/json;charset=utf-8") + headers: this.buildHeaders("application/json;charset=utf-8") } ).then(response => { this.handleResponse(response, resolve, reject); @@ -111,7 +127,7 @@ class HttpClientServiceV2 { public async delete(url: string): Promise { return new Promise((resolve, reject) => { this.axios.delete(this.resolveUrl(url), { - headers: this.buildHeaders(contextService.getContext().profile, "application/json;charset=utf-8") + headers: this.buildHeaders("application/json;charset=utf-8") }).then(response => { this.handleResponse(response, resolve, reject); }).catch(err => { @@ -125,7 +141,7 @@ class HttpClientServiceV2 { public async downloadFile(url: string): Promise { return new Promise((resolve, reject) => { this.axios.post(this.resolveUrl(url), null, { - headers: this.buildHeaders(contextService.getContext().profile), + headers: this.buildHeaders(), responseType: "stream" }).then(response => { const data: Buffer[] = []; @@ -136,7 +152,7 @@ class HttpClientServiceV2 { if (this.checkBadRequest(response.status)) { this.handleBadRequest(response.status, data.toString(), reject); } else { - this.handleResponseStreamData(Buffer.concat(data), resolve, reject); + this.handleResponseStreamData(Buffer.concat(data as any), resolve, reject); } }) }).catch(err => { @@ -145,7 +161,7 @@ class HttpClientServiceV2 { }); } - private handleResponseStreamData(data, resolve, reject): void { + private handleResponseStreamData(data: any, resolve: any, reject: any): void { if (data) { resolve(data); return; @@ -156,10 +172,10 @@ class HttpClientServiceV2 { } private resolveUrl(url: string): string { - return contextService.getContext().profile.team.replace(/\/?$/, url); + return this.context.profile.team.replace(/\/?$/, url); } - private handleResponse(res: AxiosResponse, resolve, reject): void { + private handleResponse(res: AxiosResponse, resolve: any, reject: any): void { if (this.checkBadRequest(res.status)) { this.handleBadRequest(res.status, res.data, reject); return; @@ -167,11 +183,11 @@ class HttpClientServiceV2 { resolve(res.data); } - private handleError(err: any, resolve, reject): void { + private handleError(err: any, resolve: any, reject: any): void { if (err.response) { this.handleResponse(err.response, resolve, reject); } else { - reject(err.message); + reject(err); } } @@ -180,7 +196,7 @@ class HttpClientServiceV2 { } // tslint:disable-next-line:typedef - private handleBadRequest(statusCode, data, reject): void { + private handleBadRequest(statusCode: number, data: any, reject: any): void { if (data) { reject(JSON.stringify(data)); } else { @@ -188,9 +204,9 @@ class HttpClientServiceV2 { } } - private buildHeaders(profile: Profile, contentType?: string): RawAxiosRequestHeaders { + private buildHeaders(contentType?: string): RawAxiosRequestHeaders { return { - ...this.buildAuthorizationHeaders(profile, contentType), + ...this.buildAuthorizationHeaders(this.context.profile, contentType), ...TracingUtils.getTracingHeaders(), "User-Agent": "content-cli v" + VersionUtils.getCurrentCliVersion() } @@ -204,5 +220,3 @@ class HttpClientServiceV2 { }; } } - -export const httpClientV2 = new HttpClientServiceV2(); diff --git a/src/core/http/http-shared/base.manager.helper.ts b/src/core/http/http-shared/base.manager.helper.ts new file mode 100644 index 00000000..e216138c --- /dev/null +++ b/src/core/http/http-shared/base.manager.helper.ts @@ -0,0 +1,8 @@ +import { BaseManager } from "./base.manager"; + +export class BaseManagerHelper { + + public async batchPush(baseManagers: BaseManager[]): Promise { + return Promise.all(baseManagers.map(baseManager => baseManager.push())) + } +} diff --git a/src/content/manager/base.manager.ts b/src/core/http/http-shared/base.manager.ts similarity index 75% rename from src/content/manager/base.manager.ts rename to src/core/http/http-shared/base.manager.ts index 2db43926..de37c5bf 100644 --- a/src/content/manager/base.manager.ts +++ b/src/core/http/http-shared/base.manager.ts @@ -1,29 +1,22 @@ -import { Profile } from "../../interfaces/profile.interface"; -import { FatalError, logger } from "../../util/logger"; -import { HttpClientService } from "../../services/http-client.service"; import * as fs from "fs"; import * as path from "path"; -import { ManagerConfig } from "../../interfaces/manager-config.interface"; +import { FatalError, logger } from "../../utils/logger"; +import { ManagerConfig } from "./manager-config.interface"; +import { HttpClient } from "../http-client"; +import { Context } from "../../command/cli-context"; export abstract class BaseManager { - private httpClientService = new HttpClientService(); - - public get profile(): Profile { - return this._profile; - } + private httpClient: HttpClient; + protected readonly fileDownloadedMessage = "File downloaded successfully. New filename: "; - public set profile(value: Profile) { - this._profile = value; + protected constructor(context: Context) { + this.httpClient = context.httpClient; } - private _profile: Profile; - - protected readonly fileDownloadedMessage = "File downloaded successfully. New filename: "; - public async pull(): Promise { return new Promise((resolve, reject) => { - this.httpClientService - .pullData(this.getConfig().pullUrl, this._profile) + this.httpClient + .get(this.getConfig().pullUrl) .then(data => { try { const filename = this.writeToFile(data); @@ -43,8 +36,8 @@ export abstract class BaseManager { public async pullFile(): Promise { return new Promise((resolve, reject) => { - this.httpClientService - .pullFileData(this.getConfig().pullUrl, this._profile) + this.httpClient + .downloadFile(this.getConfig().pullUrl) .then(data => { const filename = this.writeStreamToFile(data); logger.info(this.fileDownloadedMessage + filename); @@ -59,8 +52,8 @@ export abstract class BaseManager { public async push(): Promise { return new Promise((resolve, reject) => { - this.httpClientService - .pushData(this.getConfig().pushUrl, this._profile, this.getBody()) + this.httpClient + .post(this.getConfig().pushUrl, this.getBody()) .then(data => { logger.info(this.getConfig().onPushSuccessMessage(data)); resolve(data); @@ -74,8 +67,8 @@ export abstract class BaseManager { public async update(): Promise { return new Promise((resolve, reject) => { - this.httpClientService - .updateData(this.getConfig().updateUrl, this._profile, this.getBody()) + this.httpClient + .put(this.getConfig().updateUrl, this.getBody()) .then(data => { logger.info(this.getConfig().onUpdateSuccessMessage()); resolve(data); @@ -89,8 +82,8 @@ export abstract class BaseManager { public async findAll(): Promise { return new Promise((resolve, reject) => { - this.httpClientService - .findAll(this.getConfig().findAllUrl, this._profile) + this.httpClient + .get(this.getConfig().findAllUrl) .then(data => { this.getConfig().onFindAll(data); resolve(data); diff --git a/src/interfaces/manager-config.interface.ts b/src/core/http/http-shared/manager-config.interface.ts similarity index 100% rename from src/interfaces/manager-config.interface.ts rename to src/core/http/http-shared/manager-config.interface.ts diff --git a/src/util/tracing.ts b/src/core/http/tracing.ts similarity index 100% rename from src/util/tracing.ts rename to src/core/http/tracing.ts diff --git a/src/interfaces/profile.interface.ts b/src/core/profile/profile.interface.ts similarity index 100% rename from src/interfaces/profile.interface.ts rename to src/core/profile/profile.interface.ts diff --git a/src/services/profile.service.ts b/src/core/profile/profile.service.ts similarity index 95% rename from src/services/profile.service.ts rename to src/core/profile/profile.service.ts index 5e97dc0c..b45a6c25 100644 --- a/src/services/profile.service.ts +++ b/src/core/profile/profile.service.ts @@ -1,11 +1,11 @@ import { AuthenticationType, ClientAuthenticationMethod, Profile, ProfileType -} from "../interfaces/profile.interface"; -import { ProfileValidator } from "../validators/profile.validator"; +} from "./profile.interface"; +import { ProfileValidator } from "./profile.validator"; import * as path from "path"; import * as fs from "fs"; -import { FatalError, logger } from "../util/logger"; +import { FatalError, logger } from "../utils/logger"; import { Issuer } from "openid-client"; import axios from "axios"; import os = require("os"); @@ -26,6 +26,7 @@ export class ProfileService { public async findProfile(profileName: string): Promise { return new Promise((resolve, reject) => { + this.checkIfMissingProfile(profileName, reject); try { if (process.env.TEAM_URL && process.env.API_TOKEN) { resolve(this.buildProfileFromEnvVariables()); @@ -39,9 +40,7 @@ export class ProfileService { .then(() => resolve(profile)); } } catch (e) { - reject( - "No profile provided. Please provide a profile or an TEAM_URL and API_TOKEN through env variables" - ); + reject(`The profile ${profileName} couldn't be resolved.`); } }); } @@ -297,6 +296,12 @@ export class ProfileService { }) }) } + + private checkIfMissingProfile(profileName: string, reject: any): void { + if (!profileName && (!process.env.TEAM_URL || !process.env.API_TOKEN)) { + reject("No profile provided. Please provide a profile or an TEAM_URL and API_TOKEN through env variables"); + } + } } -export const profileService = new ProfileService(); +export const profileService = new ProfileService(); diff --git a/src/validators/profile.validator.ts b/src/core/profile/profile.validator.ts similarity index 88% rename from src/validators/profile.validator.ts rename to src/core/profile/profile.validator.ts index b311ae9c..8b78dd47 100644 --- a/src/validators/profile.validator.ts +++ b/src/core/profile/profile.validator.ts @@ -1,6 +1,6 @@ -import {Profile, ProfileType} from "../interfaces/profile.interface"; -import { FatalError, logger } from "../util/logger"; +import { FatalError, logger } from "../utils/logger"; import validUrl = require("valid-url"); +import { Profile, ProfileType } from "./profile.interface"; export class ProfileValidator { public static async validateProfile(profile: Profile): Promise { diff --git a/src/services/file-service.ts b/src/core/utils/file-service.ts similarity index 71% rename from src/services/file-service.ts rename to src/core/utils/file-service.ts index 9da10aa4..98352c38 100644 --- a/src/services/file-service.ts +++ b/src/core/utils/file-service.ts @@ -1,8 +1,6 @@ import * as fs from "fs"; import * as path from "path"; -import { ManifestNodeTransport } from "../interfaces/manifest-transport"; -import { FatalError, logger } from "../util/logger"; -import {parse} from "../util/yaml"; +import {FatalError, logger} from "./logger"; export class FileService { public static readonly fileDownloadedMessage = "File downloaded successfully. New filename: "; @@ -17,13 +15,6 @@ export class FileService { fs.mkdirSync(path.resolve(process.cwd(), dirName)); } - public readManifestFile(importedFileName: string): Promise { - const manifest: ManifestNodeTransport[] = parse( - fs.readFileSync(path.resolve(importedFileName + "/manifest.yml"), { encoding: "utf-8" }) - ); - return Promise.all(manifest); - } - public async readFileToJson(fileName: string): Promise { const fileContent = this.readFile(fileName); diff --git a/src/util/json.ts b/src/core/utils/json.ts similarity index 99% rename from src/util/json.ts rename to src/core/utils/json.ts index 7f45a685..0a1b8eae 100644 --- a/src/util/json.ts +++ b/src/core/utils/json.ts @@ -1,4 +1,3 @@ - export function stringify(data: any): string { return JSON.stringify(data, replacer, 2); } diff --git a/src/core/utils/logger.ts b/src/core/utils/logger.ts new file mode 100644 index 00000000..570b06dc --- /dev/null +++ b/src/core/utils/logger.ts @@ -0,0 +1,102 @@ +import * as winston from "winston"; +import * as Transport from "winston-transport"; +import { Logger } from "winston"; +import os = require("os"); +import * as path from "path"; +import * as fs from "fs"; + +class CustomTransport extends Transport { + constructor(opts: any) { + super(opts); + } + + public log(info: any, cb: () => void): void { + setImmediate(() => { + this.emit("logged", info); + }); + + cb(); + if (info.error || (info.errno && info.errno !== "__CELGRACEFULERROR")) { + process.exit(1); + } + } +} + +// log into the same directory as where the profiles are, to avoid creating more +// directories for now. Consider changing this to a general 'home' directory such +// as .celonis-cli or alike. +const logDirName = ".celonis-content-cli-profiles"; +const logFileName = "celonis-cli.log"; +const exceptionLogFileName = "exceptions.log"; +const maxLogSizeMB = 3; +const logDir = path.join(os.homedir(), logDirName); +const logFilePath = path.join(logDir, logFileName); +const exceptionLogFilePath = path.join(logDir, exceptionLogFileName); +const maxSizeBytes = maxLogSizeMB * 1024 * 1024; // 3 MB in bytes + +// --- Ensure log directory exists --- +try { + if (!fs.existsSync(logDir)) { + fs.mkdirSync(logDir, { recursive: true }); + } +} catch (error) { + console.error(`Error creating log directory: ${logDir}`, error); +} + +export const logger: Logger = winston.createLogger({ + format: winston.format.combine(winston.format.cli()), + level: "debug", + transports: [ + new winston.transports.Console({ + level: "info", + format: winston.format.combine( + winston.format.colorize(), + ), + }), + new winston.transports.File({ + level: "info", // Log everything from debug up to the file + filename: logFilePath, + format: winston.format.combine( + winston.format.timestamp(), // Add timestamp to file logs + winston.format.errors({ stack: true }), // Log stack traces + winston.format.json() // Log in JSON format + ), + maxsize: maxSizeBytes, + maxFiles: 5, + tailable: true, + }), + new CustomTransport({}) + ], + exceptionHandlers: [ + new winston.transports.Console({ + format: winston.format.combine( + winston.format.colorize(), + ), + }), + new winston.transports.File({ + filename: exceptionLogFilePath, // Separate file recommended + format: winston.format.combine( + winston.format.timestamp(), + winston.format.errors({ stack: true }), + winston.format.json() + ), + maxsize: maxSizeBytes, + maxFiles: 2, // Keep fewer exception logs if desired + tailable: true, + }), + new CustomTransport({}) + ], + exitOnError: false, +}); + +// tslint:disable-next-line: max-classes-per-file +export class FatalError extends Error { + public error = "FatalError"; +} + +// By default, the logger will process.exit(1) when logging an uncaught fatal error +// This interface allows us to throw errors that do not force the process to exit and can be handled gracefully +// tslint:disable-next-line: max-classes-per-file +export class GracefulError extends Error { + public code: "__CELGRACEFULERROR"; +} diff --git a/src/core/utils/question.service.ts b/src/core/utils/question.service.ts new file mode 100644 index 00000000..7a91456b --- /dev/null +++ b/src/core/utils/question.service.ts @@ -0,0 +1,29 @@ +import * as readline from "readline"; +import { ReadLine } from "readline"; + +/** + * Simple method to get input from the user/console using ReadLine. The + * class must be closed in order to avoid the CLI to not terminate properly. + */ +export class QuestionService { + + private readLine: ReadLine; + + constructor() { + this.readLine = readline.createInterface({ + input: process.stdin, + output: process.stdout, + terminal: true, + }); + } + + public async ask(question: string): Promise { + return new Promise(resolve => { + this.readLine.question(question, input => resolve(input)); + }); + } + + public async close(): Promise { + this.readLine.close(); + } +} diff --git a/src/util/version.ts b/src/core/utils/version.ts similarity index 74% rename from src/util/version.ts rename to src/core/utils/version.ts index 772a7299..78343fc5 100644 --- a/src/util/version.ts +++ b/src/core/utils/version.ts @@ -1,5 +1,5 @@ // tslint:disable-next-line:no-var-requires -const { version } = require("./../package.json"); +const { version } = require("../../../package.json"); export class VersionUtils { public static getCurrentCliVersion(): string { diff --git a/src/util/yaml.ts b/src/core/utils/yaml.ts similarity index 100% rename from src/util/yaml.ts rename to src/core/utils/yaml.ts diff --git a/src/interfaces/variable-assignment-api.interface.ts b/src/interfaces/variable-assignment-api.interface.ts deleted file mode 100644 index d18e9efb..00000000 --- a/src/interfaces/variable-assignment-api.interface.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface VariableAssignmentApi { - url: string; -} \ No newline at end of file diff --git a/src/services/command.service.ts b/src/services/command.service.ts deleted file mode 100644 index fc02b179..00000000 --- a/src/services/command.service.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Command } from "commander"; - -export class CommandService { - private readonly command: Command; - - constructor() { - this.command = new Command(); - this.command.parseOptions(process.argv); - } - - public get program(): Command { - return this.command; - } -} \ No newline at end of file diff --git a/src/services/content.service.ts b/src/services/content.service.ts deleted file mode 100644 index 7ec64ebd..00000000 --- a/src/services/content.service.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { ProfileService } from "./profile.service"; -import { Profile } from "../interfaces/profile.interface"; -import { FatalError, logger } from "../util/logger"; -import { BaseManager } from "../content/manager/base.manager"; - -export class ContentService { - private profileService = new ProfileService(); - - public async pull(profileName: string, baseManager: BaseManager): Promise { - return new Promise((resolve, reject) => { - this.profileService - .findProfile(this.resolveProfile(profileName)) - .then((profile: Profile) => { - baseManager.profile = profile; - baseManager.pull().then( - () => resolve(), - () => reject() - ); - }) - .catch(err => { - logger.error(new FatalError(err)); - }); - }); - } - - public async pullFile(profileName: string, baseManager: BaseManager): Promise { - return new Promise((resolve, reject) => { - this.profileService - .findProfile(this.resolveProfile(profileName)) - .then((profile: Profile) => { - baseManager.profile = profile; - baseManager.pullFile().then( - () => resolve(), - () => reject() - ); - }) - .catch(err => { - logger.error(new FatalError(err)); - }); - }); - } - - public async push(profileName: string, baseManager: BaseManager): Promise { - return new Promise((resolve, reject) => { - this.profileService - .findProfile(this.resolveProfile(profileName)) - .then((profile: Profile) => { - baseManager.profile = profile; - baseManager.push().then( - () => resolve(), - () => reject() - ); - }) - .catch(err => { - logger.error(new FatalError(err)); - }); - }); - } - - public async batchPush(profileName: string, baseManagers: BaseManager[]): Promise { - return new Promise((resolve, reject) => { - this.profileService - .findProfile(this.resolveProfile(profileName)) - .then((profile: Profile) => { - const promises: Array> = []; - - baseManagers.forEach(baseManager => { - baseManager.profile = profile; - promises.push(baseManager.push()); - }); - - Promise.all(promises).then( - () => resolve(), - () => reject() - ); - }) - .catch(err => { - logger.error(new FatalError(err)); - }); - }); - } - - public async update(profileName: string, baseManager: BaseManager): Promise { - return new Promise((resolve, reject) => { - this.profileService - .findProfile(this.resolveProfile(profileName)) - .then((profile: Profile) => { - baseManager.profile = profile; - baseManager.update().then( - () => resolve(), - () => reject() - ); - }) - .catch(err => { - logger.error(new FatalError(err)); - }); - }); - } - - public async findAll(profileName: string, baseManager: BaseManager): Promise { - return new Promise((resolve, reject) => { - this.profileService - .findProfile(this.resolveProfile(profileName)) - .then((profile: Profile) => { - baseManager.profile = profile; - baseManager.findAll().then( - () => resolve(), - () => reject() - ); - }) - .catch(err => { - logger.error(new FatalError(err)); - }); - }); - } - - private resolveProfile(profile: string): string { - if (profile) { - return profile; - } - - return this.profileService.getDefaultProfile(); - } -} diff --git a/src/services/context.service.ts b/src/services/context.service.ts deleted file mode 100644 index ddb98733..00000000 --- a/src/services/context.service.ts +++ /dev/null @@ -1,26 +0,0 @@ -import {Profile} from "../interfaces/profile.interface"; -import {profileService} from "./profile.service"; - -interface Context { - profile: Profile; -} - -class ContextService { - public static readonly INSTANCE = new ContextService(); - private context: Context; - - public getContext(): Context { - return this.context; - } - - public async resolveProfile(profile: string): Promise { - const resolvedProfile = await profileService.findProfile(profile); - this.setContext({profile: resolvedProfile}); - }; - - public setContext(context: Context): void { - this.context = context; - } -} - -export const contextService = ContextService.INSTANCE; diff --git a/src/services/http-client.service.ts b/src/services/http-client.service.ts deleted file mode 100644 index fa3d5d7d..00000000 --- a/src/services/http-client.service.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { AuthenticationType, Profile } from "../interfaces/profile.interface"; -import {logger} from "../util/logger"; -import {AxiosResponse, RawAxiosRequestHeaders} from "axios"; -import * as FormData from "form-data"; -import { AxiosInitializer } from "../util/axios-initializer"; - -export class HttpClientService { - - private axios = AxiosInitializer.initializeAxios(); - - public async pushData(url: string, profile: Profile, body: any): Promise { - return new Promise((resolve, reject) => { - const headers = this.buildAuthorizationHeaders(profile); - - if (body instanceof FormData) { - headers["Content-Type"] = "multipart/form-data"; - } - - this.axios.post(url, body, { - headers - }).then(response => { - this.handleResponse(response, resolve, reject); - }).catch(err => { - this.handleError(err, resolve, reject); - }); - }); - } - - public async pullData(url: string, profile: Profile): Promise { - return new Promise((resolve, reject) => { - this.axios.get(url, { - headers: this.buildAuthorizationHeaders(profile) - }).then(response => { - this.handleResponse(response, resolve, reject); - }).catch(err => { - this.handleError(err, resolve, reject); - }); - }); - } - - public async pullFileData(url: string, profile: Profile): Promise { - return new Promise((resolve, reject) => { - this.axios.post(url, null, { - headers: this.buildAuthorizationHeaders(profile), - responseType: "stream" - }).then(response => { - const data: Buffer[] = []; - response.data.on("data", (chunk: Buffer) => { - data.push(chunk); - }); - response.data.on("end", () => { - if (this.checkBadRequest(response.status)) { - this.handleBadRequest(response.status, data.toString(), reject); - } else { - this.handleResponseStreamData(Buffer.concat(data), resolve, reject); - } - }) - }).catch(err => { - this.handleError(err, resolve, reject); - }); - }); - } - - public async updateData(url: string, profile: Profile, body: object): Promise { - return new Promise((resolve, reject) => { - this.axios.put(url, body, { - headers: this.buildAuthorizationHeaders(profile) - }).then(response => { - this.handleResponse(response, resolve, reject); - }).catch(err => { - this.handleError(err, resolve, reject); - }); - }); - } - - public async findAll(url: string, profile: Profile): Promise { - return new Promise((resolve, reject) => { - this.axios.get(url, { - headers: this.buildAuthorizationHeaders(profile) - }).then(response => { - this.handleResponse(response, resolve, reject); - }).catch(err => { - this.handleError(err, resolve, reject); - }); - }); - } - - private buildAuthorizationHeaders(profile: Profile): RawAxiosRequestHeaders { - const authenticationType = profile.authenticationType || AuthenticationType.BEARER; - return { - Authorization: `${authenticationType} ${profile.apiToken}`, - "Content-Type": "application/json", - }; - } - - // tslint:disable-next-line:typedef - private handleResponseStreamData(data, resolve, reject): void { - if (data) { - resolve(data); - return; - } - - logger.error("Could not get file stream from response"); - reject(); - } - - // tslint:disable-next-line:typedef - private handleResponse(res: AxiosResponse, resolve, reject): void { - if (this.checkBadRequest(res.status)) { - this.handleBadRequest(res.status, res.data, reject); - return; - } - resolve(res.data); - } - - private handleError(err: any, resolve, reject): void { - if (err.response) { - this.handleResponse(err.response, resolve, reject); - } else { - reject(err.message); - } - } - - private checkBadRequest(statusCode: number): boolean { - return statusCode >= 400; - } - - // tslint:disable-next-line:typedef - private handleBadRequest(statusCode, data, reject): void { - if (data) { - reject(JSON.stringify(data)); - } else { - reject("Backend responded with status code " + statusCode); - } - } -} diff --git a/src/services/question.service.ts b/src/services/question.service.ts deleted file mode 100644 index 926e656e..00000000 --- a/src/services/question.service.ts +++ /dev/null @@ -1,16 +0,0 @@ -import * as readline from "readline"; -import { ReadLine } from "readline"; - -export class QuestionService { - private static readLine: ReadLine = readline.createInterface({ - input: process.stdin, - output: process.stdout, - terminal: true, - }); - - public static async ask(question: string): Promise { - return new Promise((resolve, reject) => { - this.readLine.question(question, input => resolve(input)); - }); - } -} diff --git a/src/util/context-initializer.ts b/src/util/context-initializer.ts deleted file mode 100644 index 9b4ada44..00000000 --- a/src/util/context-initializer.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { logger } from "./logger"; -import { contextService } from "../services/context.service"; -import { program } from "./program"; - -export class ContextInitializer { - public static async initContext(): Promise { - const options = program.parseOptions(process.argv); - const pOptionIndex = options.unknown.indexOf("-p"); - const indexOfProfileOption = pOptionIndex !== -1 ? pOptionIndex : options.unknown.indexOf("--profile"); - - process.on("unhandledRejection", (e, promise) => { - logger.error(e.toString()); - }); - - await contextService.resolveProfile(options.unknown[indexOfProfileOption + 1]); - } -} diff --git a/src/util/logger.ts b/src/util/logger.ts deleted file mode 100644 index 75cbb159..00000000 --- a/src/util/logger.ts +++ /dev/null @@ -1,39 +0,0 @@ -import * as winston from "winston"; -import * as Transport from "winston-transport"; -import { Logger } from "winston"; - -class CustomTransport extends Transport { - constructor(opts: any) { - super(opts); - } - - public log(info: any, cb: () => void): void { - setImmediate(() => { - this.emit("logged", info); - }); - - cb(); - if (info.error || (info.errno && info.errno !== "__CELGRACEFULERROR")) { - process.exit(1); - } - } -} - -export const logger: Logger = winston.createLogger({ - format: winston.format.combine(winston.format.cli()), - transports: [new winston.transports.Console(), new CustomTransport({})], - exceptionHandlers: [new winston.transports.Console(), new CustomTransport({})], - exitOnError: true, -}); - -// tslint:disable-next-line: max-classes-per-file -export class FatalError extends Error { - public error = "FatalError"; -} - -// By default the logger will process.exit(1) when logging an uncaught fatal error -// This interface allows us to throw errors that do not force the process to exit and can be handled gracefully -// tslint:disable-next-line: max-classes-per-file -export class GracefulError extends Error { - public code: "__CELGRACEFULERROR"; -} diff --git a/src/util/program.ts b/src/util/program.ts deleted file mode 100644 index 4f956fc1..00000000 --- a/src/util/program.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { CommandService } from "../services/command.service"; -import { Command } from "commander"; - -const commandService = new CommandService(); - -export const program: Command = commandService.program; \ No newline at end of file diff --git a/tests/.gitkeep b/tests/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/tests/analyze/action-flows.spec.ts b/tests/commands/action-flows/analyze-action-flows.spec.ts similarity index 66% rename from tests/analyze/action-flows.spec.ts rename to tests/commands/action-flows/analyze-action-flows.spec.ts index 8cb1f7a1..784f3e13 100644 --- a/tests/analyze/action-flows.spec.ts +++ b/tests/commands/action-flows/analyze-action-flows.spec.ts @@ -1,8 +1,9 @@ -import { FileService } from "../../src/services/file-service"; import * as path from "path"; -import { mockWriteFileSync, testTransport } from "../jest.setup"; -import { mockedAxiosInstance } from "../utls/http-requests-mock"; -import { ActionFlowCommand } from "../../src/commands/action-flow.command"; +import { mockedAxiosInstance } from "../../utls/http-requests-mock"; +import { loggingTestTransport, mockWriteFileSync } from "../../jest.setup"; +import { FileService } from "../../../src/core/utils/file-service"; +import { ActionFlowCommandService } from "../../../src/commands/action-flows/action-flow/action-flow-command.service"; +import { testContext } from "../../utls/test-context"; describe("Analyze action-flows", () => { @@ -45,10 +46,10 @@ describe("Analyze action-flows", () => { const resp = { data: mockAnalyzeResponse }; (mockedAxiosInstance.get as jest.Mock).mockResolvedValue(resp); - await new ActionFlowCommand().analyzeActionFlows(packageId, false); + await new ActionFlowCommandService(testContext).analyzeActionFlows(packageId, false); - expect(testTransport.logMessages.length).toBe(1); - expect(testTransport.logMessages[0].message).toContain(JSON.stringify(mockAnalyzeResponse, null, 4)); + expect(loggingTestTransport.logMessages.length).toBe(1); + expect(loggingTestTransport.logMessages[0].message).toContain(JSON.stringify(mockAnalyzeResponse, null, 4)); expect(mockedAxiosInstance.get).toHaveBeenCalledWith(`https://myTeam.celonis.cloud/ems-automation/api/root/${packageId}/export/assets/analyze`, expect.anything()); }); @@ -57,11 +58,11 @@ describe("Analyze action-flows", () => { const resp = { data: mockAnalyzeResponse }; (mockedAxiosInstance.get as jest.Mock).mockResolvedValue(resp); - await new ActionFlowCommand().analyzeActionFlows(packageId, true); + await new ActionFlowCommandService(testContext).analyzeActionFlows(packageId, true); - expect(testTransport.logMessages.length).toBe(1); - expect(testTransport.logMessages[0].message).toContain(FileService.fileDownloadedMessage); - const expectedFileName = testTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; + expect(loggingTestTransport.logMessages.length).toBe(1); + expect(loggingTestTransport.logMessages[0].message).toContain(FileService.fileDownloadedMessage); + const expectedFileName = loggingTestTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; expect(mockWriteFileSync).toHaveBeenCalledWith(path.resolve(process.cwd(), expectedFileName), JSON.stringify(mockAnalyzeResponse, null, 4), { encoding: "utf-8" }); expect(mockedAxiosInstance.get).toHaveBeenCalledWith(`https://myTeam.celonis.cloud/ems-automation/api/root/${packageId}/export/assets/analyze`, expect.anything()); diff --git a/tests/export/action-flows.spec.ts b/tests/commands/action-flows/export-action-flows.spec.ts similarity index 79% rename from tests/export/action-flows.spec.ts rename to tests/commands/action-flows/export-action-flows.spec.ts index f0503919..09e9d9cb 100644 --- a/tests/export/action-flows.spec.ts +++ b/tests/commands/action-flows/export-action-flows.spec.ts @@ -1,13 +1,13 @@ -import { FileService } from "../../src/services/file-service"; -import { mockWriteSync, testTransport } from "../jest.setup"; -import { mockAxiosGet } from "../utls/http-requests-mock"; -import { ActionFlowCommand } from "../../src/commands/action-flow.command"; import * as AdmZip from "adm-zip"; -import { mockExistsSyncOnce, mockReadFileSync } from "../utls/fs-mock-utils"; -import { stringify } from "../../src/util/yaml"; import * as fs from "fs"; -import { parse } from "yaml"; -import { metadataFileName } from "../../src/services/action-flow/action-flow-service"; +import { parse, stringify } from "yaml"; +import { mockAxiosGet } from "../../utls/http-requests-mock"; +import { ActionFlowCommandService } from "../../../src/commands/action-flows/action-flow/action-flow-command.service"; +import { loggingTestTransport, mockWriteSync } from "../../jest.setup"; +import { FileService } from "../../../src/core/utils/file-service"; +import { mockExistsSyncOnce, mockReadFileSync } from "../../utls/fs-mock-utils"; +import { ActionFlowService } from "../../../src/commands/action-flows/action-flow/action-flow.service"; +import { testContext } from "../../utls/test-context"; describe("Export action-flows", () => { @@ -79,10 +79,10 @@ describe("Export action-flows", () => { mockAxiosGet(`https://myTeam.celonis.cloud/ems-automation/api/root/${packageId}/export/assets`, zipExport.toBuffer()); - await new ActionFlowCommand().exportActionFlows(packageId, null); + await new ActionFlowCommandService(testContext).exportActionFlows(packageId, null); - expect(testTransport.logMessages.length).toBe(1); - const expectedZipFileName = testTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; + expect(loggingTestTransport.logMessages.length).toBe(1); + const expectedZipFileName = loggingTestTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; expect(fs.openSync).toHaveBeenCalledWith(expectedZipFileName, expect.anything(), expect.anything()); expect(mockWriteSync).toHaveBeenCalled(); @@ -137,10 +137,10 @@ describe("Export action-flows", () => { zipExport.addFile(actionFlowFileName, Buffer.from(stringify(actionFlowConfig))); mockAxiosGet(`https://myTeam.celonis.cloud/ems-automation/api/root/${packageId}/export/assets`, zipExport.toBuffer()); - await new ActionFlowCommand().exportActionFlows(packageId, metadataFileName); + await new ActionFlowCommandService(testContext).exportActionFlows(packageId, ActionFlowService.METADATA_FILE_NAME); - expect(testTransport.logMessages.length).toBe(1); - const expectedZipFileName = testTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; + expect(loggingTestTransport.logMessages.length).toBe(1); + const expectedZipFileName = loggingTestTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; expect(fs.openSync).toHaveBeenCalledWith(expectedZipFileName, expect.anything(), expect.anything()); expect(mockWriteSync).toHaveBeenCalled(); @@ -148,10 +148,10 @@ describe("Export action-flows", () => { const receivedZip = new AdmZip(fileBuffer); expect(receivedZip.getEntries().length).toBe(2); - expect(receivedZip.getEntries().filter(entry => entry.name === metadataFileName).length).toBe(1); + expect(receivedZip.getEntries().filter(entry => entry.name === ActionFlowService.METADATA_FILE_NAME).length).toBe(1); - const receivedMetadataZipEntry = receivedZip.getEntries().filter(entry => entry.name === metadataFileName)[0]; - const receivedActionFlowZipEntry = receivedZip.getEntries().filter(entry => entry.name !== metadataFileName)[0]; + const receivedMetadataZipEntry = receivedZip.getEntries().filter(entry => entry.name === ActionFlowService.METADATA_FILE_NAME)[0]; + const receivedActionFlowZipEntry = receivedZip.getEntries().filter(entry => entry.name !== ActionFlowService.METADATA_FILE_NAME)[0]; const receivedMetadataFile = parse(receivedMetadataZipEntry.getData().toString()); const receivedActionFlowFile = parse(receivedActionFlowZipEntry.getData().toString()); @@ -172,7 +172,7 @@ describe("Export action-flows", () => { }); try { - await new ActionFlowCommand().exportActionFlows(packageId, metadataFileName); + await new ActionFlowCommandService(testContext).exportActionFlows(packageId, ActionFlowService.METADATA_FILE_NAME); } catch (e) { expect(e).toBe(error); expect(process.exit).toHaveBeenCalledWith(1); diff --git a/tests/import/action-flows.spec.ts b/tests/commands/action-flows/import-action-flows.spec.ts similarity index 59% rename from tests/import/action-flows.spec.ts rename to tests/commands/action-flows/import-action-flows.spec.ts index 3dea2474..9ff02fb8 100644 --- a/tests/import/action-flows.spec.ts +++ b/tests/commands/action-flows/import-action-flows.spec.ts @@ -1,10 +1,11 @@ -import { FileService } from "../../src/services/file-service"; import * as path from "path"; -import { mockWriteFileSync, testTransport } from "../jest.setup"; -import { mockedAxiosInstance } from "../utls/http-requests-mock"; -import { ActionFlowCommand } from "../../src/commands/action-flow.command"; import * as AdmZip from "adm-zip"; -import { mockCreateReadStream } from "../utls/fs-mock-utils"; +import { mockedAxiosInstance } from "../../utls/http-requests-mock"; +import { mockCreateReadStream } from "../../utls/fs-mock-utils"; +import { ActionFlowCommandService } from "../../../src/commands/action-flows/action-flow/action-flow-command.service"; +import { loggingTestTransport, mockWriteFileSync } from "../../jest.setup"; +import { FileService } from "../../../src/core/utils/file-service"; +import { testContext } from "../../utls/test-context"; describe("Import action-flows", () => { @@ -29,10 +30,10 @@ describe("Import action-flows", () => { const zip = new AdmZip(); mockCreateReadStream(zip.toBuffer()); - await new ActionFlowCommand().importActionFlows(packageId, "tmp", true, false); + await new ActionFlowCommandService(testContext).importActionFlows(packageId, "tmp", true, false); - expect(testTransport.logMessages.length).toBe(1); - expect(testTransport.logMessages[0].message).toContain(JSON.stringify(mockImportResponse, null, 4)); + expect(loggingTestTransport.logMessages.length).toBe(1); + expect(loggingTestTransport.logMessages[0].message).toContain(JSON.stringify(mockImportResponse, null, 4)); expect(mockedAxiosInstance.post).toHaveBeenCalledWith(`https://myTeam.celonis.cloud/ems-automation/api/root/${packageId}/import/assets`, expect.anything(), expect.anything()); }); @@ -43,11 +44,11 @@ describe("Import action-flows", () => { const zip = new AdmZip(); mockCreateReadStream(zip.toBuffer()); - await new ActionFlowCommand().importActionFlows(packageId, "tmp", true, true); + await new ActionFlowCommandService(testContext).importActionFlows(packageId, "tmp", true, true); - expect(testTransport.logMessages.length).toBe(1); - expect(testTransport.logMessages[0].message).toContain(FileService.fileDownloadedMessage); - const expectedFileName = testTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; + expect(loggingTestTransport.logMessages.length).toBe(1); + expect(loggingTestTransport.logMessages[0].message).toContain(FileService.fileDownloadedMessage); + const expectedFileName = loggingTestTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; expect(mockWriteFileSync).toHaveBeenCalledWith(path.resolve(process.cwd(), expectedFileName), JSON.stringify(mockImportResponse, null, 4), { encoding: "utf-8" }); expect(mockedAxiosInstance.post).toHaveBeenCalledWith(`https://myTeam.celonis.cloud/ems-automation/api/root/${packageId}/import/assets`, expect.anything(), expect.anything()); diff --git a/tests/config/config-diff.spec.ts b/tests/commands/configuration-management/config-diff.spec.ts similarity index 81% rename from tests/config/config-diff.spec.ts rename to tests/commands/configuration-management/config-diff.spec.ts index 72e3c8df..9c93cd15 100644 --- a/tests/config/config-diff.spec.ts +++ b/tests/commands/configuration-management/config-diff.spec.ts @@ -1,16 +1,19 @@ -import {PackageManifestTransport} from "../../src/interfaces/package-export-transport"; -import {ConfigUtils} from "../utls/config-utils"; import * as path from "path"; -import {mockCreateReadStream, mockExistsSync, mockReadFileSync} from "../utls/fs-mock-utils"; +import { mockCreateReadStream, mockExistsSync, mockReadFileSync } from "../../utls/fs-mock-utils"; +import { + PackageManifestTransport +} from "../../../src/commands/configuration-management/interfaces/package-export.interfaces"; import { NodeConfigurationChangeType, PackageDiffMetadata, PackageDiffTransport, -} from "../../src/interfaces/diff-package.transport"; -import {mockAxiosPost} from "../utls/http-requests-mock"; -import {ConfigCommand} from "../../src/commands/config.command"; -import { mockWriteFileSync, mockWriteSync, testTransport } from "../jest.setup"; -import { FileService } from "../../src/services/file-service"; +} from "../../../src/commands/configuration-management/interfaces/diff-package.interfaces"; +import { mockAxiosPost } from "../../utls/http-requests-mock"; +import { ConfigCommandService } from "../../../src/commands/configuration-management/config-command.service"; +import { testContext } from "../../utls/test-context"; +import { loggingTestTransport, mockWriteFileSync } from "../../jest.setup"; +import { FileService } from "../../../src/core/utils/file-service"; +import { ConfigUtils } from "../../utls/config-utils"; describe("Config diff", () => { @@ -37,10 +40,10 @@ describe("Config diff", () => { mockAxiosPost("https://myTeam.celonis.cloud/package-manager/api/core/packages/diff/configuration/has-changes", diffResponse); - await new ConfigCommand().diffPackages("./packages.zip", true, false); + await new ConfigCommandService(testContext).diffPackages("./packages.zip", true, false); - expect(testTransport.logMessages.length).toBe(1); - expect(testTransport.logMessages[0].message).toContain( + expect(loggingTestTransport.logMessages.length).toBe(1); + expect(loggingTestTransport.logMessages[0].message).toContain( JSON.stringify(diffResponse, null, 2) ); }); @@ -84,10 +87,10 @@ describe("Config diff", () => { mockAxiosPost("https://myTeam.celonis.cloud/package-manager/api/core/packages/diff/configuration", diffResponse); - await new ConfigCommand().diffPackages("./packages.zip", false, false); + await new ConfigCommandService(testContext).diffPackages("./packages.zip", false, false); - expect(testTransport.logMessages.length).toBe(1); - expect(testTransport.logMessages[0].message).toContain( + expect(loggingTestTransport.logMessages.length).toBe(1); + expect(loggingTestTransport.logMessages[0].message).toContain( JSON.stringify(diffResponse, null, 2) ); }); @@ -131,9 +134,9 @@ describe("Config diff", () => { mockAxiosPost("https://myTeam.celonis.cloud/package-manager/api/core/packages/diff/configuration", diffResponse); - await new ConfigCommand().diffPackages("./packages.zip", false, true); + await new ConfigCommandService(testContext).diffPackages("./packages.zip", false, true); - const expectedFileName = testTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; + const expectedFileName = loggingTestTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; expect(mockWriteFileSync).toHaveBeenCalledWith(path.resolve(process.cwd(), expectedFileName), expect.any(String), {encoding: "utf-8"}); const exportedPackageDiffTransport = JSON.parse(mockWriteFileSync.mock.calls[0][1]) as PackageDiffTransport[]; @@ -162,9 +165,9 @@ describe("Config diff", () => { mockAxiosPost("https://myTeam.celonis.cloud/package-manager/api/core/packages/diff/configuration/has-changes", diffResponse); - await new ConfigCommand().diffPackages("./packages.zip", true, true); + await new ConfigCommandService(testContext).diffPackages("./packages.zip", true, true); - const expectedFileName = testTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; + const expectedFileName = loggingTestTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; expect(mockWriteFileSync).toHaveBeenCalledWith(path.resolve(process.cwd(), expectedFileName), expect.any(String), {encoding: "utf-8"}); const exportedPackageDiffTransport = JSON.parse(mockWriteFileSync.mock.calls[0][1]) as PackageDiffTransport[]; diff --git a/tests/config/config-export.spec.ts b/tests/commands/configuration-management/config-export.spec.ts similarity index 90% rename from tests/config/config-export.spec.ts rename to tests/commands/configuration-management/config-export.spec.ts index a6d520a4..a93c4632 100644 --- a/tests/config/config-export.spec.ts +++ b/tests/commands/configuration-management/config-export.spec.ts @@ -1,30 +1,29 @@ -import {ConfigUtils} from "../utls/config-utils"; -import { - DependencyTransport, NodeConfiguration, NodeExportTransport, - PackageManifestTransport, - StudioPackageManifest, - VariableManifestTransport, -} from "../../src/interfaces/package-export-transport"; -import {mockAxiosGet, mockAxiosPost, mockedPostRequestBodyByUrl} from "../utls/http-requests-mock"; -import {ConfigCommand} from "../../src/commands/config.command"; -import {PackageManagerApiUtils} from "../utls/package-manager-api.utils"; -import {mockWriteSync, testTransport} from "../jest.setup"; -import {FileService} from "../../src/services/file-service"; import * as fs from "fs"; import AdmZip = require("adm-zip"); - -import { parse, stringify } from "../../src/util/json"; +import { mockAxiosGet, mockAxiosPost, mockedPostRequestBodyByUrl } from "../../utls/http-requests-mock"; +import { + BatchExportImportConstants +} from "../../../src/commands/configuration-management/interfaces/batch-export-import.constants"; +import { + DependencyTransport, NodeConfiguration, NodeExportTransport, + PackageManifestTransport, StudioPackageManifest, VariableManifestTransport, +} from "../../../src/commands/configuration-management/interfaces/package-export.interfaces"; import { - PackageManagerVariableType, - VariableDefinition, - VariablesAssignments -} from "../../src/interfaces/package-manager.interfaces"; -import {BatchExportImportConstants} from "../../src/interfaces/batch-export-import-constants"; + PackageManagerVariableType, VariableDefinition, + VariablesAssignments, +} from "../../../src/commands/studio/interfaces/package-manager.interfaces"; +import { loggingTestTransport, mockWriteSync } from "../../jest.setup"; +import { FileService } from "../../../src/core/utils/file-service"; +import { parse, stringify } from "../../../src/core/utils/json"; +import { ConfigCommandService } from "../../../src/commands/configuration-management/config-command.service"; +import { testContext } from "../../utls/test-context"; +import { ConfigUtils } from "../../utls/config-utils"; +import { PacmanApiUtils } from "../../utls/pacman-api.utils"; describe("Config export", () => { - const firstSpace = PackageManagerApiUtils.buildSpaceTransport("space-1", "First space", "Icon1"); - const secondSpace = PackageManagerApiUtils.buildSpaceTransport("space-2", "Second space", "Icon2"); + const firstSpace = PacmanApiUtils.buildSpaceTransport("space-1", "First space", "Icon1"); + const secondSpace = PacmanApiUtils.buildSpaceTransport("space-2", "Second space", "Icon2"); beforeEach(() => { (fs.openSync as jest.Mock).mockReturnValue(100); @@ -39,14 +38,14 @@ describe("Config export", () => { manifest.push(ConfigUtils.buildManifestForKeyAndFlavor("key-3", "TEST")); const exportedPackagesZip = ConfigUtils.buildBatchExportZip(manifest, []); - const firstStudioPackage = PackageManagerApiUtils.buildContentNodeTransport("key-1", "space-1"); + const firstStudioPackage = PacmanApiUtils.buildContentNodeTransport("key-1", "space-1"); const firstPackageRuntimeVariable: VariablesAssignments = { key: "varKey", type: PackageManagerVariableType.PLAIN_TEXT, value: "default-value" as unknown as object }; - const secondStudioPackage = PackageManagerApiUtils.buildContentNodeTransport("key-2", "space-2"); + const secondStudioPackage = PacmanApiUtils.buildContentNodeTransport("key-2", "space-2"); mockAxiosGet("https://myTeam.celonis.cloud/package-manager/api/core/packages/export/batch?packageKeys=key-1&packageKeys=key-2&packageKeys=key-3&withDependencies=true", exportedPackagesZip.toBuffer()); mockAxiosPost("https://myTeam.celonis.cloud/package-manager/api/core/packages/export/batch/variables-with-assignments", []); @@ -55,9 +54,9 @@ describe("Config export", () => { mockAxiosGet(`https://myTeam.celonis.cloud/package-manager/api/nodes/by-package-key/${firstStudioPackage.key}/variables/runtime-values?appMode=VIEWER`, [firstPackageRuntimeVariable]); mockAxiosGet(`https://myTeam.celonis.cloud/package-manager/api/nodes/by-package-key/${secondStudioPackage.key}/variables/runtime-values?appMode=VIEWER`, []); - await new ConfigCommand().batchExportPackages(["key-1", "key-2", "key-3"], true); + await new ConfigCommandService(testContext).batchExportPackages(["key-1", "key-2", "key-3"], true); - const expectedFileName = testTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; + const expectedFileName = loggingTestTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; expect(fs.openSync).toHaveBeenCalledWith(expectedFileName, expect.anything(), expect.anything()); expect(mockWriteSync).toHaveBeenCalled(); @@ -181,9 +180,9 @@ describe("Config export", () => { mockAxiosGet(`https://myTeam.celonis.cloud/package-manager/api/nodes/by-package-key/${firstPackageNode.key}/variables/runtime-values?appMode=VIEWER`, []); mockAxiosGet(`https://myTeam.celonis.cloud/package-manager/api/nodes/by-package-key/${secondPackageNode.key}/variables/runtime-values?appMode=VIEWER`, []); - await new ConfigCommand().batchExportPackages(["key-1", "key-2"], true); + await new ConfigCommandService(testContext).batchExportPackages(["key-1", "key-2"], true); - const expectedFileName = testTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; + const expectedFileName = loggingTestTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; expect(fs.openSync).toHaveBeenCalledWith(expectedFileName, expect.anything(), expect.anything()); expect(mockWriteSync).toHaveBeenCalled(); @@ -277,9 +276,9 @@ describe("Config export", () => { mockAxiosGet(`https://myTeam.celonis.cloud/package-manager/api/nodes/by-package-key/${firstPackageNode.key}/variables/runtime-values?appMode=VIEWER`, []); mockAxiosGet(`https://myTeam.celonis.cloud/package-manager/api/nodes/by-package-key/${secondPackageNode.key}/variables/runtime-values?appMode=VIEWER`, []); - await new ConfigCommand().batchExportPackages(["key-1", "key-2"], true); + await new ConfigCommandService(testContext).batchExportPackages(["key-1", "key-2"], true); - const expectedFileName = testTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; + const expectedFileName = loggingTestTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; expect(fs.openSync).toHaveBeenCalledWith(expectedFileName, expect.anything(), expect.anything()); expect(mockWriteSync).toHaveBeenCalled(); @@ -393,9 +392,9 @@ describe("Config export", () => { mockAxiosGet(`https://myTeam.celonis.cloud/package-manager/api/nodes/by-package-key/${firstPackageNode.key}/variables/runtime-values?appMode=VIEWER`, []); mockAxiosGet(`https://myTeam.celonis.cloud/package-manager/api/nodes/by-package-key/${secondPackageNode.key}/variables/runtime-values?appMode=VIEWER`, []); - await new ConfigCommand().batchExportPackages(["key-1", "key-2"], true); + await new ConfigCommandService(testContext).batchExportPackages(["key-1", "key-2"], true); - const expectedFileName = testTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; + const expectedFileName = loggingTestTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; expect(fs.openSync).toHaveBeenCalledWith(expectedFileName, expect.anything(), expect.anything()); expect(mockWriteSync).toHaveBeenCalled(); @@ -501,9 +500,9 @@ describe("Config export", () => { mockAxiosGet(`https://myTeam.celonis.cloud/package-manager/api/nodes/${firstPackageNode.key}/${firstPackageNode.key}`, {...firstPackageNode, spaceId: "space-1"}); mockAxiosGet(`https://myTeam.celonis.cloud/package-manager/api/nodes/by-package-key/${firstPackageNode.key}/variables/runtime-values?appMode=VIEWER`, []); - await new ConfigCommand().batchExportPackages(["key_with_underscores_1"], true); + await new ConfigCommandService(testContext).batchExportPackages(["key_with_underscores_1"], true); - const expectedFileName = testTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; + const expectedFileName = loggingTestTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; expect(fs.openSync).toHaveBeenCalledWith(expectedFileName, expect.anything(), expect.anything()); expect(mockWriteSync).toHaveBeenCalled(); @@ -544,9 +543,9 @@ describe("Config export", () => { mockAxiosGet("https://myTeam.celonis.cloud/package-manager/api/core/packages/export/batch?packageKeys=key-1&packageKeys=key-2&packageKeys=key-3&withDependencies=false", exportedPackagesZip.toBuffer()); mockAxiosPost("https://myTeam.celonis.cloud/package-manager/api/core/packages/export/batch/variables-with-assignments", []); - await new ConfigCommand().batchExportPackages(["key-1", "key-2", "key-3"], false); + await new ConfigCommandService(testContext).batchExportPackages(["key-1", "key-2", "key-3"], false); - const expectedFileName = testTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; + const expectedFileName = loggingTestTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; expect(fs.openSync).toHaveBeenCalledWith(expectedFileName, expect.anything(), expect.anything()); expect(mockWriteSync).toHaveBeenCalled(); }) diff --git a/tests/config/config-import.spec.ts b/tests/commands/configuration-management/config-import.spec.ts similarity index 80% rename from tests/config/config-import.spec.ts rename to tests/commands/configuration-management/config-import.spec.ts index e16c9640..bb0d0220 100644 --- a/tests/config/config-import.spec.ts +++ b/tests/commands/configuration-management/config-import.spec.ts @@ -1,29 +1,28 @@ -import {ConfigCommand} from "../../src/commands/config.command"; +import * as path from "path"; +import { mockCreateReadStream, mockExistsSync, mockReadFileSync } from "../../utls/fs-mock-utils"; +import { + PackageManifestTransport, PostPackageImportData, StudioPackageManifest, +} from "../../../src/commands/configuration-management/interfaces/package-export.interfaces"; import { mockAxiosGet, mockAxiosPost, - mockAxiosPut, mockedPostRequestBodyByUrl -} from "../utls/http-requests-mock"; -import { - PackageManifestTransport, - PostPackageImportData, - StudioPackageManifest -} from "../../src/interfaces/package-export-transport"; -import {ConfigUtils} from "../utls/config-utils"; -import {mockWriteFileSync, testTransport} from "../jest.setup"; -import * as path from "path"; -import {stringify} from "../../src/util/json"; -import {SpaceTransport} from "../../src/interfaces/save-space.interface"; -import {packageApi} from "../../src/api/package-api"; + mockAxiosPut, + mockedAxiosInstance, + mockedPostRequestBodyByUrl, +} from "../../utls/http-requests-mock"; +import { ConfigCommandService } from "../../../src/commands/configuration-management/config-command.service"; +import { testContext } from "../../utls/test-context"; +import { loggingTestTransport, mockWriteFileSync } from "../../jest.setup"; +import { SpaceTransport } from "../../../src/commands/studio/interfaces/space.interface"; import { ContentNodeTransport, - PackageManagerVariableType, - VariablesAssignments -} from "../../src/interfaces/package-manager.interfaces"; -import {mockCreateReadStream, mockExistsSync, mockReadFileSync} from "../utls/fs-mock-utils"; -import {BatchExportImportConstants} from "../../src/interfaces/batch-export-import-constants"; - -import {spaceApi} from "../../src/api/space-api"; + PackageManagerVariableType, VariablesAssignments, +} from "../../../src/commands/studio/interfaces/package-manager.interfaces"; +import { + BatchExportImportConstants +} from "../../../src/commands/configuration-management/interfaces/batch-export-import.constants"; +import { ConfigUtils } from "../../utls/config-utils"; +import { stringify } from "../../../src/core/utils/json"; describe("Config import", () => { @@ -55,9 +54,9 @@ describe("Config import", () => { mockAxiosPost("https://myTeam.celonis.cloud/package-manager/api/core/packages/import/batch", importResponse); - await new ConfigCommand().batchImportPackages("./export_file.zip", overwrite); + await new ConfigCommandService(testContext).batchImportPackages("./export_file.zip", overwrite); - const expectedFileName = testTransport.logMessages[0].message.split(LOG_MESSAGE)[1]; + const expectedFileName = loggingTestTransport.logMessages[0].message.split(LOG_MESSAGE)[1]; expect(mockWriteFileSync).toHaveBeenCalledWith(path.resolve(process.cwd(), expectedFileName), JSON.stringify(importResponse), {encoding: "utf-8"}); }) @@ -99,9 +98,9 @@ describe("Config import", () => { mockAxiosPost("https://myTeam.celonis.cloud/package-manager/api/core/packages/import/batch", importResponse); - await new ConfigCommand().batchImportPackages("./export_file.zip", true); + await new ConfigCommandService(testContext).batchImportPackages("./export_file.zip", true); - const expectedFileName = testTransport.logMessages[0].message.split(LOG_MESSAGE)[1]; + const expectedFileName = loggingTestTransport.logMessages[0].message.split(LOG_MESSAGE)[1]; expect(mockWriteFileSync).toHaveBeenCalledWith(path.resolve(process.cwd(), expectedFileName), JSON.stringify(importResponse), {encoding: "utf-8"}); }) @@ -128,7 +127,7 @@ describe("Config import", () => { mockAxiosGet("https://myTeam.celonis.cloud/package-manager/api/spaces", [space]); await expect( - new ConfigCommand().batchImportPackages("./export_file.zip", true) + new ConfigCommandService(testContext).batchImportPackages("./export_file.zip", true) ).rejects.toThrow("Provided space ID does not exist."); }) @@ -170,13 +169,11 @@ describe("Config import", () => { }]; mockAxiosPost("https://myTeam.celonis.cloud/package-manager/api/core/packages/import/batch", importResponse); - const movePackageToSpaceSpy = jest.spyOn(packageApi, "movePackageToSpace"); - await new ConfigCommand().batchImportPackages("./export_file.zip", true); - const expectedFileName = testTransport.logMessages[0].message.split(LOG_MESSAGE)[1]; + await new ConfigCommandService(testContext).batchImportPackages("./export_file.zip", true); + const expectedFileName = loggingTestTransport.logMessages[0].message.split(LOG_MESSAGE)[1]; expect(mockWriteFileSync).toHaveBeenCalledWith(path.resolve(process.cwd(), expectedFileName), JSON.stringify(importResponse), {encoding: "utf-8"}); - expect(movePackageToSpaceSpy).toBeCalledTimes(1) - expect(movePackageToSpaceSpy).toHaveBeenCalledWith("node-id", "spaceId"); + expect(mockedAxiosInstance.put).toHaveBeenCalledWith("https://myTeam.celonis.cloud/package-manager/api/packages/node-id/move/spaceId", expect.anything(), expect.anything()); }) it("Should batch import configs & map space ID by finding space with name as specified in manifest file", async () => { @@ -209,13 +206,12 @@ describe("Config import", () => { }]; mockAxiosPost("https://myTeam.celonis.cloud/package-manager/api/core/packages/import/batch", importResponse); - const createSpaceSpy = jest.spyOn(spaceApi, "createSpace"); - await new ConfigCommand().batchImportPackages("./export_file.zip", true); + await new ConfigCommandService(testContext).batchImportPackages("./export_file.zip", true); - const expectedFileName = testTransport.logMessages[0].message.split(LOG_MESSAGE)[1]; + const expectedFileName = loggingTestTransport.logMessages[0].message.split(LOG_MESSAGE)[1]; expect(mockWriteFileSync).toHaveBeenCalledWith(path.resolve(process.cwd(), expectedFileName), JSON.stringify(importResponse), {encoding: "utf-8"}); - expect(createSpaceSpy).toBeCalledTimes(0) + expect(mockedAxiosInstance.put).not.toHaveBeenCalledWith("https://myTeam.celonis.cloud/package-manager/api/spaces", expect.anything(), expect.anything()); }) it("Should batch import configs & create new space", async () => { @@ -257,13 +253,12 @@ describe("Config import", () => { }]; mockAxiosPost("https://myTeam.celonis.cloud/package-manager/api/core/packages/import/batch", importResponse); - const createSpaceSpy = jest.spyOn(spaceApi, "createSpace"); - await new ConfigCommand().batchImportPackages("./export_file.zip", true); + await new ConfigCommandService(testContext).batchImportPackages("./export_file.zip", true); - const expectedFileName = testTransport.logMessages[0].message.split(LOG_MESSAGE)[1]; + const expectedFileName = loggingTestTransport.logMessages[0].message.split(LOG_MESSAGE)[1]; expect(mockWriteFileSync).toHaveBeenCalledWith(path.resolve(process.cwd(), expectedFileName), JSON.stringify(importResponse), {encoding: "utf-8"}); - expect(createSpaceSpy).toBeCalledTimes(1) + expect(mockedAxiosInstance.put).not.toHaveBeenCalledWith("https://myTeam.celonis.cloud/package-manager/api/spaces", expect.anything(), expect.anything()); }) it("Should assign studio runtime variable values after import", async () => { @@ -317,10 +312,11 @@ describe("Config import", () => { mockAxiosPost(assignVariablesUrl, {}); mockAxiosGet("https://myTeam.celonis.cloud/package-manager/api/packages", [node]); - await new ConfigCommand().batchImportPackages("./export_file.zip", true); + await new ConfigCommandService(testContext).batchImportPackages("./export_file.zip", true); - const expectedFileName = testTransport.logMessages[0].message.split(LOG_MESSAGE)[1]; + const expectedFileName = loggingTestTransport.logMessages[0].message.split(LOG_MESSAGE)[1]; expect(mockWriteFileSync).toHaveBeenCalledWith(path.resolve(process.cwd(), expectedFileName), JSON.stringify(importResponse), {encoding: "utf-8"}); - expect(mockedPostRequestBodyByUrl.get(assignVariablesUrl)).toEqual(JSON.stringify([variableAssignment])); }) + expect(mockedPostRequestBodyByUrl.get(assignVariablesUrl)).toEqual(JSON.stringify([variableAssignment])); + }) }) diff --git a/tests/config/config-list-variables.spec.ts b/tests/commands/configuration-management/config-list-variables.spec.ts similarity index 65% rename from tests/config/config-list-variables.spec.ts rename to tests/commands/configuration-management/config-list-variables.spec.ts index a63c87bf..9c028a92 100644 --- a/tests/config/config-list-variables.spec.ts +++ b/tests/commands/configuration-management/config-list-variables.spec.ts @@ -1,12 +1,16 @@ -import {ConfigCommand} from "../../src/commands/config.command"; -import {mockWriteFileSync, testTransport} from "../jest.setup"; -import {FileService} from "../../src/services/file-service"; import * as path from "path"; -import {PackageKeyAndVersionPair, VariableManifestTransport} from "../../src/interfaces/package-export-transport"; -import {PackageManagerVariableType} from "../../src/interfaces/package-manager.interfaces"; -import {mockAxiosPost, mockedPostRequestBodyByUrl} from "../utls/http-requests-mock"; -import {parse} from "../../src/util/json"; import * as fs from "fs"; +import { parse } from "../../../src/core/utils/json"; +import { + PackageKeyAndVersionPair, + VariableManifestTransport, +} from "../../../src/commands/configuration-management/interfaces/package-export.interfaces"; +import { PackageManagerVariableType } from "../../../src/commands/studio/interfaces/package-manager.interfaces"; +import { mockAxiosPost, mockedPostRequestBodyByUrl } from "../../utls/http-requests-mock"; +import { ConfigCommandService } from "../../../src/commands/configuration-management/config-command.service"; +import { testContext } from "../../utls/test-context"; +import { loggingTestTransport, mockWriteFileSync } from "../../jest.setup"; +import { FileService } from "../../../src/core/utils/file-service"; describe("Config listVariables", () => { @@ -108,24 +112,24 @@ describe("Config listVariables", () => { }) it("Should list fixed variables for non-json response", async () => { - await new ConfigCommand().listVariables(false, ["key-1:1.0.0", "key-2:1.0.0", "key-3:1.0.0"], null); + await new ConfigCommandService(testContext).listVariables(false, ["key-1:1.0.0", "key-2:1.0.0", "key-3:1.0.0"], null); - expect(testTransport.logMessages.length).toBe(3); - expect(testTransport.logMessages[0].message).toContain(JSON.stringify(fixedVariableManifests[0])); - expect(testTransport.logMessages[1].message).toContain(JSON.stringify(fixedVariableManifests[1])); - expect(testTransport.logMessages[2].message).toContain(JSON.stringify(fixedVariableManifests[2])); + expect(loggingTestTransport.logMessages.length).toBe(3); + expect(loggingTestTransport.logMessages[0].message).toContain(JSON.stringify(fixedVariableManifests[0])); + expect(loggingTestTransport.logMessages[1].message).toContain(JSON.stringify(fixedVariableManifests[1])); + expect(loggingTestTransport.logMessages[2].message).toContain(JSON.stringify(fixedVariableManifests[2])); const variableExportRequest = parse(mockedPostRequestBodyByUrl.get("https://myTeam.celonis.cloud/package-manager/api/core/packages/export/batch/variables-with-assignments")); expect(variableExportRequest).toEqual(packageKeyAndVersionPairs); }) it("Should export fixed variables for json response", async () => { - await new ConfigCommand().listVariables(true, ["key-1:1.0.0", "key-2:1.0.0", "key-3:1.0.0"], null); + await new ConfigCommandService(testContext).listVariables(true, ["key-1:1.0.0", "key-2:1.0.0", "key-3:1.0.0"], null); - expect(testTransport.logMessages.length).toBe(1); - expect(testTransport.logMessages[0].message).toContain(FileService.fileDownloadedMessage); + expect(loggingTestTransport.logMessages.length).toBe(1); + expect(loggingTestTransport.logMessages[0].message).toContain(FileService.fileDownloadedMessage); - const expectedFileName = testTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; + const expectedFileName = loggingTestTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; expect(mockWriteFileSync).toHaveBeenCalledWith(path.resolve(process.cwd(), expectedFileName), JSON.stringify(fixedVariableManifests), {encoding: "utf-8"}); const variableExportRequest = parse(mockedPostRequestBodyByUrl.get("https://myTeam.celonis.cloud/package-manager/api/core/packages/export/batch/variables-with-assignments")); @@ -136,12 +140,12 @@ describe("Config listVariables", () => { (fs.existsSync as jest.Mock).mockReturnValue(true); (fs.readFileSync as jest.Mock).mockReturnValue(JSON.stringify(packageKeyAndVersionPairs)); - await new ConfigCommand().listVariables(false, [], "key_version_mapping.json"); + await new ConfigCommandService(testContext).listVariables(false, [], "key_version_mapping.json"); - expect(testTransport.logMessages.length).toBe(3); - expect(testTransport.logMessages[0].message).toContain(JSON.stringify(fixedVariableManifests[0])); - expect(testTransport.logMessages[1].message).toContain(JSON.stringify(fixedVariableManifests[1])); - expect(testTransport.logMessages[2].message).toContain(JSON.stringify(fixedVariableManifests[2])); + expect(loggingTestTransport.logMessages.length).toBe(3); + expect(loggingTestTransport.logMessages[0].message).toContain(JSON.stringify(fixedVariableManifests[0])); + expect(loggingTestTransport.logMessages[1].message).toContain(JSON.stringify(fixedVariableManifests[1])); + expect(loggingTestTransport.logMessages[2].message).toContain(JSON.stringify(fixedVariableManifests[2])); const variableExportRequest = parse(mockedPostRequestBodyByUrl.get("https://myTeam.celonis.cloud/package-manager/api/core/packages/export/batch/variables-with-assignments")); expect(variableExportRequest).toEqual(packageKeyAndVersionPairs); @@ -151,12 +155,12 @@ describe("Config listVariables", () => { (fs.existsSync as jest.Mock).mockReturnValue(true); (fs.readFileSync as jest.Mock).mockReturnValue(JSON.stringify(packageKeyAndVersionPairs)); - await new ConfigCommand().listVariables(true, [], "key_version_mapping.json"); + await new ConfigCommandService(testContext).listVariables(true, [], "key_version_mapping.json"); - expect(testTransport.logMessages.length).toBe(1); - expect(testTransport.logMessages[0].message).toContain(FileService.fileDownloadedMessage); + expect(loggingTestTransport.logMessages.length).toBe(1); + expect(loggingTestTransport.logMessages[0].message).toContain(FileService.fileDownloadedMessage); - const expectedFileName = testTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; + const expectedFileName = loggingTestTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; expect(mockWriteFileSync).toHaveBeenCalledWith(path.resolve(process.cwd(), expectedFileName), JSON.stringify(fixedVariableManifests), {encoding: "utf-8"}); const variableExportRequest = parse(mockedPostRequestBodyByUrl.get("https://myTeam.celonis.cloud/package-manager/api/core/packages/export/batch/variables-with-assignments")); @@ -165,7 +169,7 @@ describe("Config listVariables", () => { it("Should throw error if no mapping and no file path is provided", async () => { try { - await new ConfigCommand().listVariables(true, [], ""); + await new ConfigCommandService(testContext).listVariables(true, [], ""); } catch (e) { expect(e.message).toEqual("Please provide keysByVersion mappings or file path!"); } diff --git a/tests/config/config-list.spec.ts b/tests/commands/configuration-management/config-list.spec.ts similarity index 65% rename from tests/config/config-list.spec.ts rename to tests/commands/configuration-management/config-list.spec.ts index 53433907..b1c6af02 100644 --- a/tests/config/config-list.spec.ts +++ b/tests/commands/configuration-management/config-list.spec.ts @@ -1,15 +1,18 @@ -import {PackageExportTransport} from "../../src/interfaces/package-export-transport"; -import {ConfigCommand} from "../../src/commands/config.command"; -import {mockWriteFileSync, testTransport} from "../jest.setup"; +import * as path from "path"; +import { stringify } from "../../../src/core/utils/json"; +import { PacmanApiUtils } from "../../utls/pacman-api.utils"; +import { mockAxiosGet } from "../../utls/http-requests-mock"; +import { ConfigCommandService } from "../../../src/commands/configuration-management/config-command.service"; +import { testContext } from "../../utls/test-context"; +import { loggingTestTransport, mockWriteFileSync } from "../../jest.setup"; import { ContentNodeTransport, - PackageWithVariableAssignments, - StudioComputeNodeDescriptor -} from "../../src/interfaces/package-manager.interfaces"; -import * as path from "path"; -import {FileService} from "../../src/services/file-service"; -import {mockAxiosGet} from "../utls/http-requests-mock"; -import {PackageManagerApiUtils} from "../utls/package-manager-api.utils"; + PackageWithVariableAssignments, StudioComputeNodeDescriptor, +} from "../../../src/commands/studio/interfaces/package-manager.interfaces"; +import { FileService } from "../../../src/core/utils/file-service"; +import { + PackageExportTransport +} from "../../../src/commands/configuration-management/interfaces/package-export.interfaces"; describe("Config list", () => { @@ -19,8 +22,8 @@ describe("Config list", () => { ])( "Should list all packages by key for non-json response with flavors: %p", async (flavors: string) => { - const firstPackage = PackageManagerApiUtils.buildPackageExportTransport("key-1", "name-1"); - const secondPackage = PackageManagerApiUtils.buildPackageExportTransport("key-2", "name-2"); + const firstPackage = PacmanApiUtils.buildPackageExportTransport("key-1", "name-1"); + const secondPackage = PacmanApiUtils.buildPackageExportTransport("key-2", "name-2"); const flavorsArray = flavors !== "" ? flavors.split(",") : []; @@ -30,26 +33,26 @@ describe("Config list", () => { mockAxiosGet("https://myTeam.celonis.cloud/package-manager/api/core/packages/export/list?" + urlParams.toString(), [firstPackage, secondPackage]); - await new ConfigCommand().listActivePackages(false, flavorsArray, false, [], null, null); + await new ConfigCommandService(testContext).listActivePackages(false, flavorsArray, false, [], null, null); - expect(testTransport.logMessages.length).toBe(2); - expect(testTransport.logMessages[0].message).toContain(`${firstPackage.name} - Key: "${firstPackage.key}"`); - expect(testTransport.logMessages[1].message).toContain(`${secondPackage.name} - Key: "${secondPackage.key}"`); + expect(loggingTestTransport.logMessages.length).toBe(2); + expect(loggingTestTransport.logMessages[0].message).toContain(`${firstPackage.name} - Key: "${firstPackage.key}"`); + expect(loggingTestTransport.logMessages[1].message).toContain(`${secondPackage.name} - Key: "${secondPackage.key}"`); } ) it("Should export all packages for json response with spaceId set for studio packages", async () => { - const firstPackage = PackageManagerApiUtils.buildPackageExportTransport("key-1", "name-1"); - const secondPackage = PackageManagerApiUtils.buildPackageExportTransport("key-2", "name-2"); + const firstPackage = PacmanApiUtils.buildPackageExportTransport("key-1", "name-1"); + const secondPackage = PacmanApiUtils.buildPackageExportTransport("key-2", "name-2"); - const studioPackage: ContentNodeTransport = PackageManagerApiUtils.buildContentNodeTransport("key-1", "spaceId-1"); + const studioPackage: ContentNodeTransport = PacmanApiUtils.buildContentNodeTransport("key-1", "spaceId-1"); mockAxiosGet("https://myTeam.celonis.cloud/package-manager/api/core/packages/export/list?withDependencies=false", [{...firstPackage}, {...secondPackage}]); mockAxiosGet("https://myTeam.celonis.cloud/package-manager/api/packages/with-variable-assignments?type=DATA_MODEL", [studioPackage]); - await new ConfigCommand().listActivePackages(true, [], false, [], null, null); + await new ConfigCommandService(testContext).listActivePackages(true, [], false, [], null, null); - const expectedFileName = testTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; + const expectedFileName = loggingTestTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; expect(mockWriteFileSync).toHaveBeenCalledWith(path.resolve(process.cwd(), expectedFileName), expect.any(String), {encoding: "utf-8"}); @@ -64,8 +67,8 @@ describe("Config list", () => { }) it("Should export all packages with dependencies and data models set for json response and withDependencies option", async () => { - const firstPackage = PackageManagerApiUtils.buildPackageExportTransport("key-1", "name-1"); - const secondPackage = PackageManagerApiUtils.buildPackageExportTransport("key-2", "name-2"); + const firstPackage = PacmanApiUtils.buildPackageExportTransport("key-1", "name-1"); + const secondPackage = PacmanApiUtils.buildPackageExportTransport("key-2", "name-2"); mockAxiosGet("https://myTeam.celonis.cloud/package-manager/api/core/packages/export/list?withDependencies=true", [{...firstPackage}, {...secondPackage}]); mockAxiosGet("https://myTeam.celonis.cloud/package-manager/api/packages/with-variable-assignments?type=DATA_MODEL", []); @@ -93,9 +96,9 @@ describe("Config list", () => { }; mockAxiosGet("https://myTeam.celonis.cloud/package-manager/api/compute-pools/data-models/details", [dataModelDetailResponse]); - await new ConfigCommand().listActivePackages(true, [], true, [], null, null); + await new ConfigCommandService(testContext).listActivePackages(true, [], true, [], null, null); - const expectedFileName = testTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; + const expectedFileName = loggingTestTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; expect(mockWriteFileSync).toHaveBeenCalledWith(path.resolve(process.cwd(), expectedFileName), expect.any(String), {encoding: "utf-8"}); @@ -110,17 +113,17 @@ describe("Config list", () => { }) it("Should export packagesByKeys with spaceId set for studio packages", async () => { - const firstPackage = PackageManagerApiUtils.buildPackageExportTransport("key-1", "name-1"); - const secondPackage = PackageManagerApiUtils.buildPackageExportTransport("key-2", "name-2"); + const firstPackage = PacmanApiUtils.buildPackageExportTransport("key-1", "name-1"); + const secondPackage = PacmanApiUtils.buildPackageExportTransport("key-2", "name-2"); - const studioPackage: ContentNodeTransport = PackageManagerApiUtils.buildContentNodeTransport("key-1", "spaceId-1"); + const studioPackage: ContentNodeTransport = PacmanApiUtils.buildContentNodeTransport("key-1", "spaceId-1"); mockAxiosGet("https://myTeam.celonis.cloud/package-manager/api/core/packages/export/list-by-keys?packageKeys=key-1&packageKeys=key-2&withDependencies=false", [{...firstPackage}, {...secondPackage}]); mockAxiosGet("https://myTeam.celonis.cloud/package-manager/api/packages/with-variable-assignments?type=DATA_MODEL", [studioPackage]); - await new ConfigCommand().listActivePackages(true, [], false, [firstPackage.key, secondPackage.key], null, null); + await new ConfigCommandService(testContext).listActivePackages(true, [], false, [firstPackage.key, secondPackage.key], null, null); - const expectedFileName = testTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; + const expectedFileName = loggingTestTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; expect(mockWriteFileSync).toHaveBeenCalledWith(path.resolve(process.cwd(), expectedFileName), expect.any(String), {encoding: "utf-8"}); @@ -135,8 +138,8 @@ describe("Config list", () => { }) it("Should export packagesByKeys with dependencies and data models set for withDependencies option", async () => { - const firstPackage = PackageManagerApiUtils.buildPackageExportTransport("key-1", "name-1"); - const secondPackage = PackageManagerApiUtils.buildPackageExportTransport("key-2", "name-2"); + const firstPackage = PacmanApiUtils.buildPackageExportTransport("key-1", "name-1"); + const secondPackage = PacmanApiUtils.buildPackageExportTransport("key-2", "name-2"); mockAxiosGet("https://myTeam.celonis.cloud/package-manager/api/core/packages/export/list-by-keys?packageKeys=key-1&packageKeys=key-2&withDependencies=true", [{...firstPackage}, {...secondPackage}]); mockAxiosGet("https://myTeam.celonis.cloud/package-manager/api/packages/with-variable-assignments?type=DATA_MODEL", []); @@ -164,9 +167,9 @@ describe("Config list", () => { }; mockAxiosGet("https://myTeam.celonis.cloud/package-manager/api/compute-pools/data-models/details", [dataModelDetailResponse]); - await new ConfigCommand().listActivePackages(true, [], true, [firstPackage.key, secondPackage.key], null, null); + await new ConfigCommandService(testContext).listActivePackages(true, [], true, [firstPackage.key, secondPackage.key], null, null); - const expectedFileName = testTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; + const expectedFileName = loggingTestTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; expect(mockWriteFileSync).toHaveBeenCalledWith(path.resolve(process.cwd(), expectedFileName), expect.any(String), {encoding: "utf-8"}); @@ -181,30 +184,30 @@ describe("Config list", () => { }) it("Should list all packages filtered by variable value", async () => { - const firstPackage = PackageManagerApiUtils.buildPackageExportTransport("key-1", "name-1"); - const secondPackage = PackageManagerApiUtils.buildPackageExportTransport("key-2", "name-2"); + const firstPackage = PacmanApiUtils.buildPackageExportTransport("key-1", "name-1"); + const secondPackage = PacmanApiUtils.buildPackageExportTransport("key-2", "name-2"); mockAxiosGet("https://myTeam.celonis.cloud/package-manager/api/core/packages/export/list-by-variable-value?variableValue=1", [{...firstPackage}, {...secondPackage}]); mockAxiosGet("https://myTeam.celonis.cloud/package-manager/api/packages/with-variable-assignments?type=DATA_MODEL", []); - await new ConfigCommand().listActivePackages(false, [], false, [], "1", null); + await new ConfigCommandService(testContext).listActivePackages(false, [], false, [], "1", null); - expect(testTransport.logMessages.length).toBe(2); - expect(testTransport.logMessages[0].message).toContain(`${firstPackage.name} - Key: "${firstPackage.key}"`); - expect(testTransport.logMessages[1].message).toContain(`${secondPackage.name} - Key: "${secondPackage.key}"`); + expect(loggingTestTransport.logMessages.length).toBe(2); + expect(loggingTestTransport.logMessages[0].message).toContain(`${firstPackage.name} - Key: "${firstPackage.key}"`); + expect(loggingTestTransport.logMessages[1].message).toContain(`${secondPackage.name} - Key: "${secondPackage.key}"`); }) it("Should export all packages for json response filtered by variable value", async () => { - const firstPackage = PackageManagerApiUtils.buildPackageExportTransport("key-1", "name-1"); - const secondPackage = PackageManagerApiUtils.buildPackageExportTransport("key-2", "name-2"); + const firstPackage = PacmanApiUtils.buildPackageExportTransport("key-1", "name-1"); + const secondPackage = PacmanApiUtils.buildPackageExportTransport("key-2", "name-2"); mockAxiosGet("https://myTeam.celonis.cloud/package-manager/api/core/packages/export/list-by-variable-value?variableValue=1", [{...firstPackage}, {...secondPackage}]); mockAxiosGet("https://myTeam.celonis.cloud/package-manager/api/packages/with-variable-assignments?type=DATA_MODEL", []); - await new ConfigCommand().listActivePackages(true, [], false, [], "1", null); + await new ConfigCommandService(testContext).listActivePackages(true, [], false, [], "1", null); - const expectedFileName = testTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; + const expectedFileName = loggingTestTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; expect(mockWriteFileSync).toHaveBeenCalledWith(path.resolve(process.cwd(), expectedFileName), expect.any(String), {encoding: "utf-8"}); diff --git a/tests/list/assignments.spec.ts b/tests/commands/configuration-management/list-assignments.spec.ts similarity index 57% rename from tests/list/assignments.spec.ts rename to tests/commands/configuration-management/list-assignments.spec.ts index f62a3998..1230a4f7 100644 --- a/tests/list/assignments.spec.ts +++ b/tests/commands/configuration-management/list-assignments.spec.ts @@ -1,8 +1,9 @@ -import {VariableCommand} from "../../src/commands/variable.command"; -import {FileService} from "../../src/services/file-service"; import * as path from "path"; -import {mockWriteFileSync, testTransport} from "../jest.setup"; -import { mockedAxiosInstance } from "../utls/http-requests-mock"; +import { mockedAxiosInstance } from "../../utls/http-requests-mock"; +import { VariableCommandService } from "../../../src/commands/configuration-management/variable-command.service"; +import { testContext } from "../../utls/test-context"; +import { loggingTestTransport, mockWriteFileSync } from "../../jest.setup"; +import { FileService } from "../../../src/core/utils/file-service"; describe("List assignments", () => { @@ -14,11 +15,11 @@ describe("List assignments", () => { const resp = {data: mockAssignmentValues}; (mockedAxiosInstance.get as jest.Mock).mockResolvedValue(resp); - await new VariableCommand().listAssignments("DATA_MODEL", false, ""); + await new VariableCommandService(testContext).listAssignments("DATA_MODEL", false, ""); - expect(testTransport.logMessages.length).toBe(2); - expect(testTransport.logMessages[0].message).toContain('{"id":"id-1"}'); - expect(testTransport.logMessages[1].message).toContain('{"id":"id-2"}'); + expect(loggingTestTransport.logMessages.length).toBe(2); + expect(loggingTestTransport.logMessages[0].message).toContain('{"id":"id-1"}'); + expect(loggingTestTransport.logMessages[1].message).toContain('{"id":"id-2"}'); expect(mockedAxiosInstance.get).toHaveBeenCalledWith("https://myTeam.celonis.cloud/package-manager/api/compute-pools/pools-with-data-models", expect.anything()) }) @@ -31,12 +32,12 @@ describe("List assignments", () => { const resp = {data: mockAssignmentValues}; (mockedAxiosInstance.get as jest.Mock).mockResolvedValue(resp); - await new VariableCommand().listAssignments("DATA_MODEL", true, ""); + await new VariableCommandService(testContext).listAssignments("DATA_MODEL", true, ""); - expect(testTransport.logMessages.length).toBe(1); - expect(testTransport.logMessages[0].message).toContain(FileService.fileDownloadedMessage); + expect(loggingTestTransport.logMessages.length).toBe(1); + expect(loggingTestTransport.logMessages[0].message).toContain(FileService.fileDownloadedMessage); - const expectedFileName = testTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; + const expectedFileName = loggingTestTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1]; expect(mockWriteFileSync).toHaveBeenCalledWith(path.resolve(process.cwd(), expectedFileName), JSON.stringify(mockAssignmentValues), {encoding: "utf-8"}); }) @@ -46,7 +47,7 @@ describe("List assignments", () => { const resp = {data: mockAssignmentValues}; (mockedAxiosInstance.get as jest.Mock).mockResolvedValue(resp); - await new VariableCommand().listAssignments("CONNECTION", false, "param1=value1,param2=value2"); + await new VariableCommandService(testContext).listAssignments("CONNECTION", false, "param1=value1,param2=value2"); expect(mockedAxiosInstance.get).toHaveBeenCalledWith("https://myTeam.celonis.cloud/process-automation-v2/api/connections?param1=value1¶m2=value2", expect.anything()) }) @@ -55,7 +56,7 @@ describe("List assignments", () => { const type: string = "DUMMY_UNSUPPORTED_TYPE"; try { - await new VariableCommand().listAssignments(type, false, ""); + await new VariableCommandService(testContext).listAssignments(type, false, ""); } catch (e) { if (!(e.message === `Variable type ${type} not supported.`)) { fail(); diff --git a/tests/jest.setup.ts b/tests/jest.setup.ts index 722b8fb5..ae3002dd 100644 --- a/tests/jest.setup.ts +++ b/tests/jest.setup.ts @@ -1,12 +1,11 @@ -import * as fs from 'fs'; -import {setDefaultProfile} from "./utls/context-mock"; -import {TestTransport} from "./utls/test-transport"; -import {logger} from "../src/util/logger"; +// Mock the modules using Jest +import * as fs from "fs"; import { mockAxios } from "./utls/http-requests-mock"; +import { LoggingTestTransport } from "./utls/logging-test-transport"; +import { logger } from "../src/core/utils/logger"; -// Mock the modules using Jest mockAxios(); -jest.mock('fs'); +jest.mock("fs"); const mockWriteFileSync = jest.fn(); (fs.writeFileSync as jest.Mock).mockImplementation(mockWriteFileSync); @@ -16,18 +15,14 @@ const mockWriteSync = jest.fn(); afterEach(() => { jest.clearAllMocks(); -}) - -beforeAll(() => { - setDefaultProfile(); -}) +}); -let testTransport; +let loggingTestTransport: LoggingTestTransport; beforeEach(() => { jest.clearAllMocks(); - testTransport = new TestTransport({}) - logger.add(testTransport); -}) + loggingTestTransport = new LoggingTestTransport({}); + logger.add(loggingTestTransport); +}); -export {testTransport, mockWriteFileSync, mockWriteSync}; \ No newline at end of file +export {loggingTestTransport, mockWriteFileSync, mockWriteSync}; \ No newline at end of file diff --git a/tests/utls/config-utils.ts b/tests/utls/config-utils.ts index e7962788..74825257 100644 --- a/tests/utls/config-utils.ts +++ b/tests/utls/config-utils.ts @@ -3,9 +3,9 @@ import { DependencyTransport, NodeConfiguration, NodeExportTransport, PackageManifestTransport, StudioPackageManifest, -} from "../../src/interfaces/package-export-transport"; -import {stringify} from "../../src/util/json"; -import {SpaceTransport} from "../../src/interfaces/save-space.interface"; +} from "../../src/commands/configuration-management/interfaces/package-export.interfaces"; +import { stringify } from "../../src/core/utils/json"; +import { SpaceTransport } from "../../src/commands/studio/interfaces/space.interface"; export class ConfigUtils { @@ -104,4 +104,4 @@ export class ConfigUtils { runtimeVariableAssignments: [] }; } -} \ No newline at end of file +} diff --git a/tests/utls/context-mock.ts b/tests/utls/context-mock.ts deleted file mode 100644 index 378d3276..00000000 --- a/tests/utls/context-mock.ts +++ /dev/null @@ -1,13 +0,0 @@ -import {contextService} from "../../src/services/context.service"; - -export function setDefaultProfile(): void { - contextService.setContext({ - profile: { - name: "test", - type: "Key", - team: "https://myTeam.celonis.cloud/", - apiToken: "YnQ3N2M0M2ItYzQ3OS00YzgyLTg0ODgtOWNkNzhiNzYwOTU2OlFkNnBpVCs0M0JBYm1ZWGlCZ2hPd245aldwWTNubFQyYVFOTFBUeHEwdUxM", - authenticationType: "Bearer" - } - }); -} diff --git a/tests/utls/http-requests-mock.ts b/tests/utls/http-requests-mock.ts index 3e01d5d5..d02d1c17 100644 --- a/tests/utls/http-requests-mock.ts +++ b/tests/utls/http-requests-mock.ts @@ -1,10 +1,9 @@ import { AxiosInstance } from "axios"; import {Readable} from "stream"; -import { AxiosInitializer } from "../../src/util/axios-initializer"; +import { AxiosInitializer } from "../../src/core/http/axios-initializer"; const mockedAxiosInstance = {} as AxiosInstance; - const mockedGetResponseByUrl = new Map(); const mockedPostResponseByUrl = new Map(); const mockedPostRequestBodyByUrl = new Map(); diff --git a/tests/utls/logging-test-transport.ts b/tests/utls/logging-test-transport.ts new file mode 100644 index 00000000..f3848e04 --- /dev/null +++ b/tests/utls/logging-test-transport.ts @@ -0,0 +1,19 @@ +import * as Transport from "winston-transport"; +import {LogEntry} from "winston"; + +export class LoggingTestTransport extends Transport { + public logMessages: LogEntry[] = []; + + constructor(options: any) { + super(options); + } + + public log(logEntry: LogEntry, callback: () => void): void { + if (logEntry.level.includes("debug")) { + callback(); + return; + } + this.logMessages.push(logEntry); + callback(); + } +} \ No newline at end of file diff --git a/tests/utls/package-manager-api.utils.ts b/tests/utls/pacman-api.utils.ts similarity index 73% rename from tests/utls/package-manager-api.utils.ts rename to tests/utls/pacman-api.utils.ts index 163f3c31..42ba8a26 100644 --- a/tests/utls/package-manager-api.utils.ts +++ b/tests/utls/pacman-api.utils.ts @@ -1,8 +1,10 @@ -import {PackageExportTransport} from "../../src/interfaces/package-export-transport"; -import {SpaceTransport} from "../../src/interfaces/save-space.interface"; -import {ContentNodeTransport} from "../../src/interfaces/package-manager.interfaces"; +import { + PackageExportTransport +} from "../../src/commands/configuration-management/interfaces/package-export.interfaces"; +import { ContentNodeTransport } from "../../src/commands/studio/interfaces/package-manager.interfaces"; +import { SpaceTransport } from "../../src/commands/studio/interfaces/space.interface"; -export class PackageManagerApiUtils { +export class PacmanApiUtils { public static buildPackageExportTransport = (key: string, name: string): PackageExportTransport => { return { id: "", @@ -38,4 +40,4 @@ export class PackageManagerApiUtils { iconReference, }; } -} \ No newline at end of file +} diff --git a/tests/utls/test-context.ts b/tests/utls/test-context.ts new file mode 100644 index 00000000..e41d6937 --- /dev/null +++ b/tests/utls/test-context.ts @@ -0,0 +1,13 @@ +import { Context } from "../../src/core/command/cli-context"; +import { HttpClient } from "../../src/core/http/http-client"; + +const testContext = new Context({}); +testContext.profile = { + name: "test", + type: "Key", + team: "https://myTeam.celonis.cloud/", + apiToken: "test-token", + authenticationType: "Bearer" +} +testContext.httpClient = new HttpClient(testContext); +export { testContext }; diff --git a/tests/utls/test-transport.ts b/tests/utls/test-transport.ts deleted file mode 100644 index a0dee9f2..00000000 --- a/tests/utls/test-transport.ts +++ /dev/null @@ -1,15 +0,0 @@ -import * as Transport from "winston-transport"; -import {LogEntry} from "winston"; - -export class TestTransport extends Transport { - public logMessages: LogEntry[] = []; - - constructor(options: any) { - super(options); - } - - public log(info: LogEntry, callback: () => void): void { - this.logMessages.push(info); - callback(); - } -} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index b3e7c60f..97f1f6ce 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,5 +14,5 @@ "experimentalDecorators": true, "types": ["node", "jest"], }, - "exclude": ["./tests", "./jest.config.ts"] + "exclude": ["./tests", "./jest.config.ts", "./dist/"] } diff --git a/yarn.lock b/yarn.lock index 41c43a62..4124240a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,7 +4,7 @@ "@ampproject/remapping@^2.2.0": version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: "@jridgewell/gen-mapping" "^0.3.5" @@ -12,7 +12,7 @@ "@aws-crypto/crc32@5.2.0": version "5.2.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-5.2.0.tgz#cfcc22570949c98c6689cfcbd2d693d36cdae2e1" + resolved "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz" integrity sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg== dependencies: "@aws-crypto/util" "^5.2.0" @@ -21,7 +21,7 @@ "@aws-crypto/sha256-browser@5.2.0": version "5.2.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz#153895ef1dba6f9fce38af550e0ef58988eb649e" + resolved "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz" integrity sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw== dependencies: "@aws-crypto/sha256-js" "^5.2.0" @@ -34,7 +34,7 @@ "@aws-crypto/sha256-js@5.2.0", "@aws-crypto/sha256-js@^5.2.0": version "5.2.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz#c4fdb773fdbed9a664fc1a95724e206cf3860042" + resolved "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz" integrity sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA== dependencies: "@aws-crypto/util" "^5.2.0" @@ -43,14 +43,14 @@ "@aws-crypto/supports-web-crypto@^5.2.0": version "5.2.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz#a1e399af29269be08e695109aa15da0a07b5b5fb" + resolved "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz" integrity sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg== dependencies: tslib "^2.6.2" "@aws-crypto/util@^5.2.0": version "5.2.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-5.2.0.tgz#71284c9cffe7927ddadac793c14f14886d3876da" + resolved "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz" integrity sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ== dependencies: "@aws-sdk/types" "^3.222.0" @@ -59,7 +59,7 @@ "@aws-sdk/client-cloudwatch-logs@^3.624.0": version "3.732.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.732.0.tgz#4fc0d78e9af3cb7f434b8068f253ab605592130f" + resolved "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.732.0.tgz" integrity sha512-R5H68f8P3n0nxMJ7UGvjCQq79UTP6jvxAeHrcrprQ90hfI2vCMjLpy5Px/GOTOjtkVSpggyeI90Q9y2qGQECig== dependencies: "@aws-crypto/sha256-browser" "5.2.0" @@ -109,7 +109,7 @@ "@aws-sdk/client-cognito-identity@3.731.1": version "3.731.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.731.1.tgz#ddedb7b8b38a4c7c57883928c1be270bcb4c8f54" + resolved "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.731.1.tgz" integrity sha512-hlYxRERFNxa4Jplh8rjxbCvk6e4ybNKu2wQdiK46GS2N6io9Z62/CNqx3bMiqmjhk92LWXnYcpYwI2MG/WOEMQ== dependencies: "@aws-crypto/sha256-browser" "5.2.0" @@ -154,7 +154,7 @@ "@aws-sdk/client-iam@^3.624.0": version "3.731.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-iam/-/client-iam-3.731.1.tgz#ddb914d954505cc086564bd4f4dbfe47e23c7e87" + resolved "https://registry.npmjs.org/@aws-sdk/client-iam/-/client-iam-3.731.1.tgz" integrity sha512-GLsUbzDSWXc+Jmgm1t4/A9VEu9zVeDn/u/rywMQgZ6jkkB795fvyyS/PyIdqvGiCrKMGBLn7VW9Uk130a1BLoA== dependencies: "@aws-crypto/sha256-browser" "5.2.0" @@ -200,7 +200,7 @@ "@aws-sdk/client-lambda@^3.624.0": version "3.731.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-lambda/-/client-lambda-3.731.1.tgz#2c5e2c9b91c59ab8edc1d1262386eb4a5f2c48db" + resolved "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.731.1.tgz" integrity sha512-W6fjtBVFjq+loCKKO4Gi/oOFclUPTdtQflx/tTZrOej2OMy/CgCFdqoxyc017+MkfYc3v1ZX0P7pl/qQiBAWfQ== dependencies: "@aws-crypto/sha256-browser" "5.2.0" @@ -250,7 +250,7 @@ "@aws-sdk/client-sfn@^3.624.0": version "3.731.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sfn/-/client-sfn-3.731.1.tgz#5e7d2f65bc5401202975b7be8d5572d32f62791e" + resolved "https://registry.npmjs.org/@aws-sdk/client-sfn/-/client-sfn-3.731.1.tgz" integrity sha512-XKJQuRvULWAL3ONx76w6xi3Ob4L1KzgGpWd6osiW+4+3lM/SAVLCra10DjSNFhsqOOANyAezX/p3dGM2FgF61Q== dependencies: "@aws-crypto/sha256-browser" "5.2.0" @@ -297,7 +297,7 @@ "@aws-sdk/client-sso@3.731.0": version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.731.0.tgz#6e3c13f9865863ad1fdedf848710d5fe9aa0cad6" + resolved "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.731.0.tgz" integrity sha512-O4C/UYGgqMsBg21MMApFdgyh8BX568hQhbdoNFmRVTBoSnCZ3w+H4a1wBPX4Gyl0NX+ab6Xxo9rId8HiyPXJ0A== dependencies: "@aws-crypto/sha256-browser" "5.2.0" @@ -341,7 +341,7 @@ "@aws-sdk/core@3.731.0", "@aws-sdk/core@^3.624.0": version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.731.0.tgz#86b7cbdd63b20aa5e6339536d2c94a728dd4d83c" + resolved "https://registry.npmjs.org/@aws-sdk/core/-/core-3.731.0.tgz" integrity sha512-ithBN1VWASkvAIlozJmenqDvNnFddr/SZXAs58+jCnBHgy3tXLHABZGVNCjetZkHRqNdXEO1kirnoxaFeXMeDA== dependencies: "@aws-sdk/types" "3.731.0" @@ -358,7 +358,7 @@ "@aws-sdk/credential-provider-cognito-identity@3.731.1": version "3.731.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.731.1.tgz#f195044c6fb742db0a6b5eac3c763b634dc691c0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.731.1.tgz" integrity sha512-4MdhrZFkMxS/5ZUXaf6NIVa7N3NV259Q10jvfd6AzePd6sq10stJSyShvV7nC1dc/XneHammpYdXV2hlh6Almw== dependencies: "@aws-sdk/client-cognito-identity" "3.731.1" @@ -369,7 +369,7 @@ "@aws-sdk/credential-provider-env@3.731.0": version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.731.0.tgz#456bee6ac9911f48c17f64a2955aa187cc91ef21" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.731.0.tgz" integrity sha512-h0WWZg4QMLgFVyIvQrC43zpVqsUWg1mPM1clpogP43B8+wEhDEQ4qWRzvFs3dQ4cqx/FLyDUZZF4cqgd94z7kw== dependencies: "@aws-sdk/core" "3.731.0" @@ -380,7 +380,7 @@ "@aws-sdk/credential-provider-http@3.731.0": version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.731.0.tgz#f3a2264744bd6af1c1de61b5ce2079c36f875fb3" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.731.0.tgz" integrity sha512-iRtrjtcYaWgbvtu2cvDhIsPWXZGvhy1Hgks4682MEBNTc9AUwlfvDrYz2EEnTtJJyrbOdEHVrYrzqD8qPyVLCg== dependencies: "@aws-sdk/core" "3.731.0" @@ -396,7 +396,7 @@ "@aws-sdk/credential-provider-ini@3.731.1", "@aws-sdk/credential-provider-ini@^3.624.0": version "3.731.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.731.1.tgz#eade17c4086ac67be0a75e8b5414ba9777d178d7" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.731.1.tgz" integrity sha512-0M0ejuqW8iHNcTH2ZXSY9m+I7Y06qVkj6k3vfQU9XaB//mTUCxxfGfqWAtgfr7Yi73egABTcPc0jyPdcvSW4Kw== dependencies: "@aws-sdk/core" "3.731.0" @@ -415,7 +415,7 @@ "@aws-sdk/credential-provider-node@3.731.1": version "3.731.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.731.1.tgz#2399fdcfd93ecc7f8a2c83f0580d8f16c63b65f8" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.731.1.tgz" integrity sha512-5c0ZiagMTPmWilXNffeXJCLoCEz97jilHr3QJWwf2GaTay4tzN+Ld71rpdfEenzUR7fuxEWFfVlwQbFOzFNYHg== dependencies: "@aws-sdk/credential-provider-env" "3.731.0" @@ -433,7 +433,7 @@ "@aws-sdk/credential-provider-process@3.731.0": version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.731.0.tgz#50cc40fa1919d6fc8ac9b8dea26b3ce317f15ece" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.731.0.tgz" integrity sha512-6yNMY6q3xHLbs2f2+C6GhvMrjTgtFBiPJJqKaPLsTIhlTRvh4sK8pGm3ITcma0jOxtPDIuoPfBAV8N8XVMBlZg== dependencies: "@aws-sdk/core" "3.731.0" @@ -445,7 +445,7 @@ "@aws-sdk/credential-provider-sso@3.731.1": version "3.731.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.731.1.tgz#bb2228a5cfac6521741e69a74c2db57ab0ceb0e4" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.731.1.tgz" integrity sha512-p1tp+rMUf5YNQLr8rVRmDgNtKGYLL0KCdq3K2hwwvFnx9MjReF1sA4lfm3xWsxBQM+j3QN9AvMQqBzDJ+NOSdw== dependencies: "@aws-sdk/client-sso" "3.731.0" @@ -459,7 +459,7 @@ "@aws-sdk/credential-provider-web-identity@3.731.1": version "3.731.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.731.1.tgz#1bb7b21ae579cbcc0b111e29319a2b5bdc187e85" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.731.1.tgz" integrity sha512-+ynAvEGWDR5ZJFxgpwwzhvlQ3WQ7BleWXU6JwpIw3yFrD4eZEn85b8DZC1aEz7C9kb1HSV6B3gpqHqlyS6wj8g== dependencies: "@aws-sdk/core" "3.731.0" @@ -471,7 +471,7 @@ "@aws-sdk/credential-providers@^3.624.0": version "3.731.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-providers/-/credential-providers-3.731.1.tgz#5b6484caa0649f99f3ee0a6ae4b19e7e6f846554" + resolved "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.731.1.tgz" integrity sha512-Rjb14vXPa3flBJu9YDZkld0pYuR15DESMWGvCtQgGhcgpY8QH7vzxPU2C224SgYYkP0JM+7SRfadbcI5seTFuw== dependencies: "@aws-sdk/client-cognito-identity" "3.731.1" @@ -493,7 +493,7 @@ "@aws-sdk/middleware-host-header@3.731.0": version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.731.0.tgz#7f62d4d1d6243bdba4c8737fc34668c95c6d0e1b" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.731.0.tgz" integrity sha512-ndAJsm5uWPPJRZowLKpB1zuL17qWlWVtCJP4I/ynBkq1PU1DijDXBul2UZaG6Mpvsgms1NXo/h9noHuK7T3v8w== dependencies: "@aws-sdk/types" "3.731.0" @@ -503,7 +503,7 @@ "@aws-sdk/middleware-logger@3.731.0": version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.731.0.tgz#8ab06f4c6c27be8893e3eb256d686e2bee5c4bf6" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.731.0.tgz" integrity sha512-IIZrOdjbY2vKzPJPrwE7FoFQCIPEL6UqURi8LEaiVyCag4p2fvaTN5pgKuQtGC2+iYd/HHcGT4qn2bAqF5Jmmw== dependencies: "@aws-sdk/types" "3.731.0" @@ -512,7 +512,7 @@ "@aws-sdk/middleware-recursion-detection@3.731.0": version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.731.0.tgz#c16057884029d9b10a822a47bfd51f59f3f8bf3a" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.731.0.tgz" integrity sha512-y6FLASB1iKWuR5tUipMyo77bt0lEl3OnCrrd2xw/H24avq1HhJjjPR0HHhJE6QKJzF/FYXeV88tcyPSMe32VDw== dependencies: "@aws-sdk/types" "3.731.0" @@ -522,7 +522,7 @@ "@aws-sdk/middleware-user-agent@3.731.0": version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.731.0.tgz#5a0c2b118c1a63a37cc4d4db1eb585115ffe4285" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.731.0.tgz" integrity sha512-Ngr2Gz0aec/uduoKaO3srN52SYkEHndYtFzkK/gDUyQwQzi4ha2eIisxPiuHEX6RvXT31V9ouqn/YtVkt0R76A== dependencies: "@aws-sdk/core" "3.731.0" @@ -535,7 +535,7 @@ "@aws-sdk/nested-clients@3.731.1": version "3.731.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.731.1.tgz#b60839691f0bbdcb1a1efe8668b1b814704811e6" + resolved "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.731.1.tgz" integrity sha512-/L8iVrulnXZl+kgmTn+oxRxNnhcSIbf+r12C06vGUq60w0YMidLvxJZN7vt8H9SnCAGCHqud2MS7ExCEvhc0gA== dependencies: "@aws-crypto/sha256-browser" "5.2.0" @@ -579,7 +579,7 @@ "@aws-sdk/region-config-resolver@3.731.0": version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.731.0.tgz#d7508a1489b43a0767553c82f58c83788bbe3673" + resolved "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.731.0.tgz" integrity sha512-XlDpRNkDVHF59f07JmkuAidEv//m3hT6/JL85h0l3+zrpaRWhf8n8lVUyAPNq35ZujK8AcorYM+93u7hdWsliQ== dependencies: "@aws-sdk/types" "3.731.0" @@ -591,7 +591,7 @@ "@aws-sdk/token-providers@3.731.1": version "3.731.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.731.1.tgz#02cd2ed586635f1ccdc91a1763994dbb545f9983" + resolved "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.731.1.tgz" integrity sha512-t34GOPwBZsX7zGHjiTXmMHGY3kHM7fLiQ60Jqk0On9P0ASHTDE5U75RgCXboE3u+qEv9wyKyaqMNyMWj9qQlFg== dependencies: "@aws-sdk/nested-clients" "3.731.1" @@ -603,7 +603,7 @@ "@aws-sdk/types@3.731.0", "@aws-sdk/types@^3.222.0": version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.731.0.tgz#c35cc2a8c4c9eca768563037ffbdc0cb599f4cd4" + resolved "https://registry.npmjs.org/@aws-sdk/types/-/types-3.731.0.tgz" integrity sha512-NrdkJg6oOUbXR2r9WvHP408CLyvST8cJfp1/jP9pemtjvjPoh6NukbCtiSFdOOb1eryP02CnqQWItfJC1p2Y/Q== dependencies: "@smithy/types" "^4.0.0" @@ -611,7 +611,7 @@ "@aws-sdk/util-endpoints@3.731.0": version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.731.0.tgz#21822554efd1f9a22742a4163a312a5dc9372a46" + resolved "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.731.0.tgz" integrity sha512-riztxTAfncFS9yQWcBJffGgOgLoKSa63ph+rxWJxKl6BHAmWEvHICj1qDcVmnWfIcvJ5cClclY75l9qKaUH7rQ== dependencies: "@aws-sdk/types" "3.731.0" @@ -621,14 +621,14 @@ "@aws-sdk/util-locate-window@^3.0.0": version "3.723.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.723.0.tgz#174551bfdd2eb36d3c16e7023fd7e7ee96ad0fa9" + resolved "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.723.0.tgz" integrity sha512-Yf2CS10BqK688DRsrKI/EO6B8ff5J86NXe4C+VCysK7UOgN0l1zOTeTukZ3H8Q9tYYX3oaF1961o8vRkFm7Nmw== dependencies: tslib "^2.6.2" "@aws-sdk/util-user-agent-browser@3.731.0": version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.731.0.tgz#09139c7a5d04b0d07571f57b405ca71f761e4d3a" + resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.731.0.tgz" integrity sha512-EnYXxTkCNCjTTBjW/pelRPv4Thsi9jepoB6qQjPMA9/ixrZ71BhhQecz9kgqzZLR9BPCwb6hgJ/Yd702jqJ4aQ== dependencies: "@aws-sdk/types" "3.731.0" @@ -638,7 +638,7 @@ "@aws-sdk/util-user-agent-node@3.731.0": version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.731.0.tgz#97751200f073326b170263aabc43d1c01b6520bf" + resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.731.0.tgz" integrity sha512-Rze78Ym5Bx7aWMvmZE2iL3JPo2INNCC5N9rLVx98Gg1G0ZaxclVRUvJrh1AojNlOFxU+otkxAe7FA3Foy2iLLQ== dependencies: "@aws-sdk/middleware-user-agent" "3.731.0" @@ -649,7 +649,7 @@ "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2": version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz" integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== dependencies: "@babel/helper-validator-identifier" "^7.25.9" @@ -658,12 +658,12 @@ "@babel/compat-data@^7.26.5": version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.5.tgz#df93ac37f4417854130e21d72c66ff3d4b897fc7" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz" integrity sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg== "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz" integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== dependencies: "@ampproject/remapping" "^2.2.0" @@ -684,7 +684,7 @@ "@babel/generator@^7.26.0", "@babel/generator@^7.26.5", "@babel/generator@^7.7.2": version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.5.tgz#e44d4ab3176bbcaf78a5725da5f1dc28802a9458" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz" integrity sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw== dependencies: "@babel/parser" "^7.26.5" @@ -695,7 +695,7 @@ "@babel/helper-compilation-targets@^7.25.9": version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz#75d92bb8d8d51301c0d49e52a65c9a7fe94514d8" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz" integrity sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA== dependencies: "@babel/compat-data" "^7.26.5" @@ -706,7 +706,7 @@ "@babel/helper-module-imports@^7.25.9": version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz" integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== dependencies: "@babel/traverse" "^7.25.9" @@ -714,7 +714,7 @@ "@babel/helper-module-transforms@^7.26.0": version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz" integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== dependencies: "@babel/helper-module-imports" "^7.25.9" @@ -723,27 +723,27 @@ "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0": version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz#18580d00c9934117ad719392c4f6585c9333cc35" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz" integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg== "@babel/helper-string-parser@^7.25.9": version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz" integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== "@babel/helper-validator-identifier@^7.25.9": version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz" integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== "@babel/helper-validator-option@^7.25.9": version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz" integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== "@babel/helpers@^7.26.0": version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz" integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== dependencies: "@babel/template" "^7.25.9" @@ -751,133 +751,133 @@ "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.5": version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.5.tgz#6fec9aebddef25ca57a935c86dbb915ae2da3e1f" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz" integrity sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw== dependencies: "@babel/types" "^7.26.5" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-bigint@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-class-static-block@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-import-attributes@^7.24.7": version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz#3b1412847699eea739b4f2602c74ce36f6b0b0f7" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz" integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A== dependencies: "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + 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== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.7.2": version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz#a34313a178ea56f1951599b929c1ceacee719290" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz" integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== dependencies: "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + 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== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + 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== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.10.4": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + 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== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + 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== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + 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== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-private-property-in-object@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-top-level-await@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + 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== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz#67dda2b74da43727cf21d46cf9afef23f4365399" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz" integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== dependencies: "@babel/helper-plugin-utils" "^7.25.9" "@babel/template@^7.25.9", "@babel/template@^7.3.3": version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz" integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== dependencies: "@babel/code-frame" "^7.25.9" @@ -886,7 +886,7 @@ "@babel/traverse@^7.25.9": version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.5.tgz#6d0be3e772ff786456c1a37538208286f6e79021" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz" integrity sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ== dependencies: "@babel/code-frame" "^7.26.2" @@ -899,7 +899,7 @@ "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.5", "@babel/types@^7.3.3": version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.5.tgz#7a1e1c01d28e26d1fe7f8ec9567b3b92b9d07747" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz" integrity sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg== dependencies: "@babel/helper-string-parser" "^7.25.9" @@ -907,24 +907,24 @@ "@bcoe/v8-coverage@^0.2.3": version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@colors/colors@1.6.0", "@colors/colors@^1.6.0": version "1.6.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" + resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz" integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== "@cspotcode/source-map-support@^0.8.0": version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== dependencies: "@jridgewell/trace-mapping" "0.3.9" "@dabh/diagnostics@^2.0.2": version "2.0.3" - resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" + resolved "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz" integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== dependencies: colorspace "1.1.x" @@ -933,7 +933,7 @@ "@datadog/datadog-ci@2.48.0": version "2.48.0" - resolved "https://registry.yarnpkg.com/@datadog/datadog-ci/-/datadog-ci-2.48.0.tgz#89a7c25a68b7f67e699b3eea3edda2d34c5ecb82" + resolved "https://registry.npmjs.org/@datadog/datadog-ci/-/datadog-ci-2.48.0.tgz" integrity sha512-Xseeb1Fu0CBl2SpbYzTiqok9bs5bKSY9ZAGDuDcWTjSI3jpCuDt4BiIxE/HOMzV4t+S6KKjCABhquahXo/u0TA== dependencies: "@aws-sdk/client-cloudwatch-logs" "^3.624.0" @@ -986,7 +986,7 @@ "@fimbul/bifrost@^0.21.0": version "0.21.0" - resolved "https://registry.yarnpkg.com/@fimbul/bifrost/-/bifrost-0.21.0.tgz#d0fafa25938fda475657a6a1e407a21bbe02c74e" + resolved "https://registry.npmjs.org/@fimbul/bifrost/-/bifrost-0.21.0.tgz" integrity sha512-ou8VU+nTmOW1jeg+FT+sn+an/M0Xb9G16RucrfhjXGWv1Q97kCoM5CG9Qj7GYOSdu7km72k7nY83Eyr53Bkakg== dependencies: "@fimbul/ymir" "^0.21.0" @@ -996,7 +996,7 @@ "@fimbul/ymir@^0.21.0": version "0.21.0" - resolved "https://registry.yarnpkg.com/@fimbul/ymir/-/ymir-0.21.0.tgz#8525726787aceeafd4e199472c0d795160b5d4a1" + resolved "https://registry.npmjs.org/@fimbul/ymir/-/ymir-0.21.0.tgz" integrity sha512-T/y7WqPsm4n3zhT08EpB5sfdm2Kvw3gurAxr2Lr5dQeLi8ZsMlNT/Jby+ZmuuAAd1PnXYzKp+2SXgIkQIIMCUg== dependencies: inversify "^5.0.0" @@ -1005,7 +1005,7 @@ "@google-cloud/common@^5.0.0": version "5.0.2" - resolved "https://registry.yarnpkg.com/@google-cloud/common/-/common-5.0.2.tgz#423ad94b125d44263cbed2b5eb1ce1d4d53dc038" + resolved "https://registry.npmjs.org/@google-cloud/common/-/common-5.0.2.tgz" integrity sha512-V7bmBKYQyu0eVG2BFejuUjlBt+zrya6vtsKdY+JxMM/dNntPF41vZ9+LhOshEUH01zOHEqBSvI7Dad7ZS6aUeA== dependencies: "@google-cloud/projectify" "^4.0.0" @@ -1020,7 +1020,7 @@ "@google-cloud/logging@^11.1.0": version "11.2.0" - resolved "https://registry.yarnpkg.com/@google-cloud/logging/-/logging-11.2.0.tgz#d282f136467cc4500932f1fa6d4fe58325eb2db2" + resolved "https://registry.npmjs.org/@google-cloud/logging/-/logging-11.2.0.tgz" integrity sha512-Ma94jvuoMpbgNniwtelOt8w82hxK62FuOXZonEv0Hyk3B+/YVuLG/SWNyY9yMso/RXnPEc1fP2qo9kDrjf/b2w== dependencies: "@google-cloud/common" "^5.0.0" @@ -1042,7 +1042,7 @@ "@google-cloud/paginator@^5.0.0": version "5.0.2" - resolved "https://registry.yarnpkg.com/@google-cloud/paginator/-/paginator-5.0.2.tgz#86ad773266ce9f3b82955a8f75e22cd012ccc889" + resolved "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.2.tgz" integrity sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg== dependencies: arrify "^2.0.0" @@ -1050,24 +1050,24 @@ "@google-cloud/projectify@^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@google-cloud/projectify/-/projectify-4.0.0.tgz#d600e0433daf51b88c1fa95ac7f02e38e80a07be" + resolved "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz" integrity sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA== "@google-cloud/promisify@^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@google-cloud/promisify/-/promisify-4.0.0.tgz#a906e533ebdd0f754dca2509933334ce58b8c8b1" + resolved "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz" integrity sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g== "@google-cloud/run@^1.4.0": version "1.5.0" - resolved "https://registry.yarnpkg.com/@google-cloud/run/-/run-1.5.0.tgz#95e16c9a8527083b193c3722c8063d3a25cafeed" + resolved "https://registry.npmjs.org/@google-cloud/run/-/run-1.5.0.tgz" integrity sha512-Ct0ZIuicd2O6fJHv7Lbwl4CcCWKK7NjACvUc4pOJVbKo75B5proOa7/9TrXVpI6oWu1n7EFx1s8xsavYHLxRAg== dependencies: google-gax "^4.0.3" "@grpc/grpc-js@^1.10.9": version "1.12.5" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.12.5.tgz#0064a28fe9b1ec54ac27e1c9bf70720aa01285e8" + resolved "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.12.5.tgz" integrity sha512-d3iiHxdpg5+ZcJ6jnDSOT8Z0O0VMVGy34jAnYLUX8yd36b1qn8f1TwOA/Lc7TsOh03IkPJ38eGI5qD2EjNkoEA== dependencies: "@grpc/proto-loader" "^0.7.13" @@ -1075,7 +1075,7 @@ "@grpc/proto-loader@^0.7.13": version "0.7.13" - resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.13.tgz#f6a44b2b7c9f7b609f5748c6eac2d420e37670cf" + resolved "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz" integrity sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw== dependencies: lodash.camelcase "^4.3.0" @@ -1085,7 +1085,7 @@ "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: camelcase "^5.3.1" @@ -1096,12 +1096,12 @@ "@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== "@jest/console@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + resolved "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz" integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== dependencies: "@jest/types" "^29.6.3" @@ -1113,7 +1113,7 @@ "@jest/core@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + resolved "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz" integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== dependencies: "@jest/console" "^29.7.0" @@ -1147,7 +1147,7 @@ "@jest/environment@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz" integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== dependencies: "@jest/fake-timers" "^29.7.0" @@ -1157,14 +1157,14 @@ "@jest/expect-utils@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz" integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== dependencies: jest-get-type "^29.6.3" "@jest/expect@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + resolved "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz" integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== dependencies: expect "^29.7.0" @@ -1172,7 +1172,7 @@ "@jest/fake-timers@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz" integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== dependencies: "@jest/types" "^29.6.3" @@ -1184,7 +1184,7 @@ "@jest/globals@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz" integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== dependencies: "@jest/environment" "^29.7.0" @@ -1194,7 +1194,7 @@ "@jest/reporters@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz" integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== dependencies: "@bcoe/v8-coverage" "^0.2.3" @@ -1224,14 +1224,14 @@ "@jest/schemas@^29.6.3": version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz" integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== dependencies: "@sinclair/typebox" "^0.27.8" "@jest/source-map@^29.6.3": version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz" integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== dependencies: "@jridgewell/trace-mapping" "^0.3.18" @@ -1240,7 +1240,7 @@ "@jest/test-result@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz" integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== dependencies: "@jest/console" "^29.7.0" @@ -1250,7 +1250,7 @@ "@jest/test-sequencer@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz" integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== dependencies: "@jest/test-result" "^29.7.0" @@ -1260,7 +1260,7 @@ "@jest/transform@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz" integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== dependencies: "@babel/core" "^7.11.6" @@ -1281,7 +1281,7 @@ "@jest/types@^29.6.3": version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz" integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== dependencies: "@jest/schemas" "^29.6.3" @@ -1293,7 +1293,7 @@ "@jridgewell/gen-mapping@^0.3.5": version "0.3.8" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz" integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== dependencies: "@jridgewell/set-array" "^1.2.1" @@ -1302,22 +1302,22 @@ "@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/set-array@^1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" @@ -1325,7 +1325,7 @@ "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" @@ -1333,49 +1333,49 @@ "@js-sdsl/ordered-map@^4.4.2": version "4.4.2" - resolved "https://registry.yarnpkg.com/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz#9299f82874bab9e4c7f9c48d865becbfe8d6907c" + resolved "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz" integrity sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw== "@kwsites/file-exists@^1.1.1": version "1.1.1" - resolved "https://registry.yarnpkg.com/@kwsites/file-exists/-/file-exists-1.1.1.tgz#ad1efcac13e1987d8dbaf235ef3be5b0d96faa99" + resolved "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz" integrity sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw== dependencies: debug "^4.1.1" "@kwsites/promise-deferred@^1.1.1": version "1.1.1" - resolved "https://registry.yarnpkg.com/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz#8ace5259254426ccef57f3175bc64ed7095ed919" + resolved "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz" integrity sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw== "@opentelemetry/api@^1.7.0": version "1.9.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.9.0.tgz#d03eba68273dc0f7509e2a3d5cba21eae10379fe" + resolved "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz" integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg== "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz" integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== "@protobufjs/base64@^1.1.2": version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + resolved "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz" integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== "@protobufjs/codegen@^2.0.4": version "2.0.4" - resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + resolved "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz" integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== "@protobufjs/eventemitter@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + resolved "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz" integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== "@protobufjs/fetch@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + resolved "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz" integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== dependencies: "@protobufjs/aspromise" "^1.1.1" @@ -1383,51 +1383,51 @@ "@protobufjs/float@^1.0.2": version "1.0.2" - resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + resolved "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz" integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== "@protobufjs/inquire@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + resolved "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz" integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== "@protobufjs/path@^1.1.2": version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + resolved "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz" integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== "@protobufjs/pool@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + resolved "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz" integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== "@protobufjs/utf8@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== "@sinclair/typebox@^0.27.8": version "0.27.8" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== "@sinonjs/commons@^3.0.0": version "3.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz" integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== dependencies: type-detect "4.0.8" "@sinonjs/fake-timers@^10.0.2": version "10.3.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz" integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== dependencies: "@sinonjs/commons" "^3.0.0" "@smithy/abort-controller@^4.0.1": version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-4.0.1.tgz#7c5e73690c4105ad264c2896bd1ea822450c3819" + resolved "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.1.tgz" integrity sha512-fiUIYgIgRjMWznk6iLJz35K2YxSLHzLBA/RC6lBrKfQ8fHbPfvk7Pk9UvpKoHgJjI18MnbPuEju53zcVy6KF1g== dependencies: "@smithy/types" "^4.1.0" @@ -1435,7 +1435,7 @@ "@smithy/config-resolver@^4.0.0", "@smithy/config-resolver@^4.0.1": version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-4.0.1.tgz#3d6c78bbc51adf99c9819bb3f0ea197fe03ad363" + resolved "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.0.1.tgz" integrity sha512-Igfg8lKu3dRVkTSEm98QpZUvKEOa71jDX4vKRcvJVyRc3UgN3j7vFMf0s7xLQhYmKa8kyJGQgUJDOV5V3neVlQ== dependencies: "@smithy/node-config-provider" "^4.0.1" @@ -1446,7 +1446,7 @@ "@smithy/core@^3.0.0", "@smithy/core@^3.1.1": version "3.1.1" - resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.1.1.tgz#e82e526ba2dbec8e740a86c5c14b97a46e5a5128" + resolved "https://registry.npmjs.org/@smithy/core/-/core-3.1.1.tgz" integrity sha512-hhUZlBWYuh9t6ycAcN90XOyG76C1AzwxZZgaCVPMYpWqqk9uMFo7HGG5Zu2cEhCJn7DdOi5krBmlibWWWPgdsw== dependencies: "@smithy/middleware-serde" "^4.0.1" @@ -1460,7 +1460,7 @@ "@smithy/credential-provider-imds@^4.0.0", "@smithy/credential-provider-imds@^4.0.1": version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.1.tgz#807110739982acd1588a4847b61e6edf196d004e" + resolved "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.1.tgz" integrity sha512-l/qdInaDq1Zpznpmev/+52QomsJNZ3JkTl5yrTl02V6NBgJOQ4LY0SFw/8zsMwj3tLe8vqiIuwF6nxaEwgf6mg== dependencies: "@smithy/node-config-provider" "^4.0.1" @@ -1471,7 +1471,7 @@ "@smithy/eventstream-codec@^4.0.1": version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-4.0.1.tgz#8e0beae84013eb3b497dd189470a44bac4411bae" + resolved "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.0.1.tgz" integrity sha512-Q2bCAAR6zXNVtJgifsU16ZjKGqdw/DyecKNgIgi7dlqw04fqDu0mnq+JmGphqheypVc64CYq3azSuCpAdFk2+A== dependencies: "@aws-crypto/crc32" "5.2.0" @@ -1481,7 +1481,7 @@ "@smithy/eventstream-serde-browser@^4.0.0": version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.1.tgz#cdbbb18b9371da363eff312d78a10f6bad82df28" + resolved "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.1.tgz" integrity sha512-HbIybmz5rhNg+zxKiyVAnvdM3vkzjE6ccrJ620iPL8IXcJEntd3hnBl+ktMwIy12Te/kyrSbUb8UCdnUT4QEdA== dependencies: "@smithy/eventstream-serde-universal" "^4.0.1" @@ -1490,7 +1490,7 @@ "@smithy/eventstream-serde-config-resolver@^4.0.0": version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.0.1.tgz#3662587f507ad7fac5bd4505c4ed6ed0ac49a010" + resolved "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.0.1.tgz" integrity sha512-lSipaiq3rmHguHa3QFF4YcCM3VJOrY9oq2sow3qlhFY+nBSTF/nrO82MUQRPrxHQXA58J5G1UnU2WuJfi465BA== dependencies: "@smithy/types" "^4.1.0" @@ -1498,7 +1498,7 @@ "@smithy/eventstream-serde-node@^4.0.0": version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.1.tgz#3799c33e0148d2b923a66577d1dbc590865742ce" + resolved "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.1.tgz" integrity sha512-o4CoOI6oYGYJ4zXo34U8X9szDe3oGjmHgsMGiZM0j4vtNoT+h80TLnkUcrLZR3+E6HIxqW+G+9WHAVfl0GXK0Q== dependencies: "@smithy/eventstream-serde-universal" "^4.0.1" @@ -1507,7 +1507,7 @@ "@smithy/eventstream-serde-universal@^4.0.1": version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.1.tgz#ddb2ab9f62b8ab60f50acd5f7c8b3ac9d27468e2" + resolved "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.1.tgz" integrity sha512-Z94uZp0tGJuxds3iEAZBqGU2QiaBHP4YytLUjwZWx+oUeohCsLyUm33yp4MMBmhkuPqSbQCXq5hDet6JGUgHWA== dependencies: "@smithy/eventstream-codec" "^4.0.1" @@ -1516,7 +1516,7 @@ "@smithy/fetch-http-handler@^5.0.0", "@smithy/fetch-http-handler@^5.0.1": version "5.0.1" - resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.1.tgz#8463393442ca6a1644204849e42c386066f0df79" + resolved "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.1.tgz" integrity sha512-3aS+fP28urrMW2KTjb6z9iFow6jO8n3MFfineGbndvzGZit3taZhKWtTorf+Gp5RpFDDafeHlhfsGlDCXvUnJA== dependencies: "@smithy/protocol-http" "^5.0.1" @@ -1527,7 +1527,7 @@ "@smithy/hash-node@^4.0.0": version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-4.0.1.tgz#ce78fc11b848a4f47c2e1e7a07fb6b982d2f130c" + resolved "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.1.tgz" integrity sha512-TJ6oZS+3r2Xu4emVse1YPB3Dq3d8RkZDKcPr71Nj/lJsdAP1c7oFzYqEn1IBc915TsgLl2xIJNuxCz+gLbLE0w== dependencies: "@smithy/types" "^4.1.0" @@ -1537,7 +1537,7 @@ "@smithy/invalid-dependency@^4.0.0": version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-4.0.1.tgz#704d1acb6fac105558c17d53f6d55da6b0d6b6fc" + resolved "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.1.tgz" integrity sha512-gdudFPf4QRQ5pzj7HEnu6FhKRi61BfH/Gk5Yf6O0KiSbr1LlVhgjThcvjdu658VE6Nve8vaIWB8/fodmS1rBPQ== dependencies: "@smithy/types" "^4.1.0" @@ -1545,21 +1545,21 @@ "@smithy/is-array-buffer@^2.2.0": version "2.2.0" - resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz#f84f0d9f9a36601a9ca9381688bd1b726fd39111" + resolved "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz" integrity sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA== dependencies: tslib "^2.6.2" "@smithy/is-array-buffer@^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz#55a939029321fec462bcc574890075cd63e94206" + resolved "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz" integrity sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw== dependencies: tslib "^2.6.2" "@smithy/middleware-content-length@^4.0.0": version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-4.0.1.tgz#378bc94ae623f45e412fb4f164b5bb90b9de2ba3" + resolved "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.1.tgz" integrity sha512-OGXo7w5EkB5pPiac7KNzVtfCW2vKBTZNuCctn++TTSOMpe6RZO/n6WEC1AxJINn3+vWLKW49uad3lo/u0WJ9oQ== dependencies: "@smithy/protocol-http" "^5.0.1" @@ -1568,7 +1568,7 @@ "@smithy/middleware-endpoint@^4.0.0", "@smithy/middleware-endpoint@^4.0.2": version "4.0.2" - resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.0.2.tgz#f433dcd214e89f17bdf21b3af5fbdd3810bebf6d" + resolved "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.0.2.tgz" integrity sha512-Z9m67CXizGpj8CF/AW/7uHqYNh1VXXOn9Ap54fenWsCa0HnT4cJuE61zqG3cBkTZJDCy0wHJphilI41co/PE5g== dependencies: "@smithy/core" "^3.1.1" @@ -1582,7 +1582,7 @@ "@smithy/middleware-retry@^4.0.0": version "4.0.3" - resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.0.3.tgz#4073369e54c1beb7a764633ca218a6e39b9da688" + resolved "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.0.3.tgz" integrity sha512-TiKwwQTwUDeDtwWW8UWURTqu7s6F3wN2pmziLU215u7bqpVT9Mk2oEvURjpRLA+5XeQhM68R5BpAGzVtomsqgA== dependencies: "@smithy/node-config-provider" "^4.0.1" @@ -1597,7 +1597,7 @@ "@smithy/middleware-serde@^4.0.0", "@smithy/middleware-serde@^4.0.1": version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-4.0.1.tgz#4c9218cecd5316ab696e73fdc1c80b38bcaffa99" + resolved "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.1.tgz" integrity sha512-Fh0E2SOF+S+P1+CsgKyiBInAt3o2b6Qk7YOp2W0Qx2XnfTdfMuSDKUEcnrtpxCzgKJnqXeLUZYqtThaP0VGqtA== dependencies: "@smithy/types" "^4.1.0" @@ -1605,7 +1605,7 @@ "@smithy/middleware-stack@^4.0.0", "@smithy/middleware-stack@^4.0.1": version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-4.0.1.tgz#c157653f9df07f7c26e32f49994d368e4e071d22" + resolved "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.1.tgz" integrity sha512-dHwDmrtR/ln8UTHpaIavRSzeIk5+YZTBtLnKwDW3G2t6nAupCiQUvNzNoHBpik63fwUaJPtlnMzXbQrNFWssIA== dependencies: "@smithy/types" "^4.1.0" @@ -1613,7 +1613,7 @@ "@smithy/node-config-provider@^4.0.0", "@smithy/node-config-provider@^4.0.1": version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-4.0.1.tgz#4e84fe665c0774d5f4ebb75144994fc6ebedf86e" + resolved "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.0.1.tgz" integrity sha512-8mRTjvCtVET8+rxvmzRNRR0hH2JjV0DFOmwXPrISmTIJEfnCBugpYYGAsCj8t41qd+RB5gbheSQ/6aKZCQvFLQ== dependencies: "@smithy/property-provider" "^4.0.1" @@ -1623,7 +1623,7 @@ "@smithy/node-http-handler@^4.0.0", "@smithy/node-http-handler@^4.0.2": version "4.0.2" - resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.0.2.tgz#48d47a046cf900ab86bfbe7f5fd078b52c82fab6" + resolved "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.2.tgz" integrity sha512-X66H9aah9hisLLSnGuzRYba6vckuFtGE+a5DcHLliI/YlqKrGoxhisD5XbX44KyoeRzoNlGr94eTsMVHFAzPOw== dependencies: "@smithy/abort-controller" "^4.0.1" @@ -1634,7 +1634,7 @@ "@smithy/property-provider@^2.0.12": version "2.2.0" - resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-2.2.0.tgz#37e3525a3fa3e11749f86a4f89f0fd7765a6edb0" + resolved "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.2.0.tgz" integrity sha512-+xiil2lFhtTRzXkx8F053AV46QnIw6e7MV8od5Mi68E1ICOjCeCHw2XfLnDEUHnT9WGUIkwcqavXjfwuJbGlpg== dependencies: "@smithy/types" "^2.12.0" @@ -1642,7 +1642,7 @@ "@smithy/property-provider@^4.0.0", "@smithy/property-provider@^4.0.1": version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-4.0.1.tgz#8d35d5997af2a17cf15c5e921201ef6c5e3fc870" + resolved "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.1.tgz" integrity sha512-o+VRiwC2cgmk/WFV0jaETGOtX16VNPp2bSQEzu0whbReqE1BMqsP2ami2Vi3cbGVdKu1kq9gQkDAGKbt0WOHAQ== dependencies: "@smithy/types" "^4.1.0" @@ -1650,7 +1650,7 @@ "@smithy/protocol-http@^5.0.0", "@smithy/protocol-http@^5.0.1": version "5.0.1" - resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-5.0.1.tgz#37c248117b29c057a9adfad4eb1d822a67079ff1" + resolved "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.0.1.tgz" integrity sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ== dependencies: "@smithy/types" "^4.1.0" @@ -1658,7 +1658,7 @@ "@smithy/querystring-builder@^4.0.1": version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-4.0.1.tgz#37e1e05d0d33c6f694088abc3e04eafb65cb6976" + resolved "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.1.tgz" integrity sha512-wU87iWZoCbcqrwszsOewEIuq+SU2mSoBE2CcsLwE0I19m0B2gOJr1MVjxWcDQYOzHbR1xCk7AcOBbGFUYOKvdg== dependencies: "@smithy/types" "^4.1.0" @@ -1667,7 +1667,7 @@ "@smithy/querystring-parser@^4.0.1": version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-4.0.1.tgz#312dc62b146f8bb8a67558d82d4722bb9211af42" + resolved "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.1.tgz" integrity sha512-Ma2XC7VS9aV77+clSFylVUnPZRindhB7BbmYiNOdr+CHt/kZNJoPP0cd3QxCnCFyPXC4eybmyE98phEHkqZ5Jw== dependencies: "@smithy/types" "^4.1.0" @@ -1675,21 +1675,21 @@ "@smithy/service-error-classification@^2.1.5": version "2.1.5" - resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-2.1.5.tgz#0568a977cc0db36299d8703a5d8609c1f600c005" + resolved "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.1.5.tgz" integrity sha512-uBDTIBBEdAQryvHdc5W8sS5YX7RQzF683XrHePVdFmAgKiMofU15FLSM0/HU03hKTnazdNRFa0YHS7+ArwoUSQ== dependencies: "@smithy/types" "^2.12.0" "@smithy/service-error-classification@^4.0.1": version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-4.0.1.tgz#84e78579af46c7b79c900b6d6cc822c9465f3259" + resolved "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.1.tgz" integrity sha512-3JNjBfOWpj/mYfjXJHB4Txc/7E4LVq32bwzE7m28GN79+M1f76XHflUaSUkhOriprPDzev9cX/M+dEB80DNDKA== dependencies: "@smithy/types" "^4.1.0" "@smithy/shared-ini-file-loader@^4.0.0", "@smithy/shared-ini-file-loader@^4.0.1": version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.1.tgz#d35c21c29454ca4e58914a4afdde68d3b2def1ee" + resolved "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.1.tgz" integrity sha512-hC8F6qTBbuHRI/uqDgqqi6J0R4GtEZcgrZPhFQnMhfJs3MnUTGSnR1NSJCJs5VWlMydu0kJz15M640fJlRsIOw== dependencies: "@smithy/types" "^4.1.0" @@ -1697,7 +1697,7 @@ "@smithy/signature-v4@^5.0.0": version "5.0.1" - resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-5.0.1.tgz#f93401b176150286ba246681031b0503ec359270" + resolved "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.0.1.tgz" integrity sha512-nCe6fQ+ppm1bQuw5iKoeJ0MJfz2os7Ic3GBjOkLOPtavbD1ONoyE3ygjBfz2ythFWm4YnRm6OxW+8p/m9uCoIA== dependencies: "@smithy/is-array-buffer" "^4.0.0" @@ -1711,7 +1711,7 @@ "@smithy/smithy-client@^4.0.0", "@smithy/smithy-client@^4.1.2": version "4.1.2" - resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.1.2.tgz#1bf707d48998a559d3e91e30c20eec243e16d45b" + resolved "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.1.2.tgz" integrity sha512-0yApeHWBqocelHGK22UivZyShNxFbDNrgREBllGh5Ws0D0rg/yId/CJfeoKKpjbfY2ju8j6WgDUGZHYQmINZ5w== dependencies: "@smithy/core" "^3.1.1" @@ -1724,21 +1724,21 @@ "@smithy/types@^2.12.0": version "2.12.0" - resolved "https://registry.yarnpkg.com/@smithy/types/-/types-2.12.0.tgz#c44845f8ba07e5e8c88eda5aed7e6a0c462da041" + resolved "https://registry.npmjs.org/@smithy/types/-/types-2.12.0.tgz" integrity sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw== dependencies: tslib "^2.6.2" "@smithy/types@^4.0.0", "@smithy/types@^4.1.0": version "4.1.0" - resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.1.0.tgz#19de0b6087bccdd4182a334eb5d3d2629699370f" + resolved "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz" integrity sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw== dependencies: tslib "^2.6.2" "@smithy/url-parser@^4.0.0", "@smithy/url-parser@^4.0.1": version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-4.0.1.tgz#b47743f785f5b8d81324878cbb1b5f834bf8d85a" + resolved "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.1.tgz" integrity sha512-gPXcIEUtw7VlK8f/QcruNXm7q+T5hhvGu9tl63LsJPZ27exB6dtNwvh2HIi0v7JcXJ5emBxB+CJxwaLEdJfA+g== dependencies: "@smithy/querystring-parser" "^4.0.1" @@ -1747,7 +1747,7 @@ "@smithy/util-base64@^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-4.0.0.tgz#8345f1b837e5f636e5f8470c4d1706ae0c6d0358" + resolved "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz" integrity sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg== dependencies: "@smithy/util-buffer-from" "^4.0.0" @@ -1756,21 +1756,21 @@ "@smithy/util-body-length-browser@^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz#965d19109a4b1e5fe7a43f813522cce718036ded" + resolved "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz" integrity sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA== dependencies: tslib "^2.6.2" "@smithy/util-body-length-node@^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz#3db245f6844a9b1e218e30c93305bfe2ffa473b3" + resolved "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz" integrity sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg== dependencies: tslib "^2.6.2" "@smithy/util-buffer-from@^2.2.0": version "2.2.0" - resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz#6fc88585165ec73f8681d426d96de5d402021e4b" + resolved "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz" integrity sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA== dependencies: "@smithy/is-array-buffer" "^2.2.0" @@ -1778,7 +1778,7 @@ "@smithy/util-buffer-from@^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz#b23b7deb4f3923e84ef50c8b2c5863d0dbf6c0b9" + resolved "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz" integrity sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug== dependencies: "@smithy/is-array-buffer" "^4.0.0" @@ -1786,14 +1786,14 @@ "@smithy/util-config-provider@^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz#e0c7c8124c7fba0b696f78f0bd0ccb060997d45e" + resolved "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz" integrity sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w== dependencies: tslib "^2.6.2" "@smithy/util-defaults-mode-browser@^4.0.0": version "4.0.3" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.3.tgz#52a5a22e6a4eecbc0e2ebdeee0979081ec99667a" + resolved "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.3.tgz" integrity sha512-7c5SF1fVK0EOs+2EOf72/qF199zwJflU1d02AevwKbAUPUZyE9RUZiyJxeUmhVxfKDWdUKaaVojNiaDQgnHL9g== dependencies: "@smithy/property-provider" "^4.0.1" @@ -1804,7 +1804,7 @@ "@smithy/util-defaults-mode-node@^4.0.0": version "4.0.3" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.3.tgz#2dc140363dc35366c21c93939f61e4514f9a2fa6" + resolved "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.3.tgz" integrity sha512-CVnD42qYD3JKgDlImZ9+On+MqJHzq9uJgPbMdeBE8c2x8VJ2kf2R3XO/yVFx+30ts5lD/GlL0eFIShY3x9ROgQ== dependencies: "@smithy/config-resolver" "^4.0.1" @@ -1817,7 +1817,7 @@ "@smithy/util-endpoints@^3.0.0": version "3.0.1" - resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-3.0.1.tgz#44ccbf1721447966f69496c9003b87daa8f61975" + resolved "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.1.tgz" integrity sha512-zVdUENQpdtn9jbpD9SCFK4+aSiavRb9BxEtw9ZGUR1TYo6bBHbIoi7VkrFQ0/RwZlzx0wRBaRmPclj8iAoJCLA== dependencies: "@smithy/node-config-provider" "^4.0.1" @@ -1826,14 +1826,14 @@ "@smithy/util-hex-encoding@^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz#dd449a6452cffb37c5b1807ec2525bb4be551e8d" + resolved "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz" integrity sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw== dependencies: tslib "^2.6.2" "@smithy/util-middleware@^4.0.0", "@smithy/util-middleware@^4.0.1": version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-4.0.1.tgz#58d363dcd661219298c89fa176a28e98ccc4bf43" + resolved "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.1.tgz" integrity sha512-HiLAvlcqhbzhuiOa0Lyct5IIlyIz0PQO5dnMlmQ/ubYM46dPInB+3yQGkfxsk6Q24Y0n3/JmcA1v5iEhmOF5mA== dependencies: "@smithy/types" "^4.1.0" @@ -1841,7 +1841,7 @@ "@smithy/util-retry@^2.0.4": version "2.2.0" - resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-2.2.0.tgz#e8e019537ab47ba6b2e87e723ec51ee223422d85" + resolved "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.2.0.tgz" integrity sha512-q9+pAFPTfftHXRytmZ7GzLFFrEGavqapFc06XxzZFcSIGERXMerXxCitjOG1prVDR9QdjqotF40SWvbqcCpf8g== dependencies: "@smithy/service-error-classification" "^2.1.5" @@ -1850,7 +1850,7 @@ "@smithy/util-retry@^4.0.0", "@smithy/util-retry@^4.0.1": version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-4.0.1.tgz#fb5f26492383dcb9a09cc4aee23a10f839cd0769" + resolved "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.1.tgz" integrity sha512-WmRHqNVwn3kI3rKk1LsKcVgPBG6iLTBGC1iYOV3GQegwJ3E8yjzHytPt26VNzOWr1qu0xE03nK0Ug8S7T7oufw== dependencies: "@smithy/service-error-classification" "^4.0.1" @@ -1859,7 +1859,7 @@ "@smithy/util-stream@^4.0.0", "@smithy/util-stream@^4.0.2": version "4.0.2" - resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-4.0.2.tgz#63495d3f7fba9d78748d540921136dc4a8d4c067" + resolved "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.0.2.tgz" integrity sha512-0eZ4G5fRzIoewtHtwaYyl8g2C+osYOT4KClXgfdNEDAgkbe2TYPqcnw4GAWabqkZCax2ihRGPe9LZnsPdIUIHA== dependencies: "@smithy/fetch-http-handler" "^5.0.1" @@ -1873,14 +1873,14 @@ "@smithy/util-uri-escape@^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz#a96c160c76f3552458a44d8081fade519d214737" + resolved "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz" integrity sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg== dependencies: tslib "^2.6.2" "@smithy/util-utf8@^2.0.0": version "2.3.0" - resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-2.3.0.tgz#dd96d7640363259924a214313c3cf16e7dd329c5" + resolved "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz" integrity sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A== dependencies: "@smithy/util-buffer-from" "^2.2.0" @@ -1888,7 +1888,7 @@ "@smithy/util-utf8@^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-4.0.0.tgz#09ca2d9965e5849e72e347c130f2a29d5c0c863c" + resolved "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz" integrity sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow== dependencies: "@smithy/util-buffer-from" "^4.0.0" @@ -1896,7 +1896,7 @@ "@smithy/util-waiter@^4.0.0": version "4.0.2" - resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-4.0.2.tgz#0a73a0fcd30ea7bbc3009cf98ad199f51b8eac51" + resolved "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.2.tgz" integrity sha512-piUTHyp2Axx3p/kc2CIJkYSv0BAaheBQmbACZgQSSfWUumWNW+R1lL+H9PDBxKJkvOeEX+hKYEFiwO8xagL8AQ== dependencies: "@smithy/abort-controller" "^4.0.1" @@ -1905,44 +1905,44 @@ "@tootallnate/once@2": version "2.0.0" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== "@tootallnate/quickjs-emscripten@^0.23.0": version "0.23.0" - resolved "https://registry.yarnpkg.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz#db4ecfd499a9765ab24002c3b696d02e6d32a12c" + resolved "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz" integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== "@tsconfig/node10@^1.0.7": version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz" integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== "@tsconfig/node12@^1.0.7": version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== "@tsconfig/node14@^1.0.0": version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== "@types/adm-zip@0.5.7": version "0.5.7" - resolved "https://registry.yarnpkg.com/@types/adm-zip/-/adm-zip-0.5.7.tgz#eec10b6f717d3948beb64aca0abebc4b344ac7e9" + resolved "https://registry.npmjs.org/@types/adm-zip/-/adm-zip-0.5.7.tgz" integrity sha512-DNEs/QvmyRLurdQPChqq0Md4zGvPwHerAJYWk9l2jCbD1VPpnzRJorOdiq4zsw09NFbYnhfsoEhWtxIzXpn2yw== dependencies: "@types/node" "*" "@types/babel__core@^7.1.14": version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== dependencies: "@babel/parser" "^7.20.7" @@ -1953,14 +1953,14 @@ "@types/babel__generator@*": version "7.6.8" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz" integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": version "7.4.4" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz" integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== dependencies: "@babel/parser" "^7.1.0" @@ -1968,50 +1968,50 @@ "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": version "7.20.6" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz" integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== dependencies: "@babel/types" "^7.20.7" "@types/caseless@*": version "0.12.5" - resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.5.tgz#db9468cb1b1b5a925b8f34822f1669df0c5472f5" + resolved "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz" integrity sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg== "@types/datadog-metrics@0.6.1": version "0.6.1" - resolved "https://registry.yarnpkg.com/@types/datadog-metrics/-/datadog-metrics-0.6.1.tgz#9957ad75fe3a4742c87b94273e94c40228c8dd4c" + resolved "https://registry.npmjs.org/@types/datadog-metrics/-/datadog-metrics-0.6.1.tgz" integrity sha512-p6zVpfmNcXwtcXjgpz7do/fKyfndGhU5sGJVtb5Gn5PvLDiQUAgD0mI/itf/99sBi9DRxeyhFQ9dQF6OxxQNbA== "@types/graceful-fs@^4.1.3": version "4.1.9" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz" integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== dependencies: "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz" integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== "@types/istanbul-lib-report@*": version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz" integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz" integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== dependencies: "@types/istanbul-lib-report" "*" "@types/jest@29.5.14": version "29.5.14" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.14.tgz#2b910912fa1d6856cadcd0c1f95af7df1d6049e5" + resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz" integrity sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ== dependencies: expect "^29.0.0" @@ -2019,26 +2019,26 @@ "@types/long@^4.0.0": version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" + resolved "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz" integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== -"@types/node@*", "@types/node@>=13.7.0": - version "22.10.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.7.tgz#14a1ca33fd0ebdd9d63593ed8d3fbc882a6d28d7" - integrity sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg== - dependencies: - undici-types "~6.20.0" - -"@types/node@20.10.4": +"@types/node@*", "@types/node@20.10.4": version "20.10.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.4.tgz#b246fd84d55d5b1b71bf51f964bd514409347198" + resolved "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz" integrity sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg== dependencies: undici-types "~5.26.4" +"@types/node@>=13.7.0": + version "22.10.7" + resolved "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz" + integrity sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg== + dependencies: + undici-types "~6.20.0" + "@types/request@^2.48.8": version "2.48.12" - resolved "https://registry.yarnpkg.com/@types/request/-/request-2.48.12.tgz#0f590f615a10f87da18e9790ac94c29ec4c5ef30" + resolved "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz" integrity sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw== dependencies: "@types/caseless" "*" @@ -2048,82 +2048,82 @@ "@types/stack-utils@^2.0.0": version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz" integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== "@types/tough-cookie@*": version "4.0.5" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" + resolved "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz" integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== "@types/triple-beam@^1.3.2": version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" + resolved "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz" integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== "@types/uuid@^9.0.1": version "9.0.8" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" + resolved "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz" integrity sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA== "@types/yargs-parser@*": version "21.0.3" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz" integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^17.0.8": version "17.0.33" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz" integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== dependencies: "@types/yargs-parser" "*" abort-controller@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== dependencies: event-target-shim "^5.0.0" acorn-walk@^8.1.1: version "8.3.4" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz" integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== dependencies: acorn "^8.11.0" acorn@^8.11.0, acorn@^8.4.1: version "8.14.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz" integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== adm-zip@0.5.14: version "0.5.14" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.5.14.tgz#2c557c0bf12af4311cf6d32970f4060cf8133b2a" + resolved "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.14.tgz" integrity sha512-DnyqqifT4Jrcvb8USYjp6FHtBpEIz1mnXu6pTRHZ0RL69LbQYiO+0lDFg5+OKA7U29oWSs3a/i8fhn8ZcceIWg== agent-base@6: version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" agent-base@^7.1.0, agent-base@^7.1.2: version "7.1.3" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.3.tgz#29435eb821bc4194633a5b89e5bc4703bafc25a1" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz" integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== ajv-formats@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== dependencies: ajv "^8.0.0" ajv@^8.0.0, ajv@^8.12.0: version "8.17.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== dependencies: fast-deep-equal "^3.1.3" @@ -2133,55 +2133,55 @@ ajv@^8.0.0, ajv@^8.12.0: ansi-escapes@^4.2.1: version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" ansi-escapes@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.0.0.tgz#00fc19f491bbb18e1d481b97868204f92109bfe7" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz" integrity sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw== dependencies: environment "^1.0.0" ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: version "6.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz" integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + 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" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== ansi-styles@^6.0.0, ansi-styles@^6.2.1: version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== anymatch@^3.0.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -2189,60 +2189,69 @@ anymatch@^3.0.3: arg@^4.1.0: version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== argparse@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" arrify@^2.0.0, arrify@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" + resolved "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== asn1@^0.2.6, asn1@~0.2.0, asn1@~0.2.3: version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== dependencies: safer-buffer "~2.1.0" assert-plus@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== ast-types@^0.13.4: version "0.13.4" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782" + resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz" integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== dependencies: tslib "^2.0.1" async-retry@1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.1.tgz#139f31f8ddce50c0870b0ba558a6079684aaed55" + resolved "https://registry.npmjs.org/async-retry/-/async-retry-1.3.1.tgz" integrity sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA== dependencies: retry "0.12.0" async@^3.2.3: version "3.2.6" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + resolved "https://registry.npmjs.org/async/-/async-3.2.6.tgz" integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -axios@1.7.9, axios@^1.7.4: +axios@1.8.4: + version "1.8.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.8.4.tgz#78990bb4bc63d2cae072952d374835950a82f447" + integrity sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +axios@^1.7.4: version "1.7.9" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.9.tgz#d7d071380c132a24accda1b2cfc1535b79ec650a" + resolved "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz" integrity sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw== dependencies: follow-redirects "^1.15.6" @@ -2251,7 +2260,7 @@ axios@1.7.9, axios@^1.7.4: babel-jest@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz" integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== dependencies: "@jest/transform" "^29.7.0" @@ -2264,7 +2273,7 @@ babel-jest@^29.7.0: babel-plugin-istanbul@^6.1.1: version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -2275,7 +2284,7 @@ babel-plugin-istanbul@^6.1.1: babel-plugin-jest-hoist@^29.6.3: version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz" integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== dependencies: "@babel/template" "^7.3.3" @@ -2285,7 +2294,7 @@ babel-plugin-jest-hoist@^29.6.3: babel-preset-current-node-syntax@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" + resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz" integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" @@ -2306,7 +2315,7 @@ babel-preset-current-node-syntax@^1.0.0: babel-preset-jest@^29.6.3: version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz" integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== dependencies: babel-plugin-jest-hoist "^29.6.3" @@ -2314,34 +2323,34 @@ babel-preset-jest@^29.6.3: balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base64-js@^1.3.0, base64-js@^1.3.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== basic-ftp@^5.0.2: version "5.0.5" - resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.5.tgz#14a474f5fffecca1f4f406f1c26b18f800225ac0" + resolved "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz" integrity sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg== bcrypt-pbkdf@^1.0.0, bcrypt-pbkdf@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== dependencies: tweetnacl "^0.14.3" bignumber.js@^9.0.0: version "9.1.2" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" + resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz" integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== bl@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== dependencies: buffer "^5.5.0" @@ -2350,12 +2359,12 @@ bl@^4.1.0: bowser@^2.11.0: version "2.11.0" - resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" + resolved "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz" integrity sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA== brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -2363,21 +2372,21 @@ brace-expansion@^1.1.7: brace-expansion@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: balanced-match "^1.0.0" braces@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: fill-range "^7.1.1" browserslist@^4.24.0: version "4.24.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz" integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== dependencies: caniuse-lite "^1.0.30001688" @@ -2387,31 +2396,31 @@ browserslist@^4.24.0: bs-logger@^0.2.6: version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + resolved "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz" integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== dependencies: fast-json-stable-stringify "2.x" bser@2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: node-int64 "^0.4.0" buffer-equal-constant-time@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + resolved "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz" integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer@^5.5.0: version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: base64-js "^1.3.1" @@ -2419,37 +2428,37 @@ buffer@^5.5.0: buildcheck@~0.0.6: version "0.0.6" - resolved "https://registry.yarnpkg.com/buildcheck/-/buildcheck-0.0.6.tgz#89aa6e417cfd1e2196e3f8fe915eb709d2fe4238" + resolved "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.6.tgz" integrity sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A== builtin-modules@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz" integrity sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ== callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelcase@^5.3.1: version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.2.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001688: version "1.0.30001695" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz#39dfedd8f94851132795fdf9b79d29659ad9c4d4" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz" integrity sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw== chalk@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== dependencies: ansi-styles "^4.1.0" @@ -2457,7 +2466,7 @@ chalk@3.0.0: chalk@4.1.2, chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -2465,7 +2474,7 @@ chalk@4.1.2, chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1: chalk@^2.3.0: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + 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" @@ -2474,51 +2483,51 @@ chalk@^2.3.0: chalk@~5.4.1: version "5.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.4.1.tgz#1b48bf0963ec158dce2aacf69c093ae2dd2092d8" + resolved "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz" integrity sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w== char-regex@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== chardet@^0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== ci-info@^3.2.0: version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.0.0: version "1.4.1" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz" integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== cli-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: restore-cursor "^3.1.0" cli-cursor@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz#24a4831ecf5a6b01ddeb32fb71a4b2088b0dce38" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz" integrity sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw== dependencies: restore-cursor "^5.0.0" cli-spinners@^2.5.0: version "2.9.2" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz" integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== cli-truncate@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" + resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz" integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== dependencies: slice-ansi "^5.0.0" @@ -2526,19 +2535,19 @@ cli-truncate@^4.0.0: cli-width@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + resolved "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== clipanion@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/clipanion/-/clipanion-3.2.1.tgz#2887db4cb232e80ba57cf19347a4e3a1c4a74133" + resolved "https://registry.npmjs.org/clipanion/-/clipanion-3.2.1.tgz" integrity sha512-dYFdjLb7y1ajfxQopN05mylEpK9ZX0sO1/RfMXdfmwjlIsPkbh4p7A682x++zFPLDCo1x3p82dtljHf5cW2LKA== dependencies: typanion "^3.8.0" cliui@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + 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" @@ -2547,46 +2556,46 @@ cliui@^8.0.1: clone@^1.0.2: version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== co@^4.6.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== collect-v8-coverage@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz" integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + 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" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + 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" color-name@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-string@^1.6.0: version "1.9.1" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== dependencies: color-name "^1.0.0" @@ -2594,7 +2603,7 @@ color-string@^1.6.0: color@^3.1.3: version "3.2.1" - resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + resolved "https://registry.npmjs.org/color/-/color-3.2.1.tgz" integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== dependencies: color-convert "^1.9.3" @@ -2602,12 +2611,12 @@ color@^3.1.3: colorette@^2.0.20: version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== colorspace@1.1.x: version "1.1.4" - resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" + resolved "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz" integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== dependencies: color "^3.1.3" @@ -2615,44 +2624,44 @@ colorspace@1.1.x: combined-stream@^1.0.6, combined-stream@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" commander@13.1.0: version "13.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-13.1.0.tgz#776167db68c78f38dcce1f9b8d7b8b9a488abf46" + resolved "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz" integrity sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw== commander@^2.12.1: version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== commander@~12.1.0: version "12.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" + resolved "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz" integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== convert-source-map@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== core-util-is@~1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cpu-features@~0.0.10: version "0.0.10" - resolved "https://registry.yarnpkg.com/cpu-features/-/cpu-features-0.0.10.tgz#9aae536db2710c7254d7ed67cb3cbc7d29ad79c5" + resolved "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz" integrity sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA== dependencies: buildcheck "~0.0.6" @@ -2660,7 +2669,7 @@ cpu-features@~0.0.10: create-jest@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + resolved "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz" integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== dependencies: "@jest/types" "^29.6.3" @@ -2673,12 +2682,12 @@ create-jest@^29.7.0: create-require@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== cross-spawn@^7.0.3: version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" @@ -2687,19 +2696,19 @@ cross-spawn@^7.0.3: dashdash@^1.12.0: version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== dependencies: assert-plus "^1.0.0" data-uri-to-buffer@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz#8a58bb67384b261a38ef18bea1810cb01badd28b" + resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz" integrity sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw== datadog-metrics@0.9.3: version "0.9.3" - resolved "https://registry.yarnpkg.com/datadog-metrics/-/datadog-metrics-0.9.3.tgz#e62d92b9619129805802d82111c8bcc4439fc859" + resolved "https://registry.npmjs.org/datadog-metrics/-/datadog-metrics-0.9.3.tgz" integrity sha512-BVsBX2t+4yA3tHs7DnB5H01cHVNiGJ/bHA8y6JppJDyXG7s2DLm6JaozPGpgsgVGd42Is1CHRG/yMDQpt877Xg== dependencies: debug "3.1.0" @@ -2707,48 +2716,48 @@ datadog-metrics@0.9.3: debug@3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + resolved "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz" integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: ms "2.0.0" debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4, debug@~4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz" integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: ms "^2.1.3" dedent@^1.0.0: version "1.5.3" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" + resolved "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz" integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== deep-extend@0.6.0, deep-extend@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deep-object-diff@^1.1.9: version "1.1.9" - resolved "https://registry.yarnpkg.com/deep-object-diff/-/deep-object-diff-1.1.9.tgz#6df7ef035ad6a0caa44479c536ed7b02570f4595" + resolved "https://registry.npmjs.org/deep-object-diff/-/deep-object-diff-1.1.9.tgz" integrity sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA== deepmerge@^4.2.2: version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== defaults@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz" integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== dependencies: clone "^1.0.2" degenerator@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-5.0.1.tgz#9403bf297c6dad9a1ece409b37db27954f91f2f5" + resolved "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz" integrity sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ== dependencies: ast-types "^0.13.4" @@ -2757,27 +2766,27 @@ degenerator@^5.0.0: delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== detect-newline@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== diff-sequences@^29.6.3: version "29.6.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== diff@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== dogapi@2.8.4: version "2.8.4" - resolved "https://registry.yarnpkg.com/dogapi/-/dogapi-2.8.4.tgz#ada64f20c6acdea206b9fd9e70df0c96241b6621" + resolved "https://registry.npmjs.org/dogapi/-/dogapi-2.8.4.tgz" integrity sha512-065fsvu5dB0o4+ENtLjZILvXMClDNH/yA9H6L8nsdcNiz9l0Hzpn7aQaCOPYXxqyzq4CRPOdwkFXUjDOXfRGbg== dependencies: extend "^3.0.2" @@ -2788,14 +2797,14 @@ dogapi@2.8.4: dot-prop@^6.0.0: version "6.0.1" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" + resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz" integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== dependencies: is-obj "^2.0.0" duplexify@^4.0.0, duplexify@^4.1.1: version "4.1.3" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.3.tgz#a07e1c0d0a2c001158563d32592ba58bddb0236f" + resolved "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz" integrity sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA== dependencies: end-of-stream "^1.4.1" @@ -2805,7 +2814,7 @@ duplexify@^4.0.0, duplexify@^4.1.1: ecc-jsbn@~0.1.1: version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== dependencies: jsbn "~0.1.0" @@ -2813,85 +2822,85 @@ ecc-jsbn@~0.1.1: ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11: version "1.0.11" - resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + resolved "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz" integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== dependencies: safe-buffer "^5.0.1" ee-first@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== ejs@^3.1.10: version "3.1.10" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" + resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz" integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== dependencies: jake "^10.8.5" electron-to-chromium@^1.5.73: version "1.5.84" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.84.tgz#8e334ca206bb293a20b16418bf454783365b0a95" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.84.tgz" integrity sha512-I+DQ8xgafao9Ha6y0qjHHvpZ9OfyA1qKlkHkjywxzniORU2awxyz7f/iVJcULmrF2yrM3nHQf+iDjJtbbexd/g== emittery@^0.13.1: version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz" integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== emoji-regex@^10.3.0: version "10.4.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.4.0.tgz#03553afea80b3975749cfcb36f776ca268e413d4" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz" integrity sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== enabled@2.0.x: version "2.0.0" - resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" + resolved "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz" integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" environment@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" + resolved "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz" integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== escodegen@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz" integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== dependencies: esprima "^4.0.1" @@ -2902,39 +2911,39 @@ escodegen@^2.1.0: esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== estraverse@^5.2.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== event-target-shim@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== eventemitter3@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz" integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== eventid@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/eventid/-/eventid-2.0.1.tgz#574e860149457a79a2efe788c459f0c3062d02ec" + resolved "https://registry.npmjs.org/eventid/-/eventid-2.0.1.tgz" integrity sha512-sPNTqiMokAvV048P2c9+foqVJzk49o6d4e0D/sq5jog3pw+4kBgyR0gaM1FM7Mx6Kzd9dztesh9oYz1LWWOpzw== dependencies: uuid "^8.0.0" execa@^5.0.0: version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: cross-spawn "^7.0.3" @@ -2949,7 +2958,7 @@ execa@^5.0.0: execa@~8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + resolved "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz" integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== dependencies: cross-spawn "^7.0.3" @@ -2964,12 +2973,12 @@ execa@~8.0.1: exit@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== expect@^29.0.0, expect@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + resolved "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz" integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== dependencies: "@jest/expect-utils" "^29.7.0" @@ -2980,12 +2989,12 @@ expect@^29.0.0, expect@^29.7.0: extend@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== external-editor@^3.0.3: version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz" integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== dependencies: chardet "^0.7.0" @@ -2994,81 +3003,81 @@ external-editor@^3.0.3: fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz#37b899ae47e1090e40e3fd2318e4d5f0142ca912" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz" integrity sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ== dependencies: fastest-levenshtein "^1.0.7" fast-uri@^3.0.1: version "3.0.6" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" + resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz" integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== fast-xml-parser@4.4.1: version "4.4.1" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz#86dbf3f18edf8739326447bcaac31b4ae7f6514f" + resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz" integrity sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw== dependencies: strnum "^1.0.5" fast-xml-parser@^4.4.1: version "4.5.1" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.5.1.tgz#a7e665ff79b7919100a5202f23984b6150f9b31e" + resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.1.tgz" integrity sha512-y655CeyUQ+jj7KBbYMc4FG01V8ZQqjN+gDYGJ50RtfsUB8iG9AmwmwoAgeKLJdmueKKMrH1RJ7yXHTSoczdv5w== dependencies: strnum "^1.0.5" fastest-levenshtein@^1.0.7: version "1.0.16" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz" integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== fb-watchman@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== dependencies: bser "2.1.1" fecha@^4.2.0: version "4.2.3" - resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" + resolved "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz" integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== figures@^3.0.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== dependencies: escape-string-regexp "^1.0.5" filelist@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + resolved "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz" integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== dependencies: minimatch "^5.0.1" fill-range@^7.1.1: version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + 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" find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" @@ -3076,17 +3085,17 @@ find-up@^4.0.0, find-up@^4.1.0: fn.name@1.x.x: version "1.1.0" - resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" + resolved "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz" integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== follow-redirects@^1.15.6: version "1.15.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz" integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== form-data@4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" @@ -3095,7 +3104,7 @@ form-data@4.0.0: form-data@4.0.1, form-data@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz" integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== dependencies: asynckit "^0.4.0" @@ -3104,7 +3113,7 @@ form-data@4.0.1, form-data@^4.0.0: form-data@^2.5.0: version "2.5.2" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.2.tgz#dc653743d1de2fcc340ceea38079daf6e9069fd2" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.5.2.tgz" integrity sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q== dependencies: asynckit "^0.4.0" @@ -3114,27 +3123,27 @@ form-data@^2.5.0: fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@^2.3.2: version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== fuzzy@^0.1.3: version "0.1.3" - resolved "https://registry.yarnpkg.com/fuzzy/-/fuzzy-0.1.3.tgz#4c76ec2ff0ac1a36a9dccf9a00df8623078d4ed8" + resolved "https://registry.npmjs.org/fuzzy/-/fuzzy-0.1.3.tgz" integrity sha512-/gZffu4ykarLrCiP3Ygsa86UAo1E5vEVlvTrpkKywXSbP9Xhln3oSp9QSV57gEq3JFFpGJ4GZ+5zdEp3FcUh4w== gaxios@^6.0.0, gaxios@^6.1.1: version "6.7.1" - resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-6.7.1.tgz#ebd9f7093ede3ba502685e73390248bb5b7f71fb" + resolved "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz" integrity sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ== dependencies: extend "^3.0.2" @@ -3145,7 +3154,7 @@ gaxios@^6.0.0, gaxios@^6.1.1: gcp-metadata@^6.0.0, gcp-metadata@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-6.1.0.tgz#9b0dd2b2445258e7597f2024332d20611cbd6b8c" + resolved "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz" integrity sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg== dependencies: gaxios "^6.0.0" @@ -3153,37 +3162,37 @@ gcp-metadata@^6.0.0, gcp-metadata@^6.1.0: gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.0, get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-east-asian-width@^1.0.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz#21b4071ee58ed04ee0db653371b55b4299875389" + resolved "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz" integrity sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ== get-package-type@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== get-stream@^6.0.0: version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== get-stream@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz" integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== get-uri@^6.0.1: version "6.0.4" - resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.4.tgz#6daaee9e12f9759e19e55ba313956883ef50e0a7" + resolved "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz" integrity sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ== dependencies: basic-ftp "^5.0.2" @@ -3192,7 +3201,7 @@ get-uri@^6.0.1: getpass@^0.1.1: version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== dependencies: assert-plus "^1.0.0" @@ -3209,12 +3218,12 @@ glob@10.0.0, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4: globals@^11.1.0: version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== google-auth-library@^9.0.0, google-auth-library@^9.12.0, google-auth-library@^9.3.0: version "9.15.0" - resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-9.15.0.tgz#1b009c08557929c881d72f953f17e839e91b009b" + resolved "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.0.tgz" integrity sha512-7ccSEJFDFO7exFbO6NRyC+xH8/mZ1GZGG2xxx9iHxZWcjUjJpjWxIMw3cofAKcueZ6DATiukmmprD7yavQHOyQ== dependencies: base64-js "^1.3.0" @@ -3226,7 +3235,7 @@ google-auth-library@^9.0.0, google-auth-library@^9.12.0, google-auth-library@^9. google-gax@^4.0.3: version "4.4.1" - resolved "https://registry.yarnpkg.com/google-gax/-/google-gax-4.4.1.tgz#95a9cf7ee7777ac22d1926a45b5f886dd8beecae" + resolved "https://registry.npmjs.org/google-gax/-/google-gax-4.4.1.tgz" integrity sha512-Phyp9fMfA00J3sZbJxbbB4jC55b7DBjE3F6poyL3wKMEBVKA79q6BGuHcTiM28yOzVql0NDbRL8MLLh8Iwk9Dg== dependencies: "@grpc/grpc-js" "^1.10.9" @@ -3244,12 +3253,12 @@ google-gax@^4.0.3: graceful-fs@^4.2.9: version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== gtoken@^7.0.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-7.1.0.tgz#d61b4ebd10132222817f7222b1e6064bd463fc26" + resolved "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz" integrity sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw== dependencies: gaxios "^6.0.0" @@ -3257,39 +3266,39 @@ gtoken@^7.0.0: has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== hasown@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" hpagent@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/hpagent/-/hpagent-1.2.0.tgz#0ae417895430eb3770c03443456b8d90ca464903" + resolved "https://registry.npmjs.org/hpagent/-/hpagent-1.2.0.tgz" integrity sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA== html-entities@^2.5.2: version "2.5.2" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.5.2.tgz#201a3cf95d3a15be7099521620d19dfb4f65359f" + resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz" integrity sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA== html-escaper@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== http-proxy-agent@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + 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" @@ -3298,7 +3307,7 @@ http-proxy-agent@^5.0.0: http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1: version "7.0.2" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz" integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== dependencies: agent-base "^7.1.0" @@ -3306,7 +3315,7 @@ http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1: https-proxy-agent@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + 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" @@ -3314,7 +3323,7 @@ https-proxy-agent@^5.0.0: https-proxy-agent@^7.0.1, https-proxy-agent@^7.0.6: version "7.0.6" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz" integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== dependencies: agent-base "^7.1.2" @@ -3322,34 +3331,34 @@ https-proxy-agent@^7.0.1, https-proxy-agent@^7.0.6: human-signals@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== human-signals@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz" integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== iconv-lite@^0.4.24: version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" ieee754@^1.1.13: version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== immediate@~3.0.5: version "3.0.6" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + resolved "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz" integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== import-local@^3.0.2: version "3.2.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz" integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== dependencies: pkg-dir "^4.2.0" @@ -3357,22 +3366,22 @@ import-local@^3.0.2: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== ini@~1.3.0: version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== inquirer-checkbox-plus-prompt@^1.4.2: version "1.4.2" - resolved "https://registry.yarnpkg.com/inquirer-checkbox-plus-prompt/-/inquirer-checkbox-plus-prompt-1.4.2.tgz#5a5bb42a3f4bca2f6f4e582d163733eb59f4b195" + resolved "https://registry.npmjs.org/inquirer-checkbox-plus-prompt/-/inquirer-checkbox-plus-prompt-1.4.2.tgz" integrity sha512-W8/NL9x5A81Oq9ZfbYW5c1LuwtAhc/oB/u9YZZejna0pqrajj27XhnUHygJV0Vn5TvcDy1VJcD2Ld9kTk40dvg== dependencies: chalk "4.1.2" @@ -3383,7 +3392,7 @@ inquirer-checkbox-plus-prompt@^1.4.2: inquirer@^8.2.5: version "8.2.6" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz" integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== dependencies: ansi-escapes "^4.2.1" @@ -3404,12 +3413,12 @@ inquirer@^8.2.5: inversify@^5.0.0: version "5.1.1" - resolved "https://registry.yarnpkg.com/inversify/-/inversify-5.1.1.tgz#6fbd668c591337404e005a1946bfe0d802c08730" + resolved "https://registry.npmjs.org/inversify/-/inversify-5.1.1.tgz" integrity sha512-j8grHGDzv1v+8T1sAQ+3boTCntFPfvxLCkNcxB1J8qA0lUN+fAlSyYd+RXKvaPRL4AGyPxViutBEJHNXOyUdFQ== ip-address@^9.0.5: version "9.0.5" - resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + resolved "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz" integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== dependencies: jsbn "1.1.0" @@ -3417,91 +3426,91 @@ ip-address@^9.0.5: is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-arrayish@^0.3.1: version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-core-module@^2.16.0: version "2.16.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz" integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== dependencies: hasown "^2.0.2" is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-fullwidth-code-point@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz" integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== is-fullwidth-code-point@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz#9609efced7c2f97da7b60145ef481c787c7ba704" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz" integrity sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== dependencies: get-east-asian-width "^1.0.0" is-generator-fn@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== is-interactive@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz" integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-obj@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-stream@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== is-unicode-supported@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== isarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz" integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== istanbul-lib-instrument@^5.0.4: version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== dependencies: "@babel/core" "^7.12.3" @@ -3512,7 +3521,7 @@ istanbul-lib-instrument@^5.0.4: istanbul-lib-instrument@^6.0.0: version "6.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz" integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== dependencies: "@babel/core" "^7.23.9" @@ -3523,7 +3532,7 @@ istanbul-lib-instrument@^6.0.0: istanbul-lib-report@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz" integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== dependencies: istanbul-lib-coverage "^3.0.0" @@ -3532,7 +3541,7 @@ istanbul-lib-report@^3.0.0: istanbul-lib-source-maps@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" @@ -3541,7 +3550,7 @@ istanbul-lib-source-maps@^4.0.0: istanbul-reports@^3.1.3: version "3.1.7" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz" integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== dependencies: html-escaper "^2.0.0" @@ -3549,7 +3558,7 @@ istanbul-reports@^3.1.3: jake@^10.8.5: version "10.9.2" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" + resolved "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz" integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== dependencies: async "^3.2.3" @@ -3559,7 +3568,7 @@ jake@^10.8.5: jest-changed-files@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz" integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== dependencies: execa "^5.0.0" @@ -3568,7 +3577,7 @@ jest-changed-files@^29.7.0: jest-circus@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz" integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== dependencies: "@jest/environment" "^29.7.0" @@ -3594,7 +3603,7 @@ jest-circus@^29.7.0: jest-cli@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz" integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== dependencies: "@jest/core" "^29.7.0" @@ -3611,7 +3620,7 @@ jest-cli@^29.7.0: jest-config@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz" integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== dependencies: "@babel/core" "^7.11.6" @@ -3639,7 +3648,7 @@ jest-config@^29.7.0: jest-diff@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz" integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== dependencies: chalk "^4.0.0" @@ -3649,14 +3658,14 @@ jest-diff@^29.7.0: jest-docblock@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz" integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== dependencies: detect-newline "^3.0.0" jest-each@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz" integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== dependencies: "@jest/types" "^29.6.3" @@ -3667,7 +3676,7 @@ jest-each@^29.7.0: jest-environment-node@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz" integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== dependencies: "@jest/environment" "^29.7.0" @@ -3679,12 +3688,12 @@ jest-environment-node@^29.7.0: jest-get-type@^29.6.3: version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz" integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== jest-haste-map@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz" integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== dependencies: "@jest/types" "^29.6.3" @@ -3703,7 +3712,7 @@ jest-haste-map@^29.7.0: jest-leak-detector@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz" integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== dependencies: jest-get-type "^29.6.3" @@ -3711,7 +3720,7 @@ jest-leak-detector@^29.7.0: jest-matcher-utils@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz" integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== dependencies: chalk "^4.0.0" @@ -3721,7 +3730,7 @@ jest-matcher-utils@^29.7.0: jest-message-util@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz" integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== dependencies: "@babel/code-frame" "^7.12.13" @@ -3736,7 +3745,7 @@ jest-message-util@^29.7.0: jest-mock@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz" integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== dependencies: "@jest/types" "^29.6.3" @@ -3745,17 +3754,17 @@ jest-mock@^29.7.0: jest-pnp-resolver@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz" integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== jest-regex-util@^29.6.3: version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz" integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== jest-resolve-dependencies@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz" integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== dependencies: jest-regex-util "^29.6.3" @@ -3763,7 +3772,7 @@ jest-resolve-dependencies@^29.7.0: jest-resolve@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz" integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== dependencies: chalk "^4.0.0" @@ -3778,7 +3787,7 @@ jest-resolve@^29.7.0: jest-runner@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz" integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== dependencies: "@jest/console" "^29.7.0" @@ -3805,7 +3814,7 @@ jest-runner@^29.7.0: jest-runtime@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz" integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== dependencies: "@jest/environment" "^29.7.0" @@ -3833,7 +3842,7 @@ jest-runtime@^29.7.0: jest-snapshot@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz" integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== dependencies: "@babel/core" "^7.11.6" @@ -3859,7 +3868,7 @@ jest-snapshot@^29.7.0: jest-util@^29.0.0, jest-util@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz" integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== dependencies: "@jest/types" "^29.6.3" @@ -3871,7 +3880,7 @@ jest-util@^29.0.0, jest-util@^29.7.0: jest-validate@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz" integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== dependencies: "@jest/types" "^29.6.3" @@ -3883,7 +3892,7 @@ jest-validate@^29.7.0: jest-watcher@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz" integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== dependencies: "@jest/test-result" "^29.7.0" @@ -3897,7 +3906,7 @@ jest-watcher@^29.7.0: jest-worker@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz" integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== dependencies: "@types/node" "*" @@ -3907,7 +3916,7 @@ jest-worker@^29.7.0: jest@29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + resolved "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz" integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== dependencies: "@jest/core" "^29.7.0" @@ -3917,17 +3926,17 @@ jest@29.7.0: jose@^4.15.1: version "4.15.9" - resolved "https://registry.yarnpkg.com/jose/-/jose-4.15.9.tgz#9b68eda29e9a0614c042fa29387196c7dd800100" + resolved "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz" integrity sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA== js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@3.13.1: version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== dependencies: argparse "^1.0.7" @@ -3935,7 +3944,7 @@ js-yaml@3.13.1: js-yaml@^3.13.1: version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" @@ -3943,44 +3952,44 @@ js-yaml@^3.13.1: jsbn@1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + resolved "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz" integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== jsbn@~0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== jsesc@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== json-bigint@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" + resolved "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz" integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== dependencies: bignumber.js "^9.0.0" json-parse-even-better-errors@^2.3.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + 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== json-schema-traverse@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== json5@^2.2.3: version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jszip@^3.10.1: version "3.10.1" - resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" + resolved "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz" integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== dependencies: lie "~3.3.0" @@ -3990,7 +3999,7 @@ jszip@^3.10.1: jwa@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.0.tgz#a7e9c3f29dae94027ebcaf49975c9345593410fc" + resolved "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz" integrity sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA== dependencies: buffer-equal-constant-time "1.0.1" @@ -3999,7 +4008,7 @@ jwa@^2.0.0: jws@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.0.tgz#2d4e8cf6a318ffaa12615e9dec7e86e6c97310f4" + resolved "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz" integrity sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg== dependencies: jwa "^2.0.0" @@ -4007,39 +4016,39 @@ jws@^4.0.0: kleur@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== kuler@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + resolved "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz" integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== leven@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== lie@~3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + resolved "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz" integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== dependencies: immediate "~3.0.5" lilconfig@~3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz" integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== lint-staged@15.4.1: version "15.4.1" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.4.1.tgz#b34e3297ae13fdb2d99b3456e2dbd8e20798bced" + resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-15.4.1.tgz" integrity sha512-P8yJuVRyLrm5KxCtFx+gjI5Bil+wO7wnTl7C3bXhvtTaAFGirzeB24++D0wGoUwxrUKecNiehemgCob9YL39NA== dependencies: chalk "~5.4.1" @@ -4055,7 +4064,7 @@ lint-staged@15.4.1: listr2@~8.2.5: version "8.2.5" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.2.5.tgz#5c9db996e1afeb05db0448196d3d5f64fec2593d" + resolved "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz" integrity sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ== dependencies: cli-truncate "^4.0.0" @@ -4067,29 +4076,29 @@ listr2@~8.2.5: locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" lodash.camelcase@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== lodash.memoize@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== lodash@^4.17.21, lodash@^4.17.5: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-symbols@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: chalk "^4.1.0" @@ -4097,7 +4106,7 @@ log-symbols@^4.1.0: log-update@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.1.0.tgz#1a04ff38166f94647ae1af562f4bd6a15b1b7cd4" + resolved "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz" integrity sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w== dependencies: ansi-escapes "^7.0.0" @@ -4108,7 +4117,7 @@ log-update@^6.1.0: logform@^2.7.0: version "2.7.0" - resolved "https://registry.yarnpkg.com/logform/-/logform-2.7.0.tgz#cfca97528ef290f2e125a08396805002b2d060d1" + resolved "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz" integrity sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ== dependencies: "@colors/colors" "1.6.0" @@ -4120,7 +4129,7 @@ logform@^2.7.0: long@^5.0.0: version "5.2.4" - resolved "https://registry.yarnpkg.com/long/-/long-5.2.4.tgz#ee651d5c7c25901cfca5e67220ae9911695e99b2" + resolved "https://registry.npmjs.org/long/-/long-5.2.4.tgz" integrity sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg== lru-cache@^10.2.0: @@ -4130,50 +4139,50 @@ lru-cache@^10.2.0: lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" lru-cache@^7.14.1: version "7.18.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== make-dir@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz" integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== dependencies: semver "^7.5.3" make-error@^1.1.1, make-error@^1.3.6: version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== makeerror@1.0.12: version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: tmpl "1.0.5" merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== micromatch@^4.0.4, micromatch@~4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: braces "^3.0.3" @@ -4181,41 +4190,41 @@ micromatch@^4.0.4, micromatch@~4.0.8: mime-db@1.52.0: version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12: version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + 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" mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== mimic-fn@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz" integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== mimic-function@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" + resolved "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz" integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== minimatch@^3.0.4, minimatch@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimatch@^5.0.1: version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== dependencies: brace-expansion "^2.0.1" @@ -4229,7 +4238,7 @@ minimatch@^9.0.0: minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== minipass@^5.0.0: @@ -4244,137 +4253,137 @@ minipass@^5.0.0: mkdirp@^0.5.1: version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" ms@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@^2.1.1, ms@^2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== mute-stream@0.0.8: version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== nan@^2.19.0, nan@^2.20.0: version "2.22.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3" + resolved "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz" integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== netmask@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" + resolved "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz" integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== node-fetch@^2.6.9, node-fetch@^2.7.0: version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + 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" node-int64@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== node-releases@^2.0.19: version "2.0.19" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz" integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== normalize-path@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== npm-run-path@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" npm-run-path@^5.1.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz" integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== dependencies: path-key "^4.0.0" object-hash@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz" integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== object-hash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== oidc-token-hash@^5.0.3: version "5.0.3" - resolved "https://registry.yarnpkg.com/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz#9a229f0a1ce9d4fc89bcaee5478c97a889e7b7b6" + resolved "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz" integrity sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw== on-finished@^2.3.0: version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" once@^1.3.1, once@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" one-time@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" + resolved "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz" integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== dependencies: fn.name "1.x.x" onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" onetime@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz" integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== dependencies: mimic-fn "^4.0.0" onetime@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60" + resolved "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz" integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== dependencies: mimic-function "^5.0.0" openid-client@5.6.1: version "5.6.1" - resolved "https://registry.yarnpkg.com/openid-client/-/openid-client-5.6.1.tgz#8f7526a50c290a5e28a7fe21b3ece3107511bc73" + resolved "https://registry.npmjs.org/openid-client/-/openid-client-5.6.1.tgz" integrity sha512-PtrWsY+dXg6y8mtMPyL/namZSYVz8pjXz3yJiBNZsEdCnu9miHLB4ELVC85WvneMKo2Rg62Ay7NkuCpM0bgiLQ== dependencies: jose "^4.15.1" @@ -4384,7 +4393,7 @@ openid-client@5.6.1: ora@5.4.1, ora@^5.4.1: version "5.4.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + resolved "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz" integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== dependencies: bl "^4.1.0" @@ -4399,38 +4408,38 @@ ora@5.4.1, ora@^5.4.1: os-tmpdir@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== p-limit@^2.2.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" p-limit@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" p-try@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== pac-proxy-agent@^7.1.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.1.0.tgz#da7c3b5c4cccc6655aaafb701ae140fb23f15df2" + resolved "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.1.0.tgz" integrity sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw== dependencies: "@tootallnate/quickjs-emscripten" "^0.23.0" @@ -4444,7 +4453,7 @@ pac-proxy-agent@^7.1.0: pac-resolver@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.1.tgz#54675558ea368b64d210fd9c92a640b5f3b8abb6" + resolved "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz" integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg== dependencies: degenerator "^5.0.0" @@ -4452,17 +4461,17 @@ pac-resolver@^7.0.1: packageurl-js@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/packageurl-js/-/packageurl-js-2.0.1.tgz#a8fa43a64971b5dd0dca5fb904b950a6cc317a6f" + resolved "https://registry.npmjs.org/packageurl-js/-/packageurl-js-2.0.1.tgz" integrity sha512-N5ixXjzTy4QDQH0Q9YFjqIWd6zH6936Djpl2m9QNFmDv5Fum8q8BjkpAcHNMzOFE0IwQrFhJWex3AN6kS0OSwg== pako@~1.0.2: version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== parse-json@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -4472,22 +4481,22 @@ parse-json@^5.2.0: path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-key@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-scurry@^1.6.4: @@ -4500,39 +4509,39 @@ path-scurry@^1.6.4: picocolors@^1.0.0, picocolors@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pidtree@~0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" + resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz" integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== pirates@^4.0.4: version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== pkg-dir@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" prettier@3.4.2: version "3.4.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" + resolved "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz" integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== pretty-format@^29.0.0, pretty-format@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz" integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== dependencies: "@jest/schemas" "^29.6.3" @@ -4541,12 +4550,12 @@ pretty-format@^29.0.0, pretty-format@^29.7.0: process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== prompts@^2.0.1: version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" @@ -4554,14 +4563,14 @@ prompts@^2.0.1: proto3-json-serializer@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/proto3-json-serializer/-/proto3-json-serializer-2.0.2.tgz#5b705203b4d58f3880596c95fad64902617529dd" + resolved "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.2.tgz" integrity sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ== dependencies: protobufjs "^7.2.5" protobufjs@^7.2.5, protobufjs@^7.3.2: version "7.4.0" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.4.0.tgz#7efe324ce9b3b61c82aae5de810d287bc08a248a" + resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz" integrity sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw== dependencies: "@protobufjs/aspromise" "^1.1.2" @@ -4579,7 +4588,7 @@ protobufjs@^7.2.5, protobufjs@^7.3.2: proxy-agent@^6.4.0: version "6.5.0" - resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.5.0.tgz#9e49acba8e4ee234aacb539f89ed9c23d02f232d" + resolved "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz" integrity sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A== dependencies: agent-base "^7.1.2" @@ -4593,12 +4602,12 @@ proxy-agent@^6.4.0: proxy-from-env@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== pump@^3.0.0: version "3.0.2" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz" integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== dependencies: end-of-stream "^1.1.0" @@ -4606,7 +4615,7 @@ pump@^3.0.0: pumpify@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-2.0.1.tgz#abfc7b5a621307c728b551decbbefb51f0e4aa1e" + resolved "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz" integrity sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw== dependencies: duplexify "^4.1.1" @@ -4615,12 +4624,12 @@ pumpify@^2.0.1: pure-rand@^6.0.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" + resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz" integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== rc@^1.2.8: version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: deep-extend "^0.6.0" @@ -4630,12 +4639,12 @@ rc@^1.2.8: react-is@^18.0.0: version "18.3.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.2: version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" @@ -4644,7 +4653,7 @@ readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.2: readable-stream@~2.3.6: version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" @@ -4657,39 +4666,39 @@ readable-stream@~2.3.6: reflect-metadata@^0.1.12: version "0.1.14" - resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.14.tgz#24cf721fe60677146bb77eeb0e1f9dece3d65859" + resolved "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz" integrity sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A== require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + 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== resolve-cwd@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== dependencies: resolve-from "^5.0.0" resolve-from@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve.exports@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.3.tgz#41955e6f1b4013b7586f873749a635dea07ebe3f" + resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz" integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== resolve@^1.20.0, resolve@^1.3.2: version "1.22.10" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz" integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== dependencies: is-core-module "^2.16.0" @@ -4698,7 +4707,7 @@ resolve@^1.20.0, resolve@^1.3.2: restore-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== dependencies: onetime "^5.1.0" @@ -4706,7 +4715,7 @@ restore-cursor@^3.1.0: restore-cursor@^5.0.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz" integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== dependencies: onetime "^7.0.0" @@ -4714,7 +4723,7 @@ restore-cursor@^5.0.0: retry-request@^7.0.0: version "7.0.2" - resolved "https://registry.yarnpkg.com/retry-request/-/retry-request-7.0.2.tgz#60bf48cfb424ec01b03fca6665dee91d06dd95f3" + resolved "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz" integrity sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w== dependencies: "@types/request" "^2.48.8" @@ -4723,110 +4732,110 @@ retry-request@^7.0.0: retry@0.12.0: version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== rfdc@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz" integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" run-async@^2.4.0: version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== rxjs@^6.6.7: version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== dependencies: tslib "^1.9.0" rxjs@^7.5.5: version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz" integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== dependencies: tslib "^2.1.0" safe-buffer@^5.0.1, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-stable-stringify@^2.3.1: version "2.5.0" - resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" + resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz" integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sax@>=0.6.0: version "1.4.1" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" + resolved "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz" integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== semver@7.6.3, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3: version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== semver@^5.3.0: version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== semver@^6.3.0, semver@^6.3.1: version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== setimmediate@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== signal-exit@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== simple-git@3.16.0: version "3.16.0" - resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.16.0.tgz#421773e24680f5716999cc4a1d60127b4b6a9dec" + resolved "https://registry.npmjs.org/simple-git/-/simple-git-3.16.0.tgz" integrity sha512-zuWYsOLEhbJRWVxpjdiXl6eyAyGo/KzVW+KFhhw9MqEEJttcq+32jTWSGyxTdf9e/YCohxRE+9xpWFj9FdiJNw== dependencies: "@kwsites/file-exists" "^1.1.1" @@ -4835,24 +4844,24 @@ simple-git@3.16.0: simple-swizzle@^0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== dependencies: is-arrayish "^0.3.1" sisteransi@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slice-ansi@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz" integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== dependencies: ansi-styles "^6.0.0" @@ -4860,7 +4869,7 @@ slice-ansi@^5.0.0: slice-ansi@^7.1.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.0.tgz#cd6b4655e298a8d1bdeb04250a433094b347b9a9" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz" integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== dependencies: ansi-styles "^6.2.1" @@ -4868,12 +4877,12 @@ slice-ansi@^7.1.0: smart-buffer@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== socks-proxy-agent@^8.0.5: version "8.0.5" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz#b9cdb4e7e998509d7659d689ce7697ac21645bee" + resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz" integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw== dependencies: agent-base "^7.1.2" @@ -4882,7 +4891,7 @@ socks-proxy-agent@^8.0.5: socks@^2.8.3: version "2.8.3" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" + resolved "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz" integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== dependencies: ip-address "^9.0.5" @@ -4890,7 +4899,7 @@ socks@^2.8.3: source-map-support@0.5.13: version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== dependencies: buffer-from "^1.0.0" @@ -4898,22 +4907,22 @@ source-map-support@0.5.13: source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== sprintf-js@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz" integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== ssh2-streams@0.4.10: version "0.4.10" - resolved "https://registry.yarnpkg.com/ssh2-streams/-/ssh2-streams-0.4.10.tgz#48ef7e8a0e39d8f2921c30521d56dacb31d23a34" + resolved "https://registry.npmjs.org/ssh2-streams/-/ssh2-streams-0.4.10.tgz" integrity sha512-8pnlMjvnIZJvmTzUIIA5nT4jr2ZWNNVHwyXfMGdRJbug9TpI3kd99ffglgfSWqujVv/0gxwMsDn9j9RVst8yhQ== dependencies: asn1 "~0.2.0" @@ -4922,7 +4931,7 @@ ssh2-streams@0.4.10: ssh2@^1.15.0: version "1.16.0" - resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-1.16.0.tgz#79221d40cbf4d03d07fe881149de0a9de928c9f0" + resolved "https://registry.npmjs.org/ssh2/-/ssh2-1.16.0.tgz" integrity sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg== dependencies: asn1 "^0.2.6" @@ -4933,7 +4942,7 @@ ssh2@^1.15.0: sshpk@1.16.1: version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz" integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== dependencies: asn1 "~0.2.3" @@ -4948,41 +4957,41 @@ sshpk@1.16.1: stack-trace@0.0.x: version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz" integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== stack-utils@^2.0.3: version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz" integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: escape-string-regexp "^2.0.0" stream-events@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/stream-events/-/stream-events-1.0.5.tgz#bbc898ec4df33a4902d892333d47da9bf1c406d5" + resolved "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz" integrity sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg== dependencies: stubs "^3.0.0" stream-shift@^1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.3.tgz#85b8fab4d71010fc3ba8772e8046cc49b8a3864b" + resolved "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz" integrity sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ== streamsearch@~0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" + resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz" integrity sha512-jos8u++JKm0ARcSUTAZXOVC0mSox7Bhn6sBgty73P1f3JGf7yG2clTbBNHUdde/kdvP2FESam+vM6l8jBrNxHA== string-argv@~0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz" integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== string-length@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== dependencies: char-regex "^1.0.2" @@ -4990,7 +4999,7 @@ string-length@^4.0.1: string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + 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" @@ -4999,7 +5008,7 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: string-width@^7.0.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" + resolved "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz" integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== dependencies: emoji-regex "^10.3.0" @@ -5008,91 +5017,91 @@ string-width@^7.0.0: string_decoder@^1.1.1: version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" string_decoder@~1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + 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" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^7.1.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" strip-bom@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== strip-final-newline@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz" integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strip-json-comments@~2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== strnum@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" + resolved "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz" integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== stubs@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/stubs/-/stubs-3.0.0.tgz#e8d2ba1fa9c90570303c030b6900f7d5f89abe5b" + resolved "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz" integrity sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw== supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.0.0, supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-color@^8.0.0: version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" supports-hyperlinks@^2.0.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" + resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz" integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== dependencies: has-flag "^4.0.0" @@ -5100,12 +5109,12 @@ supports-hyperlinks@^2.0.0: supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== teeny-request@^9.0.0: version "9.0.0" - resolved "https://registry.yarnpkg.com/teeny-request/-/teeny-request-9.0.0.tgz#18140de2eb6595771b1b02203312dfad79a4716d" + resolved "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz" integrity sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g== dependencies: http-proxy-agent "^5.0.0" @@ -5116,7 +5125,7 @@ teeny-request@^9.0.0: terminal-link@2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + resolved "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz" integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== dependencies: ansi-escapes "^4.2.1" @@ -5124,7 +5133,7 @@ terminal-link@2.1.1: test-exclude@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: "@istanbuljs/schema" "^0.1.2" @@ -5133,51 +5142,51 @@ test-exclude@^6.0.0: text-hex@1.0.x: version "1.0.0" - resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + resolved "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz" integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== through@^2.3.6: version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== tiny-async-pool@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/tiny-async-pool/-/tiny-async-pool-2.1.0.tgz#3ec126568c18a7916912fb9fbecf812337ec6b84" + resolved "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-2.1.0.tgz" integrity sha512-ltAHPh/9k0STRQqaoUX52NH4ZQYAJz24ZAEwf1Zm+HYg3l9OXTWeqWKyYsHu40wF/F0rxd2N2bk5sLvX2qlSvg== tmp@^0.0.33: version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" tmpl@1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + 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" tr46@~0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== triple-beam@^1.3.0: version "1.4.1" - resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" + resolved "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz" integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== ts-jest@29.2.5: version "29.2.5" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.5.tgz#591a3c108e1f5ebd013d3152142cb5472b399d63" + resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz" integrity sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA== dependencies: bs-logger "^0.2.6" @@ -5192,7 +5201,7 @@ ts-jest@29.2.5: ts-node@10.9.2: version "10.9.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz" integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== dependencies: "@cspotcode/source-map-support" "^0.8.0" @@ -5211,22 +5220,22 @@ ts-node@10.9.2: tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.1, tslib@^2.1.0, tslib@^2.6.2: version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== tslint-config-prettier@1.18.0: version "1.18.0" - resolved "https://registry.yarnpkg.com/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz#75f140bde947d35d8f0d238e0ebf809d64592c37" + resolved "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz" integrity sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg== tslint-consistent-codestyle@1.16.0: version "1.16.0" - resolved "https://registry.yarnpkg.com/tslint-consistent-codestyle/-/tslint-consistent-codestyle-1.16.0.tgz#52348ea899a7e025b37cc6545751c6a566a19077" + resolved "https://registry.npmjs.org/tslint-consistent-codestyle/-/tslint-consistent-codestyle-1.16.0.tgz" integrity sha512-ebR/xHyMEuU36hGNOgCfjGBNYxBPixf0yU1Yoo6s3BrpBRFccjPOmIVaVvQsWAUAMdmfzHOCihVkcaMfimqvHw== dependencies: "@fimbul/bifrost" "^0.21.0" @@ -5235,7 +5244,7 @@ tslint-consistent-codestyle@1.16.0: tslint@5.20.1: version "5.20.1" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.20.1.tgz#e401e8aeda0152bc44dd07e614034f3f80c67b7d" + resolved "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz" integrity sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg== dependencies: "@babel/code-frame" "^7.0.0" @@ -5254,56 +5263,56 @@ tslint@5.20.1: tsutils@^2.29.0: version "2.29.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz" integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== dependencies: tslib "^1.8.1" tsutils@^3.5.0: version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== typanion@^3.14.0, typanion@^3.8.0: version "3.14.0" - resolved "https://registry.yarnpkg.com/typanion/-/typanion-3.14.0.tgz#a766a91810ce8258033975733e836c43a2929b94" + resolved "https://registry.npmjs.org/typanion/-/typanion-3.14.0.tgz" integrity sha512-ZW/lVMRabETuYCd9O9ZvMhAh8GslSqaUjxmK/JLPCh6l73CvLBiuXswj/+7LdnWOgYsQ130FqLzFz5aGT4I3Ug== type-detect@4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== typescript@5.3.3: version "5.3.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz" integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== undici-types@~5.26.4: version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== undici-types@~6.20.0: version "6.20.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz" integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== update-browserslist-db@^1.1.1: version "1.1.2" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz#97e9c96ab0ae7bcac08e9ae5151d26e6bc6b5580" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz" integrity sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg== dependencies: escalade "^3.2.0" @@ -5311,27 +5320,27 @@ update-browserslist-db@^1.1.1: util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== uuid@^8.0.0: version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== uuid@^9.0.0, uuid@^9.0.1: version "9.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== v8-compile-cache-lib@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== v8-to-istanbul@^9.0.1: version "9.3.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz" integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== dependencies: "@jridgewell/trace-mapping" "^0.3.12" @@ -5340,31 +5349,31 @@ v8-to-istanbul@^9.0.1: valid-url@1.0.9: version "1.0.9" - resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" + resolved "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz" integrity sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA== walker@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: makeerror "1.0.12" wcwidth@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz" integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== dependencies: defaults "^1.0.3" webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" @@ -5372,14 +5381,14 @@ whatwg-url@^5.0.0: which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" winston-transport@^4.9.0: version "4.9.0" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.9.0.tgz#3bba345de10297654ea6f33519424560003b3bf9" + resolved "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz" integrity sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A== dependencies: logform "^2.7.0" @@ -5388,7 +5397,7 @@ winston-transport@^4.9.0: winston@3.17.0: version "3.17.0" - resolved "https://registry.yarnpkg.com/winston/-/winston-3.17.0.tgz#74b8665ce9b4ea7b29d0922cfccf852a08a11423" + resolved "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz" integrity sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw== dependencies: "@colors/colors" "^1.6.0" @@ -5405,7 +5414,7 @@ winston@3.17.0: wrap-ansi@^6.0.1: version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== dependencies: ansi-styles "^4.0.0" @@ -5414,7 +5423,7 @@ wrap-ansi@^6.0.1: wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + 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" @@ -5423,7 +5432,7 @@ wrap-ansi@^7.0.0: wrap-ansi@^9.0.0: version "9.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz#1a3dc8b70d85eeb8398ddfb1e4a02cd186e58b3e" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz" integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== dependencies: ansi-styles "^6.2.1" @@ -5432,12 +5441,12 @@ wrap-ansi@^9.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz" integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== dependencies: imurmurhash "^0.1.4" @@ -5445,12 +5454,12 @@ write-file-atomic@^4.0.2: ws@^7.5.10: version "7.5.10" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz" integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== xml2js@0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.5.0.tgz#d9440631fbb2ed800203fad106f2724f62c493b7" + resolved "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz" integrity sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA== dependencies: sax ">=0.6.0" @@ -5458,47 +5467,47 @@ xml2js@0.5.0: xmlbuilder@~11.0.0: version "11.0.1" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz" integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== y18n@^5.0.5: version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^3.0.2: version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@2.7.0: version "2.7.0" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.7.0.tgz#aef9bb617a64c937a9a748803786ad8d3ffe1e98" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz" integrity sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA== yaml@~2.6.1: version "2.6.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.6.1.tgz#42f2b1ba89203f374609572d5349fb8686500773" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz" integrity sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg== yamux-js@0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/yamux-js/-/yamux-js-0.1.2.tgz#a157e4922f8f0393725955c352b418f16259fd48" + resolved "https://registry.npmjs.org/yamux-js/-/yamux-js-0.1.2.tgz" integrity sha512-bhsPlPZ9xB4Dawyf6nkS58u4F3IvGCaybkEKGnneUeepcI7MPoG3Tt6SaKCU5x/kP2/2w20Qm/GqbpwAM16vYw== yargs-parser@^21.1.1: version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs@^17.3.1, yargs@^17.7.2: version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" @@ -5511,10 +5520,10 @@ yargs@^17.3.1, yargs@^17.7.2: yn@3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==