From 61ad0765763d8c7e60ea851d95db44fe16f6c36e Mon Sep 17 00:00:00 2001 From: Ray Chen Date: Thu, 20 Jun 2024 00:43:46 +0800 Subject: [PATCH] Deleted codes of sdk-generation-pipeline path (#8472) * Deleted codes of sdk-generation-pipeline path * Revert change of other paths under CODEOWNER --- .github/CODEOWNERS | 1 - tools/sdk-generation-pipeline/.eslintignore | 4 - tools/sdk-generation-pipeline/.eslintrc.json | 68 - tools/sdk-generation-pipeline/.gitattributes | 14 - .../.github/workflows/ci.yml | 27 - tools/sdk-generation-pipeline/.gitignore | 78 - tools/sdk-generation-pipeline/Dockerfile | 79 - .../build-publish-docker-image.yml | 69 - tools/sdk-generation-pipeline/ci.yml | 252 - .../common/config/rush/.npmrc | 22 - .../common/config/rush/.npmrc-publish | 20 - .../common/config/rush/.pnpmfile.cjs | 38 - .../common/config/rush/artifactory.json | 89 - .../common/config/rush/build-cache.json | 100 - .../common/config/rush/command-line.json | 297 - .../common/config/rush/common-versions.json | 62 - .../common/config/rush/experiments.json | 44 - .../common/config/rush/pnpm-lock.yaml | 6915 ----------------- .../common/config/rush/rush-plugins.json | 29 - .../common/config/rush/version-policies.json | 102 - .../common/git-hooks/commit-msg.sample | 25 - .../common/scripts/install-run-rush-pnpm.js | 28 - .../common/scripts/install-run-rush.js | 214 - .../common/scripts/install-run-rushx.js | 28 - .../common/scripts/install-run.js | 713 -- .../documents/deployment/README.md | 27 - .../documents/docker/README.md | 167 - .../docker/autorest-config-file-sample.md | 6 - .../documents/docker/build-docker-image.md | 12 - .../documents/docker/docker-image-design.md | 16 - .../docker/images/docker-design.drawio.png | Bin 71153 -> 0 bytes .../images/docker-image-layers.drawio.png | Bin 22161 -> 0 bytes .../images/extension-remote-containers.png | Bin 20337 -> 0 bytes .../docker/vscode-connect-docker-container.md | 24 - .../documents/task-engine/README.md | 135 - .../schema/CodegenToSdkConfigSchema.json | 112 - .../schema/GenerateAndBuildInputSchema.json | 45 - .../schema/GenerateAndBuildOutputSchema.json | 69 - .../task-engine/schema/InitOutputSchema.json | 11 - .../schema/LiveTestInputSchema.json | 10 - .../schema/MockTestInputSchema.json | 13 - .../task-engine/schema/TestOutputSchema.json | 21 - .../packages/sdk-generation-cli/LICENSE | 21 - .../packages/sdk-generation-cli/README.md | 79 - .../sdk-generation-cli/jest.config.js | 44 - .../packages/sdk-generation-cli/package.json | 67 - .../src/cli/dockerCli/core/DockerContext.ts | 146 - .../cli/dockerCli/core/DockerRunningModel.ts | 5 - .../dockerCli/core/DockerTaskEngineContext.ts | 160 - .../src/cli/dockerCli/core/constants.ts | 7 - .../src/cli/dockerCli/core/jobs/BaseJob.ts | 8 - .../core/jobs/GenerateCodesInLocalJob.ts | 58 - .../core/jobs/GenerateCodesInPipelineJob.ts | 18 - .../src/cli/dockerCli/core/jobs/GrowUpJob.ts | 72 - .../core/tasks/GenerateAndBuildTask.ts | 87 - .../src/cli/dockerCli/core/tasks/InitTask.ts | 55 - .../cli/dockerCli/core/tasks/MockTestTask.ts | 73 - .../core/tasks/SDKGenerationTaskBase.ts | 10 - .../src/cli/dockerCli/dockerCli.ts | 38 - .../src/cli/dockerCli/runMockHostCli.ts | 69 - .../cli/dockerCli/schema/dockerCliInput.ts | 121 - .../dockerCli/schema/dockerTaskEngineInput.ts | 128 - .../cli/dockerCli/schema/mockHostCliInput.ts | 26 - .../src/cli/pipelineCli/generateResultCli.ts | 75 - .../src/cli/pipelineCli/getRepoNameCli.ts | 20 - .../pipelineCli/prepareArtifactFilesCli.ts | 205 - .../src/cli/pipelineCli/publishResultCli.ts | 213 - .../src/cli/pipelineCli/uploadArtifactCli.ts | 40 - .../src/cliSchema/generateResultCliConfig.ts | 61 - .../prepareArtifactFilesCliConfig.ts | 68 - .../src/cliSchema/publishResultConfig.ts | 284 - .../src/cliSchema/uploadArtifactConfig.ts | 39 - .../src/utils/GitOperationWrapper.ts | 96 - .../src/utils/SdkGenerationServerClient.ts | 29 - .../src/utils/autorestConfigExtractorUtils.ts | 36 - .../sdk-generation-cli/src/utils/validator.ts | 5 - .../test/integration/integrationTest.ts | 114 - .../test/unit/DockerTaskEngine.test.ts | 90 - .../test/unit/GitOperationWrapper.test.ts | 51 - .../unit/autorestConfigExtractorUtils.test.ts | 50 - .../test/unit/utils/autorest-multi-config.md | 13 - .../test/unit/utils/autorest-single-config.md | 6 - .../test/unit/utils/mockChildProcess.ts | 167 - .../test/unit/utils/prepareEnvironment.ts | 57 - .../packages/sdk-generation-cli/tsconfig.json | 22 - .../packages/sdk-generation-lib/LICENSE | 21 - .../packages/sdk-generation-lib/README.md | 37 - .../sdk-generation-lib/jest.config.js | 23 - .../packages/sdk-generation-lib/package.json | 64 - .../packages/sdk-generation-lib/src/index.ts | 3 - .../src/lib/ArtifactUploader.ts | 102 - .../src/lib/ResultPublisher.ts | 136 - .../sdk-generation-lib/src/lib/executeTask.ts | 64 - .../src/lib/generateResult.ts | 144 - .../sdk-generation-lib/src/lib/getTask.ts | 22 - .../sdk-generation-lib/src/lib/index.ts | 6 - .../sdk-generation-lib/src/lib/runScript.ts | 109 - .../src/types/codeGeneration.ts | 61 - .../src/types/commonType.ts | 37 - .../sdk-generation-lib/src/types/events.ts | 47 - .../sdk-generation-lib/src/types/index.ts | 6 - .../src/types/taskBasicConfig.ts | 80 - .../CodegenToSdkConfig.ts | 41 - .../CodegenToSdkConfigSchema.json | 112 - .../GenerateAndBuildInput.ts | 21 - .../GenerateAndBuildInputSchema.json | 45 - .../GenerateAndBuildOutput.ts | 27 - .../GenerateAndBuildOutputSchema.json | 69 - .../InitOutput.ts | 16 - .../InitOutputSchema.json | 11 - .../LiveTestInput.ts | 10 - .../LiveTestInputSchema.json | 10 - .../MockTestInput.ts | 11 - .../MockTestInputSchema.json | 13 - .../TestOutput.ts | 14 - .../TestOutputSchema.json | 21 - .../taskInputAndOuputSchemaTypes/index.ts | 7 - .../src/types/taskResult.ts | 161 - .../src/utils/blob/AzureBlobClient.ts | 40 - .../src/utils/blob/index.ts | 1 - .../src/utils/db/codeGenerationDao.ts | 11 - .../src/utils/db/codeGenerationDaoImpl.ts | 71 - .../sdk-generation-lib/src/utils/db/index.ts | 4 - .../src/utils/db/taskResultDao.ts | 6 - .../src/utils/db/taskResultDaoImpl.ts | 36 - .../src/utils/eventhub/EventHubProducer.ts | 74 - .../src/utils/eventhub/index.ts | 1 - .../sdk-generation-lib/src/utils/index.ts | 7 - .../sdk-generation-lib/src/utils/logger.ts | 83 - .../src/utils/metric/MonitorClient.ts | 52 - .../src/utils/metric/index.ts | 1 - .../src/utils/requireJsonc.ts | 8 - .../sdk-generation-lib/src/utils/validator.ts | 25 - .../test/unit/ArtifactUploader.test.ts.tmp | 8 - .../test/unit/ResultPublisher.test.ts.tmp | 4 - .../test/unit/codeGenerationDao.test.ts | 436 -- .../test/unit/generateResult.test.ts | 117 - .../packages/sdk-generation-lib/tsconfig.json | 22 - .../pipelines/steps/generate-sdk.yml | 115 - .../steps/parse-and-publish-result.yml | 215 - .../pipelines/steps/pipeline-setup.yml | 92 - .../pipelines/steps/precheck.yml | 30 - tools/sdk-generation-pipeline/rush.json | 338 - .../scripts/change-owner.sh | 27 - .../scripts/entrypoint.sh | 9 - .../scripts/install-vscode-server.sh | 16 - .../scripts/rerun-tasks | 3 - .../sdk-generation-pipeline.yml | 123 - 148 files changed, 16545 deletions(-) delete mode 100644 tools/sdk-generation-pipeline/.eslintignore delete mode 100644 tools/sdk-generation-pipeline/.eslintrc.json delete mode 100644 tools/sdk-generation-pipeline/.gitattributes delete mode 100644 tools/sdk-generation-pipeline/.github/workflows/ci.yml delete mode 100644 tools/sdk-generation-pipeline/.gitignore delete mode 100644 tools/sdk-generation-pipeline/Dockerfile delete mode 100644 tools/sdk-generation-pipeline/build-publish-docker-image.yml delete mode 100644 tools/sdk-generation-pipeline/ci.yml delete mode 100644 tools/sdk-generation-pipeline/common/config/rush/.npmrc delete mode 100644 tools/sdk-generation-pipeline/common/config/rush/.npmrc-publish delete mode 100644 tools/sdk-generation-pipeline/common/config/rush/.pnpmfile.cjs delete mode 100644 tools/sdk-generation-pipeline/common/config/rush/artifactory.json delete mode 100644 tools/sdk-generation-pipeline/common/config/rush/build-cache.json delete mode 100644 tools/sdk-generation-pipeline/common/config/rush/command-line.json delete mode 100644 tools/sdk-generation-pipeline/common/config/rush/common-versions.json delete mode 100644 tools/sdk-generation-pipeline/common/config/rush/experiments.json delete mode 100644 tools/sdk-generation-pipeline/common/config/rush/pnpm-lock.yaml delete mode 100644 tools/sdk-generation-pipeline/common/config/rush/rush-plugins.json delete mode 100644 tools/sdk-generation-pipeline/common/config/rush/version-policies.json delete mode 100644 tools/sdk-generation-pipeline/common/git-hooks/commit-msg.sample delete mode 100644 tools/sdk-generation-pipeline/common/scripts/install-run-rush-pnpm.js delete mode 100644 tools/sdk-generation-pipeline/common/scripts/install-run-rush.js delete mode 100644 tools/sdk-generation-pipeline/common/scripts/install-run-rushx.js delete mode 100644 tools/sdk-generation-pipeline/common/scripts/install-run.js delete mode 100644 tools/sdk-generation-pipeline/documents/deployment/README.md delete mode 100644 tools/sdk-generation-pipeline/documents/docker/README.md delete mode 100644 tools/sdk-generation-pipeline/documents/docker/autorest-config-file-sample.md delete mode 100644 tools/sdk-generation-pipeline/documents/docker/build-docker-image.md delete mode 100644 tools/sdk-generation-pipeline/documents/docker/docker-image-design.md delete mode 100644 tools/sdk-generation-pipeline/documents/docker/images/docker-design.drawio.png delete mode 100644 tools/sdk-generation-pipeline/documents/docker/images/docker-image-layers.drawio.png delete mode 100755 tools/sdk-generation-pipeline/documents/docker/images/extension-remote-containers.png delete mode 100644 tools/sdk-generation-pipeline/documents/docker/vscode-connect-docker-container.md delete mode 100644 tools/sdk-generation-pipeline/documents/task-engine/README.md delete mode 100644 tools/sdk-generation-pipeline/documents/task-engine/schema/CodegenToSdkConfigSchema.json delete mode 100644 tools/sdk-generation-pipeline/documents/task-engine/schema/GenerateAndBuildInputSchema.json delete mode 100644 tools/sdk-generation-pipeline/documents/task-engine/schema/GenerateAndBuildOutputSchema.json delete mode 100644 tools/sdk-generation-pipeline/documents/task-engine/schema/InitOutputSchema.json delete mode 100644 tools/sdk-generation-pipeline/documents/task-engine/schema/LiveTestInputSchema.json delete mode 100644 tools/sdk-generation-pipeline/documents/task-engine/schema/MockTestInputSchema.json delete mode 100644 tools/sdk-generation-pipeline/documents/task-engine/schema/TestOutputSchema.json delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/LICENSE delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/README.md delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/jest.config.js delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/package.json delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/DockerContext.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/DockerRunningModel.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/DockerTaskEngineContext.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/constants.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/jobs/BaseJob.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/jobs/GenerateCodesInLocalJob.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/jobs/GenerateCodesInPipelineJob.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/jobs/GrowUpJob.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/tasks/GenerateAndBuildTask.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/tasks/InitTask.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/tasks/MockTestTask.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/tasks/SDKGenerationTaskBase.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/dockerCli.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/runMockHostCli.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/schema/dockerCliInput.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/schema/dockerTaskEngineInput.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/schema/mockHostCliInput.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/pipelineCli/generateResultCli.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/pipelineCli/getRepoNameCli.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/pipelineCli/prepareArtifactFilesCli.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/pipelineCli/publishResultCli.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/pipelineCli/uploadArtifactCli.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cliSchema/generateResultCliConfig.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cliSchema/prepareArtifactFilesCliConfig.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cliSchema/publishResultConfig.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cliSchema/uploadArtifactConfig.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/utils/GitOperationWrapper.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/utils/SdkGenerationServerClient.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/utils/autorestConfigExtractorUtils.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/utils/validator.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/integration/integrationTest.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/unit/DockerTaskEngine.test.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/unit/GitOperationWrapper.test.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/unit/autorestConfigExtractorUtils.test.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/unit/utils/autorest-multi-config.md delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/unit/utils/autorest-single-config.md delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/unit/utils/mockChildProcess.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/unit/utils/prepareEnvironment.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-cli/tsconfig.json delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/LICENSE delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/README.md delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/jest.config.js delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/package.json delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/index.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/ArtifactUploader.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/ResultPublisher.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/executeTask.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/generateResult.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/getTask.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/index.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/runScript.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/codeGeneration.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/commonType.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/events.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/index.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskBasicConfig.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/CodegenToSdkConfig.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/CodegenToSdkConfigSchema.json delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/GenerateAndBuildInput.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/GenerateAndBuildInputSchema.json delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/GenerateAndBuildOutput.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/GenerateAndBuildOutputSchema.json delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/InitOutput.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/InitOutputSchema.json delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/LiveTestInput.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/LiveTestInputSchema.json delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/MockTestInput.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/MockTestInputSchema.json delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/TestOutput.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/TestOutputSchema.json delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/index.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskResult.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/blob/AzureBlobClient.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/blob/index.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/db/codeGenerationDao.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/db/codeGenerationDaoImpl.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/db/index.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/db/taskResultDao.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/db/taskResultDaoImpl.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/eventhub/EventHubProducer.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/eventhub/index.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/index.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/logger.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/metric/MonitorClient.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/metric/index.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/requireJsonc.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/validator.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/test/unit/ArtifactUploader.test.ts.tmp delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/test/unit/ResultPublisher.test.ts.tmp delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/test/unit/codeGenerationDao.test.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/test/unit/generateResult.test.ts delete mode 100644 tools/sdk-generation-pipeline/packages/sdk-generation-lib/tsconfig.json delete mode 100644 tools/sdk-generation-pipeline/pipelines/steps/generate-sdk.yml delete mode 100644 tools/sdk-generation-pipeline/pipelines/steps/parse-and-publish-result.yml delete mode 100644 tools/sdk-generation-pipeline/pipelines/steps/pipeline-setup.yml delete mode 100644 tools/sdk-generation-pipeline/pipelines/steps/precheck.yml delete mode 100644 tools/sdk-generation-pipeline/rush.json delete mode 100644 tools/sdk-generation-pipeline/scripts/change-owner.sh delete mode 100755 tools/sdk-generation-pipeline/scripts/entrypoint.sh delete mode 100644 tools/sdk-generation-pipeline/scripts/install-vscode-server.sh delete mode 100755 tools/sdk-generation-pipeline/scripts/rerun-tasks delete mode 100644 tools/sdk-generation-pipeline/sdk-generation-pipeline.yml diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 57d77a50ecf..f2bc65272b1 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -38,7 +38,6 @@ /tools/pipeline-generator/ @weshaggard @benbp /tools/pipeline-witness/ @praveenkuttappan @weshaggard /tools/sdk-ai-bots/ @raych1 -/tools/sdk-generation-pipeline/ @weshaggard @praveenkuttappan @maririos @raych1 @tadelesh /tools/sdk-testgen/ @raych1 @tadelesh /tools/test-proxy/ @scbedd @mikeharder @benbp /tools/tsp-client/ @catalinaperalta diff --git a/tools/sdk-generation-pipeline/.eslintignore b/tools/sdk-generation-pipeline/.eslintignore deleted file mode 100644 index 0fd4c33c4fd..00000000000 --- a/tools/sdk-generation-pipeline/.eslintignore +++ /dev/null @@ -1,4 +0,0 @@ -dist/ -tmp -*.js -node_modules \ No newline at end of file diff --git a/tools/sdk-generation-pipeline/.eslintrc.json b/tools/sdk-generation-pipeline/.eslintrc.json deleted file mode 100644 index 7207402c6f1..00000000000 --- a/tools/sdk-generation-pipeline/.eslintrc.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "env": { - "browser": true, - "commonjs": true, - "es2021": true - }, - "extends": [ - "google" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": "2019" - }, - "plugins": [ - "@typescript-eslint", - "simple-import-sort" - ], - "rules": { - "indent": ["error", 4], - "max-len": ["error", 160], - "comma-dangle": ["error", "never"], - "require-jsdoc": ["error", { - "require": { - "FunctionDeclaration": false, - "MethodDefinition": false, - "ClassDeclaration": false, - "ArrowFunctionExpression": false, - "FunctionExpression": false - } - }], - "object-curly-spacing": ["error", "always"], - "simple-import-sort/imports": "error", - "new-cap": "off", - "valid-jsdoc": "off", - "@typescript-eslint/naming-convention": [ - "error", - { - "selector": ["class", "interface", "enum", "enumMember", "typeParameter", "typeLike", "default"], - "format": ["PascalCase"], - "filter": { - "regex": "^_$", - "match": false - } - }, - { - "selector": [ "variable", "parameter", "function", "method", "property", "memberLike"], - "format": ["camelCase"], - "filter": { - "regex": "^_$", - "match": false - } - }, - { - "selector": ["default"], - "modifiers": ["global", "const"], - "format": ["UPPER_CASE"], - "filter": { - "regex": "^_$", - "match": false - } - }, - { - "selector": ["objectLiteralProperty"], - "format": null - } - ] - } -} diff --git a/tools/sdk-generation-pipeline/.gitattributes b/tools/sdk-generation-pipeline/.gitattributes deleted file mode 100644 index 79a85db5c23..00000000000 --- a/tools/sdk-generation-pipeline/.gitattributes +++ /dev/null @@ -1,14 +0,0 @@ -# Don't allow people to merge changes to these generated files, because the result -# may be invalid. You need to run "rush update" again. -pnpm-lock.yaml merge=text -shrinkwrap.yaml merge=binary -npm-shrinkwrap.json merge=binary -yarn.lock merge=binary - -# Rush's JSON config files use JavaScript-style code comments. The rule below prevents pedantic -# syntax highlighters such as GitHub's from highlighting these comments as errors. Your text editor -# may also require a special configuration to allow comments in JSON. -# -# For more information, see this issue: https://github.com/microsoft/rushstack/issues/1088 -# -*.json linguist-language=JSON-with-Comments diff --git a/tools/sdk-generation-pipeline/.github/workflows/ci.yml b/tools/sdk-generation-pipeline/.github/workflows/ci.yml deleted file mode 100644 index 5eb57796fa6..00000000000 --- a/tools/sdk-generation-pipeline/.github/workflows/ci.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: CI -on: - push: - branches: [ "main" ] - pull_request: - branches: [ "main" ] -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 2 - - name: Git config user - uses: snow-actions/git-config-user@v1.0.0 - with: - name: # Service Account's Name - email: # Service Account's Email Address - - uses: actions/setup-node@v3 - with: - node-version: 16 - - name: Verify Change Logs - run: node common/scripts/install-run-rush.js change --verify - - name: Rush Install - run: node common/scripts/install-run-rush.js install - - name: Rush rebuild - run: node common/scripts/install-run-rush.js rebuild --verbose --production diff --git a/tools/sdk-generation-pipeline/.gitignore b/tools/sdk-generation-pipeline/.gitignore deleted file mode 100644 index c9c170fc258..00000000000 --- a/tools/sdk-generation-pipeline/.gitignore +++ /dev/null @@ -1,78 +0,0 @@ -!packages/** -!lib/** - -# Logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# Runtime data -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env - -# next.js build output -.next - -# OS X temporary files -.DS_Store - -# IntelliJ IDEA project files; if you want to commit IntelliJ settings, this recipe may be helpful: -# https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore -.idea/ -*.iml - -# Rush temporary files -common/deploy/ -common/temp/ -common/autoinstallers/*/.npmrc -**/.rush/temp/ - -# Heft temporary files -.heft -dist -tmp diff --git a/tools/sdk-generation-pipeline/Dockerfile b/tools/sdk-generation-pipeline/Dockerfile deleted file mode 100644 index 8fa2b8f30b9..00000000000 --- a/tools/sdk-generation-pipeline/Dockerfile +++ /dev/null @@ -1,79 +0,0 @@ -FROM mcr.microsoft.com/dotnet/runtime:3.1-focal - -RUN apt-get update -y && apt upgrade -y && apt install curl -y -RUN apt install build-essential -y - -# install java -ENV JAVA_HOME /usr/java/openjdk-17 -ENV PATH $JAVA_HOME/bin:$PATH -ENV LANG en_US.UTF-8 -ENV JAVA_VERSION 17.0.1 -RUN curl -fL -o openjdk.tgz https://download.java.net/java/GA/jdk17.0.1/2a2082e5a09d4267845be086888add4f/12/GPL/openjdk-17.0.1_linux-x64_bin.tar.gz -RUN mkdir -p "$JAVA_HOME" -RUN tar --extract --file openjdk.tgz --directory "$JAVA_HOME" --strip-components 1 --no-same-owner -RUN rm openjdk.tgz -## install maven -ENV M2_HOME /usr/maven -ENV MAVEN_HOME=/usr/maven -ENV PATH $M2_HOME/bin:$PATH -RUN mkdir -p "$MAVEN_HOME" -RUN curl -fL -o maven.tgz https://dlcdn.apache.org/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz -RUN tar --extract --file maven.tgz --directory "$MAVEN_HOME" --strip-components 1 --no-same-owner -RUN rm maven.tgz - -# install node -RUN curl -sL https://deb.nodesource.com/setup_16.x | bash - -RUN apt -y install nodejs -RUN npm install -g npm@9.5.0 - -# install python -RUN DEBIAN_FRONTEND=noninteractive apt-get install -y wget apt-transport-https software-properties-common -RUN apt install python3-pip -y && apt install python3-venv -y && pip3 install --upgrade pip -RUN add-apt-repository ppa:deadsnakes/ppa -y && apt-get install python3.10 -y && apt-get install python3.10-venv -y - -# install powershell -RUN wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -RUN dpkg -i packages-microsoft-prod.deb -RUN apt-get update && apt-get install -y powershell -RUN rm packages-microsoft-prod.deb - -# install .NET -RUN wget https://dotnet.microsoft.com/download/dotnet/scripts/v1/dotnet-install.sh && chmod 777 ./dotnet-install.sh -RUN bash ./dotnet-install.sh -RUN bash ./dotnet-install.sh -c 3.1 -RUN bash ./dotnet-install.sh --version 7.0.101 -ENV DOTNET_ROOT=/root/.dotnet PATH=/root/.dotnet:$PATH -RUN rm /dotnet-install.sh - -# install git -RUN add-apt-repository ppa:git-core/ppa -y && apt update && apt upgrade -y && apt install git -y -RUN git config --global credential.helper store && git config --global core.fileMode false -# install depended packages -RUN pip3 install --upgrade wheel PyYAML requests -RUN npm install -g typescript -RUN npm install -g @microsoft/rush -RUN npm install -g autorest - -RUN mkdir "/mock-host" && cd /mock-host && npm install @azure-tools/mock-service-host@0.1.16 - -# install chrome -RUN curl -LO https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb -RUN DEBIAN_FRONTEND=noninteractive apt-get install -y ./google-chrome-stable_current_amd64.deb -RUN rm google-chrome-stable_current_amd64.deb -ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true PUPPETEER_EXECUTABLE_PATH=/usr/bin/google-chrome-stable - -# install vscode code server and extensions -COPY scripts/install-vscode-server.sh /install-vscode-server.sh -RUN sh /install-vscode-server.sh - -# install docker because it's required by test proxy -RUN curl -fsSL https://test.docker.com -o docker.sh && sh docker.sh - -COPY packages/sdk-generation-cli/*.tgz /pack.tgz -RUN npm install -g /pack.tgz - -COPY scripts/entrypoint.sh /entrypoint.sh -COPY scripts/rerun-tasks /usr/bin/rerun-tasks -COPY scripts/change-owner.sh /change-owner.sh - -ENTRYPOINT ["bash", "/entrypoint.sh"] diff --git a/tools/sdk-generation-pipeline/build-publish-docker-image.yml b/tools/sdk-generation-pipeline/build-publish-docker-image.yml deleted file mode 100644 index 4c8818d0c44..00000000000 --- a/tools/sdk-generation-pipeline/build-publish-docker-image.yml +++ /dev/null @@ -1,69 +0,0 @@ -trigger: none - -pr: none - -parameters: - - name: dockerImage - displayName: Docker Image - type: string - default: sdkgeneration.azurecr.io/sdk-generation:beta-1.0 - - name: dockerContainerRegistry - displayName: Docker Container Registry - type: string - default: sdkgeneration.azurecr.io - -variables: - - template: ../../eng/pipelines/templates/variables/globals.yml - - name: NodeVersion - value: '16.x' - - name: VAR_ARTIFACT_NAME - value: 'packages' - - name: VAR_DOCKER_IMAGE_ARTIFACT_NAME - value: 'dockerImages' - - name: VAR_BUILD_ARTIFACT_STAGING_DIRECTORY - value: $(Build.ArtifactStagingDirectory) - -pool: - name: "azsdk-pool-mms-ubuntu-2004-general" - vmImage: "ubuntu-20.04" - -stages: - - stage: Build - jobs: - - job: Build - steps: - - task: NodeTool@0 - inputs: - versionSpec: '$(NodeVersion)' - displayName: 'Install Node.js' - - - bash: | - npm install -g @microsoft/rush - npm install -g typescript@4.6.2 - displayName: 'Install dependencies' - - - script: | - rush update - displayName: 'rush update' - workingDirectory: $(System.DefaultWorkingDirectory)/tools/sdk-generation-pipeline - - - script: | - rush build - displayName: 'rush build' - workingDirectory: $(System.DefaultWorkingDirectory)/tools/sdk-generation-pipeline - - - script: | - rushx pack - displayName: 'Pack @azure-tools/sdk-generation-cli' - workingDirectory: $(System.DefaultWorkingDirectory)/tools/sdk-generation-pipeline/packages/sdk-generation-cli - - - script: | - docker build -t ${{ parameters.dockerImage }} . - displayName: 'Build docker image' - workingDirectory: $(System.DefaultWorkingDirectory)/tools/sdk-generation-pipeline - - - script: | - docker login -u $(DockerUserName) -p $(DockerPassword) ${{ parameters.dockerContainerRegistry }} - docker push ${{ parameters.dockerImage }} - displayName: 'Publish docker image' - workingDirectory: $(System.DefaultWorkingDirectory)/tools/sdk-generation-pipeline diff --git a/tools/sdk-generation-pipeline/ci.yml b/tools/sdk-generation-pipeline/ci.yml deleted file mode 100644 index d8dbd667cf3..00000000000 --- a/tools/sdk-generation-pipeline/ci.yml +++ /dev/null @@ -1,252 +0,0 @@ -# Node.js -# Build a general Node.js project with npm. -# Add steps that analyze code, save build artifacts, deploy, and more: -# https://docs.microsoft.com/azure/devops/pipelines/languages/javascript - -# Node.js -# Build a general Node.js project with npm. -# Add steps that analyze code, save build artifacts, deploy, and more: -# https://docs.microsoft.com/azure/devops/pipelines/languages/javascript - -trigger: - branches: - include: - - main - - feature/* - - release/* - - hotfix/* - paths: - include: - - tools/sdk-generation-pipeline - -pr: - branches: - include: - - main - - feature/* - - release/* - - hotfix/* - paths: - include: - - tools/sdk-generation-pipeline - -variables: - - template: ../../eng/pipelines/templates/variables/globals.yml - - name: NodeVersion - value: '14.x' - - name: VAR_ARTIFACT_NAME - value: 'packages' - - name: VAR_DOCKER_IMAGE_ARTIFACT_NAME - value: 'dockerImages' - - name: VAR_BUILD_ARTIFACT_STAGING_DIRECTORY - value: $(Build.ArtifactStagingDirectory) - -pool: - name: "azsdk-pool-mms-ubuntu-2004-general" - vmImage: "ubuntu-20.04" - -stages: - - stage: Build - jobs: - - job: Build - steps: - - task: NodeTool@0 - inputs: - versionSpec: '$(NodeVersion)' - displayName: 'Install Node.js' - - - bash: | - npm install -g @microsoft/rush - npm install -g typescript@4.6.2 - displayName: 'Install dependencies' - - - script: | - rush update - displayName: 'rush update' - workingDirectory: $(System.DefaultWorkingDirectory)/tools/sdk-generation-pipeline - - - script: | - rushx lint - displayName: 'Lint @azure-tools/sdk-generation-lib' - workingDirectory: $(System.DefaultWorkingDirectory)/tools/sdk-generation-pipeline/packages/sdk-generation-lib - - - script: | - rushx lint - displayName: 'Lint @azure-tools/sdk-generation-cli' - workingDirectory: $(System.DefaultWorkingDirectory)/tools/sdk-generation-pipeline/packages/sdk-generation-cli - - - script: | - rush build - displayName: 'rush build' - workingDirectory: $(System.DefaultWorkingDirectory)/tools/sdk-generation-pipeline - - - script: | - rushx pack - displayName: 'Pack @azure-tools/sdk-generation-lib' - workingDirectory: $(System.DefaultWorkingDirectory)/tools/sdk-generation-pipeline/packages/sdk-generation-lib - - - script: | - rushx pack - displayName: 'Pack @azure-tools/sdk-generation-cli' - workingDirectory: $(System.DefaultWorkingDirectory)/tools/sdk-generation-pipeline/packages/sdk-generation-cli - - - script: | - mkdir -p $(VAR_BUILD_ARTIFACT_STAGING_DIRECTORY)/packages - cp azure-tools-sdk-generation-lib-*.tgz $(VAR_BUILD_ARTIFACT_STAGING_DIRECTORY)/packages/ - displayName: 'Copy @azure-tools/sdk-generation-lib to staging dir' - workingDirectory: $(System.DefaultWorkingDirectory)/tools/sdk-generation-pipeline/packages/sdk-generation-lib - - - task: PublishBuildArtifacts@1 - displayName: 'Publish packages' - inputs: - PathtoPublish: '$(VAR_BUILD_ARTIFACT_STAGING_DIRECTORY)/packages' - ArtifactName: '$(VAR_ARTIFACT_NAME)' - publishLocation: 'Container' - - - script: 'docker build -t sdkgeneration.azurecr.io/sdk-generation:$(Build.BuildId) .' - displayName: 'Build docker image' - workingDirectory: $(System.DefaultWorkingDirectory)/tools/sdk-generation-pipeline - - - script: | - mkdir -p $(VAR_BUILD_ARTIFACT_STAGING_DIRECTORY)/docker-images - docker image save sdkgeneration.azurecr.io/sdk-generation:$(Build.BuildId) -o $(VAR_BUILD_ARTIFACT_STAGING_DIRECTORY)/docker-images/image.tar - displayName: 'Save docker image' - workingDirectory: $(System.DefaultWorkingDirectory)/tools/sdk-generation-pipeline - - - task: PublishBuildArtifacts@1 - displayName: 'Publish docker image' - inputs: - PathtoPublish: '$(VAR_BUILD_ARTIFACT_STAGING_DIRECTORY)/docker-images' - ArtifactName: '$(VAR_DOCKER_IMAGE_ARTIFACT_NAME)' - publishLocation: 'Container' - - - stage: Test - dependsOn: Build - condition: succeeded() - jobs: - - job: UnitTestForCli - displayName: Unit Test For Cli Package - condition: always() - steps: - - task: NodeTool@0 - inputs: - versionSpec: '$(NodeVersion)' - displayName: 'Install Node.js' - - - bash: | - npm install -g @microsoft/rush - npm install -g typescript@4.6.2 - displayName: 'Install dependencies' - - - script: | - rush update - displayName: 'rush update' - workingDirectory: $(System.DefaultWorkingDirectory)/tools/sdk-generation-pipeline - - - script: | - rush build - displayName: 'rush build' - workingDirectory: $(System.DefaultWorkingDirectory)/tools/sdk-generation-pipeline - - - script: | - npm i -g autorest - rushx test:unit - displayName: 'Test @azure-tools/sdk-generation-cli' - workingDirectory: $(System.DefaultWorkingDirectory)/tools/sdk-generation-pipeline/packages/sdk-generation-cli - - - job: IntegrationTest - condition: always() - displayName: Integration Test for - strategy: - matrix: - JS: - sdkRepo: 'azure-sdk-for-js' - JAVA: - sdkRepo: 'azure-sdk-for-java' - PYTHON: - sdkRepo: 'azure-sdk-for-python' - Net: - sdkRepo: 'azure-sdk-for-net' - steps: - - task: NodeTool@0 - inputs: - versionSpec: '$(NodeVersion)' - displayName: 'Install Node.js' - - - bash: | - npm install -g @microsoft/rush - npm install -g typescript@4.6.2 - displayName: 'Install dependencies' - - - script: | - rush update - displayName: 'rush update' - workingDirectory: $(System.DefaultWorkingDirectory)/tools/sdk-generation-pipeline - - - script: | - rush build - displayName: 'rush build' - workingDirectory: $(System.DefaultWorkingDirectory)/tools/sdk-generation-pipeline - - - task: DownloadBuildArtifacts@0 - inputs: - buildType: 'current' - downloadType: 'single' - artifactName: '$(VAR_DOCKER_IMAGE_ARTIFACT_NAME)' - downloadPath: '$(VAR_BUILD_ARTIFACT_STAGING_DIRECTORY)' - displayName: 'Download image' - - - bash: | - docker load --input $(VAR_BUILD_ARTIFACT_STAGING_DIRECTORY)/$(VAR_DOCKER_IMAGE_ARTIFACT_NAME)/image.tar - displayName: 'Docker Load' - - - bash: | - set -e - rushx test:integration --docker-image="sdkgeneration.azurecr.io/sdk-generation:$(Build.BuildId)" --sdk-repo=$(sdkRepo) - displayName: 'Run integration test' - workingDirectory: $(System.DefaultWorkingDirectory)/tools/sdk-generation-pipeline/packages/sdk-generation-cli - - - ${{if ne(variables['Build.Reason'], 'PullRequest')}}: - - stage: Release - dependsOn: Test - condition: succeededOrFailed() - jobs: - - job: approve - pool: server - steps: - - task: ManualValidation@0 - inputs: - notifyUsers: 'Click to approve if it''s an expected public release.' - - - job: release - dependsOn: approve - condition: and(succeeded(), ne(variables['USER_SKIP_PUBLIC_RELEASE'], 'true')) - steps: - - task: NodeTool@0 - inputs: - versionSpec: '$(NodeVersion)' - displayName: 'Install Node.js' - - - task: DownloadBuildArtifacts@0 - inputs: - buildType: 'current' - downloadType: 'single' - artifactName: '$(VAR_ARTIFACT_NAME)' - downloadPath: '$(VAR_BUILD_ARTIFACT_STAGING_DIRECTORY)' - - - script: | - echo -e "\e[32m[$(date -u)] LOG: Ensure npm is installed" - sudo npm install -g npm@6.14.16 || { echo 'npm install failed' ; exit 1; } - sudo npm install -g pnpm || { echo 'pnpm install failed' ; exit 1; } - - echo -e "\e[32m[$(date -u)] LOG: publish the package" - echo "//registry.npmjs.org/:_authToken=$(azure-sdk-npm-token)" >> ~/.npmrc - for file in $(VAR_BUILD_ARTIFACT_STAGING_DIRECTORY)/$(VAR_ARTIFACT_NAME)/*.tgz - do - echo -e "\e[32m[$(date -u)] LOG: File: $file" - npm publish $file --access public || { echo 'publish $file failed' ; } - done - rm ~/.npmrc || { echo 'rm ~/.npmrc failed' ; exit 1; } - displayName: Publish - workingDirectory: $(System.DefaultWorkingDirectory)/tools/sdk-generation-pipeline - diff --git a/tools/sdk-generation-pipeline/common/config/rush/.npmrc b/tools/sdk-generation-pipeline/common/config/rush/.npmrc deleted file mode 100644 index b902e270ccd..00000000000 --- a/tools/sdk-generation-pipeline/common/config/rush/.npmrc +++ /dev/null @@ -1,22 +0,0 @@ -# Rush uses this file to configure the NPM package registry during installation. It is applicable -# to PNPM, NPM, and Yarn package managers. It is used by operations such as "rush install", -# "rush update", and the "install-run.js" scripts. -# -# NOTE: The "rush publish" command uses .npmrc-publish instead. -# -# Before invoking the package manager, Rush will copy this file to the folder where installation -# is performed. The copied file will omit any config lines that reference environment variables -# that are undefined in that session; this avoids problems that would otherwise result due to -# a missing variable being replaced by an empty string. -# -# * * * SECURITY WARNING * * * -# -# It is NOT recommended to store authentication tokens in a text file on a lab machine, because -# other unrelated processes may be able to read the file. Also, the file may persist indefinitely, -# for example if the machine loses power. A safer practice is to pass the token via an -# environment variable, which can be referenced from .npmrc using ${} expansion. For example: -# -# //registry.npmjs.org/:_authToken=${NPM_AUTH_TOKEN} -# -registry=https://registry.npmjs.org/ -always-auth=false diff --git a/tools/sdk-generation-pipeline/common/config/rush/.npmrc-publish b/tools/sdk-generation-pipeline/common/config/rush/.npmrc-publish deleted file mode 100644 index 7ab44c18d65..00000000000 --- a/tools/sdk-generation-pipeline/common/config/rush/.npmrc-publish +++ /dev/null @@ -1,20 +0,0 @@ -# This config file is very similar to common/config/rush/.npmrc, except that .npmrc-publish -# is used by the "rush publish" command, as publishing often involves different credentials -# and registries than other operations. -# -# Before invoking the package manager, Rush will copy this file to "common/temp/publish-home/.npmrc" -# and then temporarily map that folder as the "home directory" for the current user account. -# This enables the same settings to apply for each project folder that gets published. The copied file -# will omit any config lines that reference environment variables that are undefined in that session; -# this avoids problems that would otherwise result due to a missing variable being replaced by -# an empty string. -# -# * * * SECURITY WARNING * * * -# -# It is NOT recommended to store authentication tokens in a text file on a lab machine, because -# other unrelated processes may be able to read the file. Also, the file may persist indefinitely, -# for example if the machine loses power. A safer practice is to pass the token via an -# environment variable, which can be referenced from .npmrc using ${} expansion. For example: -# -# //registry.npmjs.org/:_authToken=${NPM_AUTH_TOKEN} -# diff --git a/tools/sdk-generation-pipeline/common/config/rush/.pnpmfile.cjs b/tools/sdk-generation-pipeline/common/config/rush/.pnpmfile.cjs deleted file mode 100644 index b13d6ca7a72..00000000000 --- a/tools/sdk-generation-pipeline/common/config/rush/.pnpmfile.cjs +++ /dev/null @@ -1,38 +0,0 @@ -'use strict'; - -/** - * When using the PNPM package manager, you can use pnpmfile.js to workaround - * dependencies that have mistakes in their package.json file. (This feature is - * functionally similar to Yarn's "resolutions".) - * - * For details, see the PNPM documentation: - * https://pnpm.js.org/docs/en/hooks.html - * - * IMPORTANT: SINCE THIS FILE CONTAINS EXECUTABLE CODE, MODIFYING IT IS LIKELY TO INVALIDATE - * ANY CACHED DEPENDENCY ANALYSIS. After any modification to pnpmfile.js, it's recommended to run - * "rush update --full" so that PNPM will recalculate all version selections. - */ -module.exports = { - hooks: { - readPackage - } -}; - -/** - * This hook is invoked during installation before a package's dependencies - * are selected. - * The `packageJson` parameter is the deserialized package.json - * contents for the package that is about to be installed. - * The `context` parameter provides a log() function. - * The return value is the updated object. - */ -function readPackage(packageJson, context) { - - // // The karma types have a missing dependency on typings from the log4js package. - // if (packageJson.name === '@types/karma') { - // context.log('Fixed up dependencies for @types/karma'); - // packageJson.dependencies['log4js'] = '0.6.38'; - // } - - return packageJson; -} diff --git a/tools/sdk-generation-pipeline/common/config/rush/artifactory.json b/tools/sdk-generation-pipeline/common/config/rush/artifactory.json deleted file mode 100644 index 74cf95ebdfc..00000000000 --- a/tools/sdk-generation-pipeline/common/config/rush/artifactory.json +++ /dev/null @@ -1,89 +0,0 @@ -/** - * This configuration file manages Rush integration with JFrog Artifactory services. - * More documentation is available on the Rush website: https://rushjs.io - */ -{ - "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/artifactory.schema.json", - - "packageRegistry": { - /** - * (Required) Set this to "true" to enable Rush to manage tokens for an Artifactory NPM registry. - * When enabled, "rush install" will automatically detect when the user's ~/.npmrc - * authentication token is missing or expired. And "rush setup" will prompt the user to - * renew their token. - * - * The default value is false. - */ - "enabled": false, - - /** - * (Required) Specify the URL of your NPM registry. This is the same URL that appears in - * your .npmrc file. It should look something like this example: - * - * https://your-company.jfrog.io/your-project/api/npm/npm-private/ - */ - "registryUrl": "", - - /** - * A list of custom strings that "rush setup" should add to the user's ~/.npmrc file at the time - * when the token is updated. This could be used for example to configure the company registry - * to be used whenever NPM is invoked as a standalone command (but it's not needed for Rush - * operations like "rush add" and "rush install", which get their mappings from the monorepo's - * common/config/rush/.npmrc file). - * - * NOTE: The ~/.npmrc settings are global for the user account on a given machine, so be careful - * about adding settings that may interfere with other work outside the monorepo. - */ - "userNpmrcLinesToAdd": [ - // "@example:registry=https://your-company.jfrog.io/your-project/api/npm/npm-private/" - ], - - /** - * (Required) Specifies the URL of the Artifactory control panel where the user can generate - * an API key. This URL is printed after the "visitWebsite" message. - * It should look something like this example: https://your-company.jfrog.io/ - * Specify an empty string to suppress this line entirely. - */ - "artifactoryWebsiteUrl": "", - - /** - * These settings allow the "rush setup" interactive prompts to be customized, for - * example with messages specific to your team or configuration. Specify an empty string - * to suppress that message entirely. - */ - "messageOverrides": { - /** - * Overrides the message that normally says: - * "This monorepo consumes packages from an Artifactory private NPM registry." - */ - // "introduction": "", - - /** - * Overrides the message that normally says: - * "Please contact the repository maintainers for help with setting up an Artifactory user account." - */ - // "obtainAnAccount": "", - - /** - * Overrides the message that normally says: - * "Please open this URL in your web browser:" - * - * The "artifactoryWebsiteUrl" string is printed after this message. - */ - // "visitWebsite": "", - - /** - * Overrides the message that normally says: - * "Your user name appears in the upper-right corner of the JFrog website." - */ - // "locateUserName": "", - - /** - * Overrides the message that normally says: - * "Click 'Edit Profile' on the JFrog website. Click the 'Generate API Key' - * button if you haven't already done so previously." - */ - // "locateApiKey": "" - } - } -} diff --git a/tools/sdk-generation-pipeline/common/config/rush/build-cache.json b/tools/sdk-generation-pipeline/common/config/rush/build-cache.json deleted file mode 100644 index 45571cbd709..00000000000 --- a/tools/sdk-generation-pipeline/common/config/rush/build-cache.json +++ /dev/null @@ -1,100 +0,0 @@ -/** - * This configuration file manages Rush's build cache feature. - * More documentation is available on the Rush website: https://rushjs.io - */ -{ - "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/build-cache.schema.json", - - /** - * (Required) EXPERIMENTAL - Set this to true to enable the build cache feature. - * - * See https://rushjs.io/pages/maintainer/build_cache/ for details about this experimental feature. - */ - "buildCacheEnabled": false, - - /** - * (Required) Choose where project build outputs will be cached. - * - * Possible values: "local-only", "azure-blob-storage", "amazon-s3" - */ - "cacheProvider": "local-only", - - /** - * Setting this property overrides the cache entry ID. If this property is set, it must contain - * a [hash] token. - * - * Other available tokens: - * - [projectName] - * - [projectName:normalize] - * - [phaseName] - * - [phaseName:normalize] - * - [phaseName:trimPrefix] - */ - // "cacheEntryNamePattern": "[projectName:normalize]-[phaseName:normalize]-[hash]" - - /** - * Use this configuration with "cacheProvider"="azure-blob-storage" - */ - "azureBlobStorageConfiguration": { - /** - * (Required) The name of the the Azure storage account to use for build cache. - */ - // "storageAccountName": "example", - - /** - * (Required) The name of the container in the Azure storage account to use for build cache. - */ - // "storageContainerName": "my-container", - - /** - * The Azure environment the storage account exists in. Defaults to AzurePublicCloud. - * - * Possible values: "AzurePublicCloud", "AzureChina", "AzureGermany", "AzureGovernment" - */ - // "azureEnvironment": "AzurePublicCloud", - - /** - * An optional prefix for cache item blob names. - */ - // "blobPrefix": "my-prefix", - - /** - * If set to true, allow writing to the cache. Defaults to false. - */ - // "isCacheWriteAllowed": true - }, - - /** - * Use this configuration with "cacheProvider"="amazon-s3" - */ - "amazonS3Configuration": { - /** - * (Required unless s3Endpoint is specified) The name of the bucket to use for build cache. - * Example: "my-bucket" - */ - // "s3Bucket": "my-bucket", - - /** - * (Required unless s3Bucket is specified) The Amazon S3 endpoint of the bucket to use for build cache. - * This should not include any path; use the s3Prefix to set the path. - * Examples: "my-bucket.s3.us-east-2.amazonaws.com" or "http://localhost:9000" - */ - // "s3Endpoint": "https://my-bucket.s3.us-east-2.amazonaws.com", - - /** - * (Required) The Amazon S3 region of the bucket to use for build cache. - * Example: "us-east-1" - */ - // "s3Region": "us-east-1", - - /** - * An optional prefix ("folder") for cache items. It should not start with "/". - */ - // "s3Prefix": "my-prefix", - - /** - * If set to true, allow writing to the cache. Defaults to false. - */ - // "isCacheWriteAllowed": true - } -} diff --git a/tools/sdk-generation-pipeline/common/config/rush/command-line.json b/tools/sdk-generation-pipeline/common/config/rush/command-line.json deleted file mode 100644 index e1e3a3cae8a..00000000000 --- a/tools/sdk-generation-pipeline/common/config/rush/command-line.json +++ /dev/null @@ -1,297 +0,0 @@ -/** - * This configuration file defines custom commands for the "rush" command-line. - * More documentation is available on the Rush website: https://rushjs.io - */ -{ - "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/command-line.schema.json", - - /** - * Custom "commands" introduce new verbs for the command-line. To see the help for these - * example commands, try "rush --help", "rush my-bulk-command --help", or - * "rush my-global-command --help". - */ - "commands": [ - // { - // /** - // * (Required) Determines the type of custom command. - // * Rush's "bulk" commands are invoked separately for each project. Rush will look in - // * each project's package.json file for a "scripts" entry whose name matches the - // * command name. By default, the command will run for every project in the repo, - // * according to the dependency graph (similar to how "rush build" works). - // * The set of projects can be restricted e.g. using the "--to" or "--from" parameters. - // */ - // "commandKind": "bulk", - // - // /** - // * (Required) The name that will be typed as part of the command line. This is also the name - // * of the "scripts" hook in the project's package.json file. - // * The name should be comprised of lower case words separated by hyphens or colons. The name should include an - // * English verb (e.g. "deploy"). Use a hyphen to separate words (e.g. "upload-docs"). A group of related commands - // * can be prefixed with a colon (e.g. "docs:generate", "docs:deploy", "docs:serve", etc). - // * - // * Note that if the "rebuild" command is overridden here, it becomes separated from the "build" command - // * and will call the "rebuild" script instead of the "build" script. - // */ - // "name": "my-bulk-command", - // - // /** - // * (Required) A short summary of the custom command to be shown when printing command line - // * help, e.g. "rush --help". - // */ - // "summary": "Example bulk custom command", - // - // /** - // * A detailed description of the command to be shown when printing command line - // * help (e.g. "rush --help my-command"). - // * If omitted, the "summary" text will be shown instead. - // * - // * Whenever you introduce commands/parameters, taking a little time to write meaningful - // * documentation can make a big difference for the developer experience in your repo. - // */ - // "description": "This is an example custom command that runs separately for each project", - // - // /** - // * By default, Rush operations acquire a lock file which prevents multiple commands from executing simultaneously - // * in the same repo folder. (For example, it would be a mistake to run "rush install" and "rush build" at the - // * same time.) If your command makes sense to run concurrently with other operations, - // * set "safeForSimultaneousRushProcesses" to true to disable this protection. - // * - // * In particular, this is needed for custom scripts that invoke other Rush commands. - // */ - // "safeForSimultaneousRushProcesses": false, - // - // /** - // * (Required) If true, then this command is safe to be run in parallel, i.e. executed - // * simultaneously for multiple projects. Similar to "rush build", regardless of parallelism - // * projects will not start processing until their dependencies have completed processing. - // */ - // "enableParallelism": false, - // - // /** - // * Normally projects will be processed according to their dependency order: a given project will not start - // * processing the command until all of its dependencies have completed. This restriction doesn't apply for - // * certain operations, for example a "clean" task that deletes output files. In this case - // * you can set "ignoreDependencyOrder" to true to increase parallelism. - // */ - // "ignoreDependencyOrder": false, - // - // /** - // * Normally Rush requires that each project's package.json has a "scripts" entry matching - // * the custom command name. To disable this check, set "ignoreMissingScript" to true; - // * projects with a missing definition will be skipped. - // */ - // "ignoreMissingScript": false, - // - // /** - // * When invoking shell scripts, Rush uses a heuristic to distinguish errors from warnings: - // * - If the shell script returns a nonzero process exit code, Rush interprets this as "one or more errors". - // * Error output is displayed in red, and it prevents Rush from attempting to process any downstream projects. - // * - If the shell script returns a zero process exit code but writes something to its stderr stream, - // * Rush interprets this as "one or more warnings". Warning output is printed in yellow, but does NOT prevent - // * Rush from processing downstream projects. - // * - // * Thus, warnings do not interfere with local development, but they will cause a CI job to fail, because - // * the Rush process itself returns a nonzero exit code if there are any warnings or errors. This is by design. - // * In an active monorepo, we've found that if you allow any warnings in your main branch, it inadvertently - // * teaches developers to ignore warnings, which quickly leads to a situation where so many "expected" warnings - // * have accumulated that warnings no longer serve any useful purpose. - // * - // * Sometimes a poorly behaved task will write output to stderr even though its operation was successful. - // * In that case, it's strongly recommended to fix the task. However, as a workaround you can set - // * allowWarningsInSuccessfulBuild=true, which causes Rush to return a nonzero exit code for errors only. - // * - // * Note: The default value is false. In Rush 5.7.x and earlier, the default value was true. - // */ - // "allowWarningsInSuccessfulBuild": false, - // - // /** - // * If true then this command will be incremental like the built-in "build" command - // */ - // "incremental": false, - // - // /** - // * (EXPERIMENTAL) Normally Rush terminates after the command finishes. If this option is set to "true" Rush - // * will instead enter a loop where it watches the file system for changes to the selected projects. Whenever a - // * change is detected, the command will be invoked again for the changed project and any selected projects that - // * directly or indirectly depend on it. - // * - // * For details, refer to the website article "Using watch mode". - // */ - // "watchForChanges": false, - // - // /** - // * (EXPERIMENTAL) Disable cache for this action. This may be useful if this command affects state outside of - // * projects' own folders. - // */ - // "disableBuildCache": false - // }, - // - // { - // /** - // * (Required) Determines the type of custom command. - // * Rush's "global" commands are invoked once for the entire repo. - // */ - // "commandKind": "global", - // - // "name": "my-global-command", - // "summary": "Example global custom command", - // "description": "This is an example custom command that runs once for the entire repo", - // - // "safeForSimultaneousRushProcesses": false, - // - // /** - // * (Required) A script that will be invoked using the OS shell. The working directory will be - // * the folder that contains rush.json. If custom parameters are associated with this command, their - // * values will be appended to the end of this string. - // */ - // "shellCommand": "node common/scripts/my-global-command.js", - // - // /** - // * If your "shellCommand" script depends on NPM packages, the recommended best practice is - // * to make it into a regular Rush project that builds using your normal toolchain. In cases where - // * the command needs to work without first having to run "rush build", the recommended practice - // * is to publish the project to an NPM registry and use common/scripts/install-run.js to launch it. - // * - // * Autoinstallers offer another possibility: They are folders under "common/autoinstallers" with - // * a package.json file and shrinkwrap file. Rush will automatically invoke the package manager to - // * install these dependencies before an associated command is invoked. Autoinstallers have the - // * advantage that they work even in a branch where "rush install" is broken, which makes them a - // * good solution for Git hook scripts. But they have the disadvantages of not being buildable - // * projects, and of increasing the overall installation footprint for your monorepo. - // * - // * The "autoinstallerName" setting must not contain a path and must be a valid NPM package name. - // * For example, the name "my-task" would map to "common/autoinstallers/my-task/package.json", and - // * the "common/autoinstallers/my-task/node_modules/.bin" folder would be added to the shell PATH when - // * invoking the "shellCommand". - // */ - // // "autoinstallerName": "my-task" - // } - ], - - /** - * Custom "parameters" introduce new parameters for specified Rush command-line commands. - * For example, you might define a "--production" parameter for the "rush build" command. - */ - "parameters": [ - // { - // /** - // * (Required) Determines the type of custom parameter. - // * A "flag" is a custom command-line parameter whose presence acts as an on/off switch. - // */ - // "parameterKind": "flag", - // - // /** - // * (Required) The long name of the parameter. It must be lower-case and use dash delimiters. - // */ - // "longName": "--my-flag", - // - // /** - // * An optional alternative short name for the parameter. It must be a dash followed by a single - // * lower-case or upper-case letter, which is case-sensitive. - // * - // * NOTE: The Rush developers recommend that automation scripts should always use the long name - // * to improve readability. The short name is only intended as a convenience for humans. - // * The alphabet letters run out quickly, and are difficult to memorize, so *only* use - // * a short name if you expect the parameter to be needed very often in everyday operations. - // */ - // "shortName": "-m", - // - // /** - // * (Required) A long description to be shown in the command-line help. - // * - // * Whenever you introduce commands/parameters, taking a little time to write meaningful - // * documentation can make a big difference for the developer experience in your repo. - // */ - // "description": "A custom flag parameter that is passed to the scripts that are invoked when building projects", - // - // /** - // * (Required) A list of custom commands and/or built-in Rush commands that this parameter may - // * be used with. The parameter will be appended to the shell command that Rush invokes. - // */ - // "associatedCommands": ["build", "rebuild"] - // }, - // - // { - // /** - // * (Required) Determines the type of custom parameter. - // * A "string" is a custom command-line parameter whose value is a simple text string. - // */ - // "parameterKind": "string", - // "longName": "--my-string", - // "description": "A custom string parameter for the \"my-global-command\" custom command", - // - // "associatedCommands": ["my-global-command"], - // - // /** - // * The name of the argument, which will be shown in the command-line help. - // * - // * For example, if the parameter name is '--count" and the argument name is "NUMBER", - // * then the command-line help would display "--count NUMBER". The argument name must - // * be comprised of upper-case letters, numbers, and underscores. It should be kept short. - // */ - // "argumentName": "SOME_TEXT", - // - // /** - // * If true, this parameter must be included with the command. The default is false. - // */ - // "required": false - // }, - // - // { - // /** - // * (Required) Determines the type of custom parameter. - // * A "choice" is a custom command-line parameter whose argument must be chosen from a list of - // * allowable alternatives. - // */ - // "parameterKind": "choice", - // "longName": "--my-choice", - // "description": "A custom choice parameter for the \"my-global-command\" custom command", - // - // "associatedCommands": ["my-global-command"], - // - // /** - // * If true, this parameter must be included with the command. The default is false. - // */ - // "required": false, - // - // /** - // * Normally if a parameter is omitted from the command line, it will not be passed - // * to the shell command. this value will be inserted by default. Whereas if a "defaultValue" - // * is defined, the parameter will always be passed to the shell command, and will use the - // * default value if unspecified. The value must be one of the defined alternatives. - // */ - // "defaultValue": "vanilla", - // - // /** - // * (Required) A list of alternative argument values that can be chosen for this parameter. - // */ - // "alternatives": [ - // { - // /** - // * A token that is one of the alternatives that can be used with the choice parameter, - // * e.g. "vanilla" in "--flavor vanilla". - // */ - // "name": "vanilla", - // - // /** - // * A detailed description for the alternative that can be shown in the command-line help. - // * - // * Whenever you introduce commands/parameters, taking a little time to write meaningful - // * documentation can make a big difference for the developer experience in your repo. - // */ - // "description": "Use the vanilla flavor (the default)" - // }, - // - // { - // "name": "chocolate", - // "description": "Use the chocolate flavor" - // }, - // - // { - // "name": "strawberry", - // "description": "Use the strawberry flavor" - // } - // ] - // } - ] -} diff --git a/tools/sdk-generation-pipeline/common/config/rush/common-versions.json b/tools/sdk-generation-pipeline/common/config/rush/common-versions.json deleted file mode 100644 index 1df9ccf987c..00000000000 --- a/tools/sdk-generation-pipeline/common/config/rush/common-versions.json +++ /dev/null @@ -1,62 +0,0 @@ -/** - * This configuration file specifies NPM dependency version selections that affect all projects - * in a Rush repo. More documentation is available on the Rush website: https://rushjs.io - */ -{ - "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/common-versions.schema.json", - - /** - * A table that specifies a "preferred version" for a given NPM package. This feature is typically used - * to hold back an indirect dependency to a specific older version, or to reduce duplication of indirect dependencies. - * - * The "preferredVersions" value can be any SemVer range specifier (e.g. "~1.2.3"). Rush injects these values into - * the "dependencies" field of the top-level common/temp/package.json, which influences how the package manager - * will calculate versions. The specific effect depends on your package manager. Generally it will have no - * effect on an incompatible or already constrained SemVer range. If you are using PNPM, similar effects can be - * achieved using the pnpmfile.js hook. See the Rush documentation for more details. - * - * After modifying this field, it's recommended to run "rush update --full" so that the package manager - * will recalculate all version selections. - */ - "preferredVersions": { - /** - * When someone asks for "^1.0.0" make sure they get "1.2.3" when working in this repo, - * instead of the latest version. - */ - // "some-library": "1.2.3" - }, - - /** - * When set to true, for all projects in the repo, all dependencies will be automatically added as preferredVersions, - * except in cases where different projects specify different version ranges for a given dependency. For older - * package managers, this tended to reduce duplication of indirect dependencies. However, it can sometimes cause - * trouble for indirect dependencies with incompatible peerDependencies ranges. - * - * The default value is true. If you're encountering installation errors related to peer dependencies, - * it's recommended to set this to false. - * - * After modifying this field, it's recommended to run "rush update --full" so that the package manager - * will recalculate all version selections. - */ - // "implicitlyPreferredVersions": false, - - /** - * The "rush check" command can be used to enforce that every project in the repo must specify - * the same SemVer range for a given dependency. However, sometimes exceptions are needed. - * The allowedAlternativeVersions table allows you to list other SemVer ranges that will be - * accepted by "rush check" for a given dependency. - * - * IMPORTANT: THIS TABLE IS FOR *ADDITIONAL* VERSION RANGES THAT ARE ALTERNATIVES TO THE - * USUAL VERSION (WHICH IS INFERRED BY LOOKING AT ALL PROJECTS IN THE REPO). - * This design avoids unnecessary churn in this file. - */ - "allowedAlternativeVersions": { - /** - * For example, allow some projects to use an older TypeScript compiler - * (in addition to whatever "usual" version is being used by other projects in the repo): - */ - // "typescript": [ - // "~2.4.0" - // ] - } -} diff --git a/tools/sdk-generation-pipeline/common/config/rush/experiments.json b/tools/sdk-generation-pipeline/common/config/rush/experiments.json deleted file mode 100644 index b48cb73c2d6..00000000000 --- a/tools/sdk-generation-pipeline/common/config/rush/experiments.json +++ /dev/null @@ -1,44 +0,0 @@ -/** - * This configuration file allows repo maintainers to enable and disable experimental - * Rush features. More documentation is available on the Rush website: https://rushjs.io - */ -{ - "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/experiments.schema.json", - - /** - * By default, 'rush install' passes --no-prefer-frozen-lockfile to 'pnpm install'. - * Set this option to true to pass '--frozen-lockfile' instead for faster installs. - */ - // "usePnpmFrozenLockfileForRushInstall": true, - - /** - * By default, 'rush update' passes --no-prefer-frozen-lockfile to 'pnpm install'. - * Set this option to true to pass '--prefer-frozen-lockfile' instead to minimize shrinkwrap changes. - */ - // "usePnpmPreferFrozenLockfileForRushUpdate": true, - - /** - * If using the 'preventManualShrinkwrapChanges' option, restricts the hash to only include the layout of external dependencies. - * Used to allow links between workspace projects or the addition/removal of references to existing dependency versions to not - * cause hash changes. - */ - // "omitImportersFromPreventManualShrinkwrapChanges": true, - - /** - * If true, the chmod field in temporary project tar headers will not be normalized. - * This normalization can help ensure consistent tarball integrity across platforms. - */ - // "noChmodFieldInTarHeaderNormalization": true, - - /** - * If true, build caching will respect the allowWarningsInSuccessfulBuild flag and cache builds with warnings. - * This will not replay warnings from the cached build. - */ - // "buildCacheWithAllowWarningsInSuccessfulBuild": true, - - /** - * If true, the phased commands feature is enabled. To use this feature, create a "phased" command - * in common/config/rush/command-line.json. - */ - // "phasedCommands": true -} diff --git a/tools/sdk-generation-pipeline/common/config/rush/pnpm-lock.yaml b/tools/sdk-generation-pipeline/common/config/rush/pnpm-lock.yaml deleted file mode 100644 index a2860ecb5e2..00000000000 --- a/tools/sdk-generation-pipeline/common/config/rush/pnpm-lock.yaml +++ /dev/null @@ -1,6915 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -dependencies: - '@azure/event-hubs': - specifier: ~5.5.1 - version: 5.5.2 - '@azure/storage-blob': - specifier: ^12.8.0 - version: 12.23.0 - '@azure/swagger-validation-common': - specifier: ^0.1.2 - version: 0.1.2 - '@octokit/auth-app': - specifier: ^2.4.5 - version: 2.11.0 - '@octokit/rest': - specifier: ^18.0.3 - version: 18.12.0 - '@rush-temp/sdk-generation-cli': - specifier: file:./projects/sdk-generation-cli.tgz - version: file:projects/sdk-generation-cli.tgz - '@rush-temp/sdk-generation-lib': - specifier: file:./projects/sdk-generation-lib.tgz - version: file:projects/sdk-generation-lib.tgz - '@types/jest': - specifier: ^25.2.1 - version: 25.2.3 - '@types/node': - specifier: ^16.11.7 - version: 16.18.99 - '@typescript-eslint/eslint-plugin': - specifier: ^5.25.0 - version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@4.6.4) - '@typescript-eslint/parser': - specifier: ^5.25.0 - version: 5.62.0(eslint@8.57.0)(typescript@4.6.4) - ajv: - specifier: ^6.12.6 - version: 6.12.6 - axios: - specifier: ^0.24.0 - version: 0.24.0 - class-validator: - specifier: ^0.14.0 - version: 0.14.1 - colors: - specifier: 1.4.0 - version: 1.4.0 - command-line-args: - specifier: ~5.2.1 - version: 5.2.1 - convict: - specifier: ^6.2.3 - version: 6.2.4 - copyfiles: - specifier: ^2.4.1 - version: 2.4.1 - dotenv: - specifier: ^16.0.0 - version: 16.4.5 - eslint: - specifier: ^8.16.0 - version: 8.57.0 - eslint-config-google: - specifier: ^0.14.0 - version: 0.14.0(eslint@8.57.0) - eslint-plugin-import: - specifier: ^2.26.0 - version: 2.29.1(eslint@8.57.0) - eslint-plugin-n: - specifier: ^15.0.0 - version: 15.7.0(eslint@8.57.0) - eslint-plugin-promise: - specifier: ^6.0.0 - version: 6.2.0(eslint@8.57.0) - eslint-plugin-simple-import-sort: - specifier: ^7.0.0 - version: 7.0.0(eslint@8.57.0) - hot-shots: - specifier: ^8.5.2 - version: 8.5.2 - jest: - specifier: ~26.6.3 - version: 26.6.3(ts-node@10.7.0) - jsonc-parser: - specifier: ^3.0.0 - version: 3.2.1 - memory-fs: - specifier: ^0.5.0 - version: 0.5.0 - mongodb: - specifier: ^3.6.10 - version: 3.7.4 - node-yaml: - specifier: ^3.2.0 - version: 3.2.0(eslint@8.57.0) - simple-git: - specifier: ~3.16.0 - version: 3.16.1 - ts-jest: - specifier: ~26.5.4 - version: 26.5.6(jest@26.6.3)(typescript@4.6.4) - ts-node: - specifier: ~10.7.0 - version: 10.7.0(@types/node@16.18.99)(typescript@4.6.4) - typeorm: - specifier: ^0.3.20 - version: 0.3.20(mongodb@3.7.4)(ts-node@10.7.0) - typescript: - specifier: ~4.6.3 - version: 4.6.4 - winston: - specifier: 3.7.2 - version: 3.7.2 - -packages: - - /@ampproject/remapping@2.3.0: - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - dev: false - - /@azure/abort-controller@1.1.0: - resolution: {integrity: sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==} - engines: {node: '>=12.0.0'} - dependencies: - tslib: 2.6.3 - dev: false - - /@azure/abort-controller@2.1.2: - resolution: {integrity: sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==} - engines: {node: '>=18.0.0'} - dependencies: - tslib: 2.6.3 - dev: false - - /@azure/core-amqp@3.3.0: - resolution: {integrity: sha512-RYIyC8PtGpMzZRiSokADw0ezFgNq1eUkCPV8rd7tJ85dn8CAhYDEYapzMYxAwIBLWidshu14m9UWjQS7hKYDpA==} - engines: {node: '>=14.0.0'} - dependencies: - '@azure/abort-controller': 1.1.0 - '@azure/core-auth': 1.7.2 - '@azure/core-util': 1.9.0 - '@azure/logger': 1.1.2 - buffer: 6.0.3 - events: 3.3.0 - jssha: 3.3.1 - process: 0.11.10 - rhea: 3.0.2 - rhea-promise: 3.0.3 - tslib: 2.6.3 - util: 0.12.5 - transitivePeerDependencies: - - supports-color - dev: false - - /@azure/core-asynciterator-polyfill@1.0.2: - resolution: {integrity: sha512-3rkP4LnnlWawl0LZptJOdXNrT/fHp2eQMadoasa6afspXdpGrtPZuAQc2PD0cpgyuoXtUWyC3tv7xfntjGS5Dw==} - engines: {node: '>=12.0.0'} - dev: false - - /@azure/core-auth@1.7.2: - resolution: {integrity: sha512-Igm/S3fDYmnMq1uKS38Ae1/m37B3zigdlZw+kocwEhh5GjyKjPrXKO2J6rzpC1wAxrNil/jX9BJRqBshyjnF3g==} - engines: {node: '>=18.0.0'} - dependencies: - '@azure/abort-controller': 2.1.2 - '@azure/core-util': 1.9.0 - tslib: 2.6.3 - dev: false - - /@azure/core-client@1.9.2: - resolution: {integrity: sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w==} - engines: {node: '>=18.0.0'} - dependencies: - '@azure/abort-controller': 2.1.2 - '@azure/core-auth': 1.7.2 - '@azure/core-rest-pipeline': 1.16.0 - '@azure/core-tracing': 1.1.2 - '@azure/core-util': 1.9.0 - '@azure/logger': 1.1.2 - tslib: 2.6.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@azure/core-http-compat@2.1.2: - resolution: {integrity: sha512-5MnV1yqzZwgNLLjlizsU3QqOeQChkIXw781Fwh1xdAqJR5AA32IUaq6xv1BICJvfbHoa+JYcaij2HFkhLbNTJQ==} - engines: {node: '>=18.0.0'} - dependencies: - '@azure/abort-controller': 2.1.2 - '@azure/core-client': 1.9.2 - '@azure/core-rest-pipeline': 1.16.0 - transitivePeerDependencies: - - supports-color - dev: false - - /@azure/core-lro@2.7.2: - resolution: {integrity: sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw==} - engines: {node: '>=18.0.0'} - dependencies: - '@azure/abort-controller': 2.1.2 - '@azure/core-util': 1.9.0 - '@azure/logger': 1.1.2 - tslib: 2.6.3 - dev: false - - /@azure/core-paging@1.6.2: - resolution: {integrity: sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA==} - engines: {node: '>=18.0.0'} - dependencies: - tslib: 2.6.3 - dev: false - - /@azure/core-rest-pipeline@1.16.0: - resolution: {integrity: sha512-CeuTvsXxCUmEuxH5g/aceuSl6w2EugvNHKAtKKVdiX915EjJJxAwfzNNWZreNnbxHZ2fi0zaM6wwS23x2JVqSQ==} - engines: {node: '>=18.0.0'} - dependencies: - '@azure/abort-controller': 2.1.2 - '@azure/core-auth': 1.7.2 - '@azure/core-tracing': 1.1.2 - '@azure/core-util': 1.9.0 - '@azure/logger': 1.1.2 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.4 - tslib: 2.6.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@azure/core-tracing@1.0.0-preview.11: - resolution: {integrity: sha512-frF0pJc9HTmKncVokhBxCqipjbql02DThQ1ZJ9wLi7SDMLdPAFyDI5xZNzX5guLz+/DtPkY+SGK2li9FIXqshQ==} - engines: {node: '>=8.0.0'} - dependencies: - '@opencensus/web-types': 0.0.7 - '@opentelemetry/api': 1.0.0-rc.0 - tslib: 2.6.3 - dev: false - - /@azure/core-tracing@1.1.2: - resolution: {integrity: sha512-dawW9ifvWAWmUm9/h+/UQ2jrdvjCJ7VJEuCJ6XVNudzcOwm53BFZH4Q845vjfgoUAM8ZxokvVNxNxAITc502YA==} - engines: {node: '>=18.0.0'} - dependencies: - tslib: 2.6.3 - dev: false - - /@azure/core-util@1.9.0: - resolution: {integrity: sha512-AfalUQ1ZppaKuxPPMsFEUdX6GZPB3d9paR9d/TTL7Ow2De8cJaC7ibi7kWVlFAVPCYo31OcnGymc0R89DX8Oaw==} - engines: {node: '>=18.0.0'} - dependencies: - '@azure/abort-controller': 2.1.2 - tslib: 2.6.3 - dev: false - - /@azure/core-xml@1.4.2: - resolution: {integrity: sha512-CW3MZhApe/S4iikbYKE7s83fjDBPIr2kpidX+hlGRwh7N4o1nIpQ/PfJTeioqhfqdMvRtheEl+ft64fyTaLNaA==} - engines: {node: '>=18.0.0'} - dependencies: - fast-xml-parser: 4.4.0 - tslib: 2.6.3 - dev: false - - /@azure/event-hubs@5.5.2: - resolution: {integrity: sha512-thaF4idFRMO3VQZoEgdJnXQZiZMo6fGIVJO/TFP4kKvwbmCN0QkquA9zjdHniwgp3FWALHMXCZLyszRUVv0ZKA==} - engines: {node: '>=8.0.0'} - dependencies: - '@azure/abort-controller': 1.1.0 - '@azure/core-amqp': 3.3.0 - '@azure/core-asynciterator-polyfill': 1.0.2 - '@azure/core-auth': 1.7.2 - '@azure/core-tracing': 1.0.0-preview.11 - '@azure/logger': 1.1.2 - buffer: 5.7.1 - is-buffer: 2.0.5 - jssha: 3.3.1 - process: 0.11.10 - rhea-promise: 2.1.0 - tslib: 2.6.3 - uuid: 8.3.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@azure/logger@1.1.2: - resolution: {integrity: sha512-l170uE7bsKpIU6B/giRc9i4NI0Mj+tANMMMxf7Zi/5cKzEqPayP7+X1WPrG7e+91JgY8N+7K7nF2WOi7iVhXvg==} - engines: {node: '>=18.0.0'} - dependencies: - tslib: 2.6.3 - dev: false - - /@azure/storage-blob@12.23.0: - resolution: {integrity: sha512-c1KJ5R5hqR/HtvmFtTn/Y1BNMq45NUBp0LZH7yF8WFMET+wmESgEr0FVTu/Z5NonmfUjbgJZG5Nh8xHc5RdWGQ==} - engines: {node: '>=18.0.0'} - dependencies: - '@azure/abort-controller': 1.1.0 - '@azure/core-auth': 1.7.2 - '@azure/core-client': 1.9.2 - '@azure/core-http-compat': 2.1.2 - '@azure/core-lro': 2.7.2 - '@azure/core-paging': 1.6.2 - '@azure/core-rest-pipeline': 1.16.0 - '@azure/core-tracing': 1.1.2 - '@azure/core-util': 1.9.0 - '@azure/core-xml': 1.4.2 - '@azure/logger': 1.1.2 - events: 3.3.0 - tslib: 2.6.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@azure/swagger-validation-common@0.1.2: - resolution: {integrity: sha512-QjmSpAliTzc77WTCnm3+zS2qVGv5U9/2h2y1ICZKQp5+0JSMcy3dPbS9WiKKkpsGQ2b1BJbDugJqKVg6a+8AeA==} - dev: false - - /@babel/code-frame@7.24.7: - resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.24.7 - picocolors: 1.0.1 - dev: false - - /@babel/compat-data@7.24.7: - resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==} - engines: {node: '>=6.9.0'} - dev: false - - /@babel/core@7.24.7: - resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.24.7 - '@babel/helper-compilation-targets': 7.24.7 - '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) - '@babel/helpers': 7.24.7 - '@babel/parser': 7.24.7 - '@babel/template': 7.24.7 - '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 - convert-source-map: 2.0.0 - debug: 4.3.5 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/generator@7.24.7: - resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.7 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - dev: false - - /@babel/helper-compilation-targets@7.24.7: - resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.24.7 - '@babel/helper-validator-option': 7.24.7 - browserslist: 4.23.1 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: false - - /@babel/helper-environment-visitor@7.24.7: - resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.7 - dev: false - - /@babel/helper-function-name@7.24.7: - resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.24.7 - '@babel/types': 7.24.7 - dev: false - - /@babel/helper-hoist-variables@7.24.7: - resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.7 - dev: false - - /@babel/helper-module-imports@7.24.7: - resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-module-imports': 7.24.7 - '@babel/helper-simple-access': 7.24.7 - '@babel/helper-split-export-declaration': 7.24.7 - '@babel/helper-validator-identifier': 7.24.7 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/helper-plugin-utils@7.24.7: - resolution: {integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==} - engines: {node: '>=6.9.0'} - dev: false - - /@babel/helper-simple-access@7.24.7: - resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/helper-split-export-declaration@7.24.7: - resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.7 - dev: false - - /@babel/helper-string-parser@7.24.7: - resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} - engines: {node: '>=6.9.0'} - dev: false - - /@babel/helper-validator-identifier@7.24.7: - resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} - engines: {node: '>=6.9.0'} - dev: false - - /@babel/helper-validator-option@7.24.7: - resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==} - engines: {node: '>=6.9.0'} - dev: false - - /@babel/helpers@7.24.7: - resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.24.7 - '@babel/types': 7.24.7 - dev: false - - /@babel/highlight@7.24.7: - resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.24.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.1 - dev: false - - /@babel/parser@7.24.7: - resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} - engines: {node: '>=6.0.0'} - hasBin: true - dev: false - - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.7): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 - dev: false - - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.7): - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 - dev: false - - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.7): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 - dev: false - - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.7): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 - dev: false - - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.7): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 - dev: false - - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.7): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 - dev: false - - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.7): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 - dev: false - - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.7): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 - dev: false - - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.7): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 - dev: false - - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.7): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 - dev: false - - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.7): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 - dev: false - - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.7): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 - dev: false - - /@babel/template@7.24.7: - resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 - dev: false - - /@babel/traverse@7.24.7: - resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.24.7 - '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-function-name': 7.24.7 - '@babel/helper-hoist-variables': 7.24.7 - '@babel/helper-split-export-declaration': 7.24.7 - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 - debug: 4.3.5 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/types@7.24.7: - resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.24.7 - '@babel/helper-validator-identifier': 7.24.7 - to-fast-properties: 2.0.0 - dev: false - - /@bcoe/v8-coverage@0.2.3: - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - dev: false - - /@cnakazawa/watch@1.0.4: - resolution: {integrity: sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==} - engines: {node: '>=0.1.95'} - hasBin: true - dependencies: - exec-sh: 0.3.6 - minimist: 1.2.8 - dev: false - - /@colors/colors@1.6.0: - resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} - engines: {node: '>=0.1.90'} - dev: false - - /@cspotcode/source-map-consumer@0.8.0: - resolution: {integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==} - engines: {node: '>= 12'} - dev: false - - /@cspotcode/source-map-support@0.7.0: - resolution: {integrity: sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==} - engines: {node: '>=12'} - dependencies: - '@cspotcode/source-map-consumer': 0.8.0 - dev: false - - /@dabh/diagnostics@2.0.3: - resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} - dependencies: - colorspace: 1.1.4 - enabled: 2.0.0 - kuler: 2.0.0 - dev: false - - /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.57.0 - eslint-visitor-keys: 3.4.3 - dev: false - - /@eslint-community/regexpp@4.10.1: - resolution: {integrity: sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: false - - /@eslint/eslintrc@2.1.4: - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.5 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@eslint/js@8.57.0: - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: false - - /@humanwhocodes/config-array@0.11.14: - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.5 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: false - - /@humanwhocodes/object-schema@2.0.3: - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead - dev: false - - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - dependencies: - string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: false - - /@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - dev: false - - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - dev: false - - /@jest/console@26.6.2: - resolution: {integrity: sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==} - engines: {node: '>= 10.14.2'} - dependencies: - '@jest/types': 26.6.2 - '@types/node': 16.18.99 - chalk: 4.1.2 - jest-message-util: 26.6.2 - jest-util: 26.6.2 - slash: 3.0.0 - dev: false - - /@jest/core@26.6.3(ts-node@10.7.0): - resolution: {integrity: sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==} - engines: {node: '>= 10.14.2'} - dependencies: - '@jest/console': 26.6.2 - '@jest/reporters': 26.6.2 - '@jest/test-result': 26.6.2 - '@jest/transform': 26.6.2 - '@jest/types': 26.6.2 - '@types/node': 16.18.99 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 26.6.2 - jest-config: 26.6.3(ts-node@10.7.0) - jest-haste-map: 26.6.2 - jest-message-util: 26.6.2 - jest-regex-util: 26.0.0 - jest-resolve: 26.6.2 - jest-resolve-dependencies: 26.6.3 - jest-runner: 26.6.3(ts-node@10.7.0) - jest-runtime: 26.6.3(ts-node@10.7.0) - jest-snapshot: 26.6.2 - jest-util: 26.6.2 - jest-validate: 26.6.2 - jest-watcher: 26.6.2 - micromatch: 4.0.7 - p-each-series: 2.2.0 - rimraf: 3.0.2 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - ts-node - - utf-8-validate - dev: false - - /@jest/environment@26.6.2: - resolution: {integrity: sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==} - engines: {node: '>= 10.14.2'} - dependencies: - '@jest/fake-timers': 26.6.2 - '@jest/types': 26.6.2 - '@types/node': 16.18.99 - jest-mock: 26.6.2 - dev: false - - /@jest/fake-timers@26.6.2: - resolution: {integrity: sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==} - engines: {node: '>= 10.14.2'} - dependencies: - '@jest/types': 26.6.2 - '@sinonjs/fake-timers': 6.0.1 - '@types/node': 16.18.99 - jest-message-util: 26.6.2 - jest-mock: 26.6.2 - jest-util: 26.6.2 - dev: false - - /@jest/globals@26.6.2: - resolution: {integrity: sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==} - engines: {node: '>= 10.14.2'} - dependencies: - '@jest/environment': 26.6.2 - '@jest/types': 26.6.2 - expect: 26.6.2 - dev: false - - /@jest/reporters@26.6.2: - resolution: {integrity: sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==} - engines: {node: '>= 10.14.2'} - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 26.6.2 - '@jest/test-result': 26.6.2 - '@jest/transform': 26.6.2 - '@jest/types': 26.6.2 - chalk: 4.1.2 - collect-v8-coverage: 1.0.2 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 4.0.3 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.7 - jest-haste-map: 26.6.2 - jest-resolve: 26.6.2 - jest-util: 26.6.2 - jest-worker: 26.6.2 - slash: 3.0.0 - source-map: 0.6.1 - string-length: 4.0.2 - terminal-link: 2.1.1 - v8-to-istanbul: 7.1.2 - optionalDependencies: - node-notifier: 8.0.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@jest/source-map@26.6.2: - resolution: {integrity: sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==} - engines: {node: '>= 10.14.2'} - dependencies: - callsites: 3.1.0 - graceful-fs: 4.2.11 - source-map: 0.6.1 - dev: false - - /@jest/test-result@26.6.2: - resolution: {integrity: sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==} - engines: {node: '>= 10.14.2'} - dependencies: - '@jest/console': 26.6.2 - '@jest/types': 26.6.2 - '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.2 - dev: false - - /@jest/test-sequencer@26.6.3(ts-node@10.7.0): - resolution: {integrity: sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==} - engines: {node: '>= 10.14.2'} - dependencies: - '@jest/test-result': 26.6.2 - graceful-fs: 4.2.11 - jest-haste-map: 26.6.2 - jest-runner: 26.6.3(ts-node@10.7.0) - jest-runtime: 26.6.3(ts-node@10.7.0) - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - ts-node - - utf-8-validate - dev: false - - /@jest/transform@26.6.2: - resolution: {integrity: sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==} - engines: {node: '>= 10.14.2'} - dependencies: - '@babel/core': 7.24.7 - '@jest/types': 26.6.2 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 1.9.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 26.6.2 - jest-regex-util: 26.0.0 - jest-util: 26.6.2 - micromatch: 4.0.7 - pirates: 4.0.6 - slash: 3.0.0 - source-map: 0.6.1 - write-file-atomic: 3.0.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@jest/types@25.5.0: - resolution: {integrity: sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==} - engines: {node: '>= 8.3'} - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 1.1.2 - '@types/yargs': 15.0.19 - chalk: 3.0.0 - dev: false - - /@jest/types@26.6.2: - resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} - engines: {node: '>= 10.14.2'} - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 16.18.99 - '@types/yargs': 15.0.19 - chalk: 4.1.2 - dev: false - - /@jridgewell/gen-mapping@0.3.5: - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 - dev: false - - /@jridgewell/resolve-uri@3.1.2: - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - dev: false - - /@jridgewell/set-array@1.2.1: - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - dev: false - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: false - - /@jridgewell/trace-mapping@0.3.25: - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: false - - /@kwsites/file-exists@1.1.1: - resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} - dependencies: - debug: 4.3.5 - transitivePeerDependencies: - - supports-color - dev: false - - /@kwsites/promise-deferred@1.1.1: - resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} - dev: false - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: false - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: false - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 - dev: false - - /@octetstream/eslint-config@3.0.0(eslint@8.57.0): - resolution: {integrity: sha512-VX8gZ6h9PNKrWb+N9AoWM2DA+eVBAqAL0OLHwLjh+iwLrICQRFYzJDxxHIpD7rN413PCppr2vp6cy8UGdZGd+A==} - peerDependencies: - eslint: ^5.4.0 - dependencies: - babel-eslint: 9.0.0 - eslint: 8.57.0 - eslint-config-airbnb-base: 13.2.0(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(eslint@8.57.0) - eslint-plugin-promise: 4.3.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@octetstream/promisify@2.0.2: - resolution: {integrity: sha512-7XHoRB61hxsz8lBQrjC1tq/3OEIgpvGWg6DKAdwi7WRzruwkmsdwmOoUXbU4Dtd4RSOMDwed0SkP3y8UlMt1Bg==} - engines: {node: 6.x || >=8.x} - dev: false - - /@octokit/auth-app@2.11.0: - resolution: {integrity: sha512-tC0BjqyTEjReIBHogOjLjF3rc2n4xwjZcpOaUUhybDnqkrp7Gxj5n91aGUcIFgJ3MDYf+f3XZehQd2B4ijG+4w==} - dependencies: - '@octokit/request': 5.6.3 - '@octokit/request-error': 2.1.0 - '@octokit/types': 6.41.0 - '@types/lru-cache': 5.1.1 - deprecation: 2.3.1 - lru-cache: 6.0.0 - universal-github-app-jwt: 1.1.2 - universal-user-agent: 6.0.1 - transitivePeerDependencies: - - encoding - dev: false - - /@octokit/auth-token@2.5.0: - resolution: {integrity: sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==} - dependencies: - '@octokit/types': 6.41.0 - dev: false - - /@octokit/core@3.6.0: - resolution: {integrity: sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==} - dependencies: - '@octokit/auth-token': 2.5.0 - '@octokit/graphql': 4.8.0 - '@octokit/request': 5.6.3 - '@octokit/request-error': 2.1.0 - '@octokit/types': 6.41.0 - before-after-hook: 2.2.3 - universal-user-agent: 6.0.1 - transitivePeerDependencies: - - encoding - dev: false - - /@octokit/endpoint@6.0.12: - resolution: {integrity: sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==} - dependencies: - '@octokit/types': 6.41.0 - is-plain-object: 5.0.0 - universal-user-agent: 6.0.1 - dev: false - - /@octokit/graphql@4.8.0: - resolution: {integrity: sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==} - dependencies: - '@octokit/request': 5.6.3 - '@octokit/types': 6.41.0 - universal-user-agent: 6.0.1 - transitivePeerDependencies: - - encoding - dev: false - - /@octokit/openapi-types@12.11.0: - resolution: {integrity: sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==} - dev: false - - /@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0): - resolution: {integrity: sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==} - peerDependencies: - '@octokit/core': '>=2' - dependencies: - '@octokit/core': 3.6.0 - '@octokit/types': 6.41.0 - dev: false - - /@octokit/plugin-request-log@1.0.4(@octokit/core@3.6.0): - resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} - peerDependencies: - '@octokit/core': '>=3' - dependencies: - '@octokit/core': 3.6.0 - dev: false - - /@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0): - resolution: {integrity: sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==} - peerDependencies: - '@octokit/core': '>=3' - dependencies: - '@octokit/core': 3.6.0 - '@octokit/types': 6.41.0 - deprecation: 2.3.1 - dev: false - - /@octokit/request-error@2.1.0: - resolution: {integrity: sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==} - dependencies: - '@octokit/types': 6.41.0 - deprecation: 2.3.1 - once: 1.4.0 - dev: false - - /@octokit/request@5.6.3: - resolution: {integrity: sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==} - dependencies: - '@octokit/endpoint': 6.0.12 - '@octokit/request-error': 2.1.0 - '@octokit/types': 6.41.0 - is-plain-object: 5.0.0 - node-fetch: 2.7.0 - universal-user-agent: 6.0.1 - transitivePeerDependencies: - - encoding - dev: false - - /@octokit/rest@18.12.0: - resolution: {integrity: sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==} - dependencies: - '@octokit/core': 3.6.0 - '@octokit/plugin-paginate-rest': 2.21.3(@octokit/core@3.6.0) - '@octokit/plugin-request-log': 1.0.4(@octokit/core@3.6.0) - '@octokit/plugin-rest-endpoint-methods': 5.16.2(@octokit/core@3.6.0) - transitivePeerDependencies: - - encoding - dev: false - - /@octokit/types@6.41.0: - resolution: {integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==} - dependencies: - '@octokit/openapi-types': 12.11.0 - dev: false - - /@opencensus/web-types@0.0.7: - resolution: {integrity: sha512-xB+w7ZDAu3YBzqH44rCmG9/RlrOmFuDPt/bpf17eJr8eZSrLt7nc7LnWdxM9Mmoj/YKMHpxRg28txu3TcpiL+g==} - engines: {node: '>=6.0'} - dev: false - - /@opentelemetry/api@1.0.0-rc.0: - resolution: {integrity: sha512-iXKByCMfrlO5S6Oh97BuM56tM2cIBB0XsL/vWF/AtJrJEKx4MC/Xdu0xDsGXMGcNWpqF7ujMsjjnp0+UHBwnDQ==} - engines: {node: '>=8.0.0'} - dev: false - - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - dev: false - optional: true - - /@sinonjs/commons@1.8.6: - resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} - dependencies: - type-detect: 4.0.8 - dev: false - - /@sinonjs/fake-timers@6.0.1: - resolution: {integrity: sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==} - dependencies: - '@sinonjs/commons': 1.8.6 - dev: false - - /@sqltools/formatter@1.2.5: - resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==} - dev: false - - /@tootallnate/once@1.1.2: - resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} - engines: {node: '>= 6'} - dev: false - - /@tsconfig/node10@1.0.11: - resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} - dev: false - - /@tsconfig/node12@1.0.11: - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - dev: false - - /@tsconfig/node14@1.0.3: - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - dev: false - - /@tsconfig/node16@1.0.4: - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - dev: false - - /@types/babel__core@7.20.5: - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - dependencies: - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 - '@types/babel__generator': 7.6.8 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.6 - dev: false - - /@types/babel__generator@7.6.8: - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} - dependencies: - '@babel/types': 7.24.7 - dev: false - - /@types/babel__template@7.4.4: - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - dependencies: - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 - dev: false - - /@types/babel__traverse@7.20.6: - resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} - dependencies: - '@babel/types': 7.24.7 - dev: false - - /@types/graceful-fs@4.1.9: - resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} - dependencies: - '@types/node': 16.18.99 - dev: false - - /@types/istanbul-lib-coverage@2.0.6: - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - dev: false - - /@types/istanbul-lib-report@3.0.3: - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - dev: false - - /@types/istanbul-reports@1.1.2: - resolution: {integrity: sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==} - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-lib-report': 3.0.3 - dev: false - - /@types/istanbul-reports@3.0.4: - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - dependencies: - '@types/istanbul-lib-report': 3.0.3 - dev: false - - /@types/jest@25.2.3: - resolution: {integrity: sha512-JXc1nK/tXHiDhV55dvfzqtmP4S3sy3T3ouV2tkViZgxY/zeUkcpQcQPGRlgF4KmWzWW5oiWYSZwtCB+2RsE4Fw==} - dependencies: - jest-diff: 25.5.0 - pretty-format: 25.5.0 - dev: false - - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: false - - /@types/json5@0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: false - - /@types/jsonwebtoken@9.0.6: - resolution: {integrity: sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==} - dependencies: - '@types/node': 16.18.99 - dev: false - - /@types/lru-cache@5.1.1: - resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} - dev: false - - /@types/node@16.18.99: - resolution: {integrity: sha512-X2Yc+NQaPXDuaR32UmFrTr3OXWaht756A6sJw56o4dehkySBZ0NWH30CCRviuC0KFwTDW/NTjrtbFHhYcHkd6g==} - dev: false - - /@types/normalize-package-data@2.4.4: - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - dev: false - - /@types/prettier@2.7.3: - resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} - dev: false - - /@types/semver@7.5.8: - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - dev: false - - /@types/stack-utils@2.0.3: - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - dev: false - - /@types/triple-beam@1.3.5: - resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} - dev: false - - /@types/validator@13.12.0: - resolution: {integrity: sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==} - dev: false - - /@types/yargs-parser@21.0.3: - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - dev: false - - /@types/yargs@15.0.19: - resolution: {integrity: sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==} - dependencies: - '@types/yargs-parser': 21.0.3 - dev: false - - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@4.6.4): - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@eslint-community/regexpp': 4.10.1 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@4.6.4) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@4.6.4) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@4.6.4) - debug: 4.3.5 - eslint: 8.57.0 - graphemer: 1.4.0 - ignore: 5.3.1 - natural-compare-lite: 1.4.0 - semver: 7.6.2 - tsutils: 3.21.0(typescript@4.6.4) - typescript: 4.6.4 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@4.6.4): - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.6.4) - debug: 4.3.5 - eslint: 8.57.0 - typescript: 4.6.4 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/scope-manager@5.62.0: - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - dev: false - - /@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@4.6.4): - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.6.4) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@4.6.4) - debug: 4.3.5 - eslint: 8.57.0 - tsutils: 3.21.0(typescript@4.6.4) - typescript: 4.6.4 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/types@5.62.0: - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: false - - /@typescript-eslint/typescript-estree@5.62.0(typescript@4.6.4): - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.5 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.6.2 - tsutils: 3.21.0(typescript@4.6.4) - typescript: 4.6.4 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@4.6.4): - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.6.4) - eslint: 8.57.0 - eslint-scope: 5.1.1 - semver: 7.6.2 - transitivePeerDependencies: - - supports-color - - typescript - dev: false - - /@typescript-eslint/visitor-keys@5.62.0: - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.3 - dev: false - - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: false - - /abab@2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - deprecated: Use your platform's native atob() and btoa() methods instead - dev: false - - /acorn-globals@6.0.0: - resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} - dependencies: - acorn: 7.4.1 - acorn-walk: 7.2.0 - dev: false - - /acorn-jsx@5.3.2(acorn@8.12.0): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.12.0 - dev: false - - /acorn-walk@7.2.0: - resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} - engines: {node: '>=0.4.0'} - dev: false - - /acorn-walk@8.3.3: - resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} - engines: {node: '>=0.4.0'} - dependencies: - acorn: 8.12.0 - dev: false - - /acorn@7.4.1: - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: false - - /acorn@8.12.0: - resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: false - - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - dependencies: - debug: 4.3.5 - transitivePeerDependencies: - - supports-color - dev: false - - /agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} - engines: {node: '>= 14'} - dependencies: - debug: 4.3.5 - transitivePeerDependencies: - - supports-color - dev: false - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: false - - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.21.3 - dev: false - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: false - - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: false - - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - dev: false - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: false - - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: false - - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: false - - /anymatch@2.0.0: - resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} - dependencies: - micromatch: 3.1.10 - normalize-path: 2.1.1 - dev: false - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: false - - /app-root-path@3.1.0: - resolution: {integrity: sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==} - engines: {node: '>= 6.0.0'} - dev: false - - /arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - dev: false - - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - dev: false - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: false - - /arr-diff@4.0.0: - resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} - engines: {node: '>=0.10.0'} - dev: false - - /arr-flatten@1.1.0: - resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} - engines: {node: '>=0.10.0'} - dev: false - - /arr-union@3.1.0: - resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} - engines: {node: '>=0.10.0'} - dev: false - - /array-back@3.1.0: - resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} - engines: {node: '>=6'} - dev: false - - /array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 - dev: false - - /array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - is-string: 1.0.7 - dev: false - - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: false - - /array-unique@0.3.2: - resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} - engines: {node: '>=0.10.0'} - dev: false - - /array.prototype.findlastindex@1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 - dev: false - - /array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - dev: false - - /array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - dev: false - - /arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 - dev: false - - /assign-symbols@1.0.0: - resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} - engines: {node: '>=0.10.0'} - dev: false - - /async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} - dev: false - - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: false - - /atob@2.1.2: - resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} - engines: {node: '>= 4.5.0'} - hasBin: true - dev: false - - /available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - dependencies: - possible-typed-array-names: 1.0.0 - dev: false - - /axios@0.24.0: - resolution: {integrity: sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==} - dependencies: - follow-redirects: 1.15.6 - transitivePeerDependencies: - - debug - dev: false - - /babel-eslint@9.0.0: - resolution: {integrity: sha512-itv1MwE3TMbY0QtNfeL7wzak1mV47Uy+n6HtSOO4Xd7rvmO+tsGQSgyOEEgo6Y2vHZKZphaoelNeSVj4vkLA1g==} - engines: {node: '>=6'} - deprecated: babel-eslint is now @babel/eslint-parser. This package will no longer receive updates. - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/parser': 7.24.7 - '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 - eslint-scope: 3.7.1 - eslint-visitor-keys: 1.3.0 - transitivePeerDependencies: - - supports-color - dev: false - - /babel-jest@26.6.3(@babel/core@7.24.7): - resolution: {integrity: sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==} - engines: {node: '>= 10.14.2'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.7 - '@jest/transform': 26.6.2 - '@jest/types': 26.6.2 - '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 26.6.2(@babel/core@7.24.7) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} - dependencies: - '@babel/helper-plugin-utils': 7.24.7 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /babel-plugin-jest-hoist@26.6.2: - resolution: {integrity: sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==} - engines: {node: '>= 10.14.2'} - dependencies: - '@babel/template': 7.24.7 - '@babel/types': 7.24.7 - '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.6 - dev: false - - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.7): - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.7 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.7) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.7) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.7) - dev: false - - /babel-preset-jest@26.6.2(@babel/core@7.24.7): - resolution: {integrity: sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==} - engines: {node: '>= 10.14.2'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.7 - babel-plugin-jest-hoist: 26.6.2 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7) - dev: false - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: false - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: false - - /base@0.11.2: - resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} - engines: {node: '>=0.10.0'} - dependencies: - cache-base: 1.0.1 - class-utils: 0.3.6 - component-emitter: 1.3.1 - define-property: 1.0.0 - isobject: 3.0.1 - mixin-deep: 1.3.2 - pascalcase: 0.1.1 - dev: false - - /before-after-hook@2.2.3: - resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} - dev: false - - /bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - requiresBuild: true - dependencies: - file-uri-to-path: 1.0.0 - dev: false - optional: true - - /bl@2.2.1: - resolution: {integrity: sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==} - dependencies: - readable-stream: 2.3.8 - safe-buffer: 5.2.1 - dev: false - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: false - - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - dev: false - - /braces@2.3.2: - resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} - engines: {node: '>=0.10.0'} - dependencies: - arr-flatten: 1.1.0 - array-unique: 0.3.2 - extend-shallow: 2.0.1 - fill-range: 4.0.0 - isobject: 3.0.1 - repeat-element: 1.1.4 - snapdragon: 0.8.2 - snapdragon-node: 2.1.1 - split-string: 3.1.0 - to-regex: 3.0.2 - dev: false - - /braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.1.1 - dev: false - - /browser-process-hrtime@1.0.0: - resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} - dev: false - - /browserslist@4.23.1: - resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001636 - electron-to-chromium: 1.4.805 - node-releases: 2.0.14 - update-browserslist-db: 1.0.16(browserslist@4.23.1) - dev: false - - /bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} - dependencies: - fast-json-stable-stringify: 2.1.0 - dev: false - - /bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - dependencies: - node-int64: 0.4.0 - dev: false - - /bson@1.1.6: - resolution: {integrity: sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==} - engines: {node: '>=0.6.19'} - dev: false - - /buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - dev: false - - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: false - - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: false - - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: false - - /builtins@5.1.0: - resolution: {integrity: sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==} - dependencies: - semver: 7.6.2 - dev: false - - /cache-base@1.0.1: - resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} - engines: {node: '>=0.10.0'} - dependencies: - collection-visit: 1.0.0 - component-emitter: 1.3.1 - get-value: 2.0.6 - has-value: 1.0.0 - isobject: 3.0.1 - set-value: 2.0.1 - to-object-path: 0.3.0 - union-value: 1.0.1 - unset-value: 1.0.0 - dev: false - - /call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - dev: false - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: false - - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: false - - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: false - - /caniuse-lite@1.0.30001636: - resolution: {integrity: sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==} - dev: false - - /capture-exit@2.0.0: - resolution: {integrity: sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==} - engines: {node: 6.* || 8.* || >= 10.*} - dependencies: - rsvp: 4.8.5 - dev: false - - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: false - - /chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: false - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: false - - /char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} - dev: false - - /ci-info@2.0.0: - resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} - dev: false - - /cjs-module-lexer@0.6.0: - resolution: {integrity: sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==} - dev: false - - /class-utils@0.3.6: - resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} - engines: {node: '>=0.10.0'} - dependencies: - arr-union: 3.1.0 - define-property: 0.2.5 - isobject: 3.0.1 - static-extend: 0.1.2 - dev: false - - /class-validator@0.14.1: - resolution: {integrity: sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==} - dependencies: - '@types/validator': 13.12.0 - libphonenumber-js: 1.11.3 - validator: 13.12.0 - dev: false - - /cli-highlight@2.1.11: - resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} - engines: {node: '>=8.0.0', npm: '>=5.0.0'} - hasBin: true - dependencies: - chalk: 4.1.2 - highlight.js: 10.7.3 - mz: 2.7.0 - parse5: 5.1.1 - parse5-htmlparser2-tree-adapter: 6.0.1 - yargs: 16.2.0 - dev: false - - /cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - dev: false - - /cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: false - - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: false - - /co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - dev: false - - /collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} - dev: false - - /collection-visit@1.0.0: - resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} - engines: {node: '>=0.10.0'} - dependencies: - map-visit: 1.0.0 - object-visit: 1.0.1 - dev: false - - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - dev: false - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: false - - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: false - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: false - - /color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - dev: false - - /color@3.2.1: - resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} - dependencies: - color-convert: 1.9.3 - color-string: 1.9.1 - dev: false - - /colors@1.4.0: - resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} - engines: {node: '>=0.1.90'} - dev: false - - /colorspace@1.1.4: - resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} - dependencies: - color: 3.2.1 - text-hex: 1.0.0 - dev: false - - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: false - - /command-line-args@5.2.1: - resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} - engines: {node: '>=4.0.0'} - dependencies: - array-back: 3.1.0 - find-replace: 3.0.0 - lodash.camelcase: 4.3.0 - typical: 4.0.0 - dev: false - - /component-emitter@1.3.1: - resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} - dev: false - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: false - - /confusing-browser-globals@1.0.11: - resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} - dev: false - - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: false - - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: false - - /convict@6.2.4: - resolution: {integrity: sha512-qN60BAwdMVdofckX7AlohVJ2x9UvjTNoKVXCL2LxFk1l7757EJqf1nySdMkPQer0bt8kQ5lQiyZ9/2NvrFBuwQ==} - engines: {node: '>=6'} - dependencies: - lodash.clonedeep: 4.5.0 - yargs-parser: 20.2.9 - dev: false - - /copy-descriptor@0.1.1: - resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} - engines: {node: '>=0.10.0'} - dev: false - - /copyfiles@2.4.1: - resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} - hasBin: true - dependencies: - glob: 7.2.3 - minimatch: 3.1.2 - mkdirp: 1.0.4 - noms: 0.0.0 - through2: 2.0.5 - untildify: 4.0.0 - yargs: 16.2.0 - dev: false - - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: false - - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - dev: false - - /cross-spawn@6.0.5: - resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} - engines: {node: '>=4.8'} - dependencies: - nice-try: 1.0.5 - path-key: 2.0.1 - semver: 5.7.2 - shebang-command: 1.2.0 - which: 1.3.1 - dev: false - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: false - - /cssom@0.3.8: - resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} - dev: false - - /cssom@0.4.4: - resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} - dev: false - - /cssstyle@2.3.0: - resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} - engines: {node: '>=8'} - dependencies: - cssom: 0.3.8 - dev: false - - /data-urls@2.0.0: - resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} - engines: {node: '>=10'} - dependencies: - abab: 2.0.6 - whatwg-mimetype: 2.3.0 - whatwg-url: 8.7.0 - dev: false - - /data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - dev: false - - /data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - dev: false - - /data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - dev: false - - /dayjs@1.11.11: - resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} - dev: false - - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - dependencies: - ms: 2.0.0 - dev: false - - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - dependencies: - ms: 2.1.3 - dev: false - - /debug@4.3.5: - resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - dev: false - - /decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - dev: false - - /decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - dev: false - - /decode-uri-component@0.2.2: - resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} - engines: {node: '>=0.10'} - dev: false - - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: false - - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - dev: false - - /define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - dev: false - - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - dev: false - - /define-property@0.2.5: - resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} - engines: {node: '>=0.10.0'} - dependencies: - is-descriptor: 0.1.7 - dev: false - - /define-property@1.0.0: - resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} - engines: {node: '>=0.10.0'} - dependencies: - is-descriptor: 1.0.3 - dev: false - - /define-property@2.0.2: - resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} - engines: {node: '>=0.10.0'} - dependencies: - is-descriptor: 1.0.3 - isobject: 3.0.1 - dev: false - - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: false - - /denque@1.5.1: - resolution: {integrity: sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==} - engines: {node: '>=0.10'} - dev: false - - /deprecation@2.3.1: - resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} - dev: false - - /detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} - dev: false - - /diff-sequences@25.2.6: - resolution: {integrity: sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==} - engines: {node: '>= 8.3'} - dev: false - - /diff-sequences@26.6.2: - resolution: {integrity: sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==} - engines: {node: '>= 10.14.2'} - dev: false - - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - dev: false - - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: false - - /doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - dependencies: - esutils: 2.0.3 - dev: false - - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - dev: false - - /domexception@2.0.1: - resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} - engines: {node: '>=8'} - deprecated: Use your platform's native DOMException instead - dependencies: - webidl-conversions: 5.0.0 - dev: false - - /dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} - engines: {node: '>=12'} - dev: false - - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: false - - /ecdsa-sig-formatter@1.0.11: - resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - dependencies: - safe-buffer: 5.2.1 - dev: false - - /electron-to-chromium@1.4.805: - resolution: {integrity: sha512-8W4UJwX/w9T0QSzINJckTKG6CYpAUTqsaWcWIsdud3I1FYJcMgW9QqT1/4CBff/pP/TihWh13OmiyY8neto6vw==} - dev: false - - /emittery@0.7.2: - resolution: {integrity: sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==} - engines: {node: '>=10'} - dev: false - - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: false - - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: false - - /enabled@2.0.0: - resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} - dev: false - - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - dev: false - - /errno@0.1.8: - resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} - hasBin: true - dependencies: - prr: 1.0.1 - dev: false - - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 - dev: false - - /es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.1 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - dev: false - - /es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.4 - dev: false - - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - dev: false - - /es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - dev: false - - /es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - dev: false - - /es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - dependencies: - hasown: 2.0.2 - dev: false - - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - dev: false - - /escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - dev: false - - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: false - - /escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - dev: false - - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: false - - /escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - dev: false - - /eslint-config-airbnb-base@13.2.0(eslint-plugin-import@2.29.1)(eslint@8.57.0): - resolution: {integrity: sha512-1mg/7eoB4AUeB0X1c/ho4vb2gYkNH8Trr/EgCT/aGmKhhG+F6vF5s8+iRBlWAzFIAphxIdp3YfEKgEl0f9Xg+w==} - engines: {node: '>= 4'} - peerDependencies: - eslint: ^4.19.1 || ^5.3.0 - eslint-plugin-import: ^2.17.2 - dependencies: - confusing-browser-globals: 1.0.11 - eslint: 8.57.0 - eslint-plugin-import: 2.29.1(eslint@8.57.0) - object.assign: 4.1.5 - object.entries: 1.1.8 - dev: false - - /eslint-config-google@0.14.0(eslint@8.57.0): - resolution: {integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==} - engines: {node: '>=0.10.0'} - peerDependencies: - eslint: '>=5.16.0' - dependencies: - eslint: 8.57.0 - dev: false - - /eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - dependencies: - debug: 3.2.7 - is-core-module: 2.13.1 - resolve: 1.22.8 - dev: false - - /eslint-module-utils@2.8.1(eslint@8.57.0): - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} - engines: {node: '>=4'} - peerDependencies: - eslint: '*' - peerDependenciesMeta: - eslint: - optional: true - dependencies: - debug: 3.2.7 - eslint: 8.57.0 - dev: false - - /eslint-plugin-es@4.1.0(eslint@8.57.0): - resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} - engines: {node: '>=8.10.0'} - peerDependencies: - eslint: '>=4.19.1' - dependencies: - eslint: 8.57.0 - eslint-utils: 2.1.0 - regexpp: 3.2.0 - dev: false - - /eslint-plugin-import@2.29.1(eslint@8.57.0): - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - dependencies: - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(eslint@8.57.0) - hasown: 2.0.2 - is-core-module: 2.13.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.0 - semver: 6.3.1 - tsconfig-paths: 3.15.0 - dev: false - - /eslint-plugin-n@15.7.0(eslint@8.57.0): - resolution: {integrity: sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==} - engines: {node: '>=12.22.0'} - peerDependencies: - eslint: '>=7.0.0' - dependencies: - builtins: 5.1.0 - eslint: 8.57.0 - eslint-plugin-es: 4.1.0(eslint@8.57.0) - eslint-utils: 3.0.0(eslint@8.57.0) - ignore: 5.3.1 - is-core-module: 2.13.1 - minimatch: 3.1.2 - resolve: 1.22.8 - semver: 7.6.2 - dev: false - - /eslint-plugin-promise@4.3.1: - resolution: {integrity: sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ==} - engines: {node: '>=6'} - dev: false - - /eslint-plugin-promise@6.2.0(eslint@8.57.0): - resolution: {integrity: sha512-QmAqwizauvnKOlifxyDj2ObfULpHQawlg/zQdgEixur9vl0CvZGv/LCJV2rtj3210QCoeGBzVMfMXqGAOr/4fA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - dependencies: - eslint: 8.57.0 - dev: false - - /eslint-plugin-simple-import-sort@7.0.0(eslint@8.57.0): - resolution: {integrity: sha512-U3vEDB5zhYPNfxT5TYR7u01dboFZp+HNpnGhkDB2g/2E4wZ/g1Q9Ton8UwCLfRV9yAKyYqDh62oHOamvkFxsvw==} - peerDependencies: - eslint: '>=5.0.0' - dependencies: - eslint: 8.57.0 - dev: false - - /eslint-scope@3.7.1: - resolution: {integrity: sha512-ivpbtpUgg9SJS4TLjK7KdcDhqc/E3CGItsvQbBNLkNGUeMhd5qnJcryba/brESS+dg3vrLqPuc/UcS7jRJdN5A==} - engines: {node: '>=4.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: false - - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: false - - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: false - - /eslint-utils@2.1.0: - resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} - engines: {node: '>=6'} - dependencies: - eslint-visitor-keys: 1.3.0 - dev: false - - /eslint-utils@3.0.0(eslint@8.57.0): - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - dependencies: - eslint: 8.57.0 - eslint-visitor-keys: 2.1.0 - dev: false - - /eslint-visitor-keys@1.3.0: - resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} - engines: {node: '>=4'} - dev: false - - /eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - dev: false - - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: false - - /eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.1 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.0 - '@humanwhocodes/config-array': 0.11.14 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.5 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.1 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: false - - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.12.0 - acorn-jsx: 5.3.2(acorn@8.12.0) - eslint-visitor-keys: 3.4.3 - dev: false - - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: false - - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: false - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: false - - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: false - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: false - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: false - - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - dev: false - - /exec-sh@0.3.6: - resolution: {integrity: sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==} - dev: false - - /execa@1.0.0: - resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} - engines: {node: '>=6'} - dependencies: - cross-spawn: 6.0.5 - get-stream: 4.1.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.7 - strip-eof: 1.0.0 - dev: false - - /execa@4.1.0: - resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 5.2.0 - human-signals: 1.1.1 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: false - - /exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} - dev: false - - /expand-brackets@2.1.4: - resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} - engines: {node: '>=0.10.0'} - dependencies: - debug: 2.6.9 - define-property: 0.2.5 - extend-shallow: 2.0.1 - posix-character-classes: 0.1.1 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - dev: false - - /expect@26.6.2: - resolution: {integrity: sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==} - engines: {node: '>= 10.14.2'} - dependencies: - '@jest/types': 26.6.2 - ansi-styles: 4.3.0 - jest-get-type: 26.3.0 - jest-matcher-utils: 26.6.2 - jest-message-util: 26.6.2 - jest-regex-util: 26.0.0 - dev: false - - /extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} - dependencies: - is-extendable: 0.1.1 - dev: false - - /extend-shallow@3.0.2: - resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} - engines: {node: '>=0.10.0'} - dependencies: - assign-symbols: 1.0.0 - is-extendable: 1.0.1 - dev: false - - /extglob@2.0.4: - resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} - engines: {node: '>=0.10.0'} - dependencies: - array-unique: 0.3.2 - define-property: 1.0.0 - expand-brackets: 2.1.4 - extend-shallow: 2.0.1 - fragment-cache: 0.2.1 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - dev: false - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: false - - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.7 - dev: false - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: false - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: false - - /fast-xml-parser@4.4.0: - resolution: {integrity: sha512-kLY3jFlwIYwBNDojclKsNAC12sfD6NwW74QB2CoNGPvtVxjliYehVunB3HYyNi+n4Tt1dAcgwYvmKF/Z18flqg==} - hasBin: true - dependencies: - strnum: 1.0.5 - dev: false - - /fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - dependencies: - reusify: 1.0.4 - dev: false - - /fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - dependencies: - bser: 2.1.1 - dev: false - - /fecha@4.2.3: - resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} - dev: false - - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.2.0 - dev: false - - /file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - requiresBuild: true - dev: false - optional: true - - /fill-range@4.0.0: - resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} - engines: {node: '>=0.10.0'} - dependencies: - extend-shallow: 2.0.1 - is-number: 3.0.0 - repeat-string: 1.6.1 - to-regex-range: 2.1.1 - dev: false - - /fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: false - - /find-replace@3.0.0: - resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} - engines: {node: '>=4.0.0'} - dependencies: - array-back: 3.1.0 - dev: false - - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: false - - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: false - - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flatted: 3.3.1 - keyv: 4.5.4 - rimraf: 3.0.2 - dev: false - - /flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - dev: false - - /fn.name@1.1.0: - resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - dev: false - - /follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: false - - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - dependencies: - is-callable: 1.2.7 - dev: false - - /for-in@1.0.2: - resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} - engines: {node: '>=0.10.0'} - dev: false - - /foreground-child@3.2.1: - resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} - engines: {node: '>=14'} - dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.1.0 - dev: false - - /form-data@3.0.1: - resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - - /fragment-cache@0.2.1: - resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} - engines: {node: '>=0.10.0'} - dependencies: - map-cache: 0.2.2 - dev: false - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: false - - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: false - - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - functions-have-names: 1.2.3 - dev: false - - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: false - - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: false - - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: false - - /get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - dev: false - - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - dev: false - - /get-stream@4.1.0: - resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} - engines: {node: '>=6'} - dependencies: - pump: 3.0.0 - dev: false - - /get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - dependencies: - pump: 3.0.0 - dev: false - - /get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - dev: false - - /get-value@2.0.6: - resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} - engines: {node: '>=0.10.0'} - dev: false - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: false - - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - dev: false - - /glob@10.4.1: - resolution: {integrity: sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==} - engines: {node: '>=16 || 14 >=14.18'} - hasBin: true - dependencies: - foreground-child: 3.2.1 - jackspeak: 3.4.0 - minimatch: 9.0.4 - minipass: 7.1.2 - path-scurry: 1.11.1 - dev: false - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: false - - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: false - - /globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: false - - /globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - dependencies: - define-properties: 1.2.1 - gopd: 1.0.1 - dev: false - - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.1 - merge2: 1.4.1 - slash: 3.0.0 - dev: false - - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.2.4 - dev: false - - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: false - - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: false - - /growly@1.3.0: - resolution: {integrity: sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==} - requiresBuild: true - dev: false - optional: true - - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: false - - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: false - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: false - - /has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - dependencies: - es-define-property: 1.0.0 - dev: false - - /has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - dev: false - - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: false - - /has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: false - - /has-value@0.3.1: - resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} - engines: {node: '>=0.10.0'} - dependencies: - get-value: 2.0.6 - has-values: 0.1.4 - isobject: 2.1.0 - dev: false - - /has-value@1.0.0: - resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} - engines: {node: '>=0.10.0'} - dependencies: - get-value: 2.0.6 - has-values: 1.0.0 - isobject: 3.0.1 - dev: false - - /has-values@0.1.4: - resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} - engines: {node: '>=0.10.0'} - dev: false - - /has-values@1.0.0: - resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} - engines: {node: '>=0.10.0'} - dependencies: - is-number: 3.0.0 - kind-of: 4.0.0 - dev: false - - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - dependencies: - function-bind: 1.1.2 - dev: false - - /highlight.js@10.7.3: - resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} - dev: false - - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: false - - /hot-shots@8.5.2: - resolution: {integrity: sha512-1CKCtbYU28KtRriRW+mdOZzKce0WPqU0FOYE4bYs3gD1bFpOrYzQDXfQ09Qz9dJPEltasDOGhFKiYaiuW/j9Dg==} - engines: {node: '>=6.0.0'} - optionalDependencies: - unix-dgram: 2.0.6 - dev: false - - /html-encoding-sniffer@2.0.1: - resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} - engines: {node: '>=10'} - dependencies: - whatwg-encoding: 1.0.5 - dev: false - - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: false - - /http-proxy-agent@4.0.1: - resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} - engines: {node: '>= 6'} - dependencies: - '@tootallnate/once': 1.1.2 - agent-base: 6.0.2 - debug: 4.3.5 - transitivePeerDependencies: - - supports-color - dev: false - - /http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.1 - debug: 4.3.5 - transitivePeerDependencies: - - supports-color - dev: false - - /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.5 - transitivePeerDependencies: - - supports-color - dev: false - - /https-proxy-agent@7.0.4: - resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.1 - debug: 4.3.5 - transitivePeerDependencies: - - supports-color - dev: false - - /human-signals@1.1.1: - resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} - engines: {node: '>=8.12.0'} - dev: false - - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - dev: false - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: false - - /ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} - dev: false - - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: false - - /import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} - hasBin: true - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - dev: false - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: false - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: false - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: false - - /internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.0.6 - dev: false - - /is-accessor-descriptor@1.0.1: - resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} - engines: {node: '>= 0.10'} - dependencies: - hasown: 2.0.2 - dev: false - - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - dev: false - - /is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - dev: false - - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: false - - /is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - dev: false - - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - dependencies: - has-bigints: 1.0.2 - dev: false - - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - dev: false - - /is-buffer@1.1.6: - resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - dev: false - - /is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - dev: false - - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: false - - /is-ci@2.0.0: - resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} - hasBin: true - dependencies: - ci-info: 2.0.0 - dev: false - - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - dependencies: - hasown: 2.0.2 - dev: false - - /is-data-descriptor@1.0.1: - resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} - engines: {node: '>= 0.4'} - dependencies: - hasown: 2.0.2 - dev: false - - /is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} - dependencies: - is-typed-array: 1.1.13 - dev: false - - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.2 - dev: false - - /is-descriptor@0.1.7: - resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} - engines: {node: '>= 0.4'} - dependencies: - is-accessor-descriptor: 1.0.1 - is-data-descriptor: 1.0.1 - dev: false - - /is-descriptor@1.0.3: - resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} - engines: {node: '>= 0.4'} - dependencies: - is-accessor-descriptor: 1.0.1 - is-data-descriptor: 1.0.1 - dev: false - - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - requiresBuild: true - dev: false - optional: true - - /is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - dev: false - - /is-extendable@1.0.1: - resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} - engines: {node: '>=0.10.0'} - dependencies: - is-plain-object: 2.0.4 - dev: false - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: false - - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: false - - /is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} - dev: false - - /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.2 - dev: false - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: false - - /is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - dev: false - - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.2 - dev: false - - /is-number@3.0.0: - resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 3.2.2 - dev: false - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: false - - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: false - - /is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - dependencies: - isobject: 3.0.1 - dev: false - - /is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - dev: false - - /is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - dev: false - - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - dev: false - - /is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - dev: false - - /is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - dev: false - - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: false - - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.2 - dev: false - - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: false - - /is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - dependencies: - which-typed-array: 1.1.15 - dev: false - - /is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - dev: false - - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - dependencies: - call-bind: 1.0.7 - dev: false - - /is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - dev: false - - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - requiresBuild: true - dependencies: - is-docker: 2.2.1 - dev: false - optional: true - - /isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - dev: false - - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: false - - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: false - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: false - - /isobject@2.1.0: - resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} - engines: {node: '>=0.10.0'} - dependencies: - isarray: 1.0.0 - dev: false - - /isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - dev: false - - /istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - dev: false - - /istanbul-lib-instrument@4.0.3: - resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} - engines: {node: '>=8'} - dependencies: - '@babel/core': 7.24.7 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: false - - /istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} - dependencies: - '@babel/core': 7.24.7 - '@babel/parser': 7.24.7 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: false - - /istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} - dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 - dev: false - - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - dependencies: - debug: 4.3.5 - istanbul-lib-coverage: 3.2.2 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - dev: false - - /istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - dev: false - - /jackspeak@3.4.0: - resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} - engines: {node: '>=14'} - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - dev: false - - /jest-changed-files@26.6.2: - resolution: {integrity: sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==} - engines: {node: '>= 10.14.2'} - dependencies: - '@jest/types': 26.6.2 - execa: 4.1.0 - throat: 5.0.0 - dev: false - - /jest-cli@26.6.3(ts-node@10.7.0): - resolution: {integrity: sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==} - engines: {node: '>= 10.14.2'} - hasBin: true - dependencies: - '@jest/core': 26.6.3(ts-node@10.7.0) - '@jest/test-result': 26.6.2 - '@jest/types': 26.6.2 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - import-local: 3.1.0 - is-ci: 2.0.0 - jest-config: 26.6.3(ts-node@10.7.0) - jest-util: 26.6.2 - jest-validate: 26.6.2 - prompts: 2.4.2 - yargs: 15.4.1 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - ts-node - - utf-8-validate - dev: false - - /jest-config@26.6.3(ts-node@10.7.0): - resolution: {integrity: sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==} - engines: {node: '>= 10.14.2'} - peerDependencies: - ts-node: '>=9.0.0' - peerDependenciesMeta: - ts-node: - optional: true - dependencies: - '@babel/core': 7.24.7 - '@jest/test-sequencer': 26.6.3(ts-node@10.7.0) - '@jest/types': 26.6.2 - babel-jest: 26.6.3(@babel/core@7.24.7) - chalk: 4.1.2 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-environment-jsdom: 26.6.2 - jest-environment-node: 26.6.2 - jest-get-type: 26.3.0 - jest-jasmine2: 26.6.3(ts-node@10.7.0) - jest-regex-util: 26.0.0 - jest-resolve: 26.6.2 - jest-util: 26.6.2 - jest-validate: 26.6.2 - micromatch: 4.0.7 - pretty-format: 26.6.2 - ts-node: 10.7.0(@types/node@16.18.99)(typescript@4.6.4) - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - dev: false - - /jest-diff@25.5.0: - resolution: {integrity: sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==} - engines: {node: '>= 8.3'} - dependencies: - chalk: 3.0.0 - diff-sequences: 25.2.6 - jest-get-type: 25.2.6 - pretty-format: 25.5.0 - dev: false - - /jest-diff@26.6.2: - resolution: {integrity: sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==} - engines: {node: '>= 10.14.2'} - dependencies: - chalk: 4.1.2 - diff-sequences: 26.6.2 - jest-get-type: 26.3.0 - pretty-format: 26.6.2 - dev: false - - /jest-docblock@26.0.0: - resolution: {integrity: sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==} - engines: {node: '>= 10.14.2'} - dependencies: - detect-newline: 3.1.0 - dev: false - - /jest-each@26.6.2: - resolution: {integrity: sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==} - engines: {node: '>= 10.14.2'} - dependencies: - '@jest/types': 26.6.2 - chalk: 4.1.2 - jest-get-type: 26.3.0 - jest-util: 26.6.2 - pretty-format: 26.6.2 - dev: false - - /jest-environment-jsdom@26.6.2: - resolution: {integrity: sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==} - engines: {node: '>= 10.14.2'} - dependencies: - '@jest/environment': 26.6.2 - '@jest/fake-timers': 26.6.2 - '@jest/types': 26.6.2 - '@types/node': 16.18.99 - jest-mock: 26.6.2 - jest-util: 26.6.2 - jsdom: 16.7.0 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - dev: false - - /jest-environment-node@26.6.2: - resolution: {integrity: sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==} - engines: {node: '>= 10.14.2'} - dependencies: - '@jest/environment': 26.6.2 - '@jest/fake-timers': 26.6.2 - '@jest/types': 26.6.2 - '@types/node': 16.18.99 - jest-mock: 26.6.2 - jest-util: 26.6.2 - dev: false - - /jest-get-type@25.2.6: - resolution: {integrity: sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==} - engines: {node: '>= 8.3'} - dev: false - - /jest-get-type@26.3.0: - resolution: {integrity: sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==} - engines: {node: '>= 10.14.2'} - dev: false - - /jest-haste-map@26.6.2: - resolution: {integrity: sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==} - engines: {node: '>= 10.14.2'} - dependencies: - '@jest/types': 26.6.2 - '@types/graceful-fs': 4.1.9 - '@types/node': 16.18.99 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 26.0.0 - jest-serializer: 26.6.2 - jest-util: 26.6.2 - jest-worker: 26.6.2 - micromatch: 4.0.7 - sane: 4.1.0 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 - dev: false - - /jest-jasmine2@26.6.3(ts-node@10.7.0): - resolution: {integrity: sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==} - engines: {node: '>= 10.14.2'} - dependencies: - '@babel/traverse': 7.24.7 - '@jest/environment': 26.6.2 - '@jest/source-map': 26.6.2 - '@jest/test-result': 26.6.2 - '@jest/types': 26.6.2 - '@types/node': 16.18.99 - chalk: 4.1.2 - co: 4.6.0 - expect: 26.6.2 - is-generator-fn: 2.1.0 - jest-each: 26.6.2 - jest-matcher-utils: 26.6.2 - jest-message-util: 26.6.2 - jest-runtime: 26.6.3(ts-node@10.7.0) - jest-snapshot: 26.6.2 - jest-util: 26.6.2 - pretty-format: 26.6.2 - throat: 5.0.0 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - ts-node - - utf-8-validate - dev: false - - /jest-leak-detector@26.6.2: - resolution: {integrity: sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==} - engines: {node: '>= 10.14.2'} - dependencies: - jest-get-type: 26.3.0 - pretty-format: 26.6.2 - dev: false - - /jest-matcher-utils@26.6.2: - resolution: {integrity: sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==} - engines: {node: '>= 10.14.2'} - dependencies: - chalk: 4.1.2 - jest-diff: 26.6.2 - jest-get-type: 26.3.0 - pretty-format: 26.6.2 - dev: false - - /jest-message-util@26.6.2: - resolution: {integrity: sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==} - engines: {node: '>= 10.14.2'} - dependencies: - '@babel/code-frame': 7.24.7 - '@jest/types': 26.6.2 - '@types/stack-utils': 2.0.3 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.7 - pretty-format: 26.6.2 - slash: 3.0.0 - stack-utils: 2.0.6 - dev: false - - /jest-mock@26.6.2: - resolution: {integrity: sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==} - engines: {node: '>= 10.14.2'} - dependencies: - '@jest/types': 26.6.2 - '@types/node': 16.18.99 - dev: false - - /jest-pnp-resolver@1.2.3(jest-resolve@26.6.2): - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - dependencies: - jest-resolve: 26.6.2 - dev: false - - /jest-regex-util@26.0.0: - resolution: {integrity: sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==} - engines: {node: '>= 10.14.2'} - dev: false - - /jest-resolve-dependencies@26.6.3: - resolution: {integrity: sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==} - engines: {node: '>= 10.14.2'} - dependencies: - '@jest/types': 26.6.2 - jest-regex-util: 26.0.0 - jest-snapshot: 26.6.2 - dev: false - - /jest-resolve@26.6.2: - resolution: {integrity: sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==} - engines: {node: '>= 10.14.2'} - dependencies: - '@jest/types': 26.6.2 - chalk: 4.1.2 - graceful-fs: 4.2.11 - jest-pnp-resolver: 1.2.3(jest-resolve@26.6.2) - jest-util: 26.6.2 - read-pkg-up: 7.0.1 - resolve: 1.22.8 - slash: 3.0.0 - dev: false - - /jest-runner@26.6.3(ts-node@10.7.0): - resolution: {integrity: sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==} - engines: {node: '>= 10.14.2'} - dependencies: - '@jest/console': 26.6.2 - '@jest/environment': 26.6.2 - '@jest/test-result': 26.6.2 - '@jest/types': 26.6.2 - '@types/node': 16.18.99 - chalk: 4.1.2 - emittery: 0.7.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 26.6.3(ts-node@10.7.0) - jest-docblock: 26.0.0 - jest-haste-map: 26.6.2 - jest-leak-detector: 26.6.2 - jest-message-util: 26.6.2 - jest-resolve: 26.6.2 - jest-runtime: 26.6.3(ts-node@10.7.0) - jest-util: 26.6.2 - jest-worker: 26.6.2 - source-map-support: 0.5.21 - throat: 5.0.0 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - ts-node - - utf-8-validate - dev: false - - /jest-runtime@26.6.3(ts-node@10.7.0): - resolution: {integrity: sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==} - engines: {node: '>= 10.14.2'} - hasBin: true - dependencies: - '@jest/console': 26.6.2 - '@jest/environment': 26.6.2 - '@jest/fake-timers': 26.6.2 - '@jest/globals': 26.6.2 - '@jest/source-map': 26.6.2 - '@jest/test-result': 26.6.2 - '@jest/transform': 26.6.2 - '@jest/types': 26.6.2 - '@types/yargs': 15.0.19 - chalk: 4.1.2 - cjs-module-lexer: 0.6.0 - collect-v8-coverage: 1.0.2 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-config: 26.6.3(ts-node@10.7.0) - jest-haste-map: 26.6.2 - jest-message-util: 26.6.2 - jest-mock: 26.6.2 - jest-regex-util: 26.0.0 - jest-resolve: 26.6.2 - jest-snapshot: 26.6.2 - jest-util: 26.6.2 - jest-validate: 26.6.2 - slash: 3.0.0 - strip-bom: 4.0.0 - yargs: 15.4.1 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - ts-node - - utf-8-validate - dev: false - - /jest-serializer@26.6.2: - resolution: {integrity: sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==} - engines: {node: '>= 10.14.2'} - dependencies: - '@types/node': 16.18.99 - graceful-fs: 4.2.11 - dev: false - - /jest-snapshot@26.6.2: - resolution: {integrity: sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==} - engines: {node: '>= 10.14.2'} - dependencies: - '@babel/types': 7.24.7 - '@jest/types': 26.6.2 - '@types/babel__traverse': 7.20.6 - '@types/prettier': 2.7.3 - chalk: 4.1.2 - expect: 26.6.2 - graceful-fs: 4.2.11 - jest-diff: 26.6.2 - jest-get-type: 26.3.0 - jest-haste-map: 26.6.2 - jest-matcher-utils: 26.6.2 - jest-message-util: 26.6.2 - jest-resolve: 26.6.2 - natural-compare: 1.4.0 - pretty-format: 26.6.2 - semver: 7.6.2 - dev: false - - /jest-util@26.6.2: - resolution: {integrity: sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==} - engines: {node: '>= 10.14.2'} - dependencies: - '@jest/types': 26.6.2 - '@types/node': 16.18.99 - chalk: 4.1.2 - graceful-fs: 4.2.11 - is-ci: 2.0.0 - micromatch: 4.0.7 - dev: false - - /jest-validate@26.6.2: - resolution: {integrity: sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==} - engines: {node: '>= 10.14.2'} - dependencies: - '@jest/types': 26.6.2 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 26.3.0 - leven: 3.1.0 - pretty-format: 26.6.2 - dev: false - - /jest-watcher@26.6.2: - resolution: {integrity: sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==} - engines: {node: '>= 10.14.2'} - dependencies: - '@jest/test-result': 26.6.2 - '@jest/types': 26.6.2 - '@types/node': 16.18.99 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - jest-util: 26.6.2 - string-length: 4.0.2 - dev: false - - /jest-worker@26.6.2: - resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} - engines: {node: '>= 10.13.0'} - dependencies: - '@types/node': 16.18.99 - merge-stream: 2.0.0 - supports-color: 7.2.0 - dev: false - - /jest@26.6.3(ts-node@10.7.0): - resolution: {integrity: sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==} - engines: {node: '>= 10.14.2'} - hasBin: true - dependencies: - '@jest/core': 26.6.3(ts-node@10.7.0) - import-local: 3.1.0 - jest-cli: 26.6.3(ts-node@10.7.0) - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - ts-node - - utf-8-validate - dev: false - - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: false - - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: false - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - dev: false - - /jsdom@16.7.0: - resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} - engines: {node: '>=10'} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - dependencies: - abab: 2.0.6 - acorn: 8.12.0 - acorn-globals: 6.0.0 - cssom: 0.4.4 - cssstyle: 2.3.0 - data-urls: 2.0.0 - decimal.js: 10.4.3 - domexception: 2.0.1 - escodegen: 2.1.0 - form-data: 3.0.1 - html-encoding-sniffer: 2.0.1 - http-proxy-agent: 4.0.1 - https-proxy-agent: 5.0.1 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.10 - parse5: 6.0.1 - saxes: 5.0.1 - symbol-tree: 3.2.4 - tough-cookie: 4.1.4 - w3c-hr-time: 1.0.2 - w3c-xmlserializer: 2.0.0 - webidl-conversions: 6.1.0 - whatwg-encoding: 1.0.5 - whatwg-mimetype: 2.3.0 - whatwg-url: 8.7.0 - ws: 7.5.10 - xml-name-validator: 3.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false - - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: false - - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: false - - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: false - - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: false - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: false - - /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - dependencies: - minimist: 1.2.8 - dev: false - - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: false - - /jsonc-parser@3.2.1: - resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} - dev: false - - /jsonwebtoken@9.0.2: - resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} - engines: {node: '>=12', npm: '>=6'} - dependencies: - jws: 3.2.2 - lodash.includes: 4.3.0 - lodash.isboolean: 3.0.3 - lodash.isinteger: 4.0.4 - lodash.isnumber: 3.0.3 - lodash.isplainobject: 4.0.6 - lodash.isstring: 4.0.1 - lodash.once: 4.1.1 - ms: 2.1.3 - semver: 7.6.2 - dev: false - - /jssha@3.3.1: - resolution: {integrity: sha512-VCMZj12FCFMQYcFLPRm/0lOBbLi8uM2BhXPTqw3U4YAfs4AZfiApOoBLoN8cQE60Z50m1MYMTQVCfgF/KaCVhQ==} - dev: false - - /junk@3.0.0: - resolution: {integrity: sha512-8oLnegfzPD/7V2oLI+kacn941P7IEYKDdjbwBJQWqWFdoZduX+YOJIrZEEYehd9aSk00J2m+l3fppxAmAc4sXQ==} - engines: {node: '>=8'} - dev: false - - /jwa@1.4.1: - resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 - dev: false - - /jws@3.2.2: - resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} - dependencies: - jwa: 1.4.1 - safe-buffer: 5.2.1 - dev: false - - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - dependencies: - json-buffer: 3.0.1 - dev: false - - /kind-of@3.2.2: - resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} - engines: {node: '>=0.10.0'} - dependencies: - is-buffer: 1.1.6 - dev: false - - /kind-of@4.0.0: - resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} - engines: {node: '>=0.10.0'} - dependencies: - is-buffer: 1.1.6 - dev: false - - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: false - - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - dev: false - - /kuler@2.0.0: - resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} - dev: false - - /leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - dev: false - - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: false - - /libphonenumber-js@1.11.3: - resolution: {integrity: sha512-RU0CTsLCu2v6VEzdP+W6UU2n5+jEpMDRkGxUeBgsAJgre3vKgm17eApISH9OQY4G0jZYJVIc8qXmz6CJFueAFg==} - dev: false - - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: false - - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - dependencies: - p-locate: 4.1.0 - dev: false - - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: false - - /lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - dev: false - - /lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - dev: false - - /lodash.includes@4.3.0: - resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} - dev: false - - /lodash.isboolean@3.0.3: - resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} - dev: false - - /lodash.isinteger@4.0.4: - resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} - dev: false - - /lodash.isnumber@3.0.3: - resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} - dev: false - - /lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - dev: false - - /lodash.isstring@4.0.1: - resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - dev: false - - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: false - - /lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - dev: false - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: false - - /logform@2.6.0: - resolution: {integrity: sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==} - engines: {node: '>= 12.0.0'} - dependencies: - '@colors/colors': 1.6.0 - '@types/triple-beam': 1.3.5 - fecha: 4.2.3 - ms: 2.1.3 - safe-stable-stringify: 2.4.3 - triple-beam: 1.4.1 - dev: false - - /lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} - engines: {node: 14 || >=16.14} - dev: false - - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - dependencies: - yallist: 3.1.1 - dev: false - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: false - - /make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} - dependencies: - semver: 7.6.2 - dev: false - - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - dev: false - - /makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - dependencies: - tmpl: 1.0.5 - dev: false - - /map-cache@0.2.2: - resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} - engines: {node: '>=0.10.0'} - dev: false - - /map-visit@1.0.0: - resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} - engines: {node: '>=0.10.0'} - dependencies: - object-visit: 1.0.1 - dev: false - - /memory-fs@0.5.0: - resolution: {integrity: sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==} - engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} - dependencies: - errno: 0.1.8 - readable-stream: 2.3.8 - dev: false - - /memory-pager@1.5.0: - resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} - requiresBuild: true - dev: false - optional: true - - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: false - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: false - - /micromatch@3.1.10: - resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} - engines: {node: '>=0.10.0'} - dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - braces: 2.3.2 - define-property: 2.0.2 - extend-shallow: 3.0.2 - extglob: 2.0.4 - fragment-cache: 0.2.1 - kind-of: 6.0.3 - nanomatch: 1.2.13 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - dev: false - - /micromatch@4.0.7: - resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - dev: false - - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: false - - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: false - - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: false - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: false - - /minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - brace-expansion: 2.0.1 - dev: false - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: false - - /minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - dev: false - - /mixin-deep@1.3.2: - resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} - engines: {node: '>=0.10.0'} - dependencies: - for-in: 1.0.2 - is-extendable: 1.0.1 - dev: false - - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - dev: false - - /mkdirp@2.1.6: - resolution: {integrity: sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==} - engines: {node: '>=10'} - hasBin: true - dev: false - - /mongodb@3.7.4: - resolution: {integrity: sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw==} - engines: {node: '>=4'} - peerDependencies: - aws4: '*' - bson-ext: '*' - kerberos: '*' - mongodb-client-encryption: '*' - mongodb-extjson: '*' - snappy: '*' - peerDependenciesMeta: - aws4: - optional: true - bson-ext: - optional: true - kerberos: - optional: true - mongodb-client-encryption: - optional: true - mongodb-extjson: - optional: true - snappy: - optional: true - dependencies: - bl: 2.2.1 - bson: 1.1.6 - denque: 1.5.1 - optional-require: 1.1.8 - safe-buffer: 5.2.1 - optionalDependencies: - saslprep: 1.0.3 - dev: false - - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: false - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: false - - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: false - - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - dev: false - - /nan@2.20.0: - resolution: {integrity: sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==} - requiresBuild: true - dev: false - optional: true - - /nanomatch@1.2.13: - resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} - engines: {node: '>=0.10.0'} - dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - define-property: 2.0.2 - extend-shallow: 3.0.2 - fragment-cache: 0.2.1 - is-windows: 1.0.2 - kind-of: 6.0.3 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - dev: false - - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: false - - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: false - - /nice-try@1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - dev: false - - /node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: false - - /node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - dev: false - - /node-notifier@8.0.2: - resolution: {integrity: sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==} - requiresBuild: true - dependencies: - growly: 1.3.0 - is-wsl: 2.2.0 - semver: 7.6.2 - shellwords: 0.1.1 - uuid: 8.3.2 - which: 2.0.2 - dev: false - optional: true - - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - dev: false - - /node-yaml@3.2.0(eslint@8.57.0): - resolution: {integrity: sha512-5c7TNdFOLOaY/TN0fBDrfJg+N6Z1+Ch7O/QuN2wostfo9Q4qbpOTAjk1WZ3bxgSfRPrJF4rgWdL26N2Svdljhw==} - dependencies: - co: 4.6.0 - js-yaml: 3.14.1 - junk: 3.0.0 - promise-fs: 2.1.0(eslint@8.57.0) - transitivePeerDependencies: - - eslint - - supports-color - dev: false - - /noms@0.0.0: - resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} - dependencies: - inherits: 2.0.4 - readable-stream: 1.0.34 - dev: false - - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.8 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - dev: false - - /normalize-path@2.1.1: - resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} - engines: {node: '>=0.10.0'} - dependencies: - remove-trailing-separator: 1.1.0 - dev: false - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: false - - /npm-run-path@2.0.2: - resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} - engines: {node: '>=4'} - dependencies: - path-key: 2.0.1 - dev: false - - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - dependencies: - path-key: 3.1.1 - dev: false - - /nwsapi@2.2.10: - resolution: {integrity: sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==} - dev: false - - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: false - - /object-copy@0.1.0: - resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} - engines: {node: '>=0.10.0'} - dependencies: - copy-descriptor: 0.1.1 - define-property: 0.2.5 - kind-of: 3.2.2 - dev: false - - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: false - - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: false - - /object-visit@1.0.1: - resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} - engines: {node: '>=0.10.0'} - dependencies: - isobject: 3.0.1 - dev: false - - /object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - dev: false - - /object.entries@1.1.8: - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - dev: false - - /object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - dev: false - - /object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - dev: false - - /object.pick@1.3.0: - resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} - engines: {node: '>=0.10.0'} - dependencies: - isobject: 3.0.1 - dev: false - - /object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - dev: false - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - dev: false - - /one-time@1.0.0: - resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} - dependencies: - fn.name: 1.1.0 - dev: false - - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - dependencies: - mimic-fn: 2.1.0 - dev: false - - /optional-require@1.1.8: - resolution: {integrity: sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==} - engines: {node: '>=4'} - dependencies: - require-at: 1.0.6 - dev: false - - /optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - dev: false - - /p-each-series@2.2.0: - resolution: {integrity: sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==} - engines: {node: '>=8'} - dev: false - - /p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - dev: false - - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - dependencies: - p-try: 2.2.0 - dev: false - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: false - - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - dependencies: - p-limit: 2.3.0 - dev: false - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: false - - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: false - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - dev: false - - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - dependencies: - '@babel/code-frame': 7.24.7 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - dev: false - - /parse5-htmlparser2-tree-adapter@6.0.1: - resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} - dependencies: - parse5: 6.0.1 - dev: false - - /parse5@5.1.1: - resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} - dev: false - - /parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - dev: false - - /pascalcase@0.1.1: - resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} - engines: {node: '>=0.10.0'} - dev: false - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: false - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: false - - /path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - dev: false - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: false - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: false - - /path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - dependencies: - lru-cache: 10.2.2 - minipass: 7.1.2 - dev: false - - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: false - - /picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} - dev: false - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: false - - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - dev: false - - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - dev: false - - /posix-character-classes@0.1.1: - resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} - engines: {node: '>=0.10.0'} - dev: false - - /possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - dev: false - - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: false - - /pretty-format@25.5.0: - resolution: {integrity: sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==} - engines: {node: '>= 8.3'} - dependencies: - '@jest/types': 25.5.0 - ansi-regex: 5.0.1 - ansi-styles: 4.3.0 - react-is: 16.13.1 - dev: false - - /pretty-format@26.6.2: - resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} - engines: {node: '>= 10'} - dependencies: - '@jest/types': 26.6.2 - ansi-regex: 5.0.1 - ansi-styles: 4.3.0 - react-is: 17.0.2 - dev: false - - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: false - - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - dev: false - - /promise-fs@2.1.0(eslint@8.57.0): - resolution: {integrity: sha512-Wl6Y+dSQnw1cJjXdMbXABoH2fRXC3G3KjQHH32qPT6UYyDrh9Iouj/rvI+KKJiVFwQ1/3KiPe1dybp6cHYvUag==} - engines: {node: '>= 6'} - dependencies: - '@octetstream/eslint-config': 3.0.0(eslint@8.57.0) - '@octetstream/promisify': 2.0.2 - transitivePeerDependencies: - - eslint - - supports-color - dev: false - - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - dev: false - - /prr@1.0.1: - resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} - dev: false - - /psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: false - - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: false - - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: false - - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: false - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: false - - /react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - dev: false - - /react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: false - - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - dev: false - - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - dev: false - - /readable-stream@1.0.34: - resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 0.0.1 - string_decoder: 0.10.31 - dev: false - - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - dev: false - - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: false - - /reflect-metadata@0.2.2: - resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} - dev: false - - /regex-not@1.0.2: - resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} - engines: {node: '>=0.10.0'} - dependencies: - extend-shallow: 3.0.2 - safe-regex: 1.1.0 - dev: false - - /regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.2 - dev: false - - /regexpp@3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} - dev: false - - /remove-trailing-separator@1.1.0: - resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} - dev: false - - /repeat-element@1.1.4: - resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} - engines: {node: '>=0.10.0'} - dev: false - - /repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - dev: false - - /require-at@1.0.6: - resolution: {integrity: sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==} - engines: {node: '>=4'} - dev: false - - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: false - - /require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - dev: false - - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: false - - /resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} - dependencies: - resolve-from: 5.0.0 - dev: false - - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: false - - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: false - - /resolve-url@0.2.1: - resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} - deprecated: https://github.com/lydell/resolve-url#deprecated - dev: false - - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: false - - /ret@0.1.15: - resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} - engines: {node: '>=0.12'} - dev: false - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: false - - /rhea-promise@2.1.0: - resolution: {integrity: sha512-CRMwdJ/o4oO/xKcvAwAsd0AHy5fVvSlqso7AadRmaaLGzAzc9LCoW7FOFnucI8THasVmOeCnv5c/fH/n7FcNaA==} - dependencies: - debug: 3.2.7 - rhea: 2.0.8 - tslib: 2.6.3 - dev: false - - /rhea-promise@3.0.3: - resolution: {integrity: sha512-a875P5YcMkePSTEWMsnmCQS7Y4v/XvIw7ZoMtJxqtQRZsqSA6PsZxuz4vktyRykPuUgdNsA6F84dS3iEXZoYnQ==} - dependencies: - debug: 4.3.5 - rhea: 3.0.2 - tslib: 2.6.3 - transitivePeerDependencies: - - supports-color - dev: false - - /rhea@2.0.8: - resolution: {integrity: sha512-IgwlP4D2lzinBSll5f35tAWa30dGCZhG9Ujd1DiaB7MUGegIjAaLzqATCw3ha+h9oq9mXcitqayBbNIXYdvtFg==} - dependencies: - debug: 3.2.7 - dev: false - - /rhea@3.0.2: - resolution: {integrity: sha512-0G1ZNM9yWin8VLvTxyISKH6KfR6gl1TW/1+5yMKPf2r1efhkzTLze09iFtT2vpDjuWIVtSmXz8r18lk/dO8qwQ==} - dependencies: - debug: 4.3.5 - transitivePeerDependencies: - - supports-color - dev: false - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - dependencies: - glob: 7.2.3 - dev: false - - /rimraf@5.0.7: - resolution: {integrity: sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==} - engines: {node: '>=14.18'} - hasBin: true - dependencies: - glob: 10.4.1 - dev: false - - /rsvp@4.8.5: - resolution: {integrity: sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==} - engines: {node: 6.* || >= 7.*} - dev: false - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - dev: false - - /safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - isarray: 2.0.5 - dev: false - - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: false - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: false - - /safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-regex: 1.1.4 - dev: false - - /safe-regex@1.1.0: - resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} - dependencies: - ret: 0.1.15 - dev: false - - /safe-stable-stringify@2.4.3: - resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} - engines: {node: '>=10'} - dev: false - - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: false - - /sane@4.1.0: - resolution: {integrity: sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==} - engines: {node: 6.* || 8.* || >= 10.*} - deprecated: some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added - hasBin: true - dependencies: - '@cnakazawa/watch': 1.0.4 - anymatch: 2.0.0 - capture-exit: 2.0.0 - exec-sh: 0.3.6 - execa: 1.0.0 - fb-watchman: 2.0.2 - micromatch: 3.1.10 - minimist: 1.2.8 - walker: 1.0.8 - dev: false - - /saslprep@1.0.3: - resolution: {integrity: sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==} - engines: {node: '>=6'} - requiresBuild: true - dependencies: - sparse-bitfield: 3.0.3 - dev: false - optional: true - - /saxes@5.0.1: - resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} - engines: {node: '>=10'} - dependencies: - xmlchars: 2.2.0 - dev: false - - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - dev: false - - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - dev: false - - /semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} - engines: {node: '>=10'} - hasBin: true - dev: false - - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: false - - /set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - dev: false - - /set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - dev: false - - /set-value@2.0.1: - resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} - engines: {node: '>=0.10.0'} - dependencies: - extend-shallow: 2.0.1 - is-extendable: 0.1.1 - is-plain-object: 2.0.4 - split-string: 3.1.0 - dev: false - - /sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} - hasBin: true - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: false - - /shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - dependencies: - shebang-regex: 1.0.0 - dev: false - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: false - - /shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - dev: false - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: false - - /shellwords@0.1.1: - resolution: {integrity: sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==} - requiresBuild: true - dev: false - optional: true - - /side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.1 - dev: false - - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: false - - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - dev: false - - /simple-git@3.16.1: - resolution: {integrity: sha512-xzRxMKiy1zEYeHGXgAzvuXffDS0xgsq07Oi4LWEEcVH29vLpcZ2tyQRWyK0NLLlCVaKysZeem5tC1qHEOxsKwA==} - dependencies: - '@kwsites/file-exists': 1.1.1 - '@kwsites/promise-deferred': 1.1.1 - debug: 4.3.5 - transitivePeerDependencies: - - supports-color - dev: false - - /simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - dependencies: - is-arrayish: 0.3.2 - dev: false - - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: false - - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: false - - /snapdragon-node@2.1.1: - resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} - engines: {node: '>=0.10.0'} - dependencies: - define-property: 1.0.0 - isobject: 3.0.1 - snapdragon-util: 3.0.1 - dev: false - - /snapdragon-util@3.0.1: - resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 3.2.2 - dev: false - - /snapdragon@0.8.2: - resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} - engines: {node: '>=0.10.0'} - dependencies: - base: 0.11.2 - debug: 2.6.9 - define-property: 0.2.5 - extend-shallow: 2.0.1 - map-cache: 0.2.2 - source-map: 0.5.7 - source-map-resolve: 0.5.3 - use: 3.1.1 - dev: false - - /source-map-resolve@0.5.3: - resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} - deprecated: See https://github.com/lydell/source-map-resolve#deprecated - dependencies: - atob: 2.1.2 - decode-uri-component: 0.2.2 - resolve-url: 0.2.1 - source-map-url: 0.4.1 - urix: 0.1.0 - dev: false - - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: false - - /source-map-url@0.4.1: - resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} - deprecated: See https://github.com/lydell/source-map-url#deprecated - dev: false - - /source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - dev: false - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: false - - /source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - dev: false - - /sparse-bitfield@3.0.3: - resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} - requiresBuild: true - dependencies: - memory-pager: 1.5.0 - dev: false - optional: true - - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.18 - dev: false - - /spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - dev: false - - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.18 - dev: false - - /spdx-license-ids@3.0.18: - resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==} - dev: false - - /split-string@3.1.0: - resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} - engines: {node: '>=0.10.0'} - dependencies: - extend-shallow: 3.0.2 - dev: false - - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: false - - /stack-trace@0.0.10: - resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} - dev: false - - /stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - dependencies: - escape-string-regexp: 2.0.0 - dev: false - - /static-extend@0.1.2: - resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} - engines: {node: '>=0.10.0'} - dependencies: - define-property: 0.2.5 - object-copy: 0.1.0 - dev: false - - /string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} - dependencies: - char-regex: 1.0.2 - strip-ansi: 6.0.1 - dev: false - - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - dev: false - - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - dev: false - - /string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - dev: false - - /string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - dev: false - - /string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - dev: false - - /string_decoder@0.10.31: - resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} - dev: false - - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - dependencies: - safe-buffer: 5.1.2 - dev: false - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: false - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - dev: false - - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - dependencies: - ansi-regex: 6.0.1 - dev: false - - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: false - - /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - dev: false - - /strip-eof@1.0.0: - resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} - engines: {node: '>=0.10.0'} - dev: false - - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: false - - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: false - - /strnum@1.0.5: - resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} - dev: false - - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - dev: false - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: false - - /supports-hyperlinks@2.3.0: - resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - supports-color: 7.2.0 - dev: false - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: false - - /symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - dev: false - - /terminal-link@2.1.1: - resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} - engines: {node: '>=8'} - dependencies: - ansi-escapes: 4.3.2 - supports-hyperlinks: 2.3.0 - dev: false - - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - dev: false - - /text-hex@1.0.0: - resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} - dev: false - - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: false - - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - dependencies: - thenify: 3.3.1 - dev: false - - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - dependencies: - any-promise: 1.3.0 - dev: false - - /throat@5.0.0: - resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} - dev: false - - /through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - dev: false - - /tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - dev: false - - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: false - - /to-object-path@0.3.0: - resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 3.2.2 - dev: false - - /to-regex-range@2.1.1: - resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} - engines: {node: '>=0.10.0'} - dependencies: - is-number: 3.0.0 - repeat-string: 1.6.1 - dev: false - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - dev: false - - /to-regex@3.0.2: - resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} - engines: {node: '>=0.10.0'} - dependencies: - define-property: 2.0.2 - extend-shallow: 3.0.2 - regex-not: 1.0.2 - safe-regex: 1.1.0 - dev: false - - /tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} - dependencies: - psl: 1.9.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 - dev: false - - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: false - - /tr46@2.1.0: - resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} - engines: {node: '>=8'} - dependencies: - punycode: 2.3.1 - dev: false - - /triple-beam@1.4.1: - resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} - engines: {node: '>= 14.0.0'} - dev: false - - /ts-jest@26.5.6(jest@26.6.3)(typescript@4.6.4): - resolution: {integrity: sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA==} - engines: {node: '>= 10'} - hasBin: true - peerDependencies: - jest: '>=26 <27' - typescript: '>=3.8 <5.0' - dependencies: - bs-logger: 0.2.6 - buffer-from: 1.1.2 - fast-json-stable-stringify: 2.1.0 - jest: 26.6.3(ts-node@10.7.0) - jest-util: 26.6.2 - json5: 2.2.3 - lodash: 4.17.21 - make-error: 1.3.6 - mkdirp: 1.0.4 - semver: 7.6.2 - typescript: 4.6.4 - yargs-parser: 20.2.9 - dev: false - - /ts-node@10.7.0(@types/node@16.18.99)(typescript@4.6.4): - resolution: {integrity: sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - dependencies: - '@cspotcode/source-map-support': 0.7.0 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 16.18.99 - acorn: 8.12.0 - acorn-walk: 8.3.3 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 4.6.4 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: false - - /tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - dev: false - - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: false - - /tslib@2.6.3: - resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} - dev: false - - /tsutils@3.21.0(typescript@4.6.4): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 4.6.4 - dev: false - - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - dev: false - - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: false - - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: false - - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: false - - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: false - - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: false - - /typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-typed-array: 1.1.13 - dev: false - - /typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - dev: false - - /typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - dev: false - - /typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 - dev: false - - /typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - dependencies: - is-typedarray: 1.0.0 - dev: false - - /typeorm@0.3.20(mongodb@3.7.4)(ts-node@10.7.0): - resolution: {integrity: sha512-sJ0T08dV5eoZroaq9uPKBoNcGslHBR4E4y+EBHs//SiGbblGe7IeduP/IH4ddCcj0qp3PHwDwGnuvqEAnKlq/Q==} - engines: {node: '>=16.13.0'} - hasBin: true - peerDependencies: - '@google-cloud/spanner': ^5.18.0 - '@sap/hana-client': ^2.12.25 - better-sqlite3: ^7.1.2 || ^8.0.0 || ^9.0.0 - hdb-pool: ^0.1.6 - ioredis: ^5.0.4 - mongodb: ^5.8.0 - mssql: ^9.1.1 || ^10.0.1 - mysql2: ^2.2.5 || ^3.0.1 - oracledb: ^6.3.0 - pg: ^8.5.1 - pg-native: ^3.0.0 - pg-query-stream: ^4.0.0 - redis: ^3.1.1 || ^4.0.0 - sql.js: ^1.4.0 - sqlite3: ^5.0.3 - ts-node: ^10.7.0 - typeorm-aurora-data-api-driver: ^2.0.0 - peerDependenciesMeta: - '@google-cloud/spanner': - optional: true - '@sap/hana-client': - optional: true - better-sqlite3: - optional: true - hdb-pool: - optional: true - ioredis: - optional: true - mongodb: - optional: true - mssql: - optional: true - mysql2: - optional: true - oracledb: - optional: true - pg: - optional: true - pg-native: - optional: true - pg-query-stream: - optional: true - redis: - optional: true - sql.js: - optional: true - sqlite3: - optional: true - ts-node: - optional: true - typeorm-aurora-data-api-driver: - optional: true - dependencies: - '@sqltools/formatter': 1.2.5 - app-root-path: 3.1.0 - buffer: 6.0.3 - chalk: 4.1.2 - cli-highlight: 2.1.11 - dayjs: 1.11.11 - debug: 4.3.5 - dotenv: 16.4.5 - glob: 10.4.1 - mkdirp: 2.1.6 - mongodb: 3.7.4 - reflect-metadata: 0.2.2 - sha.js: 2.4.11 - ts-node: 10.7.0(@types/node@16.18.99)(typescript@4.6.4) - tslib: 2.6.3 - uuid: 9.0.1 - yargs: 17.7.2 - transitivePeerDependencies: - - supports-color - dev: false - - /typescript@4.6.4: - resolution: {integrity: sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==} - engines: {node: '>=4.2.0'} - hasBin: true - dev: false - - /typical@4.0.0: - resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} - engines: {node: '>=8'} - dev: false - - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - dev: false - - /union-value@1.0.1: - resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} - engines: {node: '>=0.10.0'} - dependencies: - arr-union: 3.1.0 - get-value: 2.0.6 - is-extendable: 0.1.1 - set-value: 2.0.1 - dev: false - - /universal-github-app-jwt@1.1.2: - resolution: {integrity: sha512-t1iB2FmLFE+yyJY9+3wMx0ejB+MQpEVkH0gQv7dR6FZyltyq+ZZO0uDpbopxhrZ3SLEO4dCEkIujOMldEQ2iOA==} - dependencies: - '@types/jsonwebtoken': 9.0.6 - jsonwebtoken: 9.0.2 - dev: false - - /universal-user-agent@6.0.1: - resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} - dev: false - - /universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - dev: false - - /unix-dgram@2.0.6: - resolution: {integrity: sha512-AURroAsb73BZ6CdAyMrTk/hYKNj3DuYYEuOaB8bYMOHGKupRNScw90Q5C71tWJc3uE7dIeXRyuwN0xLLq3vDTg==} - engines: {node: '>=0.10.48'} - requiresBuild: true - dependencies: - bindings: 1.5.0 - nan: 2.20.0 - dev: false - optional: true - - /unset-value@1.0.0: - resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} - engines: {node: '>=0.10.0'} - dependencies: - has-value: 0.3.1 - isobject: 3.0.1 - dev: false - - /untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - dev: false - - /update-browserslist-db@1.0.16(browserslist@4.23.1): - resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.23.1 - escalade: 3.1.2 - picocolors: 1.0.1 - dev: false - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.1 - dev: false - - /urix@0.1.0: - resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} - deprecated: Please see https://github.com/lydell/urix#deprecated - dev: false - - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: false - - /use@3.1.1: - resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} - engines: {node: '>=0.10.0'} - dev: false - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: false - - /util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - dependencies: - inherits: 2.0.4 - is-arguments: 1.1.1 - is-generator-function: 1.0.10 - is-typed-array: 1.1.13 - which-typed-array: 1.1.15 - dev: false - - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - dev: false - - /uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - dev: false - - /v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - dev: false - - /v8-to-istanbul@7.1.2: - resolution: {integrity: sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==} - engines: {node: '>=10.10.0'} - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - convert-source-map: 1.9.0 - source-map: 0.7.4 - dev: false - - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - dev: false - - /validator@13.12.0: - resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} - engines: {node: '>= 0.10'} - dev: false - - /w3c-hr-time@1.0.2: - resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} - deprecated: Use your platform's native performance.now() and performance.timeOrigin. - dependencies: - browser-process-hrtime: 1.0.0 - dev: false - - /w3c-xmlserializer@2.0.0: - resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} - engines: {node: '>=10'} - dependencies: - xml-name-validator: 3.0.0 - dev: false - - /walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - dependencies: - makeerror: 1.0.12 - dev: false - - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: false - - /webidl-conversions@5.0.0: - resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} - engines: {node: '>=8'} - dev: false - - /webidl-conversions@6.1.0: - resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} - engines: {node: '>=10.4'} - dev: false - - /whatwg-encoding@1.0.5: - resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} - dependencies: - iconv-lite: 0.4.24 - dev: false - - /whatwg-mimetype@2.3.0: - resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} - dev: false - - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - dev: false - - /whatwg-url@8.7.0: - resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} - engines: {node: '>=10'} - dependencies: - lodash: 4.17.21 - tr46: 2.1.0 - webidl-conversions: 6.1.0 - dev: false - - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - dev: false - - /which-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - dev: false - - /which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.2 - dev: false - - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: false - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: false - - /winston-transport@4.7.0: - resolution: {integrity: sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==} - engines: {node: '>= 12.0.0'} - dependencies: - logform: 2.6.0 - readable-stream: 3.6.2 - triple-beam: 1.4.1 - dev: false - - /winston@3.7.2: - resolution: {integrity: sha512-QziIqtojHBoyzUOdQvQiar1DH0Xp9nF1A1y7NVy2DGEsz82SBDtOalS0ulTRGVT14xPX3WRWkCsdcJKqNflKng==} - engines: {node: '>= 12.0.0'} - dependencies: - '@dabh/diagnostics': 2.0.3 - async: 3.2.5 - is-stream: 2.0.1 - logform: 2.6.0 - one-time: 1.0.0 - readable-stream: 3.6.2 - safe-stable-stringify: 2.4.3 - stack-trace: 0.0.10 - triple-beam: 1.4.1 - winston-transport: 4.7.0 - dev: false - - /word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - dev: false - - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: false - - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: false - - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - dev: false - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: false - - /write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} - dependencies: - imurmurhash: 0.1.4 - is-typedarray: 1.0.0 - signal-exit: 3.0.7 - typedarray-to-buffer: 3.1.5 - dev: false - - /ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: false - - /xml-name-validator@3.0.0: - resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} - dev: false - - /xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - dev: false - - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - dev: false - - /y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - dev: false - - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: false - - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: false - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: false - - /yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} - dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 - dev: false - - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - dev: false - - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: false - - /yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} - dependencies: - cliui: 6.0.0 - decamelize: 1.2.0 - find-up: 4.1.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 - string-width: 4.2.3 - which-module: 2.0.1 - y18n: 4.0.3 - yargs-parser: 18.1.3 - dev: false - - /yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - dependencies: - cliui: 7.0.4 - escalade: 3.1.2 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - dev: false - - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - dependencies: - cliui: 8.0.1 - escalade: 3.1.2 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - dev: false - - /yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - dev: false - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: false - - file:projects/sdk-generation-cli.tgz: - resolution: {integrity: sha512-2XV6h8dg50Ngw8tWShYcSfmWkXnsMOvmZXS7aLpHtNRP0OZWzvGrDL/maD/6Nq4DmOTm3Uk9clQ3XvhJDWcJyQ==, tarball: file:projects/sdk-generation-cli.tgz} - name: '@rush-temp/sdk-generation-cli' - version: 0.0.0 - dependencies: - '@azure/storage-blob': 12.23.0 - '@types/jest': 25.2.3 - '@types/node': 16.18.99 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@4.6.4) - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@4.6.4) - ajv: 6.12.6 - axios: 0.24.0 - command-line-args: 5.2.1 - convict: 6.2.4 - dotenv: 16.4.5 - eslint: 8.57.0 - eslint-config-google: 0.14.0(eslint@8.57.0) - eslint-plugin-import: 2.29.1(eslint@8.57.0) - eslint-plugin-n: 15.7.0(eslint@8.57.0) - eslint-plugin-promise: 6.2.0(eslint@8.57.0) - eslint-plugin-simple-import-sort: 7.0.0(eslint@8.57.0) - jest: 26.6.3(ts-node@10.7.0) - rimraf: 3.0.2 - simple-git: 3.16.1 - ts-jest: 26.5.6(jest@26.6.3)(typescript@4.6.4) - ts-node: 10.7.0(@types/node@16.18.99)(typescript@4.6.4) - typescript: 4.6.4 - winston: 3.7.2 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - bufferutil - - canvas - - debug - - supports-color - - utf-8-validate - dev: false - - file:projects/sdk-generation-lib.tgz: - resolution: {integrity: sha512-hNf4KWdEOnJFE5yRdrbiq8fsoR8/TBheqM+J3Tr/lnc0iQkyyBbx2NMUpyJSWJ89X4PrGVD8AAvUU5VkhT+SqQ==, tarball: file:projects/sdk-generation-lib.tgz} - name: '@rush-temp/sdk-generation-lib' - version: 0.0.0 - dependencies: - '@azure/event-hubs': 5.5.2 - '@azure/storage-blob': 12.23.0 - '@azure/swagger-validation-common': 0.1.2 - '@octokit/auth-app': 2.11.0 - '@octokit/rest': 18.12.0 - '@types/jest': 25.2.3 - '@types/node': 16.18.99 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@4.6.4) - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@4.6.4) - ajv: 6.12.6 - class-validator: 0.14.1 - colors: 1.4.0 - convict: 6.2.4 - copyfiles: 2.4.1 - eslint: 8.57.0 - eslint-config-google: 0.14.0(eslint@8.57.0) - eslint-plugin-import: 2.29.1(eslint@8.57.0) - eslint-plugin-n: 15.7.0(eslint@8.57.0) - eslint-plugin-promise: 6.2.0(eslint@8.57.0) - eslint-plugin-simple-import-sort: 7.0.0(eslint@8.57.0) - hot-shots: 8.5.2 - jest: 26.6.3(ts-node@10.7.0) - jsonc-parser: 3.2.1 - memory-fs: 0.5.0 - mongodb: 3.7.4 - node-yaml: 3.2.0(eslint@8.57.0) - rimraf: 5.0.7 - ts-jest: 26.5.6(jest@26.6.3)(typescript@4.6.4) - ts-node: 10.7.0(@types/node@16.18.99)(typescript@4.6.4) - typeorm: 0.3.20(mongodb@3.7.4)(ts-node@10.7.0) - typescript: 4.6.4 - winston: 3.7.2 - transitivePeerDependencies: - - '@google-cloud/spanner' - - '@sap/hana-client' - - '@swc/core' - - '@swc/wasm' - - aws4 - - better-sqlite3 - - bson-ext - - bufferutil - - canvas - - encoding - - hdb-pool - - ioredis - - kerberos - - mongodb-client-encryption - - mongodb-extjson - - mssql - - mysql2 - - oracledb - - pg - - pg-native - - pg-query-stream - - redis - - snappy - - sql.js - - sqlite3 - - supports-color - - typeorm-aurora-data-api-driver - - utf-8-validate - dev: false diff --git a/tools/sdk-generation-pipeline/common/config/rush/rush-plugins.json b/tools/sdk-generation-pipeline/common/config/rush/rush-plugins.json deleted file mode 100644 index 752e373213c..00000000000 --- a/tools/sdk-generation-pipeline/common/config/rush/rush-plugins.json +++ /dev/null @@ -1,29 +0,0 @@ -/** - * This configuration file manages Rush's plugin feature. - */ -{ - "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/rush-plugins.schema.json", - "plugins": [ - /** - * Each item configures a plugin to be loaded by Rush. - */ - // { - // /** - // * The name of the NPM package that provides the plugin. - // */ - // "packageName": "@scope/my-rush-plugin", - // /** - // * The name of the plugin. This can be found in the "pluginName" - // * field of the "rush-plugin-manifest.json" file in the NPM package folder. - // */ - // "pluginName": "my-plugin-name", - // /** - // * The name of a Rush autoinstaller that will be used for installation, which - // * can be created using "rush init-autoinstaller". Add the plugin's NPM package - // * to the package.json "dependencies" of your autoinstaller, then run - // * "rush update-autoinstaller". - // */ - // "autoinstallerName": "rush-plugins" - // } - ] -} \ No newline at end of file diff --git a/tools/sdk-generation-pipeline/common/config/rush/version-policies.json b/tools/sdk-generation-pipeline/common/config/rush/version-policies.json deleted file mode 100644 index 048aef0fadf..00000000000 --- a/tools/sdk-generation-pipeline/common/config/rush/version-policies.json +++ /dev/null @@ -1,102 +0,0 @@ -/** - * This is configuration file is used for advanced publishing configurations with Rush. - * More documentation is available on the Rush website: https://rushjs.io - */ - -/** - * A list of version policy definitions. A "version policy" is a custom package versioning - * strategy that affects "rush change", "rush version", and "rush publish". The strategy applies - * to a set of projects that are specified using the "versionPolicyName" field in rush.json. - */ -[ - // { - // /** - // * (Required) Indicates the kind of version policy being defined ("lockStepVersion" or "individualVersion"). - // * - // * The "lockStepVersion" mode specifies that the projects will use "lock-step versioning". This - // * strategy is appropriate for a set of packages that act as selectable components of a - // * unified product. The entire set of packages are always published together, and always share - // * the same NPM version number. When the packages depend on other packages in the set, the - // * SemVer range is usually restricted to a single version. - // */ - // "definitionName": "lockStepVersion", - // - // /** - // * (Required) The name that will be used for the "versionPolicyName" field in rush.json. - // * This name is also used command-line parameters such as "--version-policy" - // * and "--to-version-policy". - // */ - // "policyName": "MyBigFramework", - // - // /** - // * (Required) The current version. All packages belonging to the set should have this version - // * in the current branch. When bumping versions, Rush uses this to determine the next version. - // * (The "version" field in package.json is NOT considered.) - // */ - // "version": "1.0.0", - // - // /** - // * (Required) The type of bump that will be performed when publishing the next release. - // * When creating a release branch in Git, this field should be updated according to the - // * type of release. - // * - // * Valid values are: "prerelease", "release", "minor", "patch", "major" - // */ - // "nextBump": "prerelease", - // - // /** - // * (Optional) If specified, all packages in the set share a common CHANGELOG.md file. - // * This file is stored with the specified "main" project, which must be a member of the set. - // * - // * If this field is omitted, then a separate CHANGELOG.md file will be maintained for each - // * package in the set. - // */ - // "mainProject": "my-app", - // - // /** - // * (Optional) If enabled, the "rush change" command will prompt the user for their email address - // * and include it in the JSON change files. If an organization maintains multiple repos, tracking - // * this contact information may be useful for a service that automatically upgrades packages and - // * needs to notify engineers whose change may be responsible for a downstream build break. It might - // * also be useful for crediting contributors. Rush itself does not do anything with the collected - // * email addresses. The default value is "false". - // */ - // // "includeEmailInChangeFile": true - // }, - // - // { - // /** - // * (Required) Indicates the kind of version policy being defined ("lockStepVersion" or "individualVersion"). - // * - // * The "individualVersion" mode specifies that the projects will use "individual versioning". - // * This is the typical NPM model where each package has an independent version number - // * and CHANGELOG.md file. Although a single CI definition is responsible for publishing the - // * packages, they otherwise don't have any special relationship. The version bumping will - // * depend on how developers answer the "rush change" questions for each package that - // * is changed. - // */ - // "definitionName": "individualVersion", - // - // "policyName": "MyRandomLibraries", - // - // /** - // * (Optional) This can be used to enforce that all packages in the set must share a common - // * major version number, e.g. because they are from the same major release branch. - // * It can also be used to discourage people from accidentally making "MAJOR" SemVer changes - // * inappropriately. The minor/patch version parts will be bumped independently according - // * to the types of changes made to each project, according to the "rush change" command. - // */ - // "lockedMajor": 3, - // - // /** - // * (Optional) When publishing is managed by Rush, by default the "rush change" command will - // * request changes for any projects that are modified by a pull request. These change entries - // * will produce a CHANGELOG.md file. If you author your CHANGELOG.md manually or announce updates - // * in some other way, set "exemptFromRushChange" to true to tell "rush change" to ignore the projects - // * belonging to this version policy. - // */ - // "exemptFromRushChange": false, - // - // // "includeEmailInChangeFile": true - // } -] diff --git a/tools/sdk-generation-pipeline/common/git-hooks/commit-msg.sample b/tools/sdk-generation-pipeline/common/git-hooks/commit-msg.sample deleted file mode 100644 index 59cacb80ca1..00000000000 --- a/tools/sdk-generation-pipeline/common/git-hooks/commit-msg.sample +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh -# -# This is an example Git hook for use with Rush. To enable this hook, rename this file -# to "commit-msg" and then run "rush install", which will copy it from common/git-hooks -# to the .git/hooks folder. -# -# TO LEARN MORE ABOUT GIT HOOKS -# -# The Git documentation is here: https://git-scm.com/docs/githooks -# Some helpful resources: https://githooks.com -# -# ABOUT THIS EXAMPLE -# -# The commit-msg hook is called by "git commit" with one argument, the name of the file -# that has the commit message. The hook should exit with non-zero status after issuing -# an appropriate message if it wants to stop the commit. The hook is allowed to edit -# the commit message file. - -# This example enforces that commit message should contain a minimum amount of -# description text. -if [ `cat $1 | wc -w` -lt 3 ]; then - echo "" - echo "Invalid commit message: The message must contain at least 3 words." - exit 1 -fi diff --git a/tools/sdk-generation-pipeline/common/scripts/install-run-rush-pnpm.js b/tools/sdk-generation-pipeline/common/scripts/install-run-rush-pnpm.js deleted file mode 100644 index 5c149955de6..00000000000 --- a/tools/sdk-generation-pipeline/common/scripts/install-run-rush-pnpm.js +++ /dev/null @@ -1,28 +0,0 @@ -// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. -// -// This script is intended for usage in an automated build environment where the Rush command may not have -// been preinstalled, or may have an unpredictable version. This script will automatically install the version of Rush -// specified in the rush.json configuration file (if not already installed), and then pass a command-line to the -// rush-pnpm command. -// -// An example usage would be: -// -// node common/scripts/install-run-rush-pnpm.js pnpm-command -// -// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/ - -/******/ (() => { // webpackBootstrap -/******/ "use strict"; -var __webpack_exports__ = {}; -/*!*****************************************************!*\ - !*** ./lib-esnext/scripts/install-run-rush-pnpm.js ***! - \*****************************************************/ - -// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. -// See the @microsoft/rush package's LICENSE file for license information. -require('./install-run-rush'); -//# sourceMappingURL=install-run-rush-pnpm.js.map -module.exports = __webpack_exports__; -/******/ })() -; -//# sourceMappingURL=install-run-rush-pnpm.js.map \ No newline at end of file diff --git a/tools/sdk-generation-pipeline/common/scripts/install-run-rush.js b/tools/sdk-generation-pipeline/common/scripts/install-run-rush.js deleted file mode 100644 index cada1eded21..00000000000 --- a/tools/sdk-generation-pipeline/common/scripts/install-run-rush.js +++ /dev/null @@ -1,214 +0,0 @@ -// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. -// -// This script is intended for usage in an automated build environment where the Rush command may not have -// been preinstalled, or may have an unpredictable version. This script will automatically install the version of Rush -// specified in the rush.json configuration file (if not already installed), and then pass a command-line to it. -// An example usage would be: -// -// node common/scripts/install-run-rush.js install -// -// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/ - -/******/ (() => { // webpackBootstrap -/******/ "use strict"; -/******/ var __webpack_modules__ = ({ - -/***/ 657147: -/*!*********************!*\ - !*** external "fs" ***! - \*********************/ -/***/ ((module) => { - -module.exports = require("fs"); - -/***/ }), - -/***/ 371017: -/*!***********************!*\ - !*** external "path" ***! - \***********************/ -/***/ ((module) => { - -module.exports = require("path"); - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/compat get default export */ -/******/ (() => { -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = (module) => { -/******/ var getter = module && module.__esModule ? -/******/ () => (module['default']) : -/******/ () => (module); -/******/ __webpack_require__.d(getter, { a: getter }); -/******/ return getter; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. -(() => { -/*!************************************************!*\ - !*** ./lib-esnext/scripts/install-run-rush.js ***! - \************************************************/ -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! path */ 371017); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! fs */ 657147); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_1__); -// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. -// See the @microsoft/rush package's LICENSE file for license information. - - -const { installAndRun, findRushJsonFolder, RUSH_JSON_FILENAME, runWithErrorAndStatusCode } = require('./install-run'); -const PACKAGE_NAME = '@microsoft/rush'; -const RUSH_PREVIEW_VERSION = 'RUSH_PREVIEW_VERSION'; -const INSTALL_RUN_RUSH_LOCKFILE_PATH_VARIABLE = 'INSTALL_RUN_RUSH_LOCKFILE_PATH'; -function _getRushVersion(logger) { - const rushPreviewVersion = process.env[RUSH_PREVIEW_VERSION]; - if (rushPreviewVersion !== undefined) { - logger.info(`Using Rush version from environment variable ${RUSH_PREVIEW_VERSION}=${rushPreviewVersion}`); - return rushPreviewVersion; - } - const rushJsonFolder = findRushJsonFolder(); - const rushJsonPath = path__WEBPACK_IMPORTED_MODULE_0__.join(rushJsonFolder, RUSH_JSON_FILENAME); - try { - const rushJsonContents = fs__WEBPACK_IMPORTED_MODULE_1__.readFileSync(rushJsonPath, 'utf-8'); - // Use a regular expression to parse out the rushVersion value because rush.json supports comments, - // but JSON.parse does not and we don't want to pull in more dependencies than we need to in this script. - const rushJsonMatches = rushJsonContents.match(/\"rushVersion\"\s*\:\s*\"([0-9a-zA-Z.+\-]+)\"/); - return rushJsonMatches[1]; - } - catch (e) { - throw new Error(`Unable to determine the required version of Rush from rush.json (${rushJsonFolder}). ` + - "The 'rushVersion' field is either not assigned in rush.json or was specified " + - 'using an unexpected syntax.'); - } -} -function _getBin(scriptName) { - switch (scriptName.toLowerCase()) { - case 'install-run-rush-pnpm.js': - return 'rush-pnpm'; - case 'install-run-rushx.js': - return 'rushx'; - default: - return 'rush'; - } -} -function _run() { - const [nodePath /* Ex: /bin/node */, scriptPath /* /repo/common/scripts/install-run-rush.js */, ...packageBinArgs /* [build, --to, myproject] */] = process.argv; - // Detect if this script was directly invoked, or if the install-run-rushx script was invokved to select the - // appropriate binary inside the rush package to run - const scriptName = path__WEBPACK_IMPORTED_MODULE_0__.basename(scriptPath); - const bin = _getBin(scriptName); - if (!nodePath || !scriptPath) { - throw new Error('Unexpected exception: could not detect node path or script path'); - } - let commandFound = false; - let logger = { info: console.log, error: console.error }; - for (const arg of packageBinArgs) { - if (arg === '-q' || arg === '--quiet') { - // The -q/--quiet flag is supported by both `rush` and `rushx`, and will suppress - // any normal informational/diagnostic information printed during startup. - // - // To maintain the same user experience, the install-run* scripts pass along this - // flag but also use it to suppress any diagnostic information normally printed - // to stdout. - logger = { - info: () => { }, - error: console.error - }; - } - else if (!arg.startsWith('-') || arg === '-h' || arg === '--help') { - // We either found something that looks like a command (i.e. - doesn't start with a "-"), - // or we found the -h/--help flag, which can be run without a command - commandFound = true; - } - } - if (!commandFound) { - console.log(`Usage: ${scriptName} [args...]`); - if (scriptName === 'install-run-rush-pnpm.js') { - console.log(`Example: ${scriptName} pnpm-command`); - } - else if (scriptName === 'install-run-rush.js') { - console.log(`Example: ${scriptName} build --to myproject`); - } - else { - console.log(`Example: ${scriptName} custom-command`); - } - process.exit(1); - } - runWithErrorAndStatusCode(logger, () => { - const version = _getRushVersion(logger); - logger.info(`The rush.json configuration requests Rush version ${version}`); - const lockFilePath = process.env[INSTALL_RUN_RUSH_LOCKFILE_PATH_VARIABLE]; - if (lockFilePath) { - logger.info(`Found ${INSTALL_RUN_RUSH_LOCKFILE_PATH_VARIABLE}="${lockFilePath}", installing with lockfile.`); - } - return installAndRun(logger, PACKAGE_NAME, version, bin, packageBinArgs, lockFilePath); - }); -} -_run(); -//# sourceMappingURL=install-run-rush.js.map -})(); - -module.exports = __webpack_exports__; -/******/ })() -; -//# sourceMappingURL=install-run-rush.js.map \ No newline at end of file diff --git a/tools/sdk-generation-pipeline/common/scripts/install-run-rushx.js b/tools/sdk-generation-pipeline/common/scripts/install-run-rushx.js deleted file mode 100644 index b05df262bc2..00000000000 --- a/tools/sdk-generation-pipeline/common/scripts/install-run-rushx.js +++ /dev/null @@ -1,28 +0,0 @@ -// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. -// -// This script is intended for usage in an automated build environment where the Rush command may not have -// been preinstalled, or may have an unpredictable version. This script will automatically install the version of Rush -// specified in the rush.json configuration file (if not already installed), and then pass a command-line to the -// rushx command. -// -// An example usage would be: -// -// node common/scripts/install-run-rushx.js custom-command -// -// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/ - -/******/ (() => { // webpackBootstrap -/******/ "use strict"; -var __webpack_exports__ = {}; -/*!*************************************************!*\ - !*** ./lib-esnext/scripts/install-run-rushx.js ***! - \*************************************************/ - -// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. -// See the @microsoft/rush package's LICENSE file for license information. -require('./install-run-rush'); -//# sourceMappingURL=install-run-rushx.js.map -module.exports = __webpack_exports__; -/******/ })() -; -//# sourceMappingURL=install-run-rushx.js.map \ No newline at end of file diff --git a/tools/sdk-generation-pipeline/common/scripts/install-run.js b/tools/sdk-generation-pipeline/common/scripts/install-run.js deleted file mode 100644 index 02a306ff240..00000000000 --- a/tools/sdk-generation-pipeline/common/scripts/install-run.js +++ /dev/null @@ -1,713 +0,0 @@ -// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. -// -// This script is intended for usage in an automated build environment where a Node tool may not have -// been preinstalled, or may have an unpredictable version. This script will automatically install the specified -// version of the specified tool (if not already installed), and then pass a command-line to it. -// An example usage would be: -// -// node common/scripts/install-run.js qrcode@1.2.2 qrcode https://rushjs.io -// -// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/ - -/******/ (() => { // webpackBootstrap -/******/ "use strict"; -/******/ var __webpack_modules__ = ({ - -/***/ 679877: -/*!************************************************!*\ - !*** ./lib-esnext/utilities/npmrcUtilities.js ***! - \************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "isVariableSetInNpmrcFile": () => (/* binding */ isVariableSetInNpmrcFile), -/* harmony export */ "syncNpmrc": () => (/* binding */ syncNpmrc) -/* harmony export */ }); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fs */ 657147); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! path */ 371017); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); -// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. -// See LICENSE in the project root for license information. -// IMPORTANT - do not use any non-built-in libraries in this file - - -/** - * This function reads the content for given .npmrc file path, and also trims - * unusable lines from the .npmrc file. - * - * @returns - * The text of the the .npmrc. - */ -// create a global _combinedNpmrc for cache purpose -const _combinedNpmrcMap = new Map(); -function _trimNpmrcFile(sourceNpmrcPath) { - const combinedNpmrcFromCache = _combinedNpmrcMap.get(sourceNpmrcPath); - if (combinedNpmrcFromCache !== undefined) { - return combinedNpmrcFromCache; - } - let npmrcFileLines = fs__WEBPACK_IMPORTED_MODULE_0__.readFileSync(sourceNpmrcPath).toString().split('\n'); - npmrcFileLines = npmrcFileLines.map((line) => (line || '').trim()); - const resultLines = []; - // This finds environment variable tokens that look like "${VAR_NAME}" - const expansionRegExp = /\$\{([^\}]+)\}/g; - // Comment lines start with "#" or ";" - const commentRegExp = /^\s*[#;]/; - // Trim out lines that reference environment variables that aren't defined - for (let line of npmrcFileLines) { - let lineShouldBeTrimmed = false; - //remove spaces before or after key and value - line = line - .split('=') - .map((line) => line.trim()) - .join('='); - // Ignore comment lines - if (!commentRegExp.test(line)) { - const environmentVariables = line.match(expansionRegExp); - if (environmentVariables) { - for (const token of environmentVariables) { - // Remove the leading "${" and the trailing "}" from the token - const environmentVariableName = token.substring(2, token.length - 1); - // Is the environment variable defined? - if (!process.env[environmentVariableName]) { - // No, so trim this line - lineShouldBeTrimmed = true; - break; - } - } - } - } - if (lineShouldBeTrimmed) { - // Example output: - // "; MISSING ENVIRONMENT VARIABLE: //my-registry.com/npm/:_authToken=${MY_AUTH_TOKEN}" - resultLines.push('; MISSING ENVIRONMENT VARIABLE: ' + line); - } - else { - resultLines.push(line); - } - } - const combinedNpmrc = resultLines.join('\n'); - //save the cache - _combinedNpmrcMap.set(sourceNpmrcPath, combinedNpmrc); - return combinedNpmrc; -} -/** - * As a workaround, copyAndTrimNpmrcFile() copies the .npmrc file to the target folder, and also trims - * unusable lines from the .npmrc file. - * - * Why are we trimming the .npmrc lines? NPM allows environment variables to be specified in - * the .npmrc file to provide different authentication tokens for different registry. - * However, if the environment variable is undefined, it expands to an empty string, which - * produces a valid-looking mapping with an invalid URL that causes an error. Instead, - * we'd prefer to skip that line and continue looking in other places such as the user's - * home directory. - * - * @returns - * The text of the the .npmrc with lines containing undefined variables commented out. - */ -function _copyAndTrimNpmrcFile(logger, sourceNpmrcPath, targetNpmrcPath) { - logger.info(`Transforming ${sourceNpmrcPath}`); // Verbose - logger.info(` --> "${targetNpmrcPath}"`); - const combinedNpmrc = _trimNpmrcFile(sourceNpmrcPath); - fs__WEBPACK_IMPORTED_MODULE_0__.writeFileSync(targetNpmrcPath, combinedNpmrc); - return combinedNpmrc; -} -/** - * syncNpmrc() copies the .npmrc file to the target folder, and also trims unusable lines from the .npmrc file. - * If the source .npmrc file not exist, then syncNpmrc() will delete an .npmrc that is found in the target folder. - * - * IMPORTANT: THIS CODE SHOULD BE KEPT UP TO DATE WITH Utilities._syncNpmrc() - * - * @returns - * The text of the the synced .npmrc, if one exists. If one does not exist, then undefined is returned. - */ -function syncNpmrc(sourceNpmrcFolder, targetNpmrcFolder, useNpmrcPublish, logger = { - info: console.log, - error: console.error -}) { - const sourceNpmrcPath = path__WEBPACK_IMPORTED_MODULE_1__.join(sourceNpmrcFolder, !useNpmrcPublish ? '.npmrc' : '.npmrc-publish'); - const targetNpmrcPath = path__WEBPACK_IMPORTED_MODULE_1__.join(targetNpmrcFolder, '.npmrc'); - try { - if (fs__WEBPACK_IMPORTED_MODULE_0__.existsSync(sourceNpmrcPath)) { - return _copyAndTrimNpmrcFile(logger, sourceNpmrcPath, targetNpmrcPath); - } - else if (fs__WEBPACK_IMPORTED_MODULE_0__.existsSync(targetNpmrcPath)) { - // If the source .npmrc doesn't exist and there is one in the target, delete the one in the target - logger.info(`Deleting ${targetNpmrcPath}`); // Verbose - fs__WEBPACK_IMPORTED_MODULE_0__.unlinkSync(targetNpmrcPath); - } - } - catch (e) { - throw new Error(`Error syncing .npmrc file: ${e}`); - } -} -function isVariableSetInNpmrcFile(sourceNpmrcFolder, variableKey) { - const sourceNpmrcPath = `${sourceNpmrcFolder}/.npmrc`; - //if .npmrc file does not exist, return false directly - if (!fs__WEBPACK_IMPORTED_MODULE_0__.existsSync(sourceNpmrcPath)) { - return false; - } - const trimmedNpmrcFile = _trimNpmrcFile(sourceNpmrcPath); - const variableKeyRegExp = new RegExp(`^${variableKey}=`, 'm'); - return trimmedNpmrcFile.match(variableKeyRegExp) !== null; -} -//# sourceMappingURL=npmrcUtilities.js.map - -/***/ }), - -/***/ 532081: -/*!********************************!*\ - !*** external "child_process" ***! - \********************************/ -/***/ ((module) => { - -module.exports = require("child_process"); - -/***/ }), - -/***/ 657147: -/*!*********************!*\ - !*** external "fs" ***! - \*********************/ -/***/ ((module) => { - -module.exports = require("fs"); - -/***/ }), - -/***/ 822037: -/*!*********************!*\ - !*** external "os" ***! - \*********************/ -/***/ ((module) => { - -module.exports = require("os"); - -/***/ }), - -/***/ 371017: -/*!***********************!*\ - !*** external "path" ***! - \***********************/ -/***/ ((module) => { - -module.exports = require("path"); - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/compat get default export */ -/******/ (() => { -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = (module) => { -/******/ var getter = module && module.__esModule ? -/******/ () => (module['default']) : -/******/ () => (module); -/******/ __webpack_require__.d(getter, { a: getter }); -/******/ return getter; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. -(() => { -/*!*******************************************!*\ - !*** ./lib-esnext/scripts/install-run.js ***! - \*******************************************/ -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "RUSH_JSON_FILENAME": () => (/* binding */ RUSH_JSON_FILENAME), -/* harmony export */ "findRushJsonFolder": () => (/* binding */ findRushJsonFolder), -/* harmony export */ "getNpmPath": () => (/* binding */ getNpmPath), -/* harmony export */ "installAndRun": () => (/* binding */ installAndRun), -/* harmony export */ "runWithErrorAndStatusCode": () => (/* binding */ runWithErrorAndStatusCode) -/* harmony export */ }); -/* harmony import */ var child_process__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! child_process */ 532081); -/* harmony import */ var child_process__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(child_process__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! fs */ 657147); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var os__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! os */ 822037); -/* harmony import */ var os__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(os__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! path */ 371017); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _utilities_npmrcUtilities__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utilities/npmrcUtilities */ 679877); -// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. -// See the @microsoft/rush package's LICENSE file for license information. - - - - - -const RUSH_JSON_FILENAME = 'rush.json'; -const RUSH_TEMP_FOLDER_ENV_VARIABLE_NAME = 'RUSH_TEMP_FOLDER'; -const INSTALL_RUN_LOCKFILE_PATH_VARIABLE = 'INSTALL_RUN_LOCKFILE_PATH'; -const INSTALLED_FLAG_FILENAME = 'installed.flag'; -const NODE_MODULES_FOLDER_NAME = 'node_modules'; -const PACKAGE_JSON_FILENAME = 'package.json'; -/** - * Parse a package specifier (in the form of name\@version) into name and version parts. - */ -function _parsePackageSpecifier(rawPackageSpecifier) { - rawPackageSpecifier = (rawPackageSpecifier || '').trim(); - const separatorIndex = rawPackageSpecifier.lastIndexOf('@'); - let name; - let version = undefined; - if (separatorIndex === 0) { - // The specifier starts with a scope and doesn't have a version specified - name = rawPackageSpecifier; - } - else if (separatorIndex === -1) { - // The specifier doesn't have a version - name = rawPackageSpecifier; - } - else { - name = rawPackageSpecifier.substring(0, separatorIndex); - version = rawPackageSpecifier.substring(separatorIndex + 1); - } - if (!name) { - throw new Error(`Invalid package specifier: ${rawPackageSpecifier}`); - } - return { name, version }; -} -let _npmPath = undefined; -/** - * Get the absolute path to the npm executable - */ -function getNpmPath() { - if (!_npmPath) { - try { - if (os__WEBPACK_IMPORTED_MODULE_2__.platform() === 'win32') { - // We're on Windows - const whereOutput = child_process__WEBPACK_IMPORTED_MODULE_0__.execSync('where npm', { stdio: [] }).toString(); - const lines = whereOutput.split(os__WEBPACK_IMPORTED_MODULE_2__.EOL).filter((line) => !!line); - // take the last result, we are looking for a .cmd command - // see https://github.com/microsoft/rushstack/issues/759 - _npmPath = lines[lines.length - 1]; - } - else { - // We aren't on Windows - assume we're on *NIX or Darwin - _npmPath = child_process__WEBPACK_IMPORTED_MODULE_0__.execSync('command -v npm', { stdio: [] }).toString(); - } - } - catch (e) { - throw new Error(`Unable to determine the path to the NPM tool: ${e}`); - } - _npmPath = _npmPath.trim(); - if (!fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(_npmPath)) { - throw new Error('The NPM executable does not exist'); - } - } - return _npmPath; -} -function _ensureFolder(folderPath) { - if (!fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(folderPath)) { - const parentDir = path__WEBPACK_IMPORTED_MODULE_3__.dirname(folderPath); - _ensureFolder(parentDir); - fs__WEBPACK_IMPORTED_MODULE_1__.mkdirSync(folderPath); - } -} -/** - * Create missing directories under the specified base directory, and return the resolved directory. - * - * Does not support "." or ".." path segments. - * Assumes the baseFolder exists. - */ -function _ensureAndJoinPath(baseFolder, ...pathSegments) { - let joinedPath = baseFolder; - try { - for (let pathSegment of pathSegments) { - pathSegment = pathSegment.replace(/[\\\/]/g, '+'); - joinedPath = path__WEBPACK_IMPORTED_MODULE_3__.join(joinedPath, pathSegment); - if (!fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(joinedPath)) { - fs__WEBPACK_IMPORTED_MODULE_1__.mkdirSync(joinedPath); - } - } - } - catch (e) { - throw new Error(`Error building local installation folder (${path__WEBPACK_IMPORTED_MODULE_3__.join(baseFolder, ...pathSegments)}): ${e}`); - } - return joinedPath; -} -function _getRushTempFolder(rushCommonFolder) { - const rushTempFolder = process.env[RUSH_TEMP_FOLDER_ENV_VARIABLE_NAME]; - if (rushTempFolder !== undefined) { - _ensureFolder(rushTempFolder); - return rushTempFolder; - } - else { - return _ensureAndJoinPath(rushCommonFolder, 'temp'); - } -} -/** - * Compare version strings according to semantic versioning. - * Returns a positive integer if "a" is a later version than "b", - * a negative integer if "b" is later than "a", - * and 0 otherwise. - */ -function _compareVersionStrings(a, b) { - const aParts = a.split(/[.-]/); - const bParts = b.split(/[.-]/); - const numberOfParts = Math.max(aParts.length, bParts.length); - for (let i = 0; i < numberOfParts; i++) { - if (aParts[i] !== bParts[i]) { - return (Number(aParts[i]) || 0) - (Number(bParts[i]) || 0); - } - } - return 0; -} -/** - * Resolve a package specifier to a static version - */ -function _resolvePackageVersion(logger, rushCommonFolder, { name, version }) { - if (!version) { - version = '*'; // If no version is specified, use the latest version - } - if (version.match(/^[a-zA-Z0-9\-\+\.]+$/)) { - // If the version contains only characters that we recognize to be used in static version specifiers, - // pass the version through - return version; - } - else { - // version resolves to - try { - const rushTempFolder = _getRushTempFolder(rushCommonFolder); - const sourceNpmrcFolder = path__WEBPACK_IMPORTED_MODULE_3__.join(rushCommonFolder, 'config', 'rush'); - (0,_utilities_npmrcUtilities__WEBPACK_IMPORTED_MODULE_4__.syncNpmrc)(sourceNpmrcFolder, rushTempFolder, undefined, logger); - const npmPath = getNpmPath(); - // This returns something that looks like: - // ``` - // [ - // "3.0.0", - // "3.0.1", - // ... - // "3.0.20" - // ] - // ``` - // - // if multiple versions match the selector, or - // - // ``` - // "3.0.0" - // ``` - // - // if only a single version matches. - const npmVersionSpawnResult = child_process__WEBPACK_IMPORTED_MODULE_0__.spawnSync(npmPath, ['view', `${name}@${version}`, 'version', '--no-update-notifier', '--json'], { - cwd: rushTempFolder, - stdio: [] - }); - if (npmVersionSpawnResult.status !== 0) { - throw new Error(`"npm view" returned error code ${npmVersionSpawnResult.status}`); - } - const npmViewVersionOutput = npmVersionSpawnResult.stdout.toString(); - const parsedVersionOutput = JSON.parse(npmViewVersionOutput); - const versions = Array.isArray(parsedVersionOutput) - ? parsedVersionOutput - : [parsedVersionOutput]; - let latestVersion = versions[0]; - for (let i = 1; i < versions.length; i++) { - const version = versions[i]; - if (_compareVersionStrings(version, latestVersion) > 0) { - latestVersion = version; - } - } - if (!latestVersion) { - throw new Error('No versions found for the specified version range.'); - } - return latestVersion; - } - catch (e) { - throw new Error(`Unable to resolve version ${version} of package ${name}: ${e}`); - } - } -} -let _rushJsonFolder; -/** - * Find the absolute path to the folder containing rush.json - */ -function findRushJsonFolder() { - if (!_rushJsonFolder) { - let basePath = __dirname; - let tempPath = __dirname; - do { - const testRushJsonPath = path__WEBPACK_IMPORTED_MODULE_3__.join(basePath, RUSH_JSON_FILENAME); - if (fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(testRushJsonPath)) { - _rushJsonFolder = basePath; - break; - } - else { - basePath = tempPath; - } - } while (basePath !== (tempPath = path__WEBPACK_IMPORTED_MODULE_3__.dirname(basePath))); // Exit the loop when we hit the disk root - if (!_rushJsonFolder) { - throw new Error('Unable to find rush.json.'); - } - } - return _rushJsonFolder; -} -/** - * Detects if the package in the specified directory is installed - */ -function _isPackageAlreadyInstalled(packageInstallFolder) { - try { - const flagFilePath = path__WEBPACK_IMPORTED_MODULE_3__.join(packageInstallFolder, INSTALLED_FLAG_FILENAME); - if (!fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(flagFilePath)) { - return false; - } - const fileContents = fs__WEBPACK_IMPORTED_MODULE_1__.readFileSync(flagFilePath).toString(); - return fileContents.trim() === process.version; - } - catch (e) { - return false; - } -} -/** - * Delete a file. Fail silently if it does not exist. - */ -function _deleteFile(file) { - try { - fs__WEBPACK_IMPORTED_MODULE_1__.unlinkSync(file); - } - catch (err) { - if (err.code !== 'ENOENT' && err.code !== 'ENOTDIR') { - throw err; - } - } -} -/** - * Removes the following files and directories under the specified folder path: - * - installed.flag - * - - * - node_modules - */ -function _cleanInstallFolder(rushTempFolder, packageInstallFolder, lockFilePath) { - try { - const flagFile = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, INSTALLED_FLAG_FILENAME); - _deleteFile(flagFile); - const packageLockFile = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, 'package-lock.json'); - if (lockFilePath) { - fs__WEBPACK_IMPORTED_MODULE_1__.copyFileSync(lockFilePath, packageLockFile); - } - else { - // Not running `npm ci`, so need to cleanup - _deleteFile(packageLockFile); - const nodeModulesFolder = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME); - if (fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(nodeModulesFolder)) { - const rushRecyclerFolder = _ensureAndJoinPath(rushTempFolder, 'rush-recycler'); - fs__WEBPACK_IMPORTED_MODULE_1__.renameSync(nodeModulesFolder, path__WEBPACK_IMPORTED_MODULE_3__.join(rushRecyclerFolder, `install-run-${Date.now().toString()}`)); - } - } - } - catch (e) { - throw new Error(`Error cleaning the package install folder (${packageInstallFolder}): ${e}`); - } -} -function _createPackageJson(packageInstallFolder, name, version) { - try { - const packageJsonContents = { - name: 'ci-rush', - version: '0.0.0', - dependencies: { - [name]: version - }, - description: "DON'T WARN", - repository: "DON'T WARN", - license: 'MIT' - }; - const packageJsonPath = path__WEBPACK_IMPORTED_MODULE_3__.join(packageInstallFolder, PACKAGE_JSON_FILENAME); - fs__WEBPACK_IMPORTED_MODULE_1__.writeFileSync(packageJsonPath, JSON.stringify(packageJsonContents, undefined, 2)); - } - catch (e) { - throw new Error(`Unable to create package.json: ${e}`); - } -} -/** - * Run "npm install" in the package install folder. - */ -function _installPackage(logger, packageInstallFolder, name, version, command) { - try { - logger.info(`Installing ${name}...`); - const npmPath = getNpmPath(); - const result = child_process__WEBPACK_IMPORTED_MODULE_0__.spawnSync(npmPath, [command], { - stdio: 'inherit', - cwd: packageInstallFolder, - env: process.env - }); - if (result.status !== 0) { - throw new Error(`"npm ${command}" encountered an error`); - } - logger.info(`Successfully installed ${name}@${version}`); - } - catch (e) { - throw new Error(`Unable to install package: ${e}`); - } -} -/** - * Get the ".bin" path for the package. - */ -function _getBinPath(packageInstallFolder, binName) { - const binFolderPath = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME, '.bin'); - const resolvedBinName = os__WEBPACK_IMPORTED_MODULE_2__.platform() === 'win32' ? `${binName}.cmd` : binName; - return path__WEBPACK_IMPORTED_MODULE_3__.resolve(binFolderPath, resolvedBinName); -} -/** - * Write a flag file to the package's install directory, signifying that the install was successful. - */ -function _writeFlagFile(packageInstallFolder) { - try { - const flagFilePath = path__WEBPACK_IMPORTED_MODULE_3__.join(packageInstallFolder, INSTALLED_FLAG_FILENAME); - fs__WEBPACK_IMPORTED_MODULE_1__.writeFileSync(flagFilePath, process.version); - } - catch (e) { - throw new Error(`Unable to create installed.flag file in ${packageInstallFolder}`); - } -} -function installAndRun(logger, packageName, packageVersion, packageBinName, packageBinArgs, lockFilePath = process.env[INSTALL_RUN_LOCKFILE_PATH_VARIABLE]) { - const rushJsonFolder = findRushJsonFolder(); - const rushCommonFolder = path__WEBPACK_IMPORTED_MODULE_3__.join(rushJsonFolder, 'common'); - const rushTempFolder = _getRushTempFolder(rushCommonFolder); - const packageInstallFolder = _ensureAndJoinPath(rushTempFolder, 'install-run', `${packageName}@${packageVersion}`); - if (!_isPackageAlreadyInstalled(packageInstallFolder)) { - // The package isn't already installed - _cleanInstallFolder(rushTempFolder, packageInstallFolder, lockFilePath); - const sourceNpmrcFolder = path__WEBPACK_IMPORTED_MODULE_3__.join(rushCommonFolder, 'config', 'rush'); - (0,_utilities_npmrcUtilities__WEBPACK_IMPORTED_MODULE_4__.syncNpmrc)(sourceNpmrcFolder, packageInstallFolder, undefined, logger); - _createPackageJson(packageInstallFolder, packageName, packageVersion); - const command = lockFilePath ? 'ci' : 'install'; - _installPackage(logger, packageInstallFolder, packageName, packageVersion, command); - _writeFlagFile(packageInstallFolder); - } - const statusMessage = `Invoking "${packageBinName} ${packageBinArgs.join(' ')}"`; - const statusMessageLine = new Array(statusMessage.length + 1).join('-'); - logger.info('\n' + statusMessage + '\n' + statusMessageLine + '\n'); - const binPath = _getBinPath(packageInstallFolder, packageBinName); - const binFolderPath = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME, '.bin'); - // Windows environment variables are case-insensitive. Instead of using SpawnSyncOptions.env, we need to - // assign via the process.env proxy to ensure that we append to the right PATH key. - const originalEnvPath = process.env.PATH || ''; - let result; - try { - // Node.js on Windows can not spawn a file when the path has a space on it - // unless the path gets wrapped in a cmd friendly way and shell mode is used - const shouldUseShell = binPath.includes(' ') && os__WEBPACK_IMPORTED_MODULE_2__.platform() === 'win32'; - const platformBinPath = shouldUseShell ? `"${binPath}"` : binPath; - process.env.PATH = [binFolderPath, originalEnvPath].join(path__WEBPACK_IMPORTED_MODULE_3__.delimiter); - result = child_process__WEBPACK_IMPORTED_MODULE_0__.spawnSync(platformBinPath, packageBinArgs, { - stdio: 'inherit', - windowsVerbatimArguments: false, - shell: shouldUseShell, - cwd: process.cwd(), - env: process.env - }); - } - finally { - process.env.PATH = originalEnvPath; - } - if (result.status !== null) { - return result.status; - } - else { - throw result.error || new Error('An unknown error occurred.'); - } -} -function runWithErrorAndStatusCode(logger, fn) { - process.exitCode = 1; - try { - const exitCode = fn(); - process.exitCode = exitCode; - } - catch (e) { - logger.error('\n\n' + e.toString() + '\n\n'); - } -} -function _run() { - const [nodePath /* Ex: /bin/node */, scriptPath /* /repo/common/scripts/install-run-rush.js */, rawPackageSpecifier /* qrcode@^1.2.0 */, packageBinName /* qrcode */, ...packageBinArgs /* [-f, myproject/lib] */] = process.argv; - if (!nodePath) { - throw new Error('Unexpected exception: could not detect node path'); - } - if (path__WEBPACK_IMPORTED_MODULE_3__.basename(scriptPath).toLowerCase() !== 'install-run.js') { - // If install-run.js wasn't directly invoked, don't execute the rest of this function. Return control - // to the script that (presumably) imported this file - return; - } - if (process.argv.length < 4) { - console.log('Usage: install-run.js @ [args...]'); - console.log('Example: install-run.js qrcode@1.2.2 qrcode https://rushjs.io'); - process.exit(1); - } - const logger = { info: console.log, error: console.error }; - runWithErrorAndStatusCode(logger, () => { - const rushJsonFolder = findRushJsonFolder(); - const rushCommonFolder = _ensureAndJoinPath(rushJsonFolder, 'common'); - const packageSpecifier = _parsePackageSpecifier(rawPackageSpecifier); - const name = packageSpecifier.name; - const version = _resolvePackageVersion(logger, rushCommonFolder, packageSpecifier); - if (packageSpecifier.version !== version) { - console.log(`Resolved to ${name}@${version}`); - } - return installAndRun(logger, name, version, packageBinName, packageBinArgs); - }); -} -_run(); -//# sourceMappingURL=install-run.js.map -})(); - -module.exports = __webpack_exports__; -/******/ })() -; -//# sourceMappingURL=install-run.js.map \ No newline at end of file diff --git a/tools/sdk-generation-pipeline/documents/deployment/README.md b/tools/sdk-generation-pipeline/documents/deployment/README.md deleted file mode 100644 index 0d6933470ac..00000000000 --- a/tools/sdk-generation-pipeline/documents/deployment/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# engagement-experience - -This is the deployment config of the SDK Release App should update. - -## SDK release app deployment variable to change - -1. environment variable: 'SDK Generation DockerImage', SDK REPO OWNER - -2. environment variable: 'SDK Generation Pipeline DefinitionId', SDK generation pipeline id of **'SDK Generation - Trigger SDK Generation Pipeline'** flow - -3. Dataverse: SDK Owner e-mail address update - -4. Check dataverse table columns length (especially branchName and Url) - -5. Check sdk generation pipeline environment variable - -6. Edit flow **'SDK Scheduled Release'** change Start time early than today to trigger flow - -7. environment variable: 'ApiViewHost', set apiview host address. - -## Test SDK release app in PPE env - -This is the requirement for testing in PPE environment. - -1. environment variable: 'SDK Generation Create ReleaseRequest', don't create ReleaseRequest in test - -2. If don't set 'environment variable', go to 'https://github.com/Azure/sdk-release-request/issues/created_by/@me' close diff --git a/tools/sdk-generation-pipeline/documents/docker/README.md b/tools/sdk-generation-pipeline/documents/docker/README.md deleted file mode 100644 index 0f22e3916c1..00000000000 --- a/tools/sdk-generation-pipeline/documents/docker/README.md +++ /dev/null @@ -1,167 +0,0 @@ -We provide a docker image, which can be used to generate code, run mock test. This docker image can be used for local -development, and running in pipeline. - -This document only describes the usages of docker image, if you want to get more information about the design details of -docker, please go to [design specs of docker image](docker-image-design.md). - -# Prerequisites -Suggest to run the command by using wsl docker if you are using Windows machine because the docker container will request your local file system frequently, and wsl docker is much faster than running it in Windows directly. - -# Docker IMAGE COMMANDS - -The docker image will be used in different scenarios: - -1. Run docker container in local (generate codes and do grow up development). -2. Run docker container in pipeline. - -## RUN DOCKER CONTAINER IN LOCAL - -### RUN DOCKER CONTAINER TO GENERATE CODES AND DO GROW UP DEVELOPMENT - -Command -1. Generate codes with Autorest: - ```shell - docker run -it --privileged -v {local_spec_repo_path}:/spec-repo -v {local_work_folder}:/work-dir -v {local_autorest_config}:/autorest.md sdkgeneration.azurecr.io/sdk-generation:latest --readme={relative_readme} --sdk={sdk_to_generate} - ``` -2. Generate codes with TypeSpec: - ```shell - docker run -it --privileged -v {local_spec_repo_path}:/spec-repo -v {local_work_folder}:/work-dir -v sdkgeneration.azurecr.io/sdk-generation:latest --typespec-project={relative_typespec_project} --sdk={sdk_to_generate} - ``` -Parameter description: - -| Parameter | Description | Example | -|-----------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------| -| { local_spec_repo_path } | Required. It's used to point to the swagger folder. | /home/test/azure-rest-api-specs | -| { local_work_folder} | Required. It's used to point to the work folder, which will store all sdk repositories. If there is no sdk repository in the folder, the docker image will clone it | /home/test/sdk-repos | -| { local_autorest_config } | Optional. When you generate data-plane sdk, and there is no autorest configuration in sdk repository or you want to change the autorest configuration, you can set new autorest config in a file and mount it to the docker container. About the content of file, please refer to [document](https://github.com/Azure/azure-rest-api-specs/blob/dpg-doc/documentation/onboard-dpg-in-sdkautomation/add-autorest-configuration-in-spec-comment.md) | /home/test/autorest.md ([Example file](./autorest-config-file-sample.md)) | -| { relative_readme } | Required. It's used to specify the readme.md file and docker image uses it to generate SDKs. it's the relative path from {path_to_local_spec_repo} | specification/agrifood/resource-manager/readme.md | -| { relative_typespec_project } | Required. It's used to specify the typespec project folder and docker image uses it to generate SDKs. it's the relative path from {path_to_local_spec_repo} | specification/agrifood/resource-manager/readme.md | -| { sdk_to_generate } | Required. It's used to specify which language of sdk you want to generate. Supported value for management sdk: js, java, python, .NET, and go. Supported value for dataplane sdk: js, java, python, and .NET. If you want to generate multi-packages, use comma to separate them. (__Not recommend to generate multi packages in one docker container because the docker will failed when encoutering error in generating one sdk, and the remaining sdk will be generated__) | js,java | - -Example Command: -1. Generate codes with Autorest: - ```shell - docker run -it --privileged -v /home/test/azure-rest-api-specs:/spec-repo -v /home/test/work-dir:/work-dir sdkgeneration.azurecr.io/sdk-generation:latest --readme="specification/agrifood/resource-manager/readme.md" --sdk=js,java - ``` -2. Generate codes with TypeSpec: - ```shell - docker run -it --privileged -v /home/test/azure-rest-api-specs:/spec-repo -v /home/test/work-dir:/work-dir sdkgeneration.azurecr.io/sdk-generation:latest --typespec-project="specification/agrifood/Agrifood" --sdk=js,java - ``` - -After running command, docker container generates SDKs. When SDKs are generated, the docker container doesn't exit, and you can [open your local vscode and connect to docker container](./vscode-connect-docker-container.md) for further grow up development. -If you want to re-run task engine after grow up development or changing swagger, please run command in docker container: -1. Rerun task engine when codes are generated by Autorest: - ```shell - rerun-tasks --readme={relative_readme} --sdk={sdk_to_generate} - ``` -2. Rerun task engine when codes are generated by TypeSpec: - ```shell - rerun-tasks --typespec-project={relative_typespec_project} --sdk={sdk_to_generate} - ``` -rerun-tasks is a script, which invokes task engine to re-run tasks. - -### RUN DOCKER CONTAINER TO DO GROW UP DEVELOPMENT -There are two scenarios here: -1. Service team has generated codes locally by using docker image and has exited the docker container. But they want to do grow up development now. -2. Service team has generated codes by using sdk generation pipeline, and sdk generation pipeline creates a work branch. Service team hope to do grow up based on the work branch. - -Run docker commands to do grow up development: -1. Codes are generated by Autorest: - ```shell - docker run -it --privileged -v {local_spec_repo_path}:/spec-repo -v {local_work_folder}:/work-dir -v {local_autorest_config}:/autorest.md sdkgeneration.azurecr.io/sdk-generation:latest --readme={relative_readme} --spec-link={spec-link} --sdk-work-branch={sdk-work-branch-link} - ``` -2. Codes are generated by TypeSpec: - ```shell - docker run -it --privileged -v {local_spec_repo_path}:/spec-repo -v {local_work_folder}:/work-dir sdkgeneration.azurecr.io/sdk-generation:latest --spec-link={spec-link} --sdk-work-branch={sdk-work-branch-link} - ``` -Parameter description: - -| Parameter | Description | Example | -|---------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------| -| { local_spec_repo_path } | Optional. If you want to change the swagger and re-generate codes, you need to mount the swagger repo. If you only want to do grow up development, no need to mount it. If you input a the link by parameter {spec-link}, docker container helps clone it. | /home/test/azure-rest-api-specs | -| { local_work_folder } | Required. It's used to point to the work folder, which stores all sdk repositories. | /home/test/work-dir | -| { local_autorest_config } | Optional. When you generate data-plane sdk, and there is no autorest configuration in sdk repository or you want to change the autorest configuration, you can set new autorest config in a file and mount it to the docker container. About the content of file, please refer to [document](https://github.com/Azure/azure-rest-api-specs/blob/dpg-doc/documentation/onboard-dpg-in-sdkautomation/add-autorest-configuration-in-spec-comment.md) | /home/test/autorest.md ([Example file](./autorest-config-file-sample.md)) | -| { relative_readme } | Optional. It's used to specify the readme.md file and docker image uses it to start mock server. it's the relative path from {path_to_local_spec_repo}. If not specified, mock server will not start. | specification/agrifood/resource-manager/readme.md | -| { sdk-work-branch-link } | **Only Required in Scenario 2**. It's used to specify the link to sdk work branch generated by sdk generation pipeline, and docker container will use it to clone sdk repo and checkout the work branch. **In scenario 2, please make sure there is no corresponding sdk repo under {local_work_folder}.** | specification/agrifood/resource-manager/readme.md | -| { spec-link } | **Only Required in Scenario 2 and no local repo mounted**. It's used to specify the link to spec repo, which can be PR link, repo Link or branch link. Then docker container will use it to clone spec repo and checkout the properly branch. **In scenario 2, please make sure there is no corresponding spec repo with path '/spec-repo' in docker container.** | specification/agrifood/resource-manager/readme.md | - -Example Command: -Scenario 1: -1. Codes are generated by Autorest: - ```shell - docker run -it --privileged -v /home/test/azure-rest-api-specs:/spec-repo -v /home/test/work-dir:/work-dir sdkgeneration.azurecr.io/sdk-generation:latest --readme="specification/agrifood/resource-manager/readme.md" - ``` -2. Codes are generated by TypeSpec: - ```shell - docker run -it --privileged -v /home/test/azure-rest-api-specs:/spec-repo -v /home/test/work-dir:/work-dir sdkgeneration.azurecr.io/sdk-generation:latest - ``` - -Scenario 2: -1. Codes are generated by Autorest: - ```shell - docker run -it --privileged -v /home/test/work-dir:/work-dir sdkgeneration.azurecr.io/sdk-generation:latest --readme="specification/agrifood/resource-manager/readme.md" --spec-link="https://github.com/Azure/azure-rest-api-specs/pull/19850" --sdk-work-branch="https://github.com/Azure/azure-sdk-for-js/tree/agrifood/dev/branch" - ``` -2. Codes are generated by TypeSpec: - ```shell - docker run -it --privileged -v /home/test/work-dir:/work-dir sdkgeneration.azurecr.io/sdk-generation:latest --spec-link="https://github.com/Azure/azure-rest-api-specs/pull/19850" --sdk-work-branch="https://github.com/Azure/azure-sdk-for-js/tree/agrifood/dev/branch" - ``` - -After running command, docker container generates SDKs. When SDKs are generated, the docker container doesn't exit, and you can [open your local vscode and connect to docker container](./vscode-connect-docker-container.md) for further grow up development. -If you want to re-run task engine after grow up development or changing swagger, please run command in docker container: -1. Rerun task engine when codes are generated by Autorest: - ```shell - rerun-tasks --readme={relative_readme} --sdk={sdk_to_generate} - ``` -2. Rerun task engine when codes are generated by TypeSpec: - ```shell - rerun-tasks --typespec-project={relative_typespec_project} --sdk={sdk_to_generate} - ``` -rerun-tasks is a script, which invokes task engine to re-run tasks. - -## RUN DOCKER CONTAINER IN PIPELINE -The docker image also can be used by SDK Generation Pipeline. Moreover, if the service team wants to integrate the docker image in their CI pipeline, the method of integration is the same here. - -Before running docker command, pipeline must prepare the spec repo and sdk repo. - -Command: -1. Generate codes with Autorest: - ```shell - docker run --privileged -v {spec_repo_path}:/spec-repo -v {sdk_repo_path}:/sdk-repo -v {local_autorest_config}:/autorest.md -v {output_folder_path}:/tmp/output sdkgeneration.azurecr.io/sdk-generation:latest --readme={relative_readme} - ``` -2. Generate codes with TypeSpec: - ```shell - docker run --privileged -v {spec_repo_path}:/spec-repo -v {sdk_repo_path}:/sdk-repo -v {output_folder_path}:/tmp/output sdkgeneration.azurecr.io/sdk-generation:latest --typespec-project={relative_typespec_project} - ``` - -Parameter description: - -| Parameter | Description | Example | -|-----------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------| -| { spec_repo_path } | Required. It's used to point to the swagger folder. | /home/test/azure-rest-api-specs | -| { sdk_repo_path } | Required. It's used to point to the sdk repository. | /home/test/sdk-repos | -| { local_autorest_config } | Optional. When you generate data-plane sdk, and there is no autorest configuration in sdk repository or you want to change the autorest configuration, you can set new autorest config in a file and mount it to the docker container. About the content of file, please refer to [document](https://github.com/Azure/azure-rest-api-specs/blob/dpg-doc/documentation/onboard-dpg-in-sdkautomation/add-autorest-configuration-in-spec-comment.md) | /home/test/autorest.md ([Example file](./autorest-config-file-sample.md)) | -| { relative_readme } | Required. It's used to specify the readme.md file and docker image uses it to generate SDKs. it's the relative path from {path_to_local_spec_repo} | specification/agrifood/resource-manager/readme.md | -| { relative_typespec_project } | Required. It's used to specify the typespec project folder and docker image uses it to generate SDKs. it's the relative path from {path_to_local_spec_repo} | specification/agrifood/resource-manager/readme.md | - -Example Command: -1. Generate codes with Autorest: - ```shell - docker run --privileged -v /home/vsts/work/azure-rest-api-specs:/spec-repo -v /home/vsts/work/azure-sdk-for-js:/sdk-repo -v /home/vsts/work/output:/tmp/output sdkgeneration.azurecr.io/sdk-generation:latest --readme=specification/agrifood/resource-manager/readme.md - ``` -2. Generate codes with TypeSpec: - ```shell - docker run --privileged -v /home/vsts/work/azure-rest-api-specs:/spec-repo -v /home/vsts/work/azure-sdk-for-js:/sdk-repo -v /home/vsts/work/output:/tmp/output sdkgeneration.azurecr.io/sdk-generation:latest --typespec-project="specification/agrifood/Agrifood" - ``` - -After running the command in pipeline, docker will execute tasks automatically. Also, there will be output files generated, which will be used by pipeline's other job, such as upload codes, parsing logs. -The following is the full list of generated files: - -| File Types | Files | Description | Schema/Example | -|-------------|-----------------------------|--------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------| -| Logs | init-task.log | It contains all logs while executing init task. | 2022-03-24 03:35:12 xxxxxxx | -| Logs | generateAndBuild-task.log | It contains all logs while executing generate and build task. | 2022-03-24 03:35:12 xxxxxxx | -| Logs | mockTest-task.log | It contains all logs while executing mock test task. | 2022-03-24 03:35:12 xxxxxxx | -| Outputs | initOutput.json | It contains the output of init task | [InitOutputSchema.json](../task-engine/schema/InitOutputSchema.json) | -| Outputs | generateAndBuildOutput.json | It contains the output of generateAndBuildOutput script, such as the path to generated codes, artifacts and so on. | [GenerateAndBuildOutputSchema.json](../task-engine/schema/GenerateAndBuildOutputSchema.json) | -| Outputs | mockTestOutput.json | It contains the output of mock test task | [TestOutputSchema.json](../task-engine/schema/TestOutputSchema.json) | -| Outputs | taskResults.json | It contains each task execution result | { "init": "success" } | diff --git a/tools/sdk-generation-pipeline/documents/docker/autorest-config-file-sample.md b/tools/sdk-generation-pipeline/documents/docker/autorest-config-file-sample.md deleted file mode 100644 index b5fdcd4ce40..00000000000 --- a/tools/sdk-generation-pipeline/documents/docker/autorest-config-file-sample.md +++ /dev/null @@ -1,6 +0,0 @@ -# azure-sdk-for-js -``` yaml -output-folder: sdk/deviceupdate/iot-device-update-rest -require: - - specification/deviceupdate/data-plane/readme.md -``` diff --git a/tools/sdk-generation-pipeline/documents/docker/build-docker-image.md b/tools/sdk-generation-pipeline/documents/docker/build-docker-image.md deleted file mode 100644 index 0462f5d9bc2..00000000000 --- a/tools/sdk-generation-pipeline/documents/docker/build-docker-image.md +++ /dev/null @@ -1,12 +0,0 @@ -## Rebuild docker In Local -Steps to rebuild the docker image: -1. `cd tools/sdk-generation-pipeline` -2. `rush update` -3. `rush rebuild` -4. `cd packages/sdk-generation-cli` -5. `rushx pack` -6. `cd ../.. # go to tools/sdk-generation-pipeline` -7. `docker build -t sdkgeneration.azurecr.io/sdk-generation:beta-1.0 .` -7. `docker push sdkgeneration.azurecr.io/sdk-generation:beta-1.0` -## Rebuild docker In Pipeline -https://dev.azure.com/azure-sdk/internal/_build?definitionId=5980 diff --git a/tools/sdk-generation-pipeline/documents/docker/docker-image-design.md b/tools/sdk-generation-pipeline/documents/docker/docker-image-design.md deleted file mode 100644 index 2ff2a0c242b..00000000000 --- a/tools/sdk-generation-pipeline/documents/docker/docker-image-design.md +++ /dev/null @@ -1,16 +0,0 @@ -# ARCHITECTURE DIAGRAM -![docker design](docker-image-design.md) - -The core of the docker image is task engine, which contains four tasks: Init Task, Generate and Build Task, Mock Test Task. There is a configuration file in each sdk repository, and it defines which task should be executed. To serve different users/pipeline, we provide different docker commands. Also, after the tasks are executed, there are some outputs, such as generated codes, task execution result, which can be used by following steps in pipeline or service team. - -# TASK ENGINE -There are mainly four tasks defined in task engine: Init Task, Generate and Build Task, Mock Test Task, Live Test Task. Task engine executes these tasks based on a configuration file in sdk repository, and you can find [the schema of configuration file here](../task-engine/schema/CodegenToSdkConfigSchema.json), and [the example](../task-engine/README.md). - -As the docker image will be used in different scenarios, we hope to extract the most common part into the docker image, and the specific parts will be removed. - -About the schemas of input/output of each task, please refer to [schemas](../task-engine/schema). - -# DOCKER IMAGE LAYERS -The docker image will be based on Ubuntu, and it also contains all the development environment for different languages of sdk. So the overall structure of layers is the following: - -![layer](images/docker-image-layers.drawio.png) diff --git a/tools/sdk-generation-pipeline/documents/docker/images/docker-design.drawio.png b/tools/sdk-generation-pipeline/documents/docker/images/docker-design.drawio.png deleted file mode 100644 index b50ad9a310e959720b56864cc3fd363543511493..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71153 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 Cs;WZ( diff --git a/tools/sdk-generation-pipeline/documents/docker/images/docker-image-layers.drawio.png b/tools/sdk-generation-pipeline/documents/docker/images/docker-image-layers.drawio.png deleted file mode 100644 index 0dae8cf81295e1d09213623feded2a0acdbb6f1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22161 zcmeHvc|4Wxy0@gHL84MghAct|5y?z4i_BAoWn89ZA#<9LBAMqXBxA-Fp}{OEWS)}D zL*|+HdKT^T+vm66^M2lQ_C9;R@8|sS`&rNZJkLE`_x;@0_xfJnJAV}=nM3yXor^U^U;+2433YNA`x8UzB0e(aNi>&ZV+}<98)Q?*m05f*Fb^4E`< z*M|6)7Q|J<`%zO=Dx6V$HwUQ!#f3z z7DlFaF5B-DiU`)n+S$RY(u4&piN+wt`)!x)_pbhL?*66!*uSjM|M-QSiEuW;IPHvW z+nkO#*WZK1+Bw;p5GL@ai`4U4`#l|vr}laGri`2 zsT(@AV>0+*bBkcpzinT>?e6};AnL|Wwm7GMzFBy8Mz>=YzTam0qgj5J{n0G^e+R4V ze4c->iky+N(LdiNzsI&?lZ(G?^aq>#e&p|Ml1qPDD4a@Y+&|qUJikrwPcVt#pG>0S zin9RMMA)?diCYTq@BR0mU=%Wk?8XEy@%M5%fc7wwb{IP> zI3Zg*TkuQ(#s2Gl=-+=yzZcOTHkXTkYs3AExBsvBAq4OJJ0nS)mBGyhjMh~I1X4}Rr_k)t(OP}&wETd*v$ef(#g?muP;{(FP*{5HgY zi^2Zvh^6dItO-j`($2;PmLIITtFp*WXa?~OT>R@>kXvvE-TwnD2*&ugK$H+S{UMwu zL{Cuon<)5wy~DWhN{b%U-y$NSCz6#Czj4c8GLGzxlKPr&f{LZY^P|UBJPth_l6Wq6 z_Shjq%CEQ0WD_YBQzS;&)t)oUMxT|wo9Mqc;pizom6LMOBkS3H#hYt-*+1S6XEgLq z=TAH7XT>_UdbPSunU{_i#hXt)KlCZ1#)9HD5eYq!4>41Yk5tyneR1sX+6O3+5-Fy z?58&nfsA3-zN4JGq_XTy0?d(CD3ytV<<}{R20{`JLN4z)@F~zkjyQDa01bfUCE1d#-HVO4a$p*2p+mE_MK8} zaQ~&kTYI51^fT~&1=lVjc!=Vh9(3k=)$vB8GfeSBj1kKyBBH-B7(eMj(@^Afc*!qB z?E3ZV_#qQ2!G!nqakR9^%Wxx^;>oR*k%NrYvp$3&yghrn=BIv5*qbW7a|N@wfX6Ne)w zNj;>eYR(4bGe|xVNSr%@*UmH3UYhEe{25_L{&S$3&Kpxr>k`YM_vTCfk+1X=q_FbI zU$vhP5qnjW?0jXw@9ad*M{>uLar|Or-<3r-OvBhU3uElcI?%_hp34Lk(%8OvzqvZj z)y(_+>f>Bxk(Cz$A!}>X<&%*nfv>5Q1l}{kxAmcvQaB1@0?!)IdHy<8j?_Q?8jLU%^#jcNNg<5Tz zpyKi#&!rxXWVvJM8kx}xQ$1Za>yE>p3%cyedkox0QA;ih-}=H1tuDrhcoyq>%v3Id zecP*O>@bqPh`(iM^RB_%XLznH@;i;)NLNn}pM-mb z*q?F{wTDg%e0gw)W{78W>|1)*$HSr+r?D0X(TE(+g>RZuzmE9n6+4{bvodv`!l!cR z7q^gK9-&vmc;2%18dz+&)Yo3VxxnQPk51x;{&W+7WiAwO|Czgfw-jx|;5N7ZBfs}!N^LQZ3Ya+tGM zALZDUZ?vAeXmK-yMcH{Pto`jmtM1}_v$9a)o6(dQOlQ7j;doX_*886w<_QJ$oF$*a znwkn=g>>7NO!BiZQfB0RzFhBb(O2ea6Jt~8Kr_SFruSorL6>r>*lAp+IYn{u!vU^* z-o`7;%GfH@80H_6dSBNC1WBduz)$yo7S-uB)U05q9`(%ThHkX z--K?mT-XFu?IhCeIvmH3t~;vcuXaAvh)XBGhSp#(eO+bUY2?Ur+$P#{hS%p2cn+Sx z*j>&3-ODpS^v#%db%HtcoGC(I=L=egv{j`je2+4Zcc2e*9T_}hiiKt3L{rMIXY-Ve zZ*1J3ilun7uA;EhioGa}J>>f01)~r53hpGGm(cEbbdtAeuLAMgMv*nG2u^)Hy08m; zGUx}Cf;M%O)@arU1Glt>DBkLYlKwjfFhRnLIqcbQn@SRLHCEITCHAaMl}yJ{jJQ+M z(GrDo=ni4Lm%sbAzIAnExk;&y);uMn=)2dyR^O!uEi{pHmujS0S=96KY|ipz+1eDR z8V4(Ov`Y3E{=!@N@JQ6n7)-8z%=q&l5v$Ad=WHoCXfed1p$%gy44VV&iE8fO?^EkB zzidyP3sN?mg-yRUz_nFai3Q6>XZ2h)9J|VVDdG)0;e zej~DYepmm{Xnx@^QPgE|-7*h+-b{;{a#Y>zx}$RZWTE_;Xy(!AT$zTsZpTI^{a)`a z&r32r+?H>bdfglSgE6vK<_n_ha_UCrh5NiHDZ>VsFvV1%<#ie;?EBJiOsZFAg!@I& zFy3!_51zQ0;I*1oUwly$jiWRp^UDydl0Z)tEFgRETZ>Fb2W(jw89LAW`lR_juZ`7?wAA=9 zIrq+c1r8AyHcd7)wS=dNQNjG$!Y(b>WsYrWE$M0MIoxM=fAyB-`aYh6XxixK{91-H zv!g6W!bWPca?kgajBaLJ304!l(al-Dj=kjV|7u;%vqaTJyVPv~o7@5$TVELOa6`=S zYIZ=){qJ#X*oSFT7o13S3ar%KM-qLz=`xS4l*9gitncF}MPh_8uJ4tC(#*9s)r|wK z2NT|z9uXUSdTcuOSK*7A(JV!DT~VJ`m(AeisPTB#H+P$saD6YR8E(Y41dtb#HhTuk zVcBd_dTU3`ixa-;$M^QO&<64=_cV`iD#xVCIivk!#aQ!HYE@mV+`er<-&|;3@oSN# zZjLy)_sop`JVBN}blf!XIvP8x$Q5Pb*k}LoP^Nifyi$ca_E-q+WO#2%%V{ST7Kf1j z+QU6AtUpv`RpvA_GQ8?madfYEY)=HMjcREpPE{S}GMH!(QXf2eAnb8it!0*RTJ8&S z29v5s4zYc=ejK7!M#odCg&9=pMCG`Kb(mI)hJnQx3I#AJ?K9qq;Dgu0ki` z7nc|czK<)apjqq6n*3v>RJ5N|$Y`hCQ+0_RNPb=Ym}Xc?+)K7*;cAkX;q@roiQu*G zzI5F^336$d_btzIt_=9gHBkzb-e#OpWzKTHlzD)xWa!-WR{1MwcA9c8P+n|BW0fdw zwgypuIu2I=l!KM0gBTDD`2f~!q{@$T2qqgurkdLE$^$@XPfh@=GnRP#96@|LMwvN* zfKy}mzWvGg0wn?Z7UxPld-?KZ zw*%?{O{8|P@-Q~@>n_3#`X`cLM$pEA6Fo7Qi-F4)q$M(P;!@y{C4iaJpu|lv;MtE^*d= zJhQ0t(53GF?p5$`3Up^SuG3tyjpeiJ?e6*ssOuf4L zXWr|*CEeHx+)YZJk9QpI1aSXRM9zEPAT11ITB7Qnqt83R;aHP}@wOuC>{92r6soI( zmz^gpPI0|L0Hkh#RhW93DvB+n-AC**glbs+iwfr>$U=__qIIbaJzj6j)^imC{_Xmb zC^?D1^zzNs`pdYHn}DVqI}8C+>+M|_O-(p%j`iN!D57=z#O?fnj76)+wx`uzH%d>N zQ8QDA4_sW=#C>XmoIMAQYsK)}WXJ@a`Fyq9Yhxnbed={)VP{>33iB!;ejO`j&DJ>t zkmoG`V%DDQESP*hs8BCkq55{@^g3EfupuPEryhi*aha+bbjts$^_SQ)7wHetd%4I5R4g1>1$md+apT z-GM|^0n}WDVB?ObDEZh(KHKhgk(EIz7A%KOzJ2ob4L~rsMlRjLPlL^awIMy;fXtlT zVag_8=mw-ZSBQNkV3p=p#|O_vipd76RcU}x(^V4hKrG-=2vGISd8H5bt=i@tIYu8d zESpm_@L2S)lSrHWqB!w4)*(X;t4O}Z5@3ITtIc52!5LzYTzZ)s(g5? z=K%X*(RKT@x!Kx5vrmymPUEdkjq>yJ3z6I=6EHhmUiiVuqCRJBGfPIz&N)hHv~MnT z{?Gb|n2Lg{k52_(sMtrsBMx623A*Z>0C5^)Do-L$(NdpxpL3t5%NoQ1`r*g?^!nEk z7-Jsqn!;z@`l;tVt>^q#&haL1C+`#-b18L)L(>1v+wJlC| zb-`jAy~nY9>`t0mYH_*u{8t(4()QO`QL$B5W-6$9;$nM~LT`_usSSg>i~~5j^}8XC zv|Jebmgmyv*>=WlgdyU76a5oq*jPLs9(QawNsOu|xZNl%>FJxW3=*hfTKYo9o00?SiNb`F3vuNvscXWepPq7tsF|gHn)GLh z&xz)wCtmyN+rQsa2*Ffm zoJ()iiM`-tVclwxQk+vEUM;v^=DAjEDAAUE;t|A*kBd+TT5P)SygLQ){&5n*7Jl?R z5LY)P155~;l*n5Pp;?Eb@_F;aft&vh7xWIjB<|I~f6ZU-Q?ruWsDmgF_ zcMfp`ZhI@n>QnG6Y}$7a3Jqi7fKX^e(DhcN6gap4O4m*G2lwqFR3k>OL@X^W{WCh^ zgzZf;X_2`4f~%y2j{ToJ>p#Ge|1~{#yHV7bGNxwb;F;99_H76D0rh0TyMz+>$;$f# zvhiQr5&l2n<3CbZbia9xK=D@CNBGV_=ok6;jBsZ!#B&#hBo=6|+{$T)7w)i)T{4d|Ngq0ez8t#8U2n-3GC;FHVnkEOq0T(PfYYje#8=n?Br z!(Sv17dTILYWtGY8pjM5`*llG>zjJ7&-iXEm2VX^@OOO@*<3ae8j3WTcuz`~Z`Kf9 z$={}Ml2aam1ta84u(tWFThBw|KPDhHaQ4d1uHi6v+YbIS#`s7>X!#?xZ6?~rz%}L5 zOW5ugzsk^cWR*;f4Q(PG9C)8eh{%c_U+QfqiXOP4x<(HW{p`x}&(xw7`X+**Vv;_tLL z3q07`1kiDM0m(d#@?51YpD&MR3?x{Vb=j6=QkCMInfA|`Gzu@}(|Ikw2R~=lQ{qz8 ztR&RX;kr7SnrT?>#cxt|&>hH{On@Yde}Ej0i^wjVn-Rrpt`l&aV*(gDJrl3l=iXbJ zi?9`UeHNOYAi3rx_epg9m*mpM{R7mUzynS|AddB9R*1YAp@;QX&(Qj+Q)Fucp{{$U z0w)FjrV84@Z7NV`>fCX`j<)Yor&|Vw<)D8_7Nis5#*H~D(*jevc4n&tTxGEu` zPRulZ_>B8tuncB)uvSToTyT(L=~1pM&@2vUE4M<|xgp!TJrGv6^)nqgAz=SZ-+i*c z_D9&Qy^3@4=EFb&72G{6(oXh@MD-58`RCISyIvL8bhR$_y4wlOed5g&zq{8qa5cLM z0a3C0$Z0RP*cOj6vn;>&p+B((lpgL5vn?eBnHW%LvG2wO{mV#Hlen&@t0q6pLpet` z&s5V*FOQg0#y8c4p`?|J%fY2xHoT*dbw0TH${Fus15X652_Pg9;OF$bMCW(ANZ(|P0HD@m7om*xJ>ynG z7R+x>_M9ghAo7cX=L!l@iMi)`tUY0A+H!VIpaMJJhE0xUDbuV~_*3<~87u#$p(}X( z_}$@n_s?WrmIyp>IhoZ7)Y=#iQ^%2d0FE8NBla|go@Av7-J&!glYb}I=neEW`k|f` z9^3uKA!Y3{U2w>4cB;cuGq_Z0)21{=7WenDp*~~p7`~UT48f^nbIUa_6+2Ik@$BufNvmL`LGz($ z5ymK4+Vl1uW}^*Agy=m8{;V`+MtdbSH>0XeH=0e9?PD+nYsi7ztd^C~qvwngeTqT= z@=^g0bLrcegst`J4b6_AsmdEoH^}6*CG1&PXxv66Pz9HIZ++a*Cr;vdULj4h4xV8O z*hTiQA^K=C%F|(_1*4>jTtXx9${o+9216HKN~JaE62EE?ilYtdQoUr?5lV3_KP*i) z7T5U3;wz&Ib!s+W_!KEhqt2k7QgA~7tpHTrSvOxQ{|HhJB@l!d{}sO;2cB=-d;fIf?E~K6LS4t@sNwcxo&uXKTOP@jH zOtW+xZTYjVe^d2jSX~^YRhZ8=&Bhn}j}2!lLz<+N2F^KWm#w~v@twL}X^2ws&$=g< ztVxzQCBDF)Jf*2NJqQL`6&5btmHx=UTD&aG7e8 zbsb9O@~siu(7iq{0WDmosyqXUWaeF^Gq0ZJOmU%{fhzt%?xjiLLE-llm=u&E2C(!` z$}e##Qyl7n>iFveDMctX!vWT|eYEubvXHJNk-oIe!-xWe->iIeaywni0_j?+qdnV9 z)D~=`E7ZJZ+hk5WtUP5E+;+Nl9mx$Fev0HKVCh?c_pgY5JwyQNvq8WWd2^do5y1U_ z)R=^PPS0;Gz<+DQ|JlZBifddyhu9JZM&#qfsB+`RjVVXUkBHD9)e+x1vK=i^)G&Zi z$@kn%+YX2FA-=J2HQqK4)(^}h`Tiywp%w}b;CFQ5wYIH#8VLneE=2ApSXBywu7Gfs z*6qpgg~<>+dN75U5PE$Dizof`=i8n`2IAL#v5%UzqcCCz%3muo3dTrw{|D|&7oiX)@om)$G07%&&=N-$;9E zxw{MUc#{ZPvd+R+dG-?T?emyZoN;r9j98}2bT1)23lOS(v`I7wJ~-|@*@L8$zI0v} zJij0u6T(OV6qde>%?i*1P?_PrH0Av3J!u3RHjSof^$r>TRU1Ei@BD!J<5PSJ<7XAD zJ93i|ZiMsguMa$~;e}HgS$d=Qp2>x=g!GPh~ zCLljnz^ay_1%R>5vg}G|IV{6SW6e%WRY{;Z>Y0_}F?Mff9w5x1b1f>O9ny>4q0Yzc^>lI8`VPR#qfw@M)`U0b%XsM}@n{P6^&1|6e}Ue$1D=Tkj!a^d#qip#m(YU#Evk1oq)AR%2Fq^y2BjC z-!XbG@Mf0ZCBOW##VMB4`Eoy!+%Lq9sxD}{@bg#%`-0UBOR@tV@FQtm1h8Xj7 z&FsRxhfWD3wtAz^u-RC8u|>$;WKoJ8;s4k_O!;|rVZ0>7rCmWODam!T!uu0<^_xS6 zX!f|eqApt@mO)A#vdHxoGQ$r?LfH#g<6U}PD^bD?k^|?0gDukTWtgLulOOZibY2{e z7(n?v?T3(S3JFkIoG~Q!RjeE#YW!(hhM*JS41bu8*~7sXB7Z+c zGWyM!7%I5=`}Kt9-#_}6e5B!sLcY?0c-y?-NE`gm@TnKC4r$UYKEtIQREl|^G*oPU z3*dAQGXsOrk4LWbiG*_t zZme{^Nxr8lQ&Ax)-5CPV62VQFNhiatal@De&XIv{Bj!e@!w=>vW z;X8~zzssf4dgxP>k{F~s*SpLUJTv4YI6p5Dm~r*S`^WGtPN@^=klkL)j+7l~Vfv+G z{)))YS70pXS@>tWuoKPP9P)#vY9dyXmT{I-r_|Jm!kC)A4D$-Ig@;?HBE%J}8y9OIvz*-cEcoIX&s{0e+-djH&E4|AXf0=gl z#jtvk8h?_akVSn2mkaUP*Eb4ZK247vqVmv>uSsUtlp8cP`TpVlXS1<3%HwF1o4B+w zhmpo!$ccoW^b1m2?0l=9doUXOL^J-a~AfgGvJ5Ni++?gRCfB{ELU^ z&#?V401|o1e006F5iF-Xs45yxY3jdb=)Lh%u6R^R34V$^E1vCln?1*F+(>Gwy^)G8%}K&O4;#MWC1^}|GJvSbG)3zhlhG&#qypdJok>R>La^qxZBChTE+UbQhOLdfJ+*PN;%&(i6Q>RCR zqU)p((T?G`l45eP(Z>gPRlO&*X&EVM*;99gW$C#PRN55zL2HmG$Z#RprkB2Ua}HTJDX_t-Vs6DgpQphFK$!~XCSu%`zxq# z9y1TiW;%ZPXTV*9L2XEwJb4jdemS^VKUL1Y?t#;EcqbDH!V#6s-Ehu2Z^(r?7qWN^ z-_#lxRFifi%i%_+27hY7i{1AOaI7bXab9-0wajR<@5Q<;afY?tFZIXO=2{~uFVo5~ z6&fR(b`}FxN3>3LAt|gvBg)CrT5epbaooO2^dMbxO2l)sBlt*Swb`XGobU0s#2iP| z)N1AL99>s>%CGIOtWwsZ8$`)c`jR5_@r?&90cY8!(-M?cRxk5~G}AsXz&4>DU&qI(+0CKWgI9~Fo&J^1ObXJ4(|Sv+?{utEHF)AX;=czNxo= z^UHpEABY1>D6R>BNB(|*XbH)mALW6x%#-HNOTlj(GWU#K#g|c;?6HQvavkPrSh8ZCZ&m0WBJ=f6oW3S1>#y3|#2Pts2qA9ay zE{IT-BnP#){PZFfYg|h2y*`OH>|0^LURQ0* z$=rGO03)?oz^p!(5$0+~n~Rs9UT6z1hF#&w5kaZI1?Xi*l1H2TiJ0q)3vqN1*DoCG z+D~OFMILNYN{=-vJlD5CS!EXL={f9MBP}cZkR#=k-%lD-;+RgAv)8YIx2?$f2_$JlPzdjU)P$+-hfz0{Z63Hjp*B+cBK zsVnp0>;+0{>XlVUWE@??gYLBx9ieXqN(9%axrB?BPa&GJ)yOkbq`8cH*$~P75d;>r zX^kRP0|NuR&b1W9dH7uj49*Y@g? zo<;gB;nxki97Prtj(14%%SH=;>I+)?ce`wCN4)UO!xI|Zm!uO zltRw~Ef9-4?Hlb3x<`hMY`F4iFn`ASY%wUNCqX>#!1Cp3R5ygvcEWD+IiSLCuxiV) z0ikZBI%FaiyB(Evi*addD(qeUuPQ51>VtRiR%%&VuaoMhHkW@KE@EyOjNlPQGe0cf z6uJ412odyRKwV-hY#}@e+Id^vw$A0{A3;5Pw;*jJD1xYH;yh++7a>205GxbFkK`i? z2%A;O2M1ZzwB$`rQb#QK>(XOk2^Jwo6w0Frr?MOAu#n18Te)5pTFy%Ub_{hp`(tt)}9Yk>^2r_%YxF z>}kqdLokT!DKJJrIfkF(MvX_Ck6pRS-PF<8=vvt?KgSV9N`}@c^xMnpXCE@ufj%?a zt{h8x{_A%T*cW_`6N(`b)>m8M?^$h!-0(;8(Ql%h-lcn&Mh1mMdGOeqDG$35Xw82i zuG5LJZRo}HXnrzg5MpC{^!Yd`^}46;Ha6F$3u~EU-dsQ9Ie*=~--i@4P~m@u;e5G# zB)yEQpKP4Ayb(ghKD{#E{Yx-1Ko% zt-7%SOZIwDa2qE!g+{NAlaB#6kppB%Bl`BkbR8r*OO#`A?KnIofFwb!d*9-b+~rTM zr=e%?IRF39;O8t;;~3c+?vr7=8B-OtT=pU9sroVEV70U?Jopw!3>i%pk_JQ}g*GkTQfVG2 zh5#z_`tz%{KUy2r&6-O6l-hl2Mma9T<-_Kx+~w4!-?OJ!=|$%qj5BzF<<(m1 z1@X`KYW(llSzY#Y0lIBQMO)MNE{LYG3v3T0>P3yUymg)H-pG(rN_C{QZILs>LSUmb z-uX$DS1?mBjLRuV`y5EM3Z~kjaV{6%G&Wxkjm4yc>L21e2bX|Z8<=AIVb!sDdekv# zcSzk=-_zKdQ?_!01$`qqA-0~OrpJ%57;;{JOx+rYOdO>tk{w&}X_DV1y0xCiPQ^N| zvX~g5fQ#;hym3$0z2X4X4n?{aIF|6Kr~YMvlp>33Toa2zWIw+U#~|-#fsdY%1+~&& zKadE@1*>%wKn6A?V$U6H@@9I9YU~vC{OmoCR{t9=4#r88k2u><^L48?vRc@iigowP z;qaf5^Qo2PKD%sfEV-1i-#zR#DHYQUGQy#IuLiRzNDRlxl}YdQf7bM6?I~xaX%RL| z^y`N2aneh@AM^+~QXklb@YLZrIw$y?Izh%aETyPPjBt|$n2sg`U`h)NYW$4jNceLX z1mzaQxln187lGLln*So%vrFvQ5!w?A;|e+lMq7Pf?Qyth$m#HC(xe%IYOEK-@T0b3 zkcQJ$32ZumTJ5)V)EsjD@%U2lCqq^=M-7}oVxzJ4%tX6!=p?(o*ft?}g7JGS+h8KQL1U?674$iaha+4MFzJaZ;ta8&Xe^eP^$XVs3KNN}}@x#Ho z5hKGjyhe8()l{-$1#_9|V)u^k2|kdg9_X%9hJg-6cMvj+RIO{eta zf&}#XDb2WkX>%D(NOxQchTCFDE*9eSDMXchiT~5KoUt{8h_NW1$n`WKXNrZRzY!&` zjm!wix*SNg;ulD2eh{vnl)zQ@<3qgLIl={|+clXiVrRBh`rV+B{Ar7cLRGuRCJ1xJP z(4)VXR?|mIO6jU4p)n#K0W#A`!z(izmnsMTkeKvvVlGtpEMs(lT9j}o`nFgs^h#jV zn1;}kTsaU2vw7{^9f0z-fb&YKsG!egme2)1bsTRoH1Z-PpHEW=7^d_AG3W9K?7RW zu59cljD-R$&8bwpqt48LmUAB_yx%?op#;^(;$9yjbV?g02z^ZS?sgsjJp;Q%xeqzT zy1F=N4HCTGQ&WZ3ZJ$9WVvWEy$b>Zj+OdIjCu>TwSEWWW^iVIN7Z7}%N^ z_dwye56170nN5}h{Jj#-NI(&c+T{~Tw){}9F<#iF!tY3-apnGT(7rp3HdP`L^SWh_ zHjbM`tuBDRc@oaC=9h16b|GT!c=xfi)CmxL6+vdT0}`?pyZ0W0+_ zN{jWewJ7B1ZV4oZGvQnvKX&k1L~YnnJ}FMJbaJ}gu+FV_5pz@hI)*2sVr~~Fr5!YD z2GM58z(e-#IGthzCC1c}B0yXv<_`{@H0Cw`oKH&UK@l7vm=f7Y2lKmG@i1zL)yLsS zRR^5DHU-tE&d0kDjSF!%^+Xw5`PyjRmNmH=3pwr-_X3dQr7HxhtzhRzzD}L=H~7UD zr5De6JcU*e77_NviF@y&Nm3MJhNP@#1}fpeLGl0{Kc@W)a=;o%F;d}?tU2Ir(WN;= zfa#8h^9@lIDoa*YR4hvQi2k(aYw|-KZN^l0Jm~p4etrKK2SQf2b~pp^aC*d#nq+?z zD6eb2Ru;w5=KyTie1HMv>%wSr^?V}DMT;lGkb7T*ndw5ZSW;PV0xfIs4J0^SSW-*y z5F3^l?$OG(2u9Mnt*=dFK$9njXDouLYX=}^h8*jzpT~)&4kJ;ji*l;y`+#$TyZmLv z=$XM(3OBhA_}n0NTe}_=HT4A!!N>L^hn*3wpjh_ZyhP2*>(4QxP02{8s0C+odm6Le z&dNpnWKFm3%uhq8iPBJ24Q3YZ$-eS(cd}$SUX7eu)x~3z-NmI%I1S6XI}*j8eSy#O z{u!fnWS4w$6WYCVH)tIBR`Lk0fHvD!yDWQ65QS0-Q9!RB)GfV;O_1OcXxMp_u)+Popb-+A2ZYY zneN)vy?0etty&!-FDr%wj|&d~0FWfag%tq+C_hNM`141|Hz74pAM*3zr=pl3pkf^V z2y*esOh85e0H}^acr}2AT*KLmYy1QNkbC}qJ`C6u83O=vFcQK7%5J)6YY5utdtkoH zt&$pQ+F?t0c*E_88Wmce^2I143cATlMa{+SfKxNe&l-eOwTJen!EQsqKwQtdQ#ER_ z?AyE`rKWuH=3@2G;;bC9WNjxD_22J5)7F;oXsgtoJM=m%O6Gv5iFo(}v$9PvOx{`H|D<~+|T~jZ#RZe0n8o5}bwkWBzC~6zs z|93lp>fBT;C48!Gd!R??i{~9-;73YH&}l$};8I=oHj`w2YEA8fEe2bOT@BX10sJpc z{-nqIdpqCGH>fDPxhT7vYGzu*sp%@(lYy0|v}vFIbzAPOk1HxP7C)H0S{KM&)_Yje zl({>8E``3!rV`baa1uxUThiu_E)sqEG@EcucdfaH*9F z=m+JeiYuV|CT-VRnk8W{1l@1%&sOLHr(U?4C$4XzU9Jv|Uv$c>wv}D+TvS6o&C&U$8K-ot+))w&n53$=vb&I6At}y93D8 z?4{p2UMvn+9`qd^V9xwSPfw5a&}&tMr!`9M-rc^X{35uKlg%#1Ro=f)@7xpg4XR>`l4$f4Tt?xcuC3Ra;aR zL*wCozqlZm^VtQzyo#(hNyZ%PO*MN~g1dC+FLE|#yO zS83RKa|aO7J=s(UU!2BVD;#AHg(PM%XoRU;T_2X0HCYXZb22l(t>1%<$TDry7yU-m zgdnedT}&J}f{cxU2n1UY0`l3YFA+p?dkEui{pIrM3^{GLjU`_U8GkYAeGdaYLAAD6 z7d7Rz9(!N|%M|D6G~k*d?;C1N(oFh-0rL!NCo7|{*2!wtlyXvnE+svklGSPIUfy-m zE*gpbQeCrT6(tRot%vpLEyu-Pvn89tLPWNB7#_pfc30pjLis{K7zSX|d^}m0hfL@- zQ*&+aw}tg;Up9e2tDj3~1XuBMjW3;6!!|H&I*}o9LLuG2LWqUiv87a4fr2Dd(%r@b zn}%CPV{2U|Y;S^_M6b$CV|p9fVS*d2(QW4U_OQn@C*aIDs3V)4!?GRlE3&IOwkRzr z%6!&(V?b@Xb7;vRYfXTQ43{G~W&y9r5}-42b>BFpW0g7tPo!bFY4YOP(3gvZa+ z`^y|8>-GHwWB`D`7j3P2m;QL^imB+gsI&WAm&*9B+%fmqY6C zc3YV%(^Z6g&X(^H(s9jA5C(9?(CY?SOXoYVQqE8G=ZokTTdTjT(p4#Qj;mb+$ohU{ zW*`XmIp(b2)kKH$b?BI`p_z*2yFpJN#m6E26eb&izbzEt zy#NW<`76u^clK)uMN@=gU0TfAZ#RUxb&T0Tj^|pSTmy6olTI`G`!c7=|m!=hCV$$J)$N8KR4ZpFV|X)~l#! zVOC?OUm+gykH)buSCHs4PjidWfc&Sktc|z}XF~3f2(DTRK~n3YvRhbI|INrKyNM{= z?t#yFVS1a38l|j-W4OKKht0sH{)Ae>Be7|??LDk(;qB!;g&cwF#*MGi4__q$rL`Lz zQo_TpgcU;4_;N~T)*a8c_V%zSGh!dN_IoKuT9G!%yp!2Qh7BpVx5#4sWvurMX~~~& z^l^na#-4goF#9J3YNyeOrXq~{e4PZy(0;t1jae}FETTghx<7N>ZV<%_sFA)B@%5!ODBjXEU4_Fu|wTrxH{yiY;=F{QA^_q zp;Vs7Mt5af_X;+ND#;5yoetZa=(#7SUG;vhxTL`sQlQ00?R`STzxj^Cc>UHwMyj2Y zO+-KMbaxgNnCVTNPV>qZnQiVS&NoisG~1&M)B}}Da#Fb79`kJIQI6Gu+x2w>o`9v!{(lp%d%H_rk&7RqwK$;c z?OfAeCZE&PupX|ApPlrS@*fBs-{)U6@!VDi<8kcHX%ZarQ4 zo*we7iC`%dAY0Z3oL!43LAHvsyS`?lgT%O#Tzey_A^6q(QEz(~iO7ULZVGowQe~g3 z^-2Ak&Li#Fqk8dj+kX~Ha&17o3opg!vA-UWn0hbghyEYaW@3AftUj#6}f?vEPm6LlG1VE?{?cU!^Hd8$?pU zq1hi@%F97I)`iO5=lcz--29lI%eJ`2cgGev-CEhOyA4|vW;#p(6NjxCd$Zr25GoW9 zP#C#qEvXqT!zPB#JJsE0!tq{FhN`AxutXA<$G|h-k)T?_N;ayIDbN5^IyP)>uzw{? zVcnoCb$55@<0xHx#TmggxBG#B|7vy(R6(W>&85|bx0M-rijkd)_v!qZ?}f~X+3GNa zzHg(Ka?5B%{QwWY6D4+|xr&&FbPz>p9Sz#oTrUuDs1D{<8Ipj#Ef}ghy(q_M8aOk3JXe7`dpA6c-ZXd@8`x)CK?xuXWKT(D`J(~!Ns=5 zRWBDCYbPjwkZx|oQ|D4%w8s8`ykbqCPPv!ZFFE3s@I15Zp9))&UwH1@2kt)eGw)!x zm|~|cQCP$UU3_;sk9N;&rJ#4kg5CKI#^Qd6xdQHEQ-|4$@TgD z1(&>KSn0*F?xw^wbCNgcdcjD`v7RCR{P_un;QIJj4px|1v}U-<>V0UCnph~Dlfn4{ zrv+bO(l09dw`p*J*d&=s=A-gA?da#397U$hIZysDscOchye*cX5(GZ1cn;M(b=TxI zo_RH_le*!KA^Ag(pCv!x>8pwFzsz17>yI-A_z=kmXK0PiF9z@t(pk7OFFS$l=Sm*1 zY=&D4GCCE<2#cw3o<@Z=jg@cYyxGnUr^2)kvE%PE38tfzEgi)wH+G-jOr%xzS5@5V zIx8nK_8m#a%g~xC4@dDIyq{#~4;gAUm=9v~mpg;x#x5S$Hte*eyZ2U`?Q|Z_JZ_#D zZ!)Ma(7`Xv&&PWuT>DmXS}gABx#q%esTn_x5bz{fo!19`gm6S<&`iR95S!+e+a4a* z@X)8KPJj_5&-}vd6A`ZSOPtQSG=;%J|FVj$)btgnO6|3Gz;)$A%2}n-uz*{9BIvS zD~c(M|6e{7_t+e9J0F63Zm5b@iIm(7x_Ggj@+C?_%)RNG@(4Wv+PK6XdaZ>|JIu_7 zo4nt&(oZ}!={Db^Iui<8*@Kaj(NheoI+Ka}YSItR^1YMIe+u?FvC3F%bq@WSOqlV) zYbTwo`mL+uq1)+J^25fBKECLJgs~Q@pe-%4<0^N8_vy4&r@+pUX~K8ReB`Mo!Mjqv zMxez0{o!;Wd_(AlZ@J#+rWL`65S4sd^~q;#DlI#gFq5%~VuS7WrdEw(RXQq&$j1cH zqK1NDbFz5D5PX>v(TyGYwy{K`J=RCmF`(f%N>lS6x3u0jLLZYiJ&(-S2YTM%ZL&?R z(~)4jUePHsG>94ewNEls$o&-vt99b%WtUk1=O^#8K}L z*A0VuD4O;q>pJp;oeH4DMx-L`G^NjV=3}8Oh2$!A;2HwBFRtzd3SvhbAH=Utd)gTjRi8V(VXR<3T(1Cq^e1$#Io{S#F+%;^t2Nz}9z zA9jQ?buwDJ&IccGzpwfZ;^GX#KUAcuAfG5Ct{V!G*EIn1J}5kvxw@V%Hc9i6Npg~s z=2e2!u)5w96Rj-%zUt<-@wi|_s$maiXE_D3H>lG`(MHNAJRnXUGB*DW5^0V-Stz5}_{kcYNZ@|cc1tz*&HIuE^HD{P=m9ACewQYQ$~FzJKr z7K+v@Zxrd-5;s)H9zeGmkLgTA*iAr_RD)?V)rQ1HzGWMFOvKjL9w%0ilK)^&)P9|+?*U7ShMRJz z;kTuMX()%V#<~u;BsAziBy>EmMb2}ml-V88mlB5kvx(gvi9&$P)HugTeTIz;+So>w z5i$L0Ye49M>i%R1CpmIlGwOVTaXmGZYgyhXPlXiv&AsW9JvWz{P6@Sq2KY+YVQH=# zLFv(q596SheCpcfiAr|NHc(}p=mVd{?avvI7pb%$D`By+4XO({V_$3`J4bEkJa^wv z<|dUa;1_GHYX)Vnd|Y~2N{9K(GxxI0B#oP)Ah)Mmbi)UoS-U&~yb>hzHRBXPrg&i% zZ?u;yn+G*5uXSk@J?~{J{uQu&aZBAHdPjoTg4W~!5u3VTsq>Hg1L=Vp)-?9OwP4*k&#moQnb35SfB-CNju@=7Tq}`zULdtf zb6O%paG2)}U_+B3gCzm+Rbh^U5|Q(NSz?6*`Uce(##uyV+O>hsV_Mf4&_;Z*u?EX- z$ftYxp;bW_G|8x#i7~5h8ufZdNfhcL<{Nwz*A~gBBKgv0jScY_-lbNp3>C&p6Dw@u zRqpvg3{~E6Y0>O4t1L!eo^VIyf55xx|5) z*hGx$yf#bi`_V^%9Q}KqW`C!tu_(&^NN0$IljB_Xjer#jlhrfN;n|MiB%O~q2Fx{Q z*06gcXS}I-tUNip+nrt97ooP6uY-AtRE||c3CJ2dO%-m9)B!No;Sg?vbq3mcMe$`4 zvPW{zum&YiSKCjp`7EYO#!eJ5$0OZ$yDl%`X7(qfwCk^O$A%KudW^DZv|PL=2#l4ASZBO)HLdW zT-sMc@Fv849x!NUcDRe-W)3~ia+G37g102JAEHA-h)jU@OJaC4GaFJHRqg|3tuEH; z?2NrpKVFCihiB%`=tg_-LWoN0znl0G(*<(-!tYH&5!Fu)+GSQ)cayhg1Sh5^XZpTB zpJsTpOw(^olxqcsnRM6nKDgw`m@4%@$o%1B9rWIYA! z6WGS1-_r`GE`xfY>zl5)Xz)%qM0FSZ7e+)O_|@HMlCU>n@;(7eY6O6}?L~xr3{+n6&+UyjD!9Ry(+dMV`iflCM&#N*^be zf{lSfjDq9xp&r*+S5)!%yw=y|_WJq+50&XVsr(~sL=jCW+robJ!9-j{@0YpISeR*- zr`CLTs||E+^5QucjL*X`bT|n}>%Z1smTEOPDt)3h4c#pgt+QM;I!cmd>!~5{&*KH( zkl}Vxx!{FPvwb41zjCbQa6HJ`^2knOZhpSSyqD$(#TSLUEVHsMXBE?$x#r|bH*Er$9pNQuE{>@aSzPB#u#{mN zs5RfjokofgTq_`U{!?nbc)G@Nt)xC6FsGzpc6P%~Grh_Yfm)|4J@vRIr;UyV4b$#f zm%+I)(L>F$-$!T3-j#;Nr|(^@LiaXPzono>`A))e+9Ox1w=DPVKWFZ<*R>h`>=alSvI=i{1Rr~ecd9B(eCUp+!2{(-r)09?xHGIH~c-6<%*A`QGQgtqIXhWC_Y9 zi?w@xDQ!)j_yK=D@lWGJO6z1{??AbGn@hRsO+u#!tB+aFDnv3^|sAc+b9{30t${|kP$Ag1(+mJQhAC=V`O7kMrK z+$P)00|EmDeQMw-B_KCTta3y>W4#9|=o^yEZ$?8NhO#?)iHHr-bzD8a1Vs5N|9l{D z5cM2___hbu#JC9I-1Ze^G3a_9_PxWgERdm_Og?D=Q#*^vU02z&??YwH>+0{}c4 z)$AusA3)IBBJXr+$T|uU-kqDZ7S_SIzq$ke9R3;?GJ8lyG(cxxM0hI=3aT-XYI=SJ z04@iN$4HOoJhAaCLAw+$Tv{*~HQ%H9#ci(fOX>Z}*OAyn>UOWaM5TV(+Mc;WxN?(k@Dghv77-<138NMHJr8O(YW7wed5p}6 zyYCtR84{IgJkP#aJKjKosZE)F^X3$PcG46+exAB+AV7y<@Ak(gZRvL6mb zHf286@2x#BbG6lp&AYFs%-f6y??eth0`rsmfI@ET;G_%nNo_cq9&Dt$Q(^e#^jIWn9f8;ubNq6 zY;^yhR_1^0321nDcu57ldS~}<-Gr^T7h%M+uHV+$E# z68CasA|rGvV}&ooLyQ>?qt$WHM*AtBmW5jitE)LoP(om`m3TFlS7&I5m2z&A0@+Bo zxEKX5WGDms?VT{HIkdyud%QcJf3M?Xse?xQwYEcV#0p4-eAUA;Dsgj#rano57#0>qj3u56sAXu2fRNS950K za<=h#3#KsC3eJi7jat$4Jq+>S081sT7izEyGc;SOJ9OTx=vGpNkg!bkOexx+Z~ddQ zc+-C^Sy@LLs|x%a^<{a<5&C~8*Idm(W}W`E!dK~3$pJ;_H01;fsU-|ZB7R)({vfCdRh! zxx`E{GU1STzHD%_RK$S*uQZfqJVZt@T1}-fZ(6^C9czL?t3ycZA(wtISjy-^NUy&x zM}-Zgoh`M}i*6`HC$wYCgep|n!j)6Pd#9jCO^$OE(>5CpjU1oTDLA5T)XdBAIV^jD zccbZEkIxf2$eE6&rGSgNW})Hj;xi~P)e0KaUJK4T%EULW?Fk+9*_xyp7b5G?MeVLV z3f1h?zuOQ$K*xuMx@~{j7T!Yr>?j@3N2pTGOP|0~(xqQ#Qcfdr5r`zG%l_u3GfqgrWMm(Oe^*r8fS;}&s7~1-uZ}vjs6x&fi)O zF<4s%{6%)5p|F&0!i0#Q&I6mqk}B7keT^tLX44epy9!*ALJ_Xec>@!xIX=;iU)M9n zeq6RqiFv?t$BN8Go%3L#V-?zy!;4HPcGNBnnzppIUX_9~r?bRY9O|~|qqt`vk>EL; zpaiNWOk#(AG~c%}n)>B6%if5<#ozK|Ot^^DW1$kiPyDbU(a1CU>;^H1qA95_d=2 z$R~<~?^%!X%&UHR&EDseT2NAgr4i+k-)~a;6s0?(BDkk~lk|pl$X=wKcK^IgpCM%9 zrqE`)PnCT?nww}mxl;eI7=7jrtMP{X+_D1OpqvvdZgj}51UILyYT)otCGL0$EfXOs zElo|{`(Cwgdslu7}Y^^{bf zjpRkrR*&!J?}!v-=i{ADpb|08ZBa_=)9w+ar}31s4)*$~jVN928}irzHtI>e$il}y z#q?_lPQf&FQtRyQMAcx5M0^EhDG9$Y|kasRDz-fJ)ZigR`5Q!IPq_hMz@5BWKgMYy(8Z zMrZ4hzJ~ehwUGOVwwBU-nh;O}tM)&^=6FFk26jnZ7Qt&LbO^Tx!#-$bhl&9$t&5Cu zBODIpWm=#us3mp0&6fUHZeCpKSjVuH#rH2*4DC-t*5xJEPm$O_m4b$VMw6!0lu)kj zBbCji(T>_Raw<|aq;qzL1X@)m&mQFowL;MQ`ZiqS#|o*$=-zkX#*Cd%gNew`r61>4L6^qmswM7K&-5Kwe<}j3svU$d#yu~26vgK z2cW`vzeP%d@0a!J2`{ql6JdkSXbS(*)Qz3qkXe{9?7%;OhwDQV$iMD3Sf z%4Ghy1_bq97K=A<_Z6*2ts>)>+r-BgiUpzX?2<@nj67#=YbpvVsMCguZ<55*lIad( z>}lyvnW_BPDARbk;^-XETYI&D7_E0dgE!lr1gd18Tz(!M!3Bw@%~`43Q^ttL&0CzY zkI*oQ$nhqnkKQNGa`T21UcMid!djWvR4Bx+6=kG~-V$4$XJJ2$t|Azkpopo}b)YE{ zwMJD+nGES#q2Sn_**v| z`Rv>erEii{_rG52YT*^6pP z$#KoUG5d&+z%XSUpN};~BvGo@bI8F!4k>T(U+YKsa+psl?kBo}t zO;#Nlm`E)VU@h0&gVZmcGQ;N@k+QN6D?;1YJqZ z=!I{}`Xtvqr#0}J((rnVU9^+$IO7d2oPS<5>%=df>yLG++~~{_bSxP_*l@1_Bd$N7 zD*=J0k&jc_7o|?2(Y50Y@8dU!8PlV$HeT3qV3KwK;7_0X<8x|+114%j>e>F*m}uEn zbvD@G;V2U>AQseo`Cw(DQ&I97w0+#ME$iKzv84RlR)>3PTE3!PXT=_@_9Lz2i^#;| zV28!TI^Vrdr)*{cO^5=FPV)h=WTJV5b!?2nw>2@ONeolwG#iYf(F<^0RD`;i^GrU& zxrd0S@>%iV8%e)BDGST(bpHKq=S)2Qo8v?#LnqBt6`YOz^=4;Bdw1Z<*{<3aLYB|^-4U{9*>B!vXdbl9!S0VwcEU|gF!`$@s-DIe5NUv4Z}n^;Ev`uV zLgS=rD&Sc@<*{9bpW0-8is!^&yHY5c-!LXtzhfcnC;gCna)mE3%;X9sD(TPScY%##FHdFOBYgcluNTD)F4Zf7n}` z$>db*rPVerew`3u{--cM?BqG80>wGS@>a9E0N+1GSyL6CYKA%N&i)zgm!JO#W#&-- zlK}X`_+QAsoDwkbi}WwG4gkQ1iv1@EU>|-@J|*hRf%nk`HsGIzNifbi^kv1eV}bvA zYRk8t2w(8mr}wZ}S}sEP29R|?u(U&Mhn1Lhz%5szpq87MU#iybCvWv1j3+QIRU%&c zL{ft;;^M)LhZ0M-5!0?ZF3Ji2v}~<)j?SwhjcLj}YKzM2ax}lJ+J^Z}L=tae=kd0o zb7B2(%ihQ+G7wo{rGl_#p>gFfuYN7|EF@#4n}E?d@fxeH!Ao3*$ul5aZbPWyvz6G@ zG#X4shnq+_cybG&RrN%c+hfmx`K3!>#pvkc)bBr|dIRzr)jCES!sPSI+k#-ga++`& z%OwBlchy6RP`)_ESl@7Ua)_^=a_$H*p}Lx`(XLx^D1Ne@CQ3K7us&6U#u3&NANzFM zpg`K!Pi|6;f&j-l)G*sJ!_In;$TIcZYNv+zs+bd$8xp}mN1&&6wE%jS^-+nx7EJK(JM&$oX$T0ut zX@wYw;Jm6DqeBaGZgWXx64EJ@i{VAjMj~kAVHtMabp@7nxR__S8blnYSreK0BE7V6uwN~igZ;i{&lZAbzz&wfl(_#;8_9%F^WFZSOF*_LerZa#~M0UQ=8 z{esBU;9%8xUqHiq9~SO^idcKVk@r`Hyn1p0%^+@XxQbu=dRnilluAjewrI>#4%>dsA!onBuOzZ_K&b%4RTlGd$ps&vj9P&XgyM? zrO)4V9O9AcSHj-W9u1Yh;#D7;rYSkw&$ZXoTIV56GK`RIbLWB#4-aGw`3b>rgrG3mvINiRZ_K9IhXJqhf> z_9ptYd|KqFBPp88s2y2h2(W95rwg{h){U&=%E;5<(qY$=_;nwAj-XaX9W8!jYiR0H zC{7j<9eV4MK0OwNnb0#_mC~5?luHdioQLvF8*T|<1XezKz- zPe~1LRCJqM%BlMVozD|AMqstoU8-XK+khPTcbB`l;S_E31G(^0YP>`0Xi_F_BYO*L)bn&a>){#l znrXs6bbWkULrG5;6@#w~Hd>J$q5dx_-QW7+a@05OYdgUiFK6W^BD6YDr!E7En^Yb~ zDD#RrLaZ8Tzb_=2*pOAy>n*YuoOuvl(=OB*N##*U!24v@3WoFJ!_6B#l0+K$y&*u* zo)Td`LNwJHd*~9ar!ahDe!XQ-lM394)?v*l(wdjv3ZnXG4E|sb6mi z+GL6W;bNsJh4aZ)=a~d)%iHcnoAmbYCrTt?JGXWb38I^Z++i4;N+C0Lav5lor<%IW z_1svsvKXU_8-9Aj8Eu0`k$@VcuNnE!NoKC(3{4hGzZIs{h_LS>v%>LVh^kk~Eigc+ z6EOTJlI1Nudq;Xgj}fOr-X5o?On^ErmlT17mavPXSK`znl{?tcU!hj)XEgY6%np^D z_8>g;J8y0@f$)Z{Q_C=jUNVYXTT8nyCzuLT#d$v|(IJ-Ki*k&R!E0#`D_ucepn&m_ zY?ZnsBHJ_)3n+cpL4W0Xvq`+V9k`309aXX=(3b7$12a&S8~H$QAd-hyJfpJ1@MRuM z|G0_YN%FdR7#*;AFIn@|19>O9kWQm+=ZGO%V@W`a`D8%8u5fGlOLxAlZv#rMQA9_u zI_0;Y1N$%8+E(JOgt8`}&oy4tMX5q7Nzm#jG9pxBz%93th_sI+BztY%bN(-P# zx=*l5Y%bu*6GRR~-_i{-kGq*p-e{2&lXK65zz~MRN2hs=PiOYLIR6t*543-8zR5Q_4HhHR(zRwvx(qI~?h`e8YO}dh`#+qqZ+@L;*^?fV}li9Tmf;aj)LzhZR&7IpEUK2cqjsnZ4ckbkv ztlirDJ0sn$hZGxqrFna46sJl^29Ah&y*&=hB#>V?yI|Ew3!I5PJ`ttodJy3g)O>v{ z&(aFE)>cgrg%O+33#_IZk7u!nqT-zgQiM$rSUCooPu!R7;!9PC z8b2AgH+gF`dMTS*Nhq47=-O>PMo-a1$@^HMT7miml+b^L3G-@SFn2)rv47OF@$J$3 z?+Ko0EXS*D_tkX@_3&hwOn=w9OKP64`p%fl3L*6LvuyQ#<@cTdwPbH-nPnQpnNzYp z#ASXtAI(b;?GBXXeUJHnG*l_h?5y1M{q_@f9%2F~&w({Y!#Nov^Mjvq2{D4NK#+9prvq{-YG!-Bmtn8XhB?9@PIZ4d&|b`SVDHC+)KD z8HA%d-r zb#_bGbJtHxsB5r6^^KYU0#|y{)b=kJYk)?~&VJ)%t=M`bd(*n|qz3(`ZtChyZ2Y%+ zi8b>PA!+XqBTum8ml2OO9bj8>z8zAf>xEc-o5%0EzI)-Wy{{MrNni|9CpAAB=@oja zL$MbE)Jf+h&8X`&H-ySB!PX*}OYD9-hM3QJaUNVd1r)W5a7Oq^_3|7|^~%Vml{)=m zpm*QgzS8&Kq?#?)S)&;}F$-r7Sd~u~0j%0@(p8(D6f{(tqL#m(nL#$K!}W3(iYc%5dG*Yv;qR|=ky}!vQ0FY2Xrj<+E3lZs~jX{biHabRGyi~0^O3mn_3MIqI5JmAA7gM zrZ`q50yLhUPxeOn?4Yq!rB!KDeneSnu#*k47O&MYn(iM-NBgwO^Ouf2IwYr99D5I6s^PO9qbu#K-T>S^#1#GPYSe79-K z%R+F&X!*61DJ3E%ohju()Ne|tF>GP{912TQ#=^0MAY zAYv4+s1JB*d(Qhmy3Xt9@1e%&c%;f5&6k5z<%Bb?uW$f6U?FVJQU^KtMH>$4(a2&+cYf79#dGMG}9WMk*4+!>%?mk8u!0m~$3tH0<~vX#5q zrf8bKe=w6xyMh%u_<(0wKvpf2{4))@LTnb)Sl68jBiM@>)Vz}b0#-<> zRn_cKc|F-<&1~Bf)$>>#qIxslV1qzolP{a$)ti1j zlwYuZq#PodCRU{?@p3mkz4hr?w-A@Uek;QedJ2)=*?OkH6}_^Y!WsF|y2n0n zsX+MdMh+DSx_U=ZJ;|BL0=juL-H&3aW*;T$(X)$5w9fT`hkhp(pCN;pu>n{=nR7lkIZNs?dchDg-43p zkK(F2nf6v%y!XhLM+^U8tw4)NloSo9^NRUNTNkhsbgxh1Vvyn4H%JGaUV#zrw1ElM ztyERB1_9Kw=Q@n;E!f#&gob&V)y;s2|9reA5#=1?P zrDfZg@YsF?P9g53!cu69vvbPWK^Z596JT_0v%kr2&`0ZO3iCao>tOavFLN_Gyjt#QRH#?yicMg_ z*oYH8h(viWaAM{Twk@!QS;&2>${T1s^0p_Xdp-TC2=-=mucMa33y|5Fz@c3&&qqKU ziL}0FHa(s`WO|4eoYCSnW9c-c^6}T+CRD@`x(Ls{Ar91%^|%u;ixZ0ducI&Y(^=&u zGgz-ZRkklBcJnLH286a66@3B7((-lh{(^pfV$nw8mL~N$zdo;HuxAZ9s6lI<1SuwY`vF4e?J1btw2xO4~Gx;pN`1sBw6`RpkqS~74QLalV8 zD3I=LqoIbmqTxT!4@zpfa`UUT6@8z=khnNLD4>&G4Qb%ZOtNOy_58jj(2gbtTDl+* zeM-CE3F#m)r}@O|{FEcKSWMHzsZm(o(JtqZ(<^7^gaus{eX~`VImm)#03r7*)KG z1NftyW6j?%tjMP-ffY@<8Uv!Y91?^!4$Kv5v-P#l4eriZod!Y#Sk2`aeB(&e2dDn4 z*;I!RSj`;i>;~!UtG-lFqa9!qw`_*hjkSXF3b7aiw6W7pV6Vo zc&|4-h|#N5n-91{aXvX6DuB;Y$DvCI$KQOh63J-hREB~OQO0pSiSWMBUJQp!A85_M zY}?ba5=274(c1TGEl>LN_j;N31UgkUM`5LBsQ-5}Rmq&D9N9GvCvLoI!jt`}1~P?% zp{&`p?lq*jg{9B`0JD)A*%R(PKBF{eyhEhA&i0P_@|*EVOuH<|;mp2u5$k^kCjTU8 zl*^*uT;3o5h(}uCe>oAOt3-2d@Q^QWDdppz;r=U$6UJ&j#3T6Sg{L_+Vo`nNSd6Y1 z&AHn{K06dhXQ|vn^!%5#!Y`&j#yM56Onsp%wAQM5hVn3GuJvYqi_D{r%@}5eie^+6kjg|^@kRb|@Ue-l?X_D!b6%BcWPETf7 zk*|sxz{(gIXa9b#y&n_}wf`HrV7AAp(EDvJN0V+oN^@M|SfKtK|0(Mn^>qkRZvz0F z@Kr0&MDP{qO6CmTipbIn36)E)WS=r}iK_ky_=Vi{EP-y(q+}XaxT;k#<~|F@OzC`Z zXzG^wKUNTS8mYp7YMA8|w?}KkH}&cKKJMc>9Q5M$WWARe-v7(AQBdy$QSQ;hf8}eB ziD1X=FgnWqbr^#h_a>H6&R4{k#w%3k*qvrQ2=_?f(OSRax85Bn?NHLrY0KiJ8(DzUrQqdzkR=)CuB{;>?x2$IeLJqaxUmQpG^t?{#rz z^6(h?as3s*g@2v?*h0#4F`g!77nv&)qWm;#Jgr3F9Mmdbu|%Iss+gx`bv9Nch%kE? z2!U#FZKgG&Bw}6VkDl_!vt4HJ-rWkXcnbF@1q;8^)=dgC-+TT~(3XIY(LtVf^wqT+ z5i6up2H50hmCKR2`=JuFZd(#WzOTyP7XTj-!5)^iyOet%wJ1J7fs@MV*}G%idzXcs z%4){)kj823F}%>}VaRP61OK4wU*QzL3WaAWCAhIo-1}t)^eDBK?dSs6{dD?xoQxA?O96x?clec`$o{ypZbH?b**d_&bk+%NunX*HtvyYSWQ+52x+>1 zO}ZeT(22b}+XHpHJmU`Nyl`IZy6^QvhZKV{+WMha`MkcT;rv}MbWc)+ymLifC+vFp zv7@zmWct$Kvzvye0zyb$8?oGxZKa#i^jU^0mCZa;(6kWtr*l{)YQ2^1V^f8-cA=TP zWA~001@xWa4r{HaU8Or0h;O(*b*@}Z?F;Losm=>+>dWJRlJ85cLx!$U4;yW$hmkTH zt8Ge&4iO^Khivw+Ax;rmHTzGUpP!ew@fhZXlxnx6L=JS(Tz0eCPa*ggAtL#eeo&N#XjTK zKWwcP?YPvxyk+dljriG&LsHOr@8U7MBcSW!XA)zJ&t~7hlJXdsZ(}#sMAXjBuD;#p zj09vnt7PDN`p^5X^V`I}m&zH0xCj>I_$n0ryerw}=Rs4}ZPE_NiFb!~(roMaome7- zbMLcWD997-aMVW_Sfix%;x$RTX!C2v9SWyp)dIdhyQ5 z%((;C_FIen5x(dd6`Zx+D{h6h^AS~C9x@PQBjoBRAbQ`9i*HM`N2@7vS^EzzPuqp*{O@Cq_h6 zKi=ng&%fvF^Q^tk*?WK2UZ1rjqeFsrvdtQ1fcijG@45H zE)AeR7+>L{iUxe2-9Q?Ar=*uD-w~{THif|jJMBC*-o7l++=#{QIGM@%{9NE2%=9yg zQ&dUtOkks!qFqp4ARWu#;NYoxBG}6~GMeq-?#1}yP}YL}BjW=7LV-2e^Mz+!SpB=& z*JnbVlI01s?Ow9`i)EtM`|JjK(A=NEe8;E$#@_~!E~CV>j>$oYnKk^ZH`ZZg6{w`2 z$g(`TqsZ%6XeYLCR(~ zqBAu}w-zVjVcCb0VBO7MTzLKBH}bv_U%Gz01hpkuDAhd7Xu$=xD?E=vSW~*jCJuva zXa_6rto7~->Wm1{D9DDlIjEY02@gnei_bX?`Z|)%+u(t_w*QOwRxMuT+c?L(DQ=^; z^rUAFbqhmQ<^m>1wJ;8hINeotVl5&6=-j!H+?!jYjl%U(FgXziu2@pb-j@NT44b|6 zJ-fhC6Uy#WWlvNHe9xO>PhngGL&Y%v+(g>iv)t&mcpfUH6Fh^aN?B?oQz3uB=b z>bmA%05Y_DdWbsgR-Y}WxN1#mIsYYiK{YHZ_x1eDzU-79#+O{6oNT_odw#j`t#*)Q zaLaaaqG2McG)+WWixn_}$#XKrCN0rw&C7FT~B@QIk1DwiA#(tUZ)V6b*s0af|KaM~^+5qqH)?rm5fJ)B~W|j zMtinL*%d8*&^Y+`mGzi9N!N~3Q3yE^Q@UM1N>7`cX@FM>z9AW(*{{#+3{G!hXEnf z0r<5e16xM3gH1o99VBF>QTVx>hKBR9p>KVk3koj72-7Lqo-@c*w>>MxQuhP)ItkBc zxAD}{uKTfEYdNZu9KBr$0Y6Tz;#1rYcDrrs98aJRy&>Ojl_2-Nqx))V~49w7( zzfJ3tAsKzdwTFe@7Pc!l) z0jf5S>8-Oni*4RIyIg?Yd4y&9jZHhH%M|A2oWK%O0PFEOqc{V==GEN#1s(d{cLT); z;zL*9F}j3{cevBfqg9ZhaWe4T3e)8Y6o0UKWNUhN?}AVo-P7p=I6FZ+4ZzKdBm+86 zV%<%cOQD*6Qjn}Hc=R$5O7w(_8`|lfM;?7Buc;xM+vuKT*Nl)7tgBd-+JC7q`d%N( zTgY-hP%LmM$ehdeG4uA0l>OS&gff`F?&E| znkRthSP5cK@Q)XvdF8H(sW*OnHc#bzfj+5yQ`zKsM)`KKp|v_JNCs?eKT46yz0_I0 zH+H)0whcya91m?&afZZ|3uWe_?#W)_SZFljc0C$eNRe_ZuGM`}Z`m6KtF?*Zji4v< z{0`%B=<2=D9LzOMOd(ttq>9&jlfKjINqrEr%#zwRb+fy)2;&qH8*6tO~8^0qMd zS&93?Q4w=3G2dQB^#)Fju7BDuSO6LMLC4g_IWxFR^#>;_V@2ON>altK9^#{~V%+X( z&Jzj;@V?GPxjZ%?GU>O}C3dQBI(o4(BPIsKTWii3fRASkK+iH!NT-XjwW&T)_lecz zmSD*s4v!y0N$gtTyNKIt#RUovPrvOd7E8e}#5(flOO*`iNmsWg~^0jApSr=SFDo=d;H#0u&ZIpSr31=KH_G51bVN! zAdY!aGW?2K3v)nE5swo*6XmFLevs0q!8bbQs56V7yrlQ5*5D2(N=k8PusbrI#k!BN zJiKB}z2b5iKoqZfFewFxJVEv%o0)G`R-_l}8pat(UMmq%>Y=1NWHsfg$?%WlP0>tJ z_}=!PJeuUrRPpPa0KpXISA?LmjUq*VkfI%29M6z%KEcHre?U9D{BY)#&WUgl!_g0t z(<%L$v9Yz6hDR;CqA@$Q+e|fIEg+Q_Cbi-#361?~Sq1u_wFz_Q7xI>1!*%$nE|jS8 z54Z%d8+2HR#zqj~v}pV{gGzAmd%2~et)Of}&YA7g-zr;+im|<&2$??q9vK^Q$%fTK z&Tglmy3;9&>QQsnTpBQdG;JupRp@hFjii(oz|K4nWTc}0V<3hcljU%dnwcU?-oNJmyW_v(gW45mNF)%kHs+}Dd7vSycsx~KkH%DEJbQw^G8an#JX zl&ri$DuMe1yhy0&@0Wk=Ur@C1KqyBTYTtJ9E8G1QhVR*d1T420o$D4JTCGN!-g(ZG z`QuQhaWO};yk9oN*g=>7n^n2~pe)X1Kp-6rI=m+oy4mXRFnTbzt{MGhbGYy492XnS_gG{cq*OmX=9xs9I;3<7)0~?bGtJX;JYQq< zB1k;cbZbV3mGVqLOjF|b#Y6_US4rx^gJ8Y%wPOimX9Ndd2xECt)f);5gACN{qGXC+ z$_!^`rB7xFb^vX|EF%67yF;!WXMg< - // initOutput.json: See #initOutput - "path": ".scripts/sdk_init.sh" - } - }, - "generateAndBuild": { - // Param: - // path_to_generateAndBuildInput.json: See #GenerateAndBuildInput. - // path_to_generateAndBuildOutput.json: See #GenerateAndBuildOutput. - "generateAndBuildScript": { - "path": ".scripts/sdk_generateAndBuild.sh", - "logFilter": { - // filter for error msg and warning msg. - "error": "(error|failed|exception)", - "warning": "warn" - } - } - }, - "mockTest": { - "mockTestScript": { - "path": ".scripts/sdk_mockTest.sh" - } - } -} - -``` - -#### CodegenToSdkConfig Schema -See [CodegenToSdkConfigSchema.json](schema/CodegenToSdkConfigSchema.json). - -### GenerateAndBuildInput - -Input file for generate and build script. - -#### GenerateAndBuildInput Example - -```jsonc -{ - "specFolder": "/z/work/azure-rest-api-specs/specification", - "headSha": "fce3400431eff281bddd04bed9727e63765b8da0", - "headRef": "refs/pull/1234/merge", - "repoHttpsUrl": "https://github.com/Azure/azure-rest-api-specs.git", - "relatedReadmeMdFile": "compute/resource-manager/readme.md" - "serviceType": "resource-manager", - "skipGeneration": "false" -} -``` - -#### GenerateAndBuildInput Schema - -See [./GenerateAndBuildInputSchema.json](schema/GenerateAndBuildInputSchema.json) - -### GenerateAndBuildOutput - -Output file for generate script. - -#### GenerateAndBuildOutput Example - -```jsonc -{ - "packages": [ - { - "packageName": "@azure/arm-compute", - "result": "succeeded", - "path": [ - "sdk/compute/arm-compute", - "rush.json" - ], - "packageFolder": [ - "sdk/compute" - ], - "changelog": { - "content": "Feature: something \n Breaking Changes: something\n", - "hasBreakingChange": true - }, - "artifacts": [ - "sdk/compute/azure-arm-compute-1.0.0.tgz", - ] - } - ] -} -``` - -#### GenerateAndBuildOutput Schema - -See [./GenerateAndBuildOutputSchema.json](schema/GenerateAndBuildOutputSchema.json) - -### InitOutput - -#### InitOutput Schema - -```jsonc -{ - "type": "object", - "properties": { - "envs": { - // Environment variable to be set in following scripts. Not Implement - "additionalProperties": { - "type": "string" - } - } - } -} -``` diff --git a/tools/sdk-generation-pipeline/documents/task-engine/schema/CodegenToSdkConfigSchema.json b/tools/sdk-generation-pipeline/documents/task-engine/schema/CodegenToSdkConfigSchema.json deleted file mode 100644 index 04159ae723e..00000000000 --- a/tools/sdk-generation-pipeline/documents/task-engine/schema/CodegenToSdkConfigSchema.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "type": "object", - "properties": { - "init": { - "$ref": "#/definitions/InitOptions" - }, - "generateAndBuild": { - "$ref": "#/definitions/GenerateAndBuildOptions" - }, - "mockTest": { - "$ref": "#/definitions/MockTestOptions" - }, - "liveTest": { - "$ref": "#/definitions/LiveTestOptions" - } - }, - "definitions": { - "InitOptions": { - // Init the environment. Install dependencies. - "type": "object", - "properties": { - "initScript": { - // Script to init dependencies. - // Param: - // initOutput.json: See #initOutput. - "$ref": "#/definitions/RunOptions" - } - }, - "required": ["initScript"] - }, - "GenerateAndBuildOptions": { - // Generate the SDK code and build generated code. - "type": "object", - "properties": { - "generateAndBuildScript": { - // Script to generate the SDK code. - // Param: - "$ref": "#/definitions/RunOptions" - } - }, - "required": ["generateAndBuildScript"] - }, - "MockTestOptions": { - // Test the generated codes with mock server. - "type": "object", - "properties": { - "mockTestScript": { - // Script to run mock test. - // Param: - "$ref": "#/definitions/RunOptions" - } - }, - "required": ["mockTestScript"] - }, - "LiveTestOptions": { - // Test the generated codes online. - "type": "object", - "properties": { - "liveTestScript": { - // Script to run mock test. - // Param: - "$ref": "#/definitions/RunOptions" - } - }, - "required": ["liveTestScript"] - }, - "RunOptions": { - // Options to run a script and collect log. - "type": "object", - "properties": { - "path": { - // Script path related to repo root - "type": "string" - }, - "envs": { - // Extra environment variable to be passed to the script (except initScript). - // By default the following envs will be passed: - // PWD (current directory) - "type": "array", - "items": { - "type": "string" - }, - "default": [] - }, - "logPrefix": { - // Prefix to be added to SDK Automation log. By default it would be filename of the script. - "type": "string" - }, - "logFilter": { - // filter for error msg and warning msg. - "$ref": "#/definitions/LogFilter" - } - }, - "required": ["path"] - }, - "LogFilter": { - "type": "object", - "properties": { - "error": { - "type": "string", - "format": "regex", - "default": "/(error|Error|ERROR|failed|Failed|FAILED|exception|Exception|EXCEPTION)/g" - }, - "warning": { - "type": "string", - "format": "regex", - "default": "/warn/g" - } - } - } - } -} diff --git a/tools/sdk-generation-pipeline/documents/task-engine/schema/GenerateAndBuildInputSchema.json b/tools/sdk-generation-pipeline/documents/task-engine/schema/GenerateAndBuildInputSchema.json deleted file mode 100644 index 3b6ca04fe08..00000000000 --- a/tools/sdk-generation-pipeline/documents/task-engine/schema/GenerateAndBuildInputSchema.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "type": "object", - "properties": { - "specFolder": { - // Path to local spec folder. path to the parent of service folders. e.g. azure-rest-api-specs/specifications - "type": "string" - }, - "headSha": { - // Git head sha. - // If spec folder is not git repo, it will be empty string. - "type": "string" - }, - "headRef": { - // Git head ref. - // Format will be "refs/pull//merge" or "refs/heads/". - "type": "string" - }, - "repoHttpsUrl": { - // Spec repo url in https without auth. - "type": "string" - }, - "relatedReadmeMdFile": { - // Related readme.md files that pending generation. - "type": "string" - }, - "relatedTypeSpecProjectFolder": { - // Related typespec project folder that pending generation. - "type": "string" - }, - "serviceType": { - // The type of related swagger: resource-manager or data-plane - "type": "string", - "enum": ["resource-manager", "data-plane"] - }, - "autorestConfig": { - // The autorest config got from /autorest.md, which is mounted by user - "type": "string" - }, - "skipGeneration": { - // Whether skip generation - "type": "boolean" - } - }, - "required": ["specFolder", "headSha", "headRef", "repoHttpsUrl"] -} diff --git a/tools/sdk-generation-pipeline/documents/task-engine/schema/GenerateAndBuildOutputSchema.json b/tools/sdk-generation-pipeline/documents/task-engine/schema/GenerateAndBuildOutputSchema.json deleted file mode 100644 index 744cc75c37e..00000000000 --- a/tools/sdk-generation-pipeline/documents/task-engine/schema/GenerateAndBuildOutputSchema.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "type": "object", - "properties": { - "packages": { - "type": "array", - "items": { - "$ref": "#/definitions/PackageResult" - } - } - }, - "required": ["packages"], - "definitions": { - "PackageResult": { - "properties": { - "packageName": { - // Name of package. Will be used in branch name, PR title and the folder name to store the generated codes. - "type": "string" - }, - "result": { - // Status of package. By default it's succeeded. - "type": "string", - "enum": ["failed", "succeeded"], - "default": "succeeded" - }, - "path": { - // List of package content paths. - // If the path points to a folder then - // all the content under the folder will be included. - "type": "array", - "items": { - "type": "string" - } - }, - "packageFolder": { - // The path of package folder. - "type": "string" - }, - "changelog": { - "type": "object", - "properties": { - "content": { - // Content of changelog in markdown - "type": "string" - }, - "hasBreakingChange": { - // Does the new package has breaking change - "type": "boolean" - }, - "breakingChangeItems": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": ["content"] - }, - "artifacts": { - // The path to artifacts - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": ["packageName", "path", "packageFolder"] - } - } -} diff --git a/tools/sdk-generation-pipeline/documents/task-engine/schema/InitOutputSchema.json b/tools/sdk-generation-pipeline/documents/task-engine/schema/InitOutputSchema.json deleted file mode 100644 index a2353494ccb..00000000000 --- a/tools/sdk-generation-pipeline/documents/task-engine/schema/InitOutputSchema.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "type": "object", - "properties": { - "envs": { - // Environment variable to be set in following scripts. - "additionalProperties": { - "type": "string" - } - } - } -} diff --git a/tools/sdk-generation-pipeline/documents/task-engine/schema/LiveTestInputSchema.json b/tools/sdk-generation-pipeline/documents/task-engine/schema/LiveTestInputSchema.json deleted file mode 100644 index 25ae5d69741..00000000000 --- a/tools/sdk-generation-pipeline/documents/task-engine/schema/LiveTestInputSchema.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "type": "object", - "properties": { - "packageFolder": { - // The path of package folder - "type": "string" - } - }, - "required": ["packageFolder"] -} diff --git a/tools/sdk-generation-pipeline/documents/task-engine/schema/MockTestInputSchema.json b/tools/sdk-generation-pipeline/documents/task-engine/schema/MockTestInputSchema.json deleted file mode 100644 index c3bcd25b8e8..00000000000 --- a/tools/sdk-generation-pipeline/documents/task-engine/schema/MockTestInputSchema.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "type": "object", - "properties": { - "packageFolder": { - // The path of package folder - "type": "string" - }, - "mockServerHost": { - "type": "string" - } - }, - "required": ["packageFolder", "mockServerHost"] -} diff --git a/tools/sdk-generation-pipeline/documents/task-engine/schema/TestOutputSchema.json b/tools/sdk-generation-pipeline/documents/task-engine/schema/TestOutputSchema.json deleted file mode 100644 index 7dd2a753b37..00000000000 --- a/tools/sdk-generation-pipeline/documents/task-engine/schema/TestOutputSchema.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "object", - "properties": { - // Test Result - "total": { - "type": "number" - }, - "success": { - "type": "number" - }, - "fail": { - "type": "number" - }, - "apiCoverage": { - "type": "number" - }, - "codeCoverage": { - "type": "number" - } - } -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/LICENSE b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/LICENSE deleted file mode 100644 index 5cf7c8db628..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) Microsoft Corporation. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/README.md b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/README.md deleted file mode 100644 index b495da760fc..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/README.md +++ /dev/null @@ -1,79 +0,0 @@ -# @azure-tools/sdk-generation-cli - -This packages includes some commands used by sdk generation pipeline. - -## Install - -```shell -npm i @azure-tools/sdk-generation-cli -``` - -## Commands - -### docker-cli -It's used by docker image, and for the details, please refer to [How to Use Docker Image for SDK Generation](../../documents/docker/README.md). - -### run-mock-host -Run this command to start the mock host. -Usage: -```shell -run-mock-host --readme= --spec-repo= --mock-host-path= -``` -For more details, please refer to [mock service host document](https://github.com/Azure/azure-sdk-tools/tree/main/tools/mock-service-host). - -### getRepoName -Get repository name from the http url and set it as azure pipeline variable. -Usage: -```shell -getRepoName -``` - -### generateResult -Parse the logs produced by tasks, and generate a summarized task result in json format. -Usage: -```shell -generateResult \ - --buildId= \ - --taskName= \ - --logfile= \ - --resultOutputPath= \ - [--dockerResultFile=] \ - [--exeResult=] \ - [--taskOutputPath=] \ - [--logFilterStr=] -``` - -### publishResult -Publish pipeline result to storage. [eventhub] is supported. -NOTE: will get eventhub connection string from environment, variable is [EVENTHUB_SAS_URL] -Usage: -```shell -publishResult \ - --storageType=eventhub \ - --pipelineStatus= \ - --buildId= \ - --trigger= \ - --logPath= \ - --resultsPath= -``` - -### uploadArtifact -Upload artifact to blob. -NOTE: will get blob connection string from environment, variable is [AZURE_STORAGE_BLOB_SAS_URL] -Usage: -```shell -uploadArtifact \ - --generateAndBuildOutputFile= \ - --buildId= \ - --language= -``` - -### prepareArtifactFiles -Determine which files to upload, copy it to artifact directory. -Usage: -```shell -prepareArtifactFiles \ - --artifactDir= \ - --generateAndBuildOutputFile= \ - --language= -``` diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/jest.config.js b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/jest.config.js deleted file mode 100644 index 2658e6882ea..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/jest.config.js +++ /dev/null @@ -1,44 +0,0 @@ -/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ -module.exports = { - verbose: true, - preset: 'ts-jest', - testEnvironment: 'node', - globals: { - "ts-jest": { - packageJson: "package.json", - tsConfig: "tsconfig.json" - } - }, - testMatch: [ - "/**/*.test.ts", - ], - modulePathIgnorePatterns: [ - "(/.*)*/tmp/*" - ], - collectCoverage: true, - collectCoverageFrom: [ - "src/**/*.ts" - ], - coveragePathIgnorePatterns: [ - "src/cli/pipelineCli", - "src/cli/dockerCli/*Cli.ts" - ], - roots: [ - "/src/", - "/test/" - ], - transform: { - "^.+\\.tsx?$": "ts-jest" - }, - moduleFileExtensions: [ - "ts", - "tsx", - "js", - "jsx", - "json", - "node" - ], - testPathIgnorePatterns: [ - "__snapshots__" - ] -}; \ No newline at end of file diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/package.json b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/package.json deleted file mode 100644 index 9545de3dd78..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/package.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "name": "@azure-tools/sdk-generation-cli", - "version": "1.0.0", - "description": "", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "scripts": { - "build": "rimraf dist && tsc", - "prepack": "npm run build", - "pack": "npm pack 2>&1", - "test:unit-prepare-environment": "ts-node test/unit/utils/prepareEnvironment.ts", - "test:unit": "npm run test:unit-prepare-environment && jest", - "test:integration": "ts-node test/integration/integrationTest.ts", - "test": "npm run test:unit && npm run test:integration", - "lint": "eslint . -c ../../.eslintrc.json --ignore-path ../../.eslintignore --ext .ts", - "lint:fix": "eslint . -c ../../.eslintrc.json --ignore-path ../../.eslintignore --ext .ts --fix" - }, - "author": "Microsoft", - "license": "MIT", - "files": [ - "dist/**/*.js", - "dist/**/*.json", - "dist/**/*.js.map", - "dist/**/*.d.ts", - "dist/**/*.d.ts.map", - "dist/**/*.handlebars", - "LICENSE", - "README.md" - ], - "bin": { - "getRepoName": "dist/cli/pipelineCli/getRepoNameCli.js", - "generateResult": "dist/cli/pipelineCli/generateResultCli.js", - "publishResult": "dist/cli/pipelineCli/publishResultCli.js", - "uploadArtifact": "dist/cli/pipelineCli/uploadArtifactCli.js", - "prepareArtifactFiles": "dist/cli/pipelineCli/prepareArtifactFilesCli.js", - "docker-cli": "dist/cli/dockerCli/dockerCli.js", - "run-mock-host": "dist/cli/dockerCli/runMockHostCli.js" - }, - "dependencies": { - "@azure/storage-blob": "^12.8.0", - "ajv": "^6.12.6", - "convict": "^6.2.3", - "@azure-tools/sdk-generation-lib": "^1.0.5", - "axios": "^0.24.0", - "dotenv": "^16.0.0", - "winston": "3.7.2", - "command-line-args": "~5.2.1", - "simple-git": "~3.16.0" - }, - "devDependencies": { - "@types/node": "^16.11.7", - "rimraf": "^3.0.2", - "jest": "~26.6.3", - "ts-jest": "~26.5.4", - "@types/jest": "^25.2.1", - "typescript": "~4.6.3", - "ts-node": "~10.7.0", - "eslint": "^8.16.0", - "@typescript-eslint/eslint-plugin": "^5.25.0", - "eslint-config-google": "^0.14.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-n": "^15.0.0", - "eslint-plugin-promise": "^6.0.0", - "@typescript-eslint/parser": "^5.25.0", - "eslint-plugin-simple-import-sort": "^7.0.0" - } -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/DockerContext.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/DockerContext.ts deleted file mode 100644 index fe2eb122219..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/DockerContext.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { initializeLogger } from '@azure-tools/sdk-generation-lib'; -import fs from 'fs'; -import path from 'path'; -import { Logger } from 'winston'; - -import { DockerCliInput } from '../schema/dockerCliInput'; -import { sdkToRepoMap } from './constants'; -import { DockerRunningModel } from './DockerRunningModel'; - -export class DockerContext { - mode: DockerRunningModel; - readmeMdPath?: string; - typespecProjectFolderPath?: string; - tag?: string; - sdkList: string[]; - specRepo?: string; - workDir?: string; - sdkRepo?: string; - resultOutputFolder?: string; - autorestConfigFilePath?: string; - specLink?: string; - sdkWorkBranchLink?: string; - skipGeneration: boolean; - isPublicRepo: boolean; - logger: Logger; - - /* - * there are different modes to use the docker image: - * 1. local: generate codes - * 2. local: grow up - * 3. pipeline: generate codes - * */ - public initialize(inputParams: DockerCliInput) { - this.readmeMdPath = inputParams.readmeMdPath; - this.typespecProjectFolderPath = inputParams.typespecProjectFolderPath; - this.tag = inputParams.tag; - this.sdkList = inputParams.sdkList?.split(',').map((e) => e.trim()).filter((e) => e.length > 0); - this.specRepo = inputParams.specRepo; - this.workDir = inputParams.workDir; - this.sdkRepo = inputParams.sdkRepo; - this.resultOutputFolder = inputParams.resultOutputFolder; - this.autorestConfigFilePath = inputParams.autorestConfigFilePath; - this.specLink = inputParams.specLink; - this.sdkWorkBranchLink = inputParams.sdkWorkBranchLink; - this.skipGeneration = inputParams.skipGeneration; - this.logger = initializeLogger(path.join(inputParams.resultOutputFolder, inputParams.dockerLogger), 'docker'); - - if (this.sdkList?.length === 0 && fs.existsSync(this.workDir)) { - this.logger.info('Preparing environment to do grow up development'); - this.mode = DockerRunningModel.GrowUp; - this.isPublicRepo = false; - if (!this.specLink) { - try { - this.validateSpecRepo(); - } catch (e) { - throw new Error(`Cannot get spec repo link by parameter --spec-link, or get mounted swagger repo.`); - } - } else { - this.validateSpecLink(); - } - - this.validateWorkDir(); - if (!!this.sdkWorkBranchLink) { - this.validateWorkBranchLink(); - } - } else if (fs.existsSync(this.workDir)) { - this.logger.info('Preparing environment to generate codes and do grow up development in local'); - this.mode = DockerRunningModel.CodeGenAndGrowUp; - this.isPublicRepo = false; - this.validateSpecRepo(); - this.validateReadmeMdPathOrTypeSpecProjectFolderPath(); - this.validateSdk(); - } else { - this.logger.info('Preparing environment to generate codes in pipeline'); - this.mode = DockerRunningModel.Pipeline; - this.isPublicRepo = inputParams.isPublicRepo; - this.validateSdkRepo(); - this.validateSpecRepo(); - this.validateReadmeMdPathOrTypeSpecProjectFolderPath(); - this.validateOutputFolder(); - } - } - - private validateSpecRepo() { - if (!fs.existsSync(this.specRepo)) { - throw new Error(`Cannot find ${this.sdkRepo}, please mount it to docker container`); - } - } - - private validateReadmeMdPathOrTypeSpecProjectFolderPath() { - if (!this.readmeMdPath && !this.typespecProjectFolderPath) { - throw new Error(`Get empty readme.md path and typespec project folder path, please input it with --readme or --typespec-project`); - } - if (!!this.readmeMdPath && !fs.existsSync(path.join(this.specRepo, this.readmeMdPath))) { - throw new Error(`Cannot find file ${this.readmeMdPath}, please input a valid one`); - } - if (!!this.typespecProjectFolderPath && !fs.existsSync(path.join(this.specRepo, this.typespecProjectFolderPath))) { - throw new Error(`Cannot find file ${this.typespecProjectFolderPath}, please input a valid one`); - } - } - - private validateSdk() { - const supportedSdk = Object.keys(sdkToRepoMap); - const unSupportedSdk: string[] = []; - for (const sdk of this.sdkList) { - if (!supportedSdk.includes(sdk)) { - unSupportedSdk.push(sdk); - } - } - if (unSupportedSdk.length > 0) { - throw new Error(`Docker container doesn't support the following sdks: ${unSupportedSdk.join(', ')}`); - } - } - - private validateWorkDir() { - if (!fs.existsSync(this.workDir)) { - throw new Error(`Cannot find ${this.workDir}, please mount it to docker container`); - } - } - - private validateSdkRepo() { - if (!fs.existsSync(this.sdkRepo)) { - throw new Error(`Cannot find ${this.sdkRepo}, please mount it to docker container`); - } - } - - private validateOutputFolder() { - if (!fs.existsSync(this.resultOutputFolder)) { - throw new Error(`Cannot find ${this.resultOutputFolder}, please mount it to docker container`); - } - } - - private validateWorkBranchLink() { - const match = this.sdkWorkBranchLink.match(/(https.*\/([^\/]*))\/tree\/(.*)/); - if (match?.length !== 4) { - throw new Error(`Get invalid sdk work branch link: ${this.sdkWorkBranchLink}`); - } - } - - private validateSpecLink() { - const match = this.specLink.match(/http.*/); - if (!match) { - throw new Error(`Get invalid sdk work branch link: ${this.specLink}`); - } - } -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/DockerRunningModel.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/DockerRunningModel.ts deleted file mode 100644 index 99f5dd6ef64..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/DockerRunningModel.ts +++ /dev/null @@ -1,5 +0,0 @@ -export enum DockerRunningModel { - CodeGenAndGrowUp, - GrowUp, - Pipeline -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/DockerTaskEngineContext.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/DockerTaskEngineContext.ts deleted file mode 100644 index 20b2577217c..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/DockerTaskEngineContext.ts +++ /dev/null @@ -1,160 +0,0 @@ -import { CodegenToSdkConfig, getCodegenToSdkConfig, requireJsonc, StringMap } from '@azure-tools/sdk-generation-lib'; -import { execSync } from 'child_process'; -import * as fs from 'fs'; -import { writeFileSync } from 'fs'; -import * as path from 'path'; -import { Logger } from 'winston'; - -import { extractAutorestConfigs } from '../../../utils/autorestConfigExtractorUtils'; -import { GitOperationWrapper } from '../../../utils/GitOperationWrapper'; -import { dockerTaskEngineInput } from '../schema/dockerTaskEngineInput'; -import { DockerContext } from './DockerContext'; -import { DockerRunningModel } from './DockerRunningModel'; -import { GenerateAndBuildTask } from './tasks/GenerateAndBuildTask'; -import { InitTask } from './tasks/InitTask'; -import { MockTestTask } from './tasks/MockTestTask'; -import { SDKGenerationTaskBase } from './tasks/SDKGenerationTaskBase'; - -export class DockerTaskEngineContext { - logger: Logger; - configFilePath: string; - initOutputJsonFile: string; - generateAndBuildInputJsonFile: string; - generateAndBuildOutputJsonFile: string; - mockTestInputJsonFile: string; - mockTestOutputJsonFile: string; - initTaskLog: string; - generateAndBuildTaskLog: string; - mockTestTaskLog: string; - readmeMdPath: string; - typespecProjectFolderPath: string; - specRepo: { - repoPath: string; - headSha: string; - headRef: string; - repoHttpsUrl: string; - }; - serviceType?: string; - tag?: string; - sdkRepo: string; - resultOutputFolder?: string; - envs?: StringMap; - packageFolders?: string[]; - mockServerHost?: string; - taskResults?: {}; - taskResultJsonPath: string; - changeOwner: boolean; - mode: DockerRunningModel; - autorestConfig: string | undefined; - skipGeneration: boolean; - - public async initialize(dockerContext: DockerContext) { - // before execute task engine, safe spec repos and sdk repos because they may be owned by others - await new GitOperationWrapper(dockerContext.specRepo).safeDirectory(); - await new GitOperationWrapper(dockerContext.sdkRepo).safeDirectory(); - const dockerTaskEngineConfigProperties = dockerTaskEngineInput.getProperties(); - this.logger = dockerContext.logger; - this.configFilePath = dockerTaskEngineConfigProperties.configFilePath; - this.initOutputJsonFile = path.join(dockerContext.resultOutputFolder, dockerTaskEngineConfigProperties.initOutputJsonFile); - this.generateAndBuildInputJsonFile = path.join(dockerContext.resultOutputFolder, dockerTaskEngineConfigProperties.generateAndBuildInputJsonFile); - this.generateAndBuildOutputJsonFile = path.join(dockerContext.resultOutputFolder, dockerTaskEngineConfigProperties.generateAndBuildOutputJsonFile); - this.mockTestInputJsonFile = path.join(dockerContext.resultOutputFolder, dockerTaskEngineConfigProperties.mockTestInputJsonFile); - this.mockTestOutputJsonFile = path.join(dockerContext.resultOutputFolder, dockerTaskEngineConfigProperties.mockTestOutputJsonFile); - this.initTaskLog = path.join(dockerContext.resultOutputFolder, dockerTaskEngineConfigProperties.initTaskLog); - this.generateAndBuildTaskLog = path.join(dockerContext.resultOutputFolder, dockerTaskEngineConfigProperties.generateAndBuildTaskLog); - this.mockTestTaskLog = path.join(dockerContext.resultOutputFolder, dockerTaskEngineConfigProperties.mockTestTaskLog); - this.readmeMdPath = dockerContext.readmeMdPath; - this.typespecProjectFolderPath = dockerContext.typespecProjectFolderPath; - this.specRepo = { - repoPath: dockerContext.specRepo, - headSha: dockerTaskEngineConfigProperties.headSha ?? dockerContext.isPublicRepo? - await new GitOperationWrapper(dockerContext.specRepo).getHeadSha() : '', - headRef: dockerTaskEngineConfigProperties.headRef ?? await new GitOperationWrapper(dockerContext.specRepo).getHeadRef(), - repoHttpsUrl: dockerTaskEngineConfigProperties.repoHttpsUrl?? (await new GitOperationWrapper(dockerContext.specRepo).getRemote())?? - `https://github.com/Azure/azure-rest-api-specs` - }; - this.serviceType = (dockerContext.readmeMdPath.includes('data-plane') && dockerTaskEngineConfigProperties.serviceType) || - !!dockerContext.typespecProjectFolderPath ? 'data-plane': 'resource-manager'; - this.tag = dockerContext.tag; - this.sdkRepo = dockerContext.sdkRepo; - this.resultOutputFolder = dockerContext.resultOutputFolder ?? '/tmp/output'; - this.mockServerHost = dockerTaskEngineConfigProperties.mockServerHost; - this.taskResultJsonPath = path.join(dockerContext.resultOutputFolder, dockerTaskEngineConfigProperties.taskResultJson); - this.changeOwner = dockerTaskEngineConfigProperties.changeOwner; - this.mode = dockerContext.mode; - this.autorestConfig = extractAutorestConfigs(dockerContext.autorestConfigFilePath, dockerContext.sdkRepo, dockerContext.logger); - this.skipGeneration = dockerContext.skipGeneration; - } - - public async beforeRunTaskEngine() { - if (!!this.resultOutputFolder && !fs.existsSync(this.resultOutputFolder)) { - fs.mkdirSync(this.resultOutputFolder, { recursive: true }); - } - if (!!this.sdkRepo && fs.existsSync(this.sdkRepo)) { - await new GitOperationWrapper(this.sdkRepo).disableFileMode(); - } - this.logger.info(`Start to run task engine in ${path.basename(this.sdkRepo)}`); - } - - public async afterRunTaskEngine() { - if (this.changeOwner && !!this.specRepo?.repoPath && !!fs.existsSync(this.specRepo.repoPath)) { - const userGroupId = (execSync(`stat -c "%u:%g" ${this.specRepo.repoPath}`, { encoding: 'utf8' })).trim(); - if (!!this.resultOutputFolder && fs.existsSync(this.resultOutputFolder)) { - execSync(`chown -R ${userGroupId} ${this.specRepo.repoPath}`); - } - if (!!this.sdkRepo && fs.existsSync(this.sdkRepo)) { - execSync(`chown -R ${userGroupId} ${this.sdkRepo}`, { encoding: 'utf8' }); - await new GitOperationWrapper(this.sdkRepo).disableFileMode(); - } - } - if (!!this.taskResults) { - writeFileSync(this.taskResultJsonPath, JSON.stringify(this.taskResults, undefined, 2), 'utf-8'); - } - this.logger.info(`Finish running task engine in ${path.basename(this.sdkRepo)}`); - } - - public async getTaskToRun(): Promise { - const codegenToSdkConfig: CodegenToSdkConfig = getCodegenToSdkConfig(requireJsonc(path.join(this.sdkRepo, this.configFilePath))); - this.logger.info(`Get codegen_to_sdk_config.json`); - this.logger.info(JSON.stringify(codegenToSdkConfig, undefined, 2)); - const tasksToRun: SDKGenerationTaskBase[] = []; - for (const taskName of Object.keys(codegenToSdkConfig)) { - let task: SDKGenerationTaskBase; - switch (taskName) { - case 'init': - task = new InitTask(this); - break; - case 'generateAndBuild': - task = new GenerateAndBuildTask(this); - break; - case 'mockTest': - task = new MockTestTask(this); - break; - } - - if (!!task) { - tasksToRun.push(task); - if (!this.taskResults) { - this.taskResults = {}; - } - this.taskResults[taskName] = 'skipped'; - } - } - tasksToRun.sort((a, b) => a.order - b.order); - this.logger.info(`Get tasks to run: ${tasksToRun.map((task) => task.taskType).join(',')}`); - return tasksToRun; - } - - public async runTaskEngine() { - await this.beforeRunTaskEngine(); - try { - const tasksToRun: SDKGenerationTaskBase[] = await this.getTaskToRun(); - for (const task of tasksToRun) { - await task.execute(); - } - } finally { - await this.afterRunTaskEngine(); - } - } -} - diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/constants.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/constants.ts deleted file mode 100644 index 20775e014a3..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/constants.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const sdkToRepoMap = { - 'js': 'azure-sdk-for-js', - 'python': 'azure-sdk-for-python', - 'go': 'azure-sdk-for-go', - 'java': 'azure-sdk-for-java', - '.net': 'azure-sdk-for-net' -}; diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/jobs/BaseJob.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/jobs/BaseJob.ts deleted file mode 100644 index 7b96d8cd5c7..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/jobs/BaseJob.ts +++ /dev/null @@ -1,8 +0,0 @@ -import * as fs from 'fs'; - -export class BaseJob { - public doNotExitDockerContainer() { - // this file will be used by entrypoint.sh to determine whether exit the docker container. - fs.writeFileSync('/tmp/notExit', 'yes', 'utf-8'); - } -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/jobs/GenerateCodesInLocalJob.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/jobs/GenerateCodesInLocalJob.ts deleted file mode 100644 index 08cbca6ce4e..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/jobs/GenerateCodesInLocalJob.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { existsSync } from 'fs'; -import * as path from 'path'; - -import { GitOperationWrapper } from '../../../../utils/GitOperationWrapper'; -import { sdkToRepoMap } from '../constants'; -import { DockerContext } from '../DockerContext'; -import { DockerTaskEngineContext } from '../DockerTaskEngineContext'; -import { BaseJob } from './BaseJob'; - -export class GenerateCodesInLocalJob extends BaseJob { - context: DockerContext; - - constructor(context: DockerContext) { - super(); - this.context = context; - } - - public async cloneRepoIfNotExist(sdkRepos: string[]) { - const gitOperationWrapper = new GitOperationWrapper(this.context.workDir); - for (const sdkRepo of sdkRepos) { - if (!existsSync(path.join(this.context.workDir, sdkRepo))) { - await gitOperationWrapper.cloneRepo(`Azure/${sdkRepo}`, this.context.logger); - } - this.context.sdkRepo = path.join(this.context.workDir, sdkRepo); - } - } - - public async execute() { - const sdkRepos: string[] = this.context.sdkList.map((ele) => sdkToRepoMap[ele]); - await this.cloneRepoIfNotExist(sdkRepos); - for (const sdk of this.context.sdkList) { - this.context.sdkRepo = path.join(this.context.workDir, sdkToRepoMap[sdk]); - const dockerTaskEngineContext = new DockerTaskEngineContext(); - await dockerTaskEngineContext.initialize(this.context); - await dockerTaskEngineContext.runTaskEngine(); - } - - const generatedCodesPath: Map> = new Map(); - - for (const sdk of this.context.sdkList) { - generatedCodesPath[sdk] = await new GitOperationWrapper(path.join(this.context.workDir, sdkToRepoMap[sdk])).getChangedPackageDirectory(); - } - - this.context.logger.info(`Finish generating sdk for ${this.context.sdkList.join(', ')}.`); - for (const sdk of this.context.sdkList) { - if (generatedCodesPath[sdk].size > 0) { - this.context.logger.info(`You can find changed files of ${sdk} in:`); - generatedCodesPath[sdk].forEach((ele) => { - this.context.logger.info(` - ${path.join(this.context.workDir, sdkToRepoMap[sdk], ele)}`); - }); - } else { - this.context.logger.info(`Cannot find changed files of ${sdk} because there is no git diff.`); - } - } - this.context.logger.info(`You can use vscode to connect this docker container for further development.`); - this.doNotExitDockerContainer(); - } -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/jobs/GenerateCodesInPipelineJob.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/jobs/GenerateCodesInPipelineJob.ts deleted file mode 100644 index e1a3e466e01..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/jobs/GenerateCodesInPipelineJob.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { DockerContext } from '../DockerContext'; -import { DockerTaskEngineContext } from '../DockerTaskEngineContext'; -import { BaseJob } from './BaseJob'; - -export class GenerateCodesInPipelineJob extends BaseJob { - context: DockerContext; - - constructor(context: DockerContext) { - super(); - this.context = context; - } - - public async execute() { - const context: DockerTaskEngineContext = new DockerTaskEngineContext(); - await context.initialize(this.context); - await context.runTaskEngine(); - } -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/jobs/GrowUpJob.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/jobs/GrowUpJob.ts deleted file mode 100644 index 69c69c55e9a..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/jobs/GrowUpJob.ts +++ /dev/null @@ -1,72 +0,0 @@ -import * as fs from 'fs'; -import * as path from 'path'; - -import { GitOperationWrapper } from '../../../../utils/GitOperationWrapper'; -import { DockerContext } from '../DockerContext'; -import { BaseJob } from './BaseJob'; - -export class GrowUpJob extends BaseJob { - context: DockerContext; - - constructor(context: DockerContext) { - super(); - this.context = context; - } - - private async cloneSdkWorkBranchIfNotExist() { - if (!this.context.sdkWorkBranchLink) return; - const match = this.context.sdkWorkBranchLink.match(/(https.*\/([^\/]*))\/tree\/(.*)/); - const sdkRepoUrl = match[1]; - const sdkRepo = match[2]; - const branch = match[3]; - if (fs.existsSync(path.join(this.context.workDir, sdkRepo))) { - this.context.logger.info(`${path.join(this.context.workDir, sdkRepo)} has already existed, and no need to clone it.`); - return; - } - const gitOperationWrapper = new GitOperationWrapper(this.context.workDir); - await gitOperationWrapper.cloneBranch(sdkRepoUrl, branch, this.context.logger); - gitOperationWrapper.baseDir = path.join(this.context.workDir, sdkRepo); - await gitOperationWrapper.safeDirectory(); - } - - private async cloneSpecRepoIfNotExist() { - if (!this.context.specLink) return; - if (fs.existsSync(this.context.specRepo)) { - this.context.logger.info(`${this.context.specRepo} has already exited, and no need to clone it`); - return; - } - const gitOperationWrapper = new GitOperationWrapper('/'); - const prLinkMatch = this.context.specLink.match(/http.*\/([^\/]*\/[^\/]*)\/pull\/([0-9]+)/); - const branchLinkMatch = this.context.specLink.match(/(https.*\/[^\/]*)\/tree\/(.*)/); - const mainBranchMatch = this.context.specLink.match(/http.*\/([^\/]*\/[^\/\.]*)/); - if (prLinkMatch?.length === 3) { - const repoName = prLinkMatch[1]; - const prNumber = prLinkMatch[2]; - await gitOperationWrapper.cloneRepo(repoName, this.context.logger, this.context.specRepo); - gitOperationWrapper.changeBaseDir(this.context.specRepo); - await gitOperationWrapper.safeDirectory(); - await gitOperationWrapper.checkoutPr(prNumber); - } else if (branchLinkMatch?.length == 3) { - const repoUrl = branchLinkMatch[1]; - const branch = branchLinkMatch[2]; - await gitOperationWrapper.cloneBranch(repoUrl, branch, this.context.logger, this.context.specRepo); - gitOperationWrapper.changeBaseDir(this.context.specRepo); - await gitOperationWrapper.safeDirectory(); - } else if (mainBranchMatch?.length == 2) { - // spec repo main branch - const repoName = mainBranchMatch[1]; - await gitOperationWrapper.cloneRepo(repoName, this.context.logger, this.context.specRepo); - gitOperationWrapper.changeBaseDir(this.context.specRepo); - await gitOperationWrapper.safeDirectory(); - } else { - throw new Error(`Get invalid spec link: ${this.context.specLink}`); - } - } - - public async execute() { - await this.cloneSpecRepoIfNotExist(); - await this.cloneSdkWorkBranchIfNotExist(); - this.context.logger.info(`Please use vscode to connect this container.`); - this.doNotExitDockerContainer(); - } -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/tasks/GenerateAndBuildTask.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/tasks/GenerateAndBuildTask.ts deleted file mode 100644 index 835e22af5c3..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/tasks/GenerateAndBuildTask.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { - addFileLog, - GenerateAndBuildInput, - GenerateAndBuildOptions, - getGenerateAndBuildOutput, - getTask, - removeFileLog, - requireJsonc, - runScript, - TaskResultStatus -} from '@azure-tools/sdk-generation-lib'; -import fs from 'fs'; -import path from 'path'; - -import { DockerTaskEngineContext } from '../DockerTaskEngineContext'; -import { SDKGenerationTaskBase, TaskType } from './SDKGenerationTaskBase'; - -export class GenerateAndBuildTask implements SDKGenerationTaskBase { - taskType: TaskType; - order: number; - context: DockerTaskEngineContext; - - constructor(context: DockerTaskEngineContext) { - this.taskType = 'GenerateAndBuildTask'; - this.order = 1; - this.context = context; - } - - public async execute() { - const generateAndBuildTask = getTask(path.join(this.context.sdkRepo, this.context.configFilePath), 'generateAndBuild'); - if (!generateAndBuildTask) { - throw new Error(`Generate and build task is ${generateAndBuildTask}`); - } - const generateAndBuildOptions = generateAndBuildTask as GenerateAndBuildOptions; - const runOptions = generateAndBuildOptions.generateAndBuildScript; - const readmeMdAbsolutePath = !!this.context.readmeMdPath? path.join(this.context.specRepo.repoPath, this.context.readmeMdPath) : ''; - const typespecProjectFolderAbsolutPath = !!this.context.typespecProjectFolderPath? - path.join(this.context.specRepo.repoPath, this.context.typespecProjectFolderPath) : ''; - const specRepoPath = this.context.specRepo.repoPath.includes('specification')? - this.context.specRepo.repoPath : path.join(this.context.specRepo.repoPath, 'specification'); - const relatedReadmeMdFileRelativePath = !!readmeMdAbsolutePath? path.relative(specRepoPath, readmeMdAbsolutePath) : ''; - const relatedTypeSpecProjectFolderRelativePath = !!typespecProjectFolderAbsolutPath? path.relative(specRepoPath, typespecProjectFolderAbsolutPath) : ''; - const inputContent: GenerateAndBuildInput = { - specFolder: specRepoPath, - headSha: this.context.specRepo.headSha, - headRef: this.context.specRepo.headRef, - repoHttpsUrl: this.context.specRepo.repoHttpsUrl, - serviceType: this.context.serviceType, - autorestConfig: this.context.autorestConfig, - skipGeneration: this.context.skipGeneration - }; - if (!!relatedTypeSpecProjectFolderRelativePath) { - inputContent.relatedTypeSpecProjectFolder = relatedTypeSpecProjectFolderRelativePath; - } else if (!!relatedReadmeMdFileRelativePath) { - inputContent.relatedReadmeMdFile = relatedReadmeMdFileRelativePath; - } - const inputJson = JSON.stringify(inputContent, undefined, 2); - this.context.logger.info(`Get ${path.basename(this.context.generateAndBuildInputJsonFile)}:`); - this.context.logger.info(inputJson); - fs.writeFileSync(this.context.generateAndBuildInputJsonFile, inputJson, { encoding: 'utf-8' }); - addFileLog(this.context.logger, this.context.generateAndBuildTaskLog, 'generateAndBuild'); - const executeResult = await runScript(runOptions, { - cwd: path.resolve(this.context.sdkRepo), - args: [this.context.generateAndBuildInputJsonFile, this.context.generateAndBuildOutputJsonFile], - envs: this.context.envs, - customizedLogger: this.context.logger - }); - removeFileLog(this.context.logger, 'generateAndBuild'); - this.context.taskResults['generateAndBuild'] = executeResult; - if (executeResult === TaskResultStatus.Failure) { - throw new Error(`Execute generateAndBuild script failed.`); - } - if (fs.existsSync(this.context.generateAndBuildOutputJsonFile)) { - const generateAndBuildOutputJson = getGenerateAndBuildOutput(requireJsonc(this.context.generateAndBuildOutputJsonFile)); - this.context.logger.info(`Get ${path.basename(this.context.generateAndBuildOutputJsonFile)}:`); - this.context.logger.info(JSON.stringify(generateAndBuildOutputJson, undefined, 2)); - const packageFolders: string[] = []; - for (const p of generateAndBuildOutputJson.packages) { - packageFolders.push(p.packageFolder); - if (p.result === TaskResultStatus.Failure) { - this.context.taskResults['generateAndBuild'] = TaskResultStatus.Failure; - } - } - this.context.packageFolders = packageFolders; - } - } -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/tasks/InitTask.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/tasks/InitTask.ts deleted file mode 100644 index 899e2361435..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/tasks/InitTask.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { - addFileLog, - getTask, - InitOptions, - initOutput, - removeFileLog, - requireJsonc, - runScript -} from '@azure-tools/sdk-generation-lib'; -import fs from 'fs'; -import path from 'path'; - -import { DockerTaskEngineContext } from '../DockerTaskEngineContext'; -import { SDKGenerationTaskBase, TaskType } from './SDKGenerationTaskBase'; - -export class InitTask implements SDKGenerationTaskBase { - taskType: TaskType; - order: number; - context: DockerTaskEngineContext; - - constructor(context: DockerTaskEngineContext) { - this.taskType = 'InitTask'; - this.order = 0; - this.context = context; - } - - public async execute() { - const initTask = getTask(path.join(this.context.sdkRepo, this.context.configFilePath), 'init'); - if (!initTask) { - throw new Error(`Init task is ${initTask}`); - } - const initOptions = initTask as InitOptions; - const runOptions = initOptions.initScript; - addFileLog(this.context.logger, this.context.initTaskLog, 'init'); - const executeResult = await runScript(runOptions, { - cwd: path.resolve(this.context.sdkRepo), - args: [this.context.initOutputJsonFile], - customizedLogger: this.context.logger - }); - removeFileLog(this.context.logger, 'init'); - this.context.taskResults['init'] = executeResult; - if (executeResult === 'failed') { - throw new Error(`Execute init script failed.`); - } - if (fs.existsSync(this.context.initOutputJsonFile)) { - const initOutputJson = initOutput(requireJsonc(this.context.initOutputJsonFile)); - this.context.logger.info(`Get ${path.basename(this.context.initOutputJsonFile)}:`); - this.context.logger.info(JSON.stringify(initOutputJson, undefined, 2)); - - if (initOutputJson?.envs) { - this.context.envs = initOutputJson.envs; - } - } - } -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/tasks/MockTestTask.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/tasks/MockTestTask.ts deleted file mode 100644 index fd99f9ac9e1..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/tasks/MockTestTask.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { - addFileLog, - getTask, - getTestOutput, - MockTestInput, - MockTestOptions, removeFileLog, requireJsonc, - runScript, TaskResultStatus -} from '@azure-tools/sdk-generation-lib'; -import fs from 'fs'; -import path from 'path'; - -import { DockerTaskEngineContext } from '../DockerTaskEngineContext'; -import { SDKGenerationTaskBase, TaskType } from './SDKGenerationTaskBase'; - -export class MockTestTask implements SDKGenerationTaskBase { - context: DockerTaskEngineContext; - order: number; - taskType: TaskType; - - constructor(context: DockerTaskEngineContext) { - this.taskType = 'MockTestTask'; - this.order = 2; - this.context = context; - } - - public async execute() { - if (this.context.taskResults?.['generateAndBuild'] !== TaskResultStatus.Success) return; - const mockTestTask = getTask(path.join(this.context.sdkRepo, this.context.configFilePath), 'mockTest'); - if (!mockTestTask) { - throw new Error(`Init task is ${mockTestTask}`); - } - const mockTestOptions = mockTestTask as MockTestOptions; - const runOptions = mockTestOptions.mockTestScript; - for (const packageFolder of this.context.packageFolders) { - this.context.logger.info(`Run MockTest for ${packageFolder}`); - - const inputContent: MockTestInput = { - packageFolder: path.join(this.context.sdkRepo, packageFolder), - mockServerHost: this.context.mockServerHost - }; - const inputJson = JSON.stringify(inputContent, undefined, 2); - const formattedPackageName = packageFolder.replace(/[^a-zA-z0-9]/g, '-'); - const mockTestInputJsonPath = this.context.packageFolders.length > 1 ? - this.context.mockTestInputJsonFile.replace('.json', `${formattedPackageName}.json`) : this.context.mockTestInputJsonFile; - const mockTestOutputJsonPath = this.context.packageFolders.length > 1 ? - this.context.mockTestOutputJsonFile.replace('.json', `${formattedPackageName}.json`) : this.context.mockTestOutputJsonFile; - const mockTestTaskLogPath = this.context.packageFolders.length > 1 ? - this.context.mockTestTaskLog.replace('task.log', `${formattedPackageName}-task.log`) : this.context.mockTestTaskLog; - fs.writeFileSync(mockTestInputJsonPath, inputJson, { encoding: 'utf-8' }); - this.context.logger.info(`Get ${path.basename(mockTestInputJsonPath)}:`); - this.context.logger.info(inputJson); - addFileLog(this.context.logger, mockTestTaskLogPath, `mockTest_${formattedPackageName}`); - const executeResult = await runScript(runOptions, { - cwd: path.resolve(this.context.sdkRepo), - args: [mockTestInputJsonPath, mockTestOutputJsonPath], - envs: this.context.envs, - customizedLogger: this.context.logger - }); - this.context.taskResults['mockTest'] = executeResult === TaskResultStatus.Success && - this.context.taskResults['mockTest'] !== TaskResultStatus.Failure ? - TaskResultStatus.Success : TaskResultStatus.Failure; - removeFileLog(this.context.logger, `mockTest_${formattedPackageName}`); - if (fs.existsSync(mockTestOutputJsonPath)) { - const mockTestOutputJson = getTestOutput(requireJsonc(mockTestOutputJsonPath)); - this.context.logger.info(`Get ${path.basename(mockTestOutputJsonPath)}:`); - this.context.logger.info(JSON.stringify(mockTestOutputJson, undefined, 2)); - } - if (this.context.taskResults['mockTest'] === TaskResultStatus.Failure) { - throw new Error('Run Mock Test Failed'); - } - } - } -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/tasks/SDKGenerationTaskBase.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/tasks/SDKGenerationTaskBase.ts deleted file mode 100644 index 62ba8cf5abe..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/core/tasks/SDKGenerationTaskBase.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { DockerTaskEngineContext } from '../DockerTaskEngineContext'; - -export type TaskType = 'InitTask' | 'GenerateAndBuildTask' | 'MockTestTask'; - -export interface SDKGenerationTaskBase { - taskType: TaskType; - context: DockerTaskEngineContext; - order: number; - execute(); -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/dockerCli.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/dockerCli.ts deleted file mode 100644 index e802dccef26..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/dockerCli.ts +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env node -import { DockerContext } from './core/DockerContext'; -import { DockerRunningModel } from './core/DockerRunningModel'; -import { GenerateCodesInLocalJob } from './core/jobs/GenerateCodesInLocalJob'; -import { GenerateCodesInPipelineJob } from './core/jobs/GenerateCodesInPipelineJob'; -import { GrowUpJob } from './core/jobs/GrowUpJob'; -import { DockerCliInput, dockerCliInput } from './schema/dockerCliInput'; - -async function main() { - const inputParams: DockerCliInput = dockerCliInput.getProperties(); - const context: DockerContext = new DockerContext(); - context.initialize(inputParams); - - let executeJob: GenerateCodesInLocalJob | GrowUpJob | GenerateCodesInPipelineJob; - - switch (context.mode) { - case DockerRunningModel.CodeGenAndGrowUp: - executeJob = new GenerateCodesInLocalJob(context); - break; - case DockerRunningModel.GrowUp: - executeJob = new GrowUpJob(context); - break; - case DockerRunningModel.Pipeline: - executeJob = new GenerateCodesInPipelineJob(context); - break; - } - - if (!!executeJob) { - await executeJob.execute(); - } -} - -main().catch((e) => { - console.error('\x1b[31m', e.toString()); - console.error('\x1b[31m', e.message); - console.error('\x1b[31m', e.stack); - process.exit(1); -}); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/runMockHostCli.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/runMockHostCli.ts deleted file mode 100644 index 5dec4c41fbb..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/runMockHostCli.ts +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/env node - -import { initializeLogger } from '@azure-tools/sdk-generation-lib'; -import { spawn } from 'child_process'; -import fs from 'fs'; -import * as path from 'path'; -import { Logger } from 'winston'; - -import { DockerCliInput, dockerCliInput } from './schema/dockerCliInput'; -import { DockerMockHostInput, dockerMockHostInput } from './schema/mockHostCliInput'; - -export type DockerMockHostContext = { - readmeMdPath?: string; - specRepo?: string; - mockHostPath: string; - logger: Logger; -} - -export function initializeDockerMockHostContext(inputParams: DockerMockHostInput & DockerCliInput) { - const dockerMockHostConfigProperties = dockerMockHostInput.getProperties(); - const dockerMockHostContext: DockerMockHostContext = { - readmeMdPath: inputParams.readmeMdPath, - specRepo: inputParams.specRepo, - mockHostPath: dockerMockHostConfigProperties.mockHostPath, - logger: initializeLogger(path.join(inputParams.resultOutputFolder, dockerMockHostConfigProperties.mockHostLogger), 'mock-host', false) - }; - return dockerMockHostContext; -} - -export async function runMockHost() { - const inputParams: DockerMockHostInput & DockerCliInput = { - ...dockerCliInput.getProperties(), - ...dockerMockHostInput.getProperties() - }; - const context = initializeDockerMockHostContext(inputParams); - if (!context.specRepo) { - context.logger.log('cmdout', `Cannot start mock server because ${context.specRepo} doesn't exist.`); - return; - } - - function sleep(ms) { - return new Promise((resolve) => { - setTimeout(resolve, ms); - }); - } - - while (!fs.existsSync(context.specRepo)) { - await sleep(10000); - } - - if (!context.readmeMdPath) { - context.logger.log('cmdout', `Cannot get valid readme, so do not start mock server.`); - return; - } - const swaggerJsonFilePattern = context.readmeMdPath.replace(/readme[.a-z-]*.md/gi, '**/*.json'); - const child = spawn(`node`, [`node_modules/@azure-tools/mock-service-host/dist/src/main.js`], { - cwd: context.mockHostPath, - env: { - ...process.env, - 'specRetrievalMethod': 'filesystem', - 'specRetrievalLocalRelativePath': context.specRepo, - 'validationPathsPattern': swaggerJsonFilePattern - } - }); - child.stdout.on('data', (data) => context.logger.log('cmdout', data.toString())); - child.stderr.on('data', (data) => context.logger.log('cmderr', data.toString())); -} - -runMockHost(); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/schema/dockerCliInput.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/schema/dockerCliInput.ts deleted file mode 100644 index 1d36844f1bd..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/schema/dockerCliInput.ts +++ /dev/null @@ -1,121 +0,0 @@ -import convict from 'convict'; -import * as dotenv from 'dotenv'; - -dotenv.config(); - -export class DockerCliInput { - readmeMdPath: string; - typespecProjectFolderPath: string; - tag: string; - sdkList: string; - specRepo: string; - workDir: string; - sdkRepo: string; - resultOutputFolder: string; - dockerLogger: string; - autorestConfigFilePath: string; - specLink: string; - sdkWorkBranchLink: string; - skipGeneration: boolean; - isPublicRepo: boolean; -} - -export const dockerCliInput = convict({ - readmeMdPath: { - default: '', - env: 'README_MD_PATH', - arg: 'readme', - format: String, - doc: 'The relative path to readme.md, which is from the root of spec repo' - }, - typespecProjectFolderPath: { - default: '', - env: 'TYPESPEC_PROJECT', - arg: 'typespec-project', - format: String, - doc: 'The relative path to typespec project folder, which is from the root of spec repo' - }, - tag: { - default: '', - env: 'TAG', - arg: 'tag', - format: String, - doc: 'The tag used to generated codes. If not defined, default tag will be used' - }, - sdkList: { - default: '', - env: 'SDK', - arg: 'sdk', - format: String, - doc: 'which language of sdks do you want to generate? you can input multi language splitted by comma' - }, - specRepo: { - default: '/spec-repo', - env: 'SPEC_REPO', - arg: 'spec-repo', - format: String, - doc: 'the absolute path of the mounted spec repo' - }, - workDir: { - default: '/work-dir', - env: 'WORK_DIR', - arg: 'work-dir', - format: String, - doc: 'the absolute path of work directory, which contains all sdk repos' - }, - sdkRepo: { - default: '/sdk-repo', - env: 'SDK_REPO', - arg: 'sdk-repo', - format: String, - doc: 'the absolute path of sdk repo' - }, - resultOutputFolder: { - default: '/tmp/output', - env: 'RESULT_OUTPUT_FOLDER', - arg: 'result-output-folder', - format: String, - doc: 'the absolute path of output folder, which stores the result of task engine' - }, - dockerLogger: { - default: 'docker.log', - env: 'DOCKER_LOGGER', - arg: 'docker-logger', - format: String, - doc: 'the path of docker.log. it will concat with resultOutputFolder' - }, - autorestConfigFilePath: { - default: '/autorest.md', - env: 'AUTOREST_CONFIG_FILE_PATH', - format: String, - doc: `The absolute path to autorest configuration file. It's required when you want to input your own autorest config in generating data-plane sdk.` - }, - specLink: { - default: '', - env: 'SPEC_LINK', - arg: 'spec-link', - format: String, - doc: `The link to spec repo or spec PR.` - }, - sdkWorkBranchLink: { - default: '', - env: 'SDK_WORK_BRANCH', - arg: 'sdk-work-branch', - format: String, - doc: `The link of sdk work branch generated by pipeline.` - }, - skipGeneration: { - default: false, - env: 'SKIP_GENERATION', - arg: 'skip-generation', - format: Boolean, - doc: `Whether skip generation` - }, - isPublicRepo: { - default: true, - env: 'IS_PUBLIC_REPO', - arg: 'is-public-repo', - format: Boolean, - doc: `Whether Spec Repo is public. IT's related to authentication when running docker in pipeline. In other scenarios, it's always false` - } -}); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/schema/dockerTaskEngineInput.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/schema/dockerTaskEngineInput.ts deleted file mode 100644 index d51f827e32e..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/schema/dockerTaskEngineInput.ts +++ /dev/null @@ -1,128 +0,0 @@ -import convict from 'convict'; -import * as dotenv from 'dotenv'; - -dotenv.config(); - -export class DockerTaskEngineInput { - configFilePath: string; - initOutputJsonFile: string; - generateAndBuildInputJsonFile: string; - generateAndBuildOutputJsonFile: string; - mockTestInputJsonFile: string; - mockTestOutputJsonFile: string; - headSha: string | undefined; - headRef: string | undefined; - repoHttpsUrl: string | undefined; - serviceType: string; - mockServerHost?: string; - initTaskLog: string; - generateAndBuildTaskLog: string; - mockTestTaskLog: string; - taskResultJson: string; - changeOwner: boolean; -} - -export const dockerTaskEngineInput = convict({ - configFilePath: { - default: 'eng/codegen_to_sdk_config.json', - env: 'CONFIG_FILE_PATH', - arg: 'configFilePath', - format: String, - doc: 'The relative path to codegen_to_sdk_config.json' - }, - initOutputJsonFile: { - default: 'initOutput.json', - env: 'INIT_OUTPUT_JSON_FILE', - arg: 'initOutputJsonFile', - format: String, - doc: 'The relative path to initOut.json. It will concat with resultOutputFolder' - }, - generateAndBuildInputJsonFile: { - default: 'generateAndBuildInput.json', - env: 'GENERATE_AND_BUILD_INPUT_JSON_FILE', - arg: 'generateAndBuildInputJsonFile', - format: String, - doc: 'The relative path to generateAndBuildInput.json. It will concat with resultOutputFolder' - }, - generateAndBuildOutputJsonFile: { - default: 'generateAndBuildOutputJson.json', - env: 'GENERATE_AND_BUILD_OUTPUT_JSON_File', - arg: 'generateAndBuildOutputJsonFile', - format: String, - doc: 'The relative path to generateAndBuildOutput.json. It will concat with resultOutputFolder' - }, - mockTestInputJsonFile: { - default: 'mockTestInput.json', - env: 'MOCK_TEST_INPUT_JSON_FILE', - arg: 'mockTestInputJsonFile', - format: String, - doc: 'The relative path to mockTestInput.json. It will concat with resultOutputFolder' - }, - mockTestOutputJsonFile: { - default: 'mockTestOutput.json', - env: 'MOCK_TEST_OUTPUT_JSON_FILE', - arg: 'mockTestOutputJsonFile', - format: String, - doc: 'The relative path to mockTestOutput.json. It will concat with resultOutputFolder' - }, - headSha: { - default: undefined, - env: 'HEAD_SHA', - format: String, - doc: 'headSha of spec repo' - }, - headRef: { - default: undefined, - env: 'HEAD_REF', - format: String, - doc: 'headRef of spec repo' - }, - repoHttpsUrl: { - default: undefined, - env: 'REPO_HTTP_URL', - format: String, - doc: 'The http url of spec repo' - }, - serviceType: { - default: 'resource-manager', - env: 'SERVICE_TYPE', - format: String, - doc: 'resource-manager or data-plane' - }, - mockServerHost: { - default: 'https://localhost:8443', - env: 'MOCK_SERVER_HOST', - format: String, - doc: 'The host of mocker server' - }, - initTaskLog: { - default: 'init-task.log', - env: 'INIT_TASK_LOG', - format: String, - doc: 'The relative path to init-task.log. It will concat with resultOutputFolder' - }, - generateAndBuildTaskLog: { - default: 'generateAndBuild-task.log', - env: 'GENERATE_AND_BUILD_TASK_LOG', - format: String, - doc: 'The relative path to generate-and-build-task.log. It will concat with resultOutputFolder' - }, - mockTestTaskLog: { - default: 'mockTest-task.log', - env: 'MOCK_TEST_TASK_LOG', - format: String, - doc: 'The relative path to mock-test-task.log. It will concat with resultOutputFolder' - }, - taskResultJson: { - default: 'taskResults.json', - env: 'TASK_RESULT_JSON', - format: String, - doc: 'The relative path to taskResult.json. It will concat with resultOutputFolder' - }, - changeOwner: { - default: true, - env: 'CHANGE_OWNER', - format: Boolean, - doc: 'When the commands run in docker, it is required to change the sdk owner because generated codes is owned by root' - } -}); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/schema/mockHostCliInput.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/schema/mockHostCliInput.ts deleted file mode 100644 index 5c98d76f197..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/dockerCli/schema/mockHostCliInput.ts +++ /dev/null @@ -1,26 +0,0 @@ -import convict from 'convict'; -import * as dotenv from 'dotenv'; - -dotenv.config(); - -export class DockerMockHostInput { - mockHostLogger: string; - mockHostPath: string; -} - -export const dockerMockHostInput = convict({ - mockHostLogger: { - default: 'mock-host.log', - env: 'MOCK_HOST_LOGGER', - arg: 'mock-host-logger', - format: String, - doc: 'the path of mock-host.log. it will concat with resultOutputFolder' - }, - mockHostPath: { - default: '/mock-host', - env: 'MOCK_HOST_PATH', - arg: 'mock-host-path', - format: String, - doc: 'the path of mock-host' - } -}); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/pipelineCli/generateResultCli.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/pipelineCli/generateResultCli.ts deleted file mode 100644 index 9656fb56206..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/pipelineCli/generateResultCli.ts +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env node -import { - AzureSDKTaskName, - createTaskResult, - LogFilter, - logger, - requireJsonc, - TaskOutput, - TaskResult, - TaskResultStatus -} from '@azure-tools/sdk-generation-lib'; -import * as fs from 'fs'; - -import { GenerateResultCliInput, generateResultCliInput } from '../../cliSchema/generateResultCliConfig'; - - -generateResultCliInput.validate(); -const config: GenerateResultCliInput = generateResultCliInput.getProperties(); - -async function main() { - let taskOutputObj: TaskOutput = undefined; - let logFilter: LogFilter = undefined; - let taskResult: TaskResult = undefined; - let exeResult: TaskResultStatus = undefined; - - if (!Object.values(AzureSDKTaskName).includes(config.taskName as AzureSDKTaskName)) { - throw new Error(`invalid taskName` + config.taskName); - } - - if (!config.exeResult && !config.dockerResultFile) { - throw new Error(`Task execute result and dockerResultFile is empty`); - } - - if (config.taskOutputPath && fs.existsSync(config.taskOutputPath)) { - taskOutputObj = requireJsonc(config.taskOutputPath); - } - if (config.logFilterStr) { - logFilter = JSON.parse(config.logFilterStr); - } - - if (config.exeResult) { - exeResult = config.exeResult as TaskResultStatus; - } else if (config.dockerResultFile && fs.existsSync(config.dockerResultFile)) { - const dockerTaskResult = JSON.parse(fs.readFileSync(config.dockerResultFile, 'utf-8')); - if (!dockerTaskResult[config.taskName] || dockerTaskResult[config.taskName].includes('skipped')) { - return; - } else { - exeResult = dockerTaskResult[config.taskName]; - } - } else { - throw new Error(`exeResult is not provided.`); - } - - taskResult = createTaskResult( - config.pipelineBuildId, - config.taskName as AzureSDKTaskName, - exeResult, - config.logfile, - logFilter, - taskOutputObj - ); - - fs.writeFileSync(config.resultOutputPath, JSON.stringify(taskResult, null, 2), { - encoding: 'utf-8' - }); - console.log('Generate Success !!!'); - - return; -} - -main().catch((e) => { - logger.error(`${e.message} - ${e.stack}`); - process.exit(1); -}); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/pipelineCli/getRepoNameCli.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/pipelineCli/getRepoNameCli.ts deleted file mode 100644 index a4f45aaa23d..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/pipelineCli/getRepoNameCli.ts +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env node -import { logger } from '@azure-tools/sdk-generation-lib'; -import * as path from 'path'; - -async function main(repoKey: string, repoUrl: string) { - repoUrl = repoUrl.replace('.git', ''); - if (repoUrl.endsWith('/')) { - repoUrl = repoUrl.substring(0, repoUrl.length - 1); - } - const repoUrlSplit = repoUrl.split('/'); - const repoName = repoUrlSplit[repoUrlSplit.length - 1]; - console.log(`##vso[task.setVariable variable=${repoKey}]${path.join(path.resolve('.'), repoName)}`); -} - -const repoUrl = process.argv.pop(); -const repoKey = process.argv.pop(); -main(repoKey, repoUrl).catch((e) => { - logger.error(`${e.message} - ${e.stack}`); -}); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/pipelineCli/prepareArtifactFilesCli.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/pipelineCli/prepareArtifactFilesCli.ts deleted file mode 100644 index 46b4b0a00e6..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/pipelineCli/prepareArtifactFilesCli.ts +++ /dev/null @@ -1,205 +0,0 @@ -#!/usr/bin/env node -import { - CompletedEvent, - GenerateAndBuildOutput, - generateTotalResult, - getGenerateAndBuildOutput, - getTaskResults, - InProgressEvent, - logger, - PipelineRunEvent, - requireJsonc, - SDK, - SDKPipelineStatus, - TaskResult, - Trigger -} from '@azure-tools/sdk-generation-lib'; -import * as fs from 'fs'; -import * as path from 'path'; - -import { - PrepareArtifactFilesInput, - prepareArtifactFilesInput, - PrepareResultArtifactInput, - prepareResultArtifactInput -} from '../../cliSchema/prepareArtifactFilesCliConfig'; -import { GitOperationWrapper } from '../../utils/GitOperationWrapper'; - -function copyFile(filePath: string, targetDir: string) { - if (!fs.existsSync(filePath)) { - logger.info(`${filePath} isn't exist, skipped it.`); - return; - } - const fileDir = path.dirname(filePath); - fs.mkdirSync(`${targetDir}/${fileDir}`, { recursive: true }); - fs.copyFileSync(`${filePath}`, `${targetDir}/${filePath}`); -} - -async function prepareSourceCode( - generateAndBuildOutput: GenerateAndBuildOutput, - language: string, - artifactDir: string -) { - for (const p of generateAndBuildOutput.packages) { - const packageName = p.packageName; - const packagePaths = p.path; - - for (const packagePath of packagePaths) { - if (!fs.existsSync(packagePath)) { - logger.warn(`${packagePath} isn't exist`); - continue; - } - - if (fs.lstatSync(packagePath).isDirectory()) { - const gitOperationWrapper: GitOperationWrapper = new GitOperationWrapper(packagePath); - - for (const filePath of await gitOperationWrapper.getFileListInPackageFolder(packagePath)) { - copyFile( - `${path.join(packagePath, filePath)}`, - `${artifactDir}/${language}/sourceCode/${packageName}` - ); - } - } else { - copyFile(packagePath, `${artifactDir}/${language}/sourceCode/${packageName}`); - } - } - } -} - -async function prepareArtifacts(generateAndBuildOutput: GenerateAndBuildOutput, language: string, artifactDir: string) { - for (const p of generateAndBuildOutput.packages) { - const artifacts = p.artifacts; - if (!artifacts) { - // artifacts is optional - continue; - } - - fs.mkdirSync(`${artifactDir}/${language}/artifact`, { recursive: true }); - for (const artifact of artifacts) { - const artifactName = path.basename(artifact); - fs.copyFileSync(`${artifact}`, `${artifactDir}/${language}/artifact/${artifactName}`); - } - } -} - -function validateInput(config: PrepareArtifactFilesInput) { - if (!fs.existsSync(config.generateAndBuildOutputFile)) { - logger.error(`generateAndBuildOutputFile:${config.generateAndBuildOutputFile} isn's exist!`); - process.exit(0); - } - if (!fs.existsSync(config.artifactDir)) { - throw new Error(`Invalid artifactDir:${config.artifactDir}!`); - } - if (!(Object).values(SDK).includes(config.language)) { - throw new Error(config.language + ` is not supported.`); - } -} - -async function prepareSourceCodeAndArtifacts() { - prepareArtifactFilesInput.validate(); - const config: PrepareArtifactFilesInput = prepareArtifactFilesInput.getProperties(); - - validateInput(config); - const generateAndBuildOutput: GenerateAndBuildOutput = getGenerateAndBuildOutput( - requireJsonc(config.generateAndBuildOutputFile) - ); - - await prepareSourceCode(generateAndBuildOutput, config.language, config.artifactDir); - await prepareArtifacts(generateAndBuildOutput, config.language, config.artifactDir); -} - -function validateResultInput(config: PrepareResultArtifactInput) { - if (!fs.existsSync(config.artifactDir)) { - throw new Error(`Invalid artifactDir:${config.artifactDir}!`); - } -} - -function getTrigger(config: PrepareResultArtifactInput): Trigger { - let trigger: Trigger; - try { - trigger = JSON.parse(config.trigger); - } catch (error) { - logger.error(`Wrong json format:` + config.trigger); - throw new Error(error); - } - - return trigger; -} - -function prepareResult(pipelineStatus: SDKPipelineStatus) { - prepareResultArtifactInput.validate(); - const config: PrepareResultArtifactInput = prepareResultArtifactInput.getProperties(); - - validateResultInput(config); - const trigger: Trigger = getTrigger(config); - let event: PipelineRunEvent = undefined; - - switch (pipelineStatus) { - case 'in_progress': - event = { - status: 'in_progress', - trigger: trigger, - pipelineBuildId: config.pipelineBuildId - } as InProgressEvent; - break; - case 'completed': - if (!config.resultsPath || !config.logPath) { - throw new Error(`Invalid completed event parameter!`); - } - - const taskResults: TaskResult[] = getTaskResults(config.resultsPath); - const taskTotalResult: TaskResult = generateTotalResult(taskResults, config.pipelineBuildId); - event = { - status: 'completed', - trigger: trigger, - pipelineBuildId: config.pipelineBuildId, - logPath: config.logPath, - result: taskTotalResult - } as CompletedEvent; - break; - default: - throw new Error(`Unsupported status: ` + (pipelineStatus as string)); - } - - fs.writeFileSync(config.artifactDir + `/` + pipelineStatus + `/result.json`, JSON.stringify(event, null, 2), { - encoding: 'utf-8' - }); -} - -async function main() { - const args = parseArgs(process.argv); - const pipelineStatus = args['pipelineStatus']; - - if (pipelineStatus === 'completed') { - prepareResult(pipelineStatus); - await prepareSourceCodeAndArtifacts(); - } else if (pipelineStatus === 'in_progress') { - prepareResult(pipelineStatus); - } else { - throw new Error(`Unknown pipelineStatus:${pipelineStatus}!`); - } -} - -/** - * Parse a list of command line arguments. - * @param argv List of cli args(process.argv) - */ -const flagRegex = /^--([^=:]+)([=:](.+))?$/; -export function parseArgs(argv: string[]) { - const result: any = {}; - for (const arg of argv) { - const match = flagRegex.exec(arg); - if (match) { - const key = match[1]; - const rawValue = match[3]; - result[key] = rawValue; - } - } - return result; -} - -main().catch((e) => { - logger.error(`${e.message} - ${e.stack}`); - process.exit(1); -}); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/pipelineCli/publishResultCli.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/pipelineCli/publishResultCli.ts deleted file mode 100644 index b9583a15788..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/pipelineCli/publishResultCli.ts +++ /dev/null @@ -1,213 +0,0 @@ -#!/usr/bin/env node -import { - AzureSDKTaskName, - BlobBasicContext, - CodeGeneration, - CompletedEvent, - generateTotalResult, - getTaskResults, - InProgressEvent, - logger, - MongoConnectContext, - PipelineRunEvent, - QueuedEvent, - requireJsonc, - ResultBlobPublisher, - ResultDBPublisher, - ResultEventhubPublisher, - SDKPipelineStatus, - StorageType, - TaskResult, - Trigger -} from '@azure-tools/sdk-generation-lib'; -import * as fs from 'fs'; - -import { - ResultPublisherBlobInput, - resultPublisherBlobInput, - ResultPublisherDBCodeGenerationInput, - resultPublisherDBCodeGenerationInput, - ResultPublisherDBResultInput, - resultPublisherDBResultInput, - ResultPublisherEventHubInput, - resultPublisherEventHubInput -} from '../../cliSchema/publishResultConfig'; - -async function publishBlob() { - resultPublisherBlobInput.validate(); - const config: ResultPublisherBlobInput = resultPublisherBlobInput.getProperties(); - const context: BlobBasicContext = { - pipelineBuildId: config.pipelineBuildId, - sdkGenerationName: config.sdkGenerationName, - azureStorageBlobSasUrl: config.azureStorageBlobSasUrl, - azureBlobContainerName: config.azureBlobContainerName - }; - const resultBlobPublisher: ResultBlobPublisher = new ResultBlobPublisher(context); - await resultBlobPublisher.uploadLogsAndResult(config.logsAndResultPath, config.taskName as AzureSDKTaskName); -} - -function initCodegen(config: ResultPublisherDBCodeGenerationInput, pipelineStatus: SDKPipelineStatus): CodeGeneration { - const cg: CodeGeneration = new CodeGeneration(); - cg.name = config.sdkGenerationName; - cg.service = config.service; - cg.serviceType = config.serviceType; - cg.tag = config.tag; - cg.sdk = config.language; - cg.swaggerRepo = config.swaggerRepo; - cg.sdkRepo = config.sdkRepo; - cg.codegenRepo = config.codegenRepo; - cg.owner = config.owner ? config.owner : ''; - cg.type = config.triggerType; - cg.status = pipelineStatus; - cg.lastPipelineBuildID = config.pipelineBuildId; - cg.swaggerPR = config.swaggerRepo; - - return cg; -} - -function initMongoConnectContext(config: ResultPublisherDBCodeGenerationInput): MongoConnectContext { - const mongoConnectContext: MongoConnectContext = { - name: 'mongodb', - type: 'mongodb', - host: config.mongodb.server, - port: config.mongodb.port, - username: config.mongodb.username, - password: config.mongodb.password, - database: config.mongodb.database, - ssl: config.mongodb.ssl, - synchronize: true, - logging: true - }; - - return mongoConnectContext; -} - -async function publishDB(pipelineStatus: SDKPipelineStatus) { - resultPublisherDBCodeGenerationInput.validate(); - const config: ResultPublisherDBCodeGenerationInput = resultPublisherDBCodeGenerationInput.getProperties(); - const cg: CodeGeneration = initCodegen(config, pipelineStatus); - const mongoConnectContext: MongoConnectContext = initMongoConnectContext(config); - const publisher: ResultDBPublisher = new ResultDBPublisher(mongoConnectContext); - - await publisher.connectDB(); - await publisher.sendSdkGenerationToDB(cg); - - if (pipelineStatus === 'completed') { - resultPublisherDBResultInput.validate(); - const resultConfig: ResultPublisherDBResultInput = resultPublisherDBResultInput.getProperties(); - const taskResultsPathArray = JSON.parse(resultConfig.taskResultsPath); - const taskResults: TaskResult[] = []; - - for (const taskResultPath of taskResultsPathArray) { - if (fs.existsSync(taskResultPath)) { - taskResults.push(requireJsonc(taskResultPath)); - } else { - logger.error(`SendSdkGenerationToDB failed !, ${taskResultPath} isn't exist`); - } - } - - await publisher.sendSdkTaskResultToDB(resultConfig.pipelineBuildId, taskResults); - } - - await publisher.close(); -} - -function getTrigger(config: ResultPublisherEventHubInput): Trigger { - let trigger: Trigger; - try { - trigger = JSON.parse(config.trigger); - } catch (error) { - logger.error(`Wrong json format:` + config.trigger); - throw new Error(error); - } - - return trigger; -} - -async function publishEventhub(pipelineStatus: SDKPipelineStatus) { - resultPublisherEventHubInput.validate(); - const config: ResultPublisherEventHubInput = resultPublisherEventHubInput.getProperties(); - const trigger: Trigger = getTrigger(config); - let event: PipelineRunEvent = undefined; - const publisher: ResultEventhubPublisher = new ResultEventhubPublisher(config.eventHubConnectionString); - - switch (pipelineStatus) { - case 'queued': - event = { - status: 'queued', - trigger: trigger, - pipelineBuildId: config.pipelineBuildId - } as QueuedEvent; - break; - case 'in_progress': - event = { - status: 'in_progress', - trigger: trigger, - pipelineBuildId: config.pipelineBuildId - } as InProgressEvent; - break; - case 'completed': - if (!config.resultsPath || !config.logPath) { - throw new Error(`Invalid completed event parameter!`); - } - - const taskResults: TaskResult[] = getTaskResults(config.resultsPath); - const taskTotalResult: TaskResult = generateTotalResult(taskResults, config.pipelineBuildId); - event = { - status: 'completed', - trigger: trigger, - pipelineBuildId: config.pipelineBuildId, - logPath: config.logPath, - result: taskTotalResult - } as CompletedEvent; - break; - default: - throw new Error(`Unsupported status: ` + (pipelineStatus as string)); - } - await publisher.publishEvent(event); - await publisher.close(); -} - -async function main() { - const args = parseArgs(process.argv); - const storageType = args['storageType']; - const pipelineStatus = args['pipelineStatus']; - - switch (storageType as StorageType) { - case StorageType.Blob: - await publishBlob(); - break; - case StorageType.Db: - await publishDB(pipelineStatus); - break; - case StorageType.EventHub: - await publishEventhub(pipelineStatus); - break; - default: - throw new Error(`Unknown storageType:${storageType}!`); - } -} - -/** - * Parse a list of command line arguments. - * @param argv List of cli args(process.argv) - */ -const flagRegex = /^--([^=:]+)([=:](.+))?$/; -export function parseArgs(argv: string[]) { - const result: any = {}; - for (const arg of argv) { - const match = flagRegex.exec(arg); - if (match) { - const key = match[1]; - const rawValue = match[3]; - result[key] = rawValue; - } - } - return result; -} - -main().catch((e) => { - logger.error(`${e.message} - ${e.stack}`); - process.exit(1); -}); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/pipelineCli/uploadArtifactCli.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/pipelineCli/uploadArtifactCli.ts deleted file mode 100644 index d84bb061bcb..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/pipelineCli/uploadArtifactCli.ts +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env node -import { - ArtifactBlobUploader, - ArtifactBlobUploaderContext, - GenerateAndBuildOutput, - getGenerateAndBuildOutput, - logger, - requireJsonc -} from '@azure-tools/sdk-generation-lib'; -import * as fs from 'fs'; - -import { UploadBlobInput, uploadBlobInput } from '../../cliSchema/uploadArtifactConfig'; - -async function main() { - uploadBlobInput.validate(); - const config: UploadBlobInput = uploadBlobInput.getProperties(); - if (!fs.existsSync(config.generateAndBuildOutputFile)) { - throw new Error(`generateAndBuildOutputFile:${config.generateAndBuildOutputFile} isn's exist!`); - } - - const blobContext: ArtifactBlobUploaderContext = { - azureStorageBlobSasUrl: config.azureStorageBlobSasUrl, - azureBlobContainerName: config.azureBlobContainerName, - language: config.language, - pipelineBuildId: config.pipelineBuildId - }; - const artifactBlobUploader: ArtifactBlobUploader = new ArtifactBlobUploader(blobContext); - const generateAndBuildOutputJson: GenerateAndBuildOutput = getGenerateAndBuildOutput( - requireJsonc(config.generateAndBuildOutputFile) - ); - - await artifactBlobUploader.uploadSourceCode(generateAndBuildOutputJson); - await artifactBlobUploader.uploadArtifacts(generateAndBuildOutputJson); -} - -main().catch((e) => { - logger.error(`${e.message} - ${e.stack}`); - process.exit(1); -}); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cliSchema/generateResultCliConfig.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cliSchema/generateResultCliConfig.ts deleted file mode 100644 index 6cbb3ff901c..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cliSchema/generateResultCliConfig.ts +++ /dev/null @@ -1,61 +0,0 @@ -import convict from 'convict'; - -import { assertNullOrEmpty } from '../utils/validator'; - -export class GenerateResultCliInput { - pipelineBuildId: string; - logfile: string; - logFilterStr?: string; - taskName: string; - exeResult?: string; - taskOutputPath?: string; - resultOutputPath: string; - dockerResultFile?: string; -} - -export const generateResultCliInput = convict({ - pipelineBuildId: { - default: null, - format: assertNullOrEmpty, - arg: 'buildId' - }, - logfile: { - default: null, - format: assertNullOrEmpty, - arg: 'logfile' - }, - logFilterStr: { - default: null, - nullable: true, - format: String, - arg: 'logFilterStr' - }, - taskName: { - default: null, - format: ['init', 'generateAndBuild', 'mockTest', 'liveTest'], - arg: 'taskName' - }, - exeResult: { - default: null, - nullable: true, - format: ['succeeded', 'failed'], - arg: 'exeResult' - }, - taskOutputPath: { - default: null, - nullable: true, - format: String, - arg: 'taskOutputPath' - }, - resultOutputPath: { - default: null, - format: assertNullOrEmpty, - arg: 'resultOutputPath' - }, - dockerResultFile: { - default: null, - nullable: true, - format: String, - arg: 'dockerResultFile' - } -}); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cliSchema/prepareArtifactFilesCliConfig.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cliSchema/prepareArtifactFilesCliConfig.ts deleted file mode 100644 index 018fc478a0a..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cliSchema/prepareArtifactFilesCliConfig.ts +++ /dev/null @@ -1,68 +0,0 @@ -import convict from 'convict'; - -import { assertNullOrEmpty } from '../utils/validator'; - -export class PrepareArtifactFilesInput { - generateAndBuildOutputFile: string; - artifactDir: string; - language: string; -} - -export const prepareArtifactFilesInput = convict({ - generateAndBuildOutputFile: { - default: null, - format: assertNullOrEmpty, - arg: 'generateAndBuildOutputFile' - }, - artifactDir: { - doc: 'The dir to publish artifact', - default: null, - format: assertNullOrEmpty, - arg: 'artifactDir' - }, - language: { - default: null, - format: ['js', 'python', 'go', 'net', 'java'], - arg: 'language' - } -}); - -export class PrepareResultArtifactInput { - pipelineBuildId: string; - trigger: string; - artifactDir: string; - logPath?: string; - resultsPath?: string; -} - -export const prepareResultArtifactInput = convict({ - pipelineBuildId: { - default: null, - format: assertNullOrEmpty, - arg: 'buildId' - }, - trigger: { - default: null, - format: assertNullOrEmpty, - arg: 'trigger' - }, - artifactDir: { - doc: 'The dir to publish artifact', - default: null, - format: assertNullOrEmpty, - arg: 'artifactDir' - }, - logPath: { - default: null, - nullable: true, - format: String, - arg: 'logPath' - }, - resultsPath: { - doc: 'task result files array', - default: null, - nullable: true, - format: String, - arg: 'resultsPath' - } -}); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cliSchema/publishResultConfig.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cliSchema/publishResultConfig.ts deleted file mode 100644 index 0fda636d736..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cliSchema/publishResultConfig.ts +++ /dev/null @@ -1,284 +0,0 @@ -#!/usr/bin/env node -import { ServiceType } from '@azure-tools/sdk-generation-lib'; -import convict from 'convict'; - -import { assertNullOrEmpty } from '../utils/validator'; - -export class ResultPublisherBlobInput { - logsAndResultPath: string; - pipelineBuildId: string; - taskName: string; - sdkGenerationName: string; - azureStorageBlobSasUrl: string; - azureBlobContainerName: string; -} - -export const resultPublisherBlobInput = convict({ - logsAndResultPath: { - default: null, - format: assertNullOrEmpty, - arg: 'logsAndResultPath' - }, - pipelineBuildId: { - default: null, - format: assertNullOrEmpty, - arg: 'buildId' - }, - taskName: { - default: null, - format: String, - arg: 'taskName' - }, - sdkGenerationName: { - default: null, - format: assertNullOrEmpty, - arg: 'sdkGenerationName' - }, - azureStorageBlobSasUrl: { - default: null, - env: 'AZURE_STORAGE_BLOB_SAS_URL', - format: assertNullOrEmpty - }, - azureBlobContainerName: { - default: 'sdk-generation', - env: 'AZURE_BLOB_CONTAINER_NAME', - format: assertNullOrEmpty - } -}); - -export class ResultPublisherDBCodeGenerationInput { - mongodb: { - server: string; - port: number; - database: string; - username: string; - password: string; - ssl: boolean; - }; - pipelineBuildId: string; - sdkGenerationName: string; - service: string; - serviceType: ServiceType; - language: string; - swaggerRepo: string; - sdkRepo: string; - codegenRepo: string; - triggerType: string; - tag?: string; - owner?: string; - codePR?: string; -} - -export const resultPublisherDBCodeGenerationInput = convict({ - mongodb: { - server: { - doc: 'The host used to connect db', - default: null, - env: 'SDKGENERATION_MONGODB_HOST', - format: assertNullOrEmpty - }, - port: { - doc: 'The port used to connect db', - default: 10225, - env: 'SDKGENERATION_MONGODB_PORT', - format: Number - }, - database: { - doc: 'The database used to connect db', - default: null, - env: 'SDKGENERATION_MONGODB_DATABASE', - format: assertNullOrEmpty - }, - username: { - doc: 'The username used to connect db', - default: null, - env: 'SDKGENERATION_MONGODB_USERNAME', - format: assertNullOrEmpty - }, - password: { - doc: 'The password used to connect db', - default: null, - env: 'SDKGENERATION_MONGODB_PASSWORD', - format: assertNullOrEmpty - }, - ssl: { - doc: 'Whether used ssl to connect db', - default: true, - env: 'SDKGENERATION_MONGODB_SSL', - format: Boolean - } - }, - pipelineBuildId: { - default: null, - format: assertNullOrEmpty, - arg: 'buildId' - }, - sdkGenerationName: { - default: null, - format: assertNullOrEmpty, - arg: 'sdkGenerationName' - }, - service: { - default: null, - format: assertNullOrEmpty, - arg: 'service' - }, - serviceType: { - default: null, - format: ['data-plane', 'resource-manager'], - arg: 'serviceType' - }, - language: { - default: null, - format: ['js', 'python', 'go', 'net', 'java'], - arg: 'language' - }, - swaggerRepo: { - default: null, - format: assertNullOrEmpty, - arg: 'swaggerRepo' - }, - sdkRepo: { - default: null, - format: assertNullOrEmpty, - arg: 'sdkRepo' - }, - codegenRepo: { - default: null, - format: assertNullOrEmpty, - arg: 'codegenRepo' - }, - triggerType: { - default: null, - format: ['ad-hoc', 'ci', 'release'], - arg: 'triggerType' - }, - tag: { - default: null, - nullable: true, - format: String, - arg: 'tag' - }, - owner: { - default: null, - nullable: true, - format: String, - arg: 'owner' - }, - codePR: { - default: null, - nullable: true, - format: String, - arg: 'codePR' - } -}); - -export class ResultPublisherDBResultInput { - mongodb: { - server: string; - port: number; - database: string; - username: string; - password: string; - ssl: boolean; - }; - pipelineBuildId: string; - taskResultsPath: string; -} - -export const resultPublisherDBResultInput = convict({ - mongodb: { - server: { - doc: 'The host used to connect db', - default: null, - env: 'SDKGENERATION_MONGODB_HOST', - format: assertNullOrEmpty - }, - port: { - doc: 'The port used to connect db', - default: 10225, - env: 'SDKGENERATION_MONGODB_PORT', - format: Number - }, - database: { - doc: 'The database used to connect db', - default: null, - env: 'SDKGENERATION_MONGODB_DATABASE', - format: assertNullOrEmpty - }, - username: { - doc: 'The username used to connect db', - default: null, - env: 'SDKGENERATION_MONGODB_USERNAME', - format: assertNullOrEmpty - }, - password: { - doc: 'The password used to connect db', - default: null, - env: 'SDKGENERATION_MONGODB_PASSWORD', - format: assertNullOrEmpty - }, - ssl: { - doc: 'Whether used ssl to connect db', - default: true, - env: 'SDKGENERATION_MONGODB_SSL', - format: Boolean - } - }, - pipelineBuildId: { - default: null, - format: assertNullOrEmpty, - arg: 'buildId' - }, - taskResultsPath: { - default: null, - format: assertNullOrEmpty, - arg: 'taskResultsPath' - } -}); - -export class ResultPublisherEventHubInput { - eventHubConnectionString: string; - partitionKey?: string; - pipelineBuildId: string; - trigger: string; - logPath?: string; - resultsPath?: string; -} - -export const resultPublisherEventHubInput = convict({ - eventHubConnectionString: { - default: null, - env: 'EVENTHUB_SAS_URL', - format: assertNullOrEmpty - }, - partitionKey: { - default: null, - env: 'PARTITIONKEY', - nullable: true, - format: String - }, - pipelineBuildId: { - default: null, - format: assertNullOrEmpty, - arg: 'buildId' - }, - trigger: { - default: null, - format: assertNullOrEmpty, - arg: 'trigger' - }, - logPath: { - default: null, - nullable: true, - format: String, - arg: 'logPath' - }, - resultsPath: { - doc: 'task result files array', - default: null, - nullable: true, - format: String, - arg: 'resultsPath' - } -}); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cliSchema/uploadArtifactConfig.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cliSchema/uploadArtifactConfig.ts deleted file mode 100644 index 0f53e6b77ff..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cliSchema/uploadArtifactConfig.ts +++ /dev/null @@ -1,39 +0,0 @@ -import convict from 'convict'; - -import { assertNullOrEmpty } from '../utils/validator'; - -export class UploadBlobInput { - generateAndBuildOutputFile: string; - pipelineBuildId: string; - language: string; - azureStorageBlobSasUrl: string; - azureBlobContainerName: string; -} - -export const uploadBlobInput = convict({ - generateAndBuildOutputFile: { - default: null, - format: assertNullOrEmpty, - arg: 'generateAndBuildOutputFile' - }, - pipelineBuildId: { - default: null, - format: assertNullOrEmpty, - arg: 'buildId' - }, - language: { - default: null, - format: ['js', 'python', 'go', 'net', 'java'], - arg: 'language' - }, - azureStorageBlobSasUrl: { - default: null, - env: 'AZURE_STORAGE_BLOB_SAS_URL', - format: assertNullOrEmpty - }, - azureBlobContainerName: { - default: 'sdk-generation', - env: 'AZURE_BLOB_CONTAINER_NAME', - format: assertNullOrEmpty - } -}); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/utils/GitOperationWrapper.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/utils/GitOperationWrapper.ts deleted file mode 100644 index bbed6bb43d3..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/utils/GitOperationWrapper.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { spawn } from 'child_process'; -import * as os from 'os'; -import simpleGit, { SimpleGit } from 'simple-git'; -import { Logger } from 'winston'; - -export class GitOperationWrapper { - public git: SimpleGit; - public baseDir: string; - - constructor(baseDir: string = '.') { - this.baseDir = baseDir; - this.git = simpleGit({ baseDir: baseDir }); - } - - public async getFileListInPackageFolder(packageFolder: string) { - const files = (await this.git.raw(['ls-files', '-cmo', '--exclude-standard']))?.trim()?.split(os.EOL); - return files; - } - - public async getHeadSha() { - const headSha = await this.git.revparse(['HEAD']); - return headSha; - } - - public async getHeadRef() { - const headRef = await this.git.revparse(['--abbrev-ref', 'HEAD']); - return headRef; - } - - public async getRemote() { - const remote = await this.git.getConfig('remote.origin.url'); - return remote?.value?.replace('.git', ''); - } - - public async safeDirectory() { - await this.git.addConfig('safe.directory', this.baseDir, true, 'global'); - } - - public async disableFileMode() { - await this.git.raw(['config', 'core.fileMode', 'false', '--replace-all']); - } - - public async checkoutPr(prNumber: string) { - await this.git.raw(['fetch', 'origin', `pull/${prNumber}/head`]); - await this.git.raw(['checkout', '-B', `pr-${prNumber}`, `FETCH_HEAD`]); - } - - public async getChangedPackageDirectory(): Promise> { - const changedPackageDirectories: Set = new Set(); - const files = (await this.git.raw(['ls-files', '-mdo', '--exclude-standard'])).trim().split(os.EOL); - for (const filePath of files) { - if (filePath.match(/sdk\/[^\/0-9]*\/.*/)) { - const packageDirectory = /sdk\/[^\/0-9]*\/[^\/]*/.exec(filePath); - if (packageDirectory) { - changedPackageDirectories.add(packageDirectory[0]); - } - } - } - return changedPackageDirectories; - } - - public async cloneRepo(githubRepo: string, logger: Logger, repoAlias?: string) { - const additionalParams = []; - if (!!repoAlias) additionalParams.push(repoAlias); - const child = spawn(`git`, [`clone`, `https://github.com/${githubRepo}.git`, ...additionalParams], { - cwd: this.baseDir, - stdio: ['ignore', 'pipe', 'pipe'] - }); - await this.injectListener(child, logger); - } - - private async injectListener(child: any, logger: Logger) { - child.stdout.on('data', (data) => logger.log('cmdout', data.toString())); - child.stderr.on('data', (data) => logger.log('cmdout', data.toString())); - await new Promise((resolve) => { - child.on('exit', (code, signal) => { - resolve({ code, signal }); - }); - }); - } - - public async cloneBranch(repoUrl: string, branchName: string, logger: Logger, repoAlias?: string) { - const additionalParams = []; - if (!!repoAlias) additionalParams.push(repoAlias); - const child = spawn(`git`, [`clone`, '--branch', branchName, repoUrl, ...additionalParams], { - cwd: this.baseDir, - stdio: ['ignore', 'pipe', 'pipe'] - }); - await this.injectListener(child, logger); - } - - public changeBaseDir(baseDir: string) { - this.baseDir = baseDir; - this.git = simpleGit({ baseDir: baseDir }); - } -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/utils/SdkGenerationServerClient.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/utils/SdkGenerationServerClient.ts deleted file mode 100644 index a81147fbc12..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/utils/SdkGenerationServerClient.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { TaskResult } from '@azure-tools/sdk-generation-lib/dist/types/taskResult'; -import * as fs from 'fs'; -import * as https from 'https'; - -const axios = require('axios'); - -export class SdkGenerationServerClient { - host: string; - cert: string; - key: string; - - constructor(host: string, certPath: string, keyPath: string) { - this.host = host; - this.cert = fs.readFileSync(certPath, 'utf-8'); - this.key = fs.readFileSync(keyPath, 'utf-8'); - } - - public async publishTaskResult(sdkGenerationName: string, buildId: string, taskResult: TaskResult) { - await axios.post(`https://${this.host}/codegenerations/${sdkGenerationName}/taskResult`, { - pipelineBuildId: buildId, - taskResult: taskResult - }, { - httpsAgent: new https.Agent({ - cert: this.cert, - key: this.key - }) - }); - } -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/utils/autorestConfigExtractorUtils.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/utils/autorestConfigExtractorUtils.ts deleted file mode 100644 index e65a355b1dc..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/utils/autorestConfigExtractorUtils.ts +++ /dev/null @@ -1,36 +0,0 @@ -import * as fs from 'fs'; -import * as path from 'path'; -import winston from 'winston'; - -export function extractAutorestConfigs(autorestConfigFilePath: string, sdkRepo: string, logger: winston.Logger): string | undefined { - if (!fs.existsSync(autorestConfigFilePath)) { - return undefined; - } - const autorestConfigFileContent = fs.readFileSync(autorestConfigFilePath, 'utf-8'); - try { - let autorestConfigs: string[] = autorestConfigFileContent.split(/#+ *azure-sdk-for-/); - if (autorestConfigs.length < 2) { - throw new Error(`Parse autorest config file failed.`); - } - autorestConfigs = autorestConfigs.slice(1); - if (!path.basename(sdkRepo).startsWith('azure-sdk-for-')) { - if (autorestConfigs.length > 1) { - logger.warn(`Docker is running in pipeline, but get autorest config for more than 1 language of sdk. So only get the first autorest config`); - } - return `# azure-sdk-for-${autorestConfigs[0]}`.replace(/\r\n/g, '\n').replace(/\n/g, '\r\n'); - } - for (const autorestConfig of autorestConfigs) { - let autorestFullConfig = `# azure-sdk-for-${autorestConfig}`; - if (autorestFullConfig.startsWith(`# ${path.basename(sdkRepo)}`)) { - logger.info(`Find autorest config for ${path.basename(sdkRepo)} in ${autorestConfigFilePath}: \n${autorestFullConfig}`); - autorestFullConfig = autorestFullConfig.replace(/\r\n/g, '\n').replace(/\n/g, '\r\n'); - return autorestFullConfig; - } - } - } catch (e) { - logger.error(`Parse ${autorestConfigFilePath} failed: ${e.message}`); - throw e; - } - logger.warn(`Cannot find autorest config for ${path.basename(sdkRepo)} in ${autorestConfigFilePath}.`); - return undefined; -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/utils/validator.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/utils/validator.ts deleted file mode 100644 index 2e9e52ebcde..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/utils/validator.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const assertNullOrEmpty = (value: string) => { - if (!value || value.length === 0) { - throw new Error(' Value should not be null or empty'); - } -}; diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/integration/integrationTest.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/integration/integrationTest.ts deleted file mode 100644 index 79cb3e652b1..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/integration/integrationTest.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { execSync } from 'child_process'; -import commandLineArgs from 'command-line-args'; -import { existsSync, mkdirSync } from 'fs'; -import * as path from 'path'; -import * as process from 'process'; - -const repoCommitId = { - 'azure-rest-api-specs': '0baca05c851c1749e92beb0d2134cd958827dd54', - 'azure-sdk-for-js': '57382229a700e0e6f607d6ac0811379a6254f3d9', - 'azure-sdk-for-java': '307df24267304fbf3947025bef7eaf9698410de8', - 'azure-sdk-for-python': '53f66170cc47739204cedfe0a46989290c047c98', - 'azure-sdk-for-go': '241bdb849ce431e1a5e398a5649cde93149ee374', - 'azure-sdk-for-net': 'e9db0733a642d50c34101339f74fdc487599d824' -}; - -const defaultImageName = 'sdkgeneration.azurecr.io/sdk-generation:v1.0'; -const integrationBranch = 'sdkgeneration-integration-test'; - -async function prepareRepo(currentPath: string, repoName: string) { - const tmpFolder = path.join(currentPath, 'tmp'); - if (!existsSync(tmpFolder)) { - mkdirSync(tmpFolder); - } - - if (!existsSync(path.join(tmpFolder, repoName))) { - execSync(`git clone https://github.com/Azure/${repoName}.git`, { - cwd: tmpFolder, - stdio: 'inherit' - }); - } - execSync(`git restore --staged . && git restore . && git checkout . && git clean -fd`, { - cwd: path.join(tmpFolder, repoName), - stdio: 'inherit' - }); - - if ( - !!repoCommitId[repoName] && - execSync(`git rev-parse HEAD`, { - encoding: 'utf-8', - cwd: path.join(tmpFolder, repoName) - }).trim() !== repoCommitId[repoName] - ) { - execSync(`git checkout ${repoCommitId[repoName]}`, { - cwd: path.join(tmpFolder, repoName), - stdio: 'inherit' - }); - } - - if ( - execSync(`git rev-parse --abbrev-ref HEAD`, { - encoding: 'utf-8', - cwd: path.join(tmpFolder, repoName) - }).trim() !== integrationBranch - ) { - execSync(`git switch -c ${integrationBranch}`, { - cwd: path.join(tmpFolder, repoName), - stdio: 'inherit' - }); - } -} - -async function runDocker(currentPath: string, sdkRepoName: string, dockerImage: string) { - const tmpFolder = path.join(currentPath, 'tmp'); - // eslint-disable-next-line max-len - execSync( - `docker run -v ${path.join(tmpFolder, 'azure-rest-api-specs')}:/spec-repo -v ${path.join( - tmpFolder, - sdkRepoName - )}:/sdk-repo ${dockerImage} --readme=specification/agrifood/resource-manager/readme.md`, - { - stdio: 'inherit' - } - ); -} - -async function buildDockImage(rushCwd: string, dockerCwd: string) { - execSync(`rushx pack`, { - cwd: rushCwd, - stdio: 'inherit' - }); - execSync(`docker build -t ${defaultImageName} .`, { - cwd: dockerCwd, - stdio: 'inherit' - }); -} - -export async function main(options: any) { - const currentPath = path.resolve(__dirname); - if (!options['docker-image']) { - await buildDockImage(path.join(currentPath, '..', '..'), path.join(currentPath, '..', '..', '..', '..')); - options['docker-image'] = defaultImageName; - } - if (!options['sdk-repo']) { - options['sdk-repo'] = Object.keys(repoCommitId) - .filter((ele) => ele !== 'azure-rest-api-specs') - .join(','); - } - await prepareRepo(currentPath, 'azure-rest-api-specs'); - for (const sdkRepo of options['sdk-repo'].split(',')) { - await prepareRepo(currentPath, sdkRepo); - await runDocker(currentPath, sdkRepo, options['docker-image']); - } -} - -const optionDefinitions = [ - { name: 'docker-image', type: String }, - { name: 'sdk-repo', type: String } -]; -const options = commandLineArgs(optionDefinitions); - -main(options).catch((err) => { - console.log(err); - process.exit(1); -}); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/unit/DockerTaskEngine.test.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/unit/DockerTaskEngine.test.ts deleted file mode 100644 index 4d7d9ed1025..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/unit/DockerTaskEngine.test.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { initializeLogger } from '@azure-tools/sdk-generation-lib'; -import { existsSync } from 'fs'; -import * as path from 'path'; - -import { DockerContext } from '../../src/cli/dockerCli/core/DockerContext'; -import { DockerTaskEngineContext } from '../../src/cli/dockerCli/core/DockerTaskEngineContext'; -import { SDKGenerationTaskBase } from '../../src/cli/dockerCli/core/tasks/SDKGenerationTaskBase'; - -describe('task engine', async () => { - it('should initialize a DockerTaskEngineContext by DockerContext', async () => { - const dockerContext = new DockerContext(); - const tmpFolder = path.join(path.resolve('.'), 'test', 'unit', 'tmp'); - dockerContext.initialize({ - readmeMdPath: 'specification/agrifood/resource-manager/readme.md', - typespecProjectFolderPath: '', - tag: '', - sdkList: '', - specRepo: path.join(tmpFolder, 'spec-repo'), - workDir: '/work-dir', - sdkRepo: path.join(tmpFolder, 'sdk-repo'), - resultOutputFolder: path.join(tmpFolder, 'output'), - dockerLogger: 'docker.log', - autorestConfigFilePath: path.join(path.resolve('.'), 'test', 'unit', 'utils', 'autorest-single-config.md'), - specLink: '', - sdkWorkBranchLink: '', - skipGeneration: false, - isPublicRepo: false - }); - const dockerTaskEngineContext = new DockerTaskEngineContext(); - await dockerTaskEngineContext.initialize(dockerContext); - expect(dockerTaskEngineContext.configFilePath).toBe('eng/codegen_to_sdk_config.json'); - expect(dockerTaskEngineContext.initOutputJsonFile).toBe(path.join(tmpFolder, 'output', 'initOutput.json')); - expect(dockerTaskEngineContext.generateAndBuildInputJsonFile).toBe(path.join(tmpFolder, 'output', 'generateAndBuildInput.json')); - expect(dockerTaskEngineContext.generateAndBuildOutputJsonFile).toBe(path.join(tmpFolder, 'output', 'generateAndBuildOutputJson.json')); - expect(dockerTaskEngineContext.mockTestInputJsonFile).toBe(path.join(tmpFolder, 'output', 'mockTestInput.json')); - expect(dockerTaskEngineContext.mockTestOutputJsonFile).toBe(path.join(tmpFolder, 'output', 'mockTestOutput.json')); - expect(dockerTaskEngineContext.initTaskLog).toBe(path.join(tmpFolder, 'output', 'init-task.log')); - expect(dockerTaskEngineContext.generateAndBuildTaskLog).toBe(path.join(tmpFolder, 'output', 'generateAndBuild-task.log')); - expect(dockerTaskEngineContext.mockTestTaskLog).toBe(path.join(tmpFolder, 'output', 'mockTest-task.log')); - expect(dockerTaskEngineContext.readmeMdPath).toBe('specification/agrifood/resource-manager/readme.md'); - expect(dockerTaskEngineContext.autorestConfig?.length).toBeGreaterThan(0); - }); - - it('should get task list', async () => { - const tmpFolder = path.join(path.resolve('.'), 'test', 'unit', 'tmp'); - const dockerTaskEngineContext = new DockerTaskEngineContext(); - dockerTaskEngineContext.sdkRepo = path.join(tmpFolder, 'sdk-repo'); - dockerTaskEngineContext.configFilePath = 'eng/codegen_to_sdk_config.json'; - dockerTaskEngineContext.logger = initializeLogger(path.join(tmpFolder, 'docker.log'), 'docker', true); - const tasksToRun: SDKGenerationTaskBase[] = await dockerTaskEngineContext.getTaskToRun(); - expect(tasksToRun.length).toEqual(2); - expect(tasksToRun[0].taskType).toEqual('InitTask'); - expect(tasksToRun[1].taskType).toEqual('GenerateAndBuildTask'); - }); - - it('should run tasks', async () => { - jest.setTimeout(999999); - const tmpFolder = path.join(path.resolve('.'), 'test', 'unit', 'tmp'); - const dockerTaskEngineContext = new DockerTaskEngineContext(); - - dockerTaskEngineContext.sdkRepo = path.join(tmpFolder, 'sdk-repo'); - dockerTaskEngineContext.taskResultJsonPath = path.join(tmpFolder, 'output', 'taskResults.json'); - dockerTaskEngineContext.logger = initializeLogger(path.join(tmpFolder, 'docker.log'), 'docker', true); - dockerTaskEngineContext.configFilePath = 'eng/codegen_to_sdk_config.json'; - dockerTaskEngineContext.initOutputJsonFile = path.join(tmpFolder, 'output', 'initOutput.json'); - dockerTaskEngineContext.generateAndBuildInputJsonFile = path.join(tmpFolder, 'output', 'generateAndBuildInput.json'); - dockerTaskEngineContext.generateAndBuildOutputJsonFile = path.join(tmpFolder, 'output', 'generateAndBuildOutputJson.json'); - dockerTaskEngineContext.mockTestInputJsonFile = path.join(tmpFolder, 'output', 'mockTestInput.json'); - dockerTaskEngineContext.mockTestOutputJsonFile = path.join(tmpFolder, 'output', 'mockTestOutput.json'); - dockerTaskEngineContext.initTaskLog = path.join(tmpFolder, 'output', 'init-task.log'); - dockerTaskEngineContext.generateAndBuildTaskLog = path.join(tmpFolder, 'output', 'generateAndBuild-task.log'); - dockerTaskEngineContext.mockTestTaskLog = path.join(tmpFolder, 'output', 'mockTest-task.log'); - dockerTaskEngineContext.readmeMdPath = 'specification/agrifood/resource-manager/readme.md'; - dockerTaskEngineContext.specRepo = { - repoPath: path.join(tmpFolder, 'spec-repo'), - headSha: '11111', - headRef: '11111', - repoHttpsUrl: 'https://github.com/Azure/azure-rest-api-specs' - }; - dockerTaskEngineContext.changeOwner = false; - dockerTaskEngineContext.skipGeneration = false; - - await dockerTaskEngineContext.runTaskEngine(); - expect(existsSync(dockerTaskEngineContext.initTaskLog)).toBe(true); - expect(existsSync(dockerTaskEngineContext.generateAndBuildInputJsonFile)).toBe(true); - expect(existsSync(dockerTaskEngineContext.generateAndBuildOutputJsonFile)).toBe(true); - expect(existsSync(dockerTaskEngineContext.generateAndBuildTaskLog)).toBe(true); - expect(existsSync(dockerTaskEngineContext.taskResultJsonPath)).toBe(true); - }); -}); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/unit/GitOperationWrapper.test.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/unit/GitOperationWrapper.test.ts deleted file mode 100644 index 78e8e141d1a..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/unit/GitOperationWrapper.test.ts +++ /dev/null @@ -1,51 +0,0 @@ -// eslint-disable-next-line simple-import-sort/imports -import * as cp from './utils/mockChildProcess'; -import { GitOperationWrapper } from '../../src/utils/GitOperationWrapper'; - -describe('git operation wrapper', () => { - let gitOperationWrapper: GitOperationWrapper; - - function assertExecutedCommands(...commands: string[]) { - expect(cp.mockChildProcessModule.$mostRecent().$args).toEqual(commands); - } - - beforeAll(() => { - gitOperationWrapper = new GitOperationWrapper(); - } - ); - it('getFileListInPackageFolder', async () => { - gitOperationWrapper.getFileListInPackageFolder('.'); - await cp.closeWithSuccess(); - assertExecutedCommands('ls-files', '-cmo', '--exclude-standard'); - }); - - it('getHeadSha', async () => { - gitOperationWrapper.getHeadSha(); - await cp.closeWithSuccess(); - assertExecutedCommands('rev-parse', 'HEAD'); - }); - - it('getHeadRef', async () => { - gitOperationWrapper.getHeadRef(); - await cp.closeWithSuccess(); - assertExecutedCommands('rev-parse', '--abbrev-ref', 'HEAD'); - }); - - it('safeDirectory', async () => { - gitOperationWrapper.safeDirectory(); - await cp.closeWithSuccess(); - assertExecutedCommands('config', '--global', '--add', 'safe.directory', '.'); - }); - - it('disableFileMode', async () => { - gitOperationWrapper.disableFileMode(); - await cp.closeWithSuccess(); - assertExecutedCommands('config', 'core.fileMode', 'false', '--replace-all'); - }); - - it('getChangedPackageDirectory', async () => { - gitOperationWrapper.getChangedPackageDirectory(); - await cp.closeWithSuccess(); - assertExecutedCommands('ls-files', '-mdo', '--exclude-standard'); - }); -}); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/unit/autorestConfigExtractorUtils.test.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/unit/autorestConfigExtractorUtils.test.ts deleted file mode 100644 index 85f066f79f9..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/unit/autorestConfigExtractorUtils.test.ts +++ /dev/null @@ -1,50 +0,0 @@ -import * as path from 'path'; - -const logger = { - error: jest.fn(), - warn: jest.fn(), - info: jest.fn() -}; - -jest.mock('winston', () => ({ - format: { - colorize: jest.fn(), - combine: jest.fn(), - label: jest.fn(), - timestamp: jest.fn(), - printf: jest.fn() - }, - createLogger: jest.fn().mockReturnValue(logger), - transports: { - Console: jest.fn() - } -})); - -import * as winston from 'winston'; - -import { extractAutorestConfigs } from '../../dist/utils/autorestConfigExtractorUtils'; - -const autorestSingleConfigFilePath = path.join(path.resolve('.'), 'test', 'unit', 'utils', 'autorest-single-config.md'); -const autorestMultiConfigFilePath = path.join(path.resolve('.'), 'test', 'unit', 'utils', 'autorest-multi-config.md'); -const loggerMock: winston.Logger = winston.createLogger(); - -describe('autorest config extractor util test', () => { - it('should extract autorest config from autorest file', async () => { - const sdkRepo = './azure-sdk-for-js'; - const result = extractAutorestConfigs(autorestSingleConfigFilePath, sdkRepo, loggerMock); - expect(result?.length).toBeGreaterThan(0); - }); - - it('should extract the first autorest config from autorest file', async () => { - const sdkRepo = './sdk-repo'; - const result = extractAutorestConfigs(autorestMultiConfigFilePath, sdkRepo, loggerMock); - expect(result?.length).toBeGreaterThan(0); - expect(result.includes('azure-sdk-for-js')).toBe(true); - }); - - it('cannot extract autorest config from autorest file', async () => { - const sdkRepo = './azure-sdk-for-go'; - const result = extractAutorestConfigs(autorestSingleConfigFilePath, sdkRepo, loggerMock); - expect(result).toBeUndefined(); - }); -}); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/unit/utils/autorest-multi-config.md b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/unit/utils/autorest-multi-config.md deleted file mode 100644 index c15aa8e5649..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/unit/utils/autorest-multi-config.md +++ /dev/null @@ -1,13 +0,0 @@ -# azure-sdk-for-js -``` yaml -output-folder: sdk/deviceupdate/iot-device-update-rest -require: - - specification/deviceupdate/data-plane/readme.md -``` - -# azure-sdk-for-python -``` yaml -output-folder: sdk/deviceupdate/iot-device-update-rest -require: - - specification/deviceupdate/data-plane/readme.md -``` \ No newline at end of file diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/unit/utils/autorest-single-config.md b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/unit/utils/autorest-single-config.md deleted file mode 100644 index b5fdcd4ce40..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/unit/utils/autorest-single-config.md +++ /dev/null @@ -1,6 +0,0 @@ -# azure-sdk-for-js -``` yaml -output-folder: sdk/deviceupdate/iot-device-update-rest -require: - - specification/deviceupdate/data-plane/readme.md -``` diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/unit/utils/mockChildProcess.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/unit/utils/mockChildProcess.ts deleted file mode 100644 index 1e706921ce9..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/unit/utils/mockChildProcess.ts +++ /dev/null @@ -1,167 +0,0 @@ - -export type MockEventTarget = { - $emit (event: string, data: any): void; - $emitted (event: string): boolean; - on: jest.Mock; - off: jest.Mock; -} - -export type MockChildProcess = MockEventTarget & { - readonly $args: any[]; - readonly $command: string; - readonly $options: any; - readonly $env: any; - - readonly stderr: MockEventTarget; - readonly stdout: MockEventTarget; - - kill (): void; -} - -type ChildProcessConstructor = [string, string[], any]; - -class MockEventTargetImpl implements MockEventTarget { - private $handlers: Map = new Map(); - private $emittedEvents: Set = new Set(); - - public $emitted(event: string) { - return this.$emittedEvents.has(event); - } - - public $emit = (event: string, data: any) => { - this.$emittedEvents.add(event); - this.getHandlers(event).forEach((handler) => handler(data)); - }; - - public kill = jest.fn(); - - public off = jest.fn((event: string, handler: Function) => { - this.delHandler(event, handler); - }); - - public on = jest.fn((event: string, handler: Function) => { - this.addHandler(event, handler); - }); - - private addHandler(event: string, handler: Function) { - this.$handlers.set(event, [ - ...(this.$handlers.get(event) || []), - handler - ]); - } - - private delHandler(event: string, handler: Function) { - const handlers = this.$handlers.get(event); - if (!Array.isArray(handlers)) { - return; - } - - const index = handlers.indexOf(handler); - if (index < 0) { - return; - } - - handlers.splice(index, 1); - } - - private getHandlers(event: string) { - const handlers = this.$handlers.get(event); - if (!handlers?.length) { - throw new Error('MockEventTarget:getHandlers no matching handlers attached'); - } - - return handlers; - } -} - -class MockChildProcessImpl extends MockEventTargetImpl implements MockChildProcess { - public get $args() { - return this.constructedWith[1]; - } - public get $command() { - return this.constructedWith[0]; - } - public get $options() { - return this.constructedWith[2]; - } - public get $env() { - return this.constructedWith[2]?.env; - } - - public readonly stderr = new MockEventTargetImpl(); - public readonly stdout = new MockEventTargetImpl(); - - constructor(private constructedWith: ChildProcessConstructor) { - super(); - } -} - -export const mockChildProcessModule = (function mockChildProcessModule() { - const children: MockChildProcess[] = []; - - return { - spawn: jest.fn((...args: ChildProcessConstructor) => addChild(new MockChildProcessImpl(args))), - - $mostRecent() { - return children[children.length - 1]; - }, - - $matchingChildProcess(what: string[] | ((mock: MockChildProcess) => boolean)): MockChildProcess | undefined { - if (Array.isArray(what)) { - return children.find((proc) => - JSON.stringify(proc.$args) === JSON.stringify(what)); - } - - if (typeof what === 'function') { - return children.find(what); - } - - throw new Error('$matchingChildProcess needs either an array of commands or matcher function'); - }, - - $reset() { - children.length = 0; - } - }; - - function addChild(child: MockChildProcess) { - return children[children.length] = child; - } -}()); - -export function wait(timeoutOrPromise: number | Promise = 10): Promise { - if (timeoutOrPromise && typeof timeoutOrPromise === 'object' && typeof timeoutOrPromise.then === 'function') { - return timeoutOrPromise.then(() => wait()); - } - - return new Promise((ok) => setTimeout(ok, typeof timeoutOrPromise === 'number' ? timeoutOrPromise : 10)); -} - -async function exitChildProcess(proc: MockChildProcess, data: string | null, exitSignal: number) { - if (proc.$emitted('exit')) { - throw new Error('exitChildProcess: attempting to exit an already closed process'); - } - - if (typeof data === 'string') { - proc.stdout.$emit('data', Buffer.from(data)); - } - - proc.$emit('exit', exitSignal); - proc.$emit('close', exitSignal); -} - -export async function closeWithSuccess(message = '') { - await wait(); - const match = mockChildProcessModule.$matchingChildProcess((p) => !p.$emitted('exit')); - if (!match) { - throw new Error(`closeWithSuccess unable to find matching child process`); - } - await exitChildProcess(match, message, 0); - await wait(); -} - -jest.mock('child_process', () => mockChildProcessModule); - -afterEach(() => { - mockChildProcessModule.$reset(); -}); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/unit/utils/prepareEnvironment.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/unit/utils/prepareEnvironment.ts deleted file mode 100644 index c91074d2e59..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/unit/utils/prepareEnvironment.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { execSync } from 'child_process'; -import { existsSync, mkdirSync } from 'fs'; -import * as path from 'path'; - -function mkdirTmpFolderIfNotExist(tmpFolder: string) { - if (!existsSync(tmpFolder)) { - mkdirSync(tmpFolder); - } -} - -function cloneSpecRepoIfNotExist(tmpFolder: string) { - if (!existsSync(path.join(tmpFolder, 'spec-repo'))) { - execSync(`git clone https://github.com/Azure/azure-rest-api-specs.git spec-repo`, { - cwd: tmpFolder, - stdio: 'inherit' - }); - } - execSync(`git checkout 0baca05c851c1749e92beb0d2134cd958827dd54`, { - cwd: path.join(tmpFolder, 'spec-repo'), - stdio: 'inherit' - }); -} - -function cloneSdkRepoIfNotExist(tmpFolder: string) { - if (!existsSync(path.join(tmpFolder, 'sdk-repo'))) { - execSync(`git clone https://github.com/Azure/azure-sdk-for-js.git sdk-repo`, { - cwd: tmpFolder, - stdio: 'inherit' - }); - } - execSync(`git checkout . && git clean -fd`, { - cwd: path.join(tmpFolder, 'sdk-repo'), - stdio: 'inherit' - }); - execSync(`git checkout 67946c5b0ce135f58ecfeab1443e5be52604908e`, { - cwd: path.join(tmpFolder, 'sdk-repo'), - stdio: 'inherit' - }); -} - -function mkdirResultOutputFolderIfNotExist(tmpFolder: string) { - if (!existsSync(path.join(tmpFolder, 'output'))) { - mkdirSync(path.join(tmpFolder, 'output')); - } -} - -async function main() { - const tmpFolder = path.join(path.resolve(__dirname), '..', 'tmp'); - mkdirTmpFolderIfNotExist(tmpFolder); - cloneSpecRepoIfNotExist(tmpFolder); - cloneSdkRepoIfNotExist(tmpFolder); - mkdirResultOutputFolderIfNotExist(tmpFolder); -} - -main().catch((e) => { - console.log(e); -}); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/tsconfig.json b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/tsconfig.json deleted file mode 100644 index 45c274c4c7f..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "compilerOptions": { - "lib": [ - "es2019", - "dom" - ], - "outDir": "dist", - "module": "commonjs", - "target": "es2017", - "sourceMap" :true, - "experimentalDecorators": true, - "emitDecoratorMetadata": true, - "strictNullChecks": false, - "declaration": true, - "esModuleInterop": true - }, - "exclude": [ - "node_modules", - "test", - "tmp" - ] -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/LICENSE b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/LICENSE deleted file mode 100644 index 5cf7c8db628..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) Microsoft Corporation. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/README.md b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/README.md deleted file mode 100644 index 8fd871d4948..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# @azure-tools/sdk-generation-lib - -This packages includes some basic functionalities and definitions used by sdk generation pipeline. - -## Install - -```shell -npm i @azure-tools/sdk-generation-lib -``` - -# Functionalities - -| Functionalities | Description | -|------------------|------------------------------------------------------------------------------| -| runScript | Run any kind of script/command os supported. | -| createTaskResult | It parses the logs produced by tasks, and generate a summarized task result. | -| executeTask | The wrapper of `runScript` and `createTaskResult`. | -| logger | The logger instance can be used by sdk generation pipeline. | -| getTask | Get task configuration from sdk repo's task configuration. | - -# Definitions - -| Definitions | Description | -|-------------------------|--------------------------------------------------------| -| CodegenToSdkConfig | The configuration type of `codegen_to_sdk_config.json` | -| InitOptions | The configuration type of init task. | -| GenerateAndBuildOptions | The configuration type of generate and build task. | -| MockTestOptions | The configuration type of mock test task. | -| RunOptions | The configuration type of running script. | -| LogFilter | The configuration type of filtering log. | -| InitOutput | The output type of init task. | -| GenerateAndBuildInput | The input type of generate and build task. | -| GenerateAndBuildOutput | The output type of generate and build task. | -| MockTestInput | The input type of mock test task. | -| TestOutput | The output type of mock test task. | -| TaskResultStatus | The task status. | -| TaskResult | The details of a task result. | diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/jest.config.js b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/jest.config.js deleted file mode 100644 index 620a27f7881..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/jest.config.js +++ /dev/null @@ -1,23 +0,0 @@ -/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ -module.exports = { - verbose: true, - preset: 'ts-jest', - testEnvironment: 'node', - globals: { - 'ts-jest': { - packageJson: 'package.json', - tsConfig: 'tsconfig.json', - }, - }, - testMatch: ['/**/*.test.ts'], - modulePathIgnorePatterns: ['/tmp/*'], - collectCoverage: true, - collectCoverageFrom: ['src/**/*.ts'], - coveragePathIgnorePatterns: [], - roots: ['/src/', '/test/'], - transform: { - '^.+\\.tsx?$': 'ts-jest', - }, - moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], - testPathIgnorePatterns: ['__snapshots__'], -}; diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/package.json b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/package.json deleted file mode 100644 index 55acea6d196..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/package.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "name": "@azure-tools/sdk-generation-lib", - "version": "1.0.5", - "description": "", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "scripts": { - "build": "rimraf dist && tsc && npm run copy", - "copy": "copyfiles -u 1 src/types/taskInputAndOuputSchemaTypes/*.json dist", - "prepack": "npm run build", - "pack": "npm pack 2>&1", - "test": "jest --forceExit --detectOpenHandles --coverage=true", - "lint": "eslint . -c ../../.eslintrc.json --ignore-path ../../.eslintignore --ext .ts", - "lint:fix": "eslint . -c ../../.eslintrc.json --ignore-path ../../.eslintignore --ext .ts --fix" - }, - "author": "Microsoft", - "license": "MIT", - "files": [ - "dist/**/*.js", - "dist/**/*.json", - "dist/**/*.js.map", - "dist/**/*.d.ts", - "dist/**/*.d.ts.map", - "dist/**/*.handlebars", - "LICENSE", - "README.md" - ], - "dependencies": { - "@azure/event-hubs": "~5.5.1", - "@azure/storage-blob": "^12.8.0", - "@azure/swagger-validation-common": "^0.1.2", - "@octokit/auth-app": "^2.4.5", - "@octokit/rest": "^18.0.3", - "ajv": "^6.12.6", - "class-validator": "^0.14.0", - "colors": "1.4.0", - "convict": "^6.2.3", - "jsonc-parser": "^3.0.0", - "hot-shots": "^8.5.2", - "memory-fs": "^0.5.0", - "mongodb": "^3.6.10", - "node-yaml": "^3.2.0", - "typeorm": "^0.3.20", - "winston": "3.7.2" - }, - "devDependencies": { - "@types/node": "^16.11.7", - "copyfiles": "^2.4.1", - "rimraf": "^5.0.7", - "jest": "~26.6.3", - "ts-jest": "~26.5.4", - "@types/jest": "^25.2.1", - "typescript": "~4.6.3", - "ts-node": "~10.7.0", - "eslint": "^8.16.0", - "@typescript-eslint/eslint-plugin": "^5.25.0", - "eslint-config-google": "^0.14.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-n": "^15.0.0", - "eslint-plugin-promise": "^6.0.0", - "@typescript-eslint/parser": "^5.25.0", - "eslint-plugin-simple-import-sort": "^7.0.0" - } -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/index.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/index.ts deleted file mode 100644 index 03b221fef6c..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './lib'; -export * from './utils'; -export * from './types'; diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/ArtifactUploader.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/ArtifactUploader.ts deleted file mode 100644 index 026fb292fea..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/ArtifactUploader.ts +++ /dev/null @@ -1,102 +0,0 @@ -import * as childProcess from 'child_process'; -import * as fs from 'fs'; -import * as path from 'path'; - -import { SDK } from '../types/commonType'; -import { GenerateAndBuildOutput } from '../types/taskInputAndOuputSchemaTypes/GenerateAndBuildOutput'; -import { TaskResultStatus } from '../types/taskResult'; -import { AzureBlobClient } from '../utils/blob/AzureBlobClient'; -import { logger } from '../utils/logger'; - -function getFileListInPackageFolder(packageFolder: string) { - const files = childProcess - .execSync('git ls-files -cmo --exclude-standard', { encoding: 'utf8', cwd: packageFolder }) - .trim() - .split('\n'); - - return files; -} - -export type ArtifactBlobUploaderContext = { - azureStorageBlobSasUrl: string; - azureBlobContainerName: string; - language: string; - pipelineBuildId: string; -}; - -export class ArtifactBlobUploader { - private azureBlobClient: AzureBlobClient; - private language: string; - private pipelineBuildId: string; - - constructor(artifactBlobUploaderContext: ArtifactBlobUploaderContext) { - this.validateContext(artifactBlobUploaderContext); - this.azureBlobClient = new AzureBlobClient( - artifactBlobUploaderContext.azureStorageBlobSasUrl, - artifactBlobUploaderContext.azureBlobContainerName - ); - this.language = artifactBlobUploaderContext.language; - this.pipelineBuildId = artifactBlobUploaderContext.pipelineBuildId; - } - - private validateContext(artifactBlobUploaderContext: ArtifactBlobUploaderContext) { - if (!artifactBlobUploaderContext.azureStorageBlobSasUrl) { - throw new Error(`Invalid azureStorageBlobSasUrl`); - } - if (!artifactBlobUploaderContext.azureBlobContainerName) { - throw new Error(`Invalid azureBlobContainerName`); - } - if (!(Object).values(SDK).includes(artifactBlobUploaderContext.language)) { - throw new Error(`Invalid language`); - } - if (!artifactBlobUploaderContext.pipelineBuildId) { - throw new Error(`Invalid pipelineBuildId`); - } - } - - public async uploadSourceCode(generateAndBuildOutputJson: GenerateAndBuildOutput) { - for (const p of generateAndBuildOutputJson.packages) { - const result = p.result; - if (result === TaskResultStatus.Failure) { - logger.warn(`Build ${p.packageName} failed, skipped it`); - continue; - } - const packageName = p.packageName; - const packageFolder = p.packageFolder; - - if (packageFolder && fs.existsSync(packageFolder)) { - for (const filePath of getFileListInPackageFolder(packageFolder)) { - if (fs.existsSync(path.join(packageFolder, filePath))) { - await this.azureBlobClient.publishBlob( - path.join(packageFolder, filePath), - `${this.pipelineBuildId}/${this.language}/${packageName}/${filePath}` - ); - } - } - } - } - } - - public async uploadArtifacts(generateAndBuildOutputJson: GenerateAndBuildOutput) { - for (const p of generateAndBuildOutputJson.packages) { - const result = p.result; - if (result === TaskResultStatus.Failure) { - logger.warn(`Build ${p.packageName} failed, skipped it`); - continue; - } - const artifacts = p.artifacts; - if (!artifacts) { - // artifacts is optional - continue; - } - - for (const artifact of artifacts) { - const artifactName = path.basename(artifact); - await this.azureBlobClient.publishBlob( - artifact, - `${this.pipelineBuildId}/${this.language}/${artifactName}` - ); - } - } - } -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/ResultPublisher.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/ResultPublisher.ts deleted file mode 100644 index c4403cb0f0e..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/ResultPublisher.ts +++ /dev/null @@ -1,136 +0,0 @@ -import * as fs from 'fs'; -import { Connection, createConnection } from 'typeorm'; - -import { CodeGeneration } from '../types/codeGeneration'; -import { AzureSDKTaskName } from '../types/commonType'; -import { PipelineRunEvent } from '../types/events'; -import { TaskResult, TaskResultEntity } from '../types/taskResult'; -import { AzureBlobClient } from '../utils/blob/AzureBlobClient'; -import { CodeGenerationDao } from '../utils/db/codeGenerationDao'; -import { CodeGenerationDaoImpl } from '../utils/db/codeGenerationDaoImpl'; -import { TaskResultDao } from '../utils/db/taskResultDao'; -import { TaskResultDaoImpl } from '../utils/db/taskResultDaoImpl'; -import { EventHubProducer } from '../utils/eventhub/EventHubProducer'; -import { logger } from '../utils/logger'; - -export type MongoConnectContext = { - name: string; - type: string; - host: string; - port: number; - username: string; - password: string; - database: string; - ssl: boolean; - synchronize: boolean; - logging: boolean; -}; - -export class ResultDBPublisher { - private connection: Connection; - private context: MongoConnectContext; - - constructor(conetxt: MongoConnectContext) { - this.context = conetxt; - } - - public async close() { - await this.connection.close(); - } - - public async connectDB() { - this.connection = await createConnection({ - name: 'mongodb', - type: 'mongodb', - host: this.context.host, - port: this.context.port, - username: this.context.username, - password: this.context.password, - database: this.context.database, - ssl: this.context.ssl, - synchronize: this.context.synchronize, - logging: this.context.logging, - entities: [TaskResultEntity, CodeGeneration] - }); - } - - public async sendSdkTaskResultToDB(pipelineBuildId: string, taskResults: TaskResult[]) { - if (!pipelineBuildId) { - throw new Error('Invalid pipelineBuildId!'); - } - - const taskResultDao: TaskResultDao = new TaskResultDaoImpl(this.connection); - for (const taskResult of taskResults) { - await taskResultDao.put(pipelineBuildId, taskResult); - } - } - - public async sendSdkGenerationToDB(cg: CodeGeneration) { - const codeGenerationDao: CodeGenerationDao = new CodeGenerationDaoImpl(this.connection); - - await codeGenerationDao.submitCodeGeneration(cg); - } -} - -export type BlobBasicContext = { - pipelineBuildId: string; - sdkGenerationName: string; - azureStorageBlobSasUrl: string; - azureBlobContainerName: string; -}; - -export class ResultBlobPublisher { - private pipelineBuildId: string; - private sdkGenerationName: string; - private azureBlobClient: AzureBlobClient; - - constructor(conetxt: BlobBasicContext) { - this.pipelineBuildId = conetxt.pipelineBuildId; - this.sdkGenerationName = conetxt.sdkGenerationName; - this.azureBlobClient = new AzureBlobClient(conetxt.azureStorageBlobSasUrl, conetxt.azureBlobContainerName); - } - - public async uploadLogsAndResult(logsAndResultPath: string, taskNameInput: AzureSDKTaskName) { - let taskName: string = taskNameInput; - - if (!taskNameInput) { - logger.info(`taskName is undefined or null, set full`); - taskName = 'full'; - } - - const logsAndResultPathArray = JSON.parse(logsAndResultPath); - for (const file of logsAndResultPathArray) { - if (fs.existsSync(file)) { - const blobName: string = file.includes('.json') ? - `${this.pipelineBuildId}/logs/${this.sdkGenerationName}-${taskName}-result.json` : - `${this.pipelineBuildId}/logs/${this.sdkGenerationName}-${taskName}.log`; - await this.azureBlobClient.publishBlob(file, blobName); - logger.info(`Publish ${file} Success !!!`); - } else { - logger.error(`Publish result failed !, ${file} is missed`); - } - } - } -} - -export class ResultEventhubPublisher { - private producer: EventHubProducer; - - constructor(eventHubConnectionString: string) { - this.producer = new EventHubProducer(eventHubConnectionString); - } - - public async publishEvent(event: PipelineRunEvent, partitionKey?: string): Promise { - try { - await this.producer.send([JSON.stringify(event)], partitionKey); - } catch (e) { - await this.producer.close(); - logger.error('Failed to send pipeline result:', JSON.stringify(event), e); - throw e; - } - } - - public async close() { - await this.producer.close(); - } -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/executeTask.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/executeTask.ts deleted file mode 100644 index e7a53b3cff7..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/executeTask.ts +++ /dev/null @@ -1,64 +0,0 @@ -import * as fs from 'fs'; - -import { AzureSDKTaskName } from '../types/commonType'; -import { getTaskBasicConfig, TaskBasicConfig } from '../types/taskBasicConfig'; -import { RunOptions } from '../types/taskInputAndOuputSchemaTypes/CodegenToSdkConfig'; -import { GenerateAndBuildInput } from '../types/taskInputAndOuputSchemaTypes/GenerateAndBuildInput'; -import { GenerateAndBuildOutput } from '../types/taskInputAndOuputSchemaTypes/GenerateAndBuildOutput'; -import { InitOutput } from '../types/taskInputAndOuputSchemaTypes/InitOutput'; -import { LiveTestInput } from '../types/taskInputAndOuputSchemaTypes/LiveTestInput'; -import { MockTestInput } from '../types/taskInputAndOuputSchemaTypes/MockTestInput'; -import { TestOutput } from '../types/taskInputAndOuputSchemaTypes/TestOutput'; -import { TaskResult } from '../types/taskResult'; -import { requireJsonc } from '../utils/requireJsonc'; -import { createTaskResult } from './generateResult'; -import { runScript } from './runScript'; - -export async function executeTask( - taskName: AzureSDKTaskName, - runScriptOptions: RunOptions, - cwd: string, - inputJson?: GenerateAndBuildInput | MockTestInput | LiveTestInput -): Promise<{ taskResult: TaskResult; output: InitOutput | GenerateAndBuildOutput | TestOutput | undefined }> { - const inputJsonPath = '/tmp/input.json'; - const outputJsonPath = '/tmp/output.json'; - if (inputJson) { - fs.writeFileSync(inputJsonPath, JSON.stringify(inputJson, null, 2), { encoding: 'utf-8' }); - } - const config: TaskBasicConfig = getTaskBasicConfig.getProperties(); - const args = []; - if (inputJson) { - args.push(inputJsonPath); - } - args.push(outputJsonPath); - const execResult = await runScript(runScriptOptions, { - cwd: cwd, - args: args - }); - if (fs.existsSync(outputJsonPath)) { - const outputJson = requireJsonc(outputJsonPath); - return { - taskResult: createTaskResult( - '', - taskName, - execResult, - config.pipeFullLog, - runScriptOptions.logFilter, - outputJson - ), - output: outputJson - }; - } else { - return { - taskResult: createTaskResult( - '', - taskName, - execResult, - config.pipeFullLog, - runScriptOptions.logFilter, - undefined - ), - output: undefined - }; - } -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/generateResult.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/generateResult.ts deleted file mode 100644 index 6ce10c17beb..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/generateResult.ts +++ /dev/null @@ -1,144 +0,0 @@ -import * as fs from 'fs'; - -import { AzureSDKTaskName } from '../types/commonType'; -import { LogFilter } from '../types/taskInputAndOuputSchemaTypes/CodegenToSdkConfig'; -import { TestOutput } from '../types/taskInputAndOuputSchemaTypes/TestOutput'; -import { - MessageRecord, - RawMessageRecord, - TaskOutput, - TaskResult, - TaskResultCommon, - TaskResultStatus, - TestTaskResult -} from '../types/taskResult'; -import { logger } from '../utils/logger'; -import { isLineMatch } from './runScript'; - -const logSeparatorLength = 26; // length of '20xx-xx-xx xx:xx:xx cmdout' -const timestampLength = 19; // length of '20xx-xx-xx xx:xx:xx' - -export function spliteLog(fullLog: string): string[] { - const lines: string[] = []; - const splitFilter = /(19|20)\d{2}-(0|1)\d-[0-3]\d (20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d (cmdout|cmderr)/g; - let startPoint = fullLog.search(splitFilter); - if (startPoint === -1) { - return []; - } - fullLog = fullLog.substring(startPoint); - startPoint = 0; - let findPoint = fullLog.substring(logSeparatorLength).search(splitFilter); - while (findPoint !== -1) { - lines.push(fullLog.substring(startPoint, findPoint - 1 + logSeparatorLength)); // -1 for the last \n - fullLog = fullLog.substring(findPoint + logSeparatorLength); - findPoint = fullLog.substring(logSeparatorLength).search(splitFilter); - } - lines.push(fullLog); - - return lines; -} - -export function parseGenerateLog( - pipelineBuildId: string, - taskName: string, - logfile: string, - logFilter: LogFilter, - taskExeResult: TaskResultStatus -): TaskResultCommon { - let errorNum = 0; - let warnNum = 0; - const defaultErrorFilter = /(error|Error|ERROR|failed|Failed|FAILED|exception|Exception|EXCEPTION)/g; - const defaultWarningFilter = /warn/g; - const logErrorFilter: RegExp = - logFilter === undefined || logFilter.error === undefined ? defaultErrorFilter : logFilter.error; - const logWarningFilter: RegExp = - logFilter === undefined || logFilter.warning === undefined ? defaultWarningFilter : logFilter.warning; - const messages: MessageRecord[] = []; - if (fs.existsSync(logfile)) { - const fullLog = fs.readFileSync(logfile, 'utf-8'); - const lines = spliteLog(fullLog); - lines.forEach((line) => { - if (isLineMatch(line.toLowerCase(), logErrorFilter)) { - errorNum++; - const message: RawMessageRecord = { - level: 'Error', - message: line, - time: new Date(line.substring(0, timestampLength)), - type: 'Raw' - }; - messages.push(message); - } else if (isLineMatch(line.toLowerCase(), logWarningFilter)) { - warnNum++; - const message: RawMessageRecord = { - level: 'Warning', - message: line, - time: new Date(line.substring(0, timestampLength)), - type: 'Raw' - }; - messages.push(message); - } - }); - } else { - logger.error('logfile ' + logfile + ' does not exist.'); - } - - const result: TaskResultCommon = { - name: taskName, - pipelineBuildId: pipelineBuildId, - errorCount: errorNum, - warningCount: warnNum, - messages: messages, - result: taskExeResult - }; - - return result; -} - -export function createTaskResult( - pipelineBuildId: string, - taskname: AzureSDKTaskName, - taskExeResult: TaskResultStatus, - logfile: string, - logFilter: LogFilter, - taskOutput: TaskOutput -): TaskResult { - let commonResult: TaskResultCommon = undefined; - if (taskExeResult === TaskResultStatus.Success) { - commonResult = { - name: taskname, - pipelineBuildId: pipelineBuildId, - result: taskExeResult, - errorCount: 0, - warningCount: 0 - }; - } else { - commonResult = parseGenerateLog(pipelineBuildId, taskname, logfile, logFilter, taskExeResult); - } - if (taskname === AzureSDKTaskName.MockTest || taskname === AzureSDKTaskName.LiveTest) { - if (taskOutput === undefined) { - logger.warn('taskOutput is undefined'); - return { - total: 0, - success: 0, - fail: 0, - apiCoverage: 0, - codeCoverage: 0, - result: taskExeResult, - ...commonResult - }; - } - const testOutput: TestOutput = taskOutput as TestOutput; - const testTaskResult: TestTaskResult = { - total: testOutput.total, - success: testOutput.success, - fail: testOutput.fail, - apiCoverage: testOutput.apiCoverage, - codeCoverage: testOutput.codeCoverage, - result: taskExeResult, - ...commonResult - }; - return testTaskResult; - } - - return commonResult; -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/getTask.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/getTask.ts deleted file mode 100644 index f220c99f774..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/getTask.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { - CodegenToSdkConfig, - GenerateAndBuildOptions, - getCodegenToSdkConfig, - InitOptions, - LiveTestOptions, - MockTestOptions -} from '../types/taskInputAndOuputSchemaTypes/CodegenToSdkConfig'; -import { requireJsonc } from '../utils/requireJsonc'; - -export function getTask( - codegenToSdkConfigPath: string, - taskName: string -): InitOptions | GenerateAndBuildOptions | MockTestOptions | LiveTestOptions | undefined { - const codegenToSdkConfig: CodegenToSdkConfig = getCodegenToSdkConfig(requireJsonc(codegenToSdkConfigPath)); - for (const task of Object.keys(codegenToSdkConfig)) { - if (task === taskName) { - return codegenToSdkConfig[task]; - } - } - return undefined; -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/index.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/index.ts deleted file mode 100644 index 16cc984b7de..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from './executeTask'; -export * from './getTask'; -export * from './runScript'; -export * from './generateResult'; -export * from './ResultPublisher'; -export * from './ArtifactUploader'; diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/runScript.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/runScript.ts deleted file mode 100644 index 712a7215fc4..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/runScript.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { spawn } from 'child_process'; -import * as fs from 'fs'; -import * as path from 'path'; -import { Readable } from 'stream'; -import { Logger } from 'winston'; - -import { StringMap, TaskResultStatus } from '../types'; -import { RunOptions } from '../types/taskInputAndOuputSchemaTypes/CodegenToSdkConfig'; -import { logger as globalLogger } from '../utils/logger'; - -let logger = globalLogger; - -export const isLineMatch = (line: string, filter: RegExp | undefined) => { - if (filter === undefined) { - return false; - } - filter = new RegExp(filter); - return filter.exec(line) !== null; -}; - -const listenOnStream = ( - prefix: string, - stream: Readable, - logType: 'cmdout' | 'cmderr' -) => { - const addLine = (line: string) => { - if (line.length === 0) { - return; - } - logger.log(logType, `${prefix} ${line}`); - }; - - stream.on('data', (data) => { - addLine(data.toString()); - }); -}; - -export async function runScript(runOptions: RunOptions, options: { - cwd: string; - args?: string[]; - envs?: StringMap; - customizedLogger?: Logger; -}): Promise { - if (!!options?.customizedLogger) { - logger = options.customizedLogger; - } - - let executeResult: TaskResultStatus; - const scriptCmd = runOptions.script; - const scriptPath = runOptions.path.trim(); - const env = { ...process.env, PWD: path.resolve(options.cwd), ...options.envs }; - - for (const e of runOptions.envs) { - env[e] = process.env[e]; - } - let cmdRet: { code: number | null; signal: NodeJS.Signals | null } = { - code: null, - signal: null - }; - logger.log('cmdout', 'task script path:' + path.join(options.cwd, scriptPath) ); - if (fs.existsSync(path.join(options.cwd, scriptPath))) { - logger.log('cmdout', 'chmod'); - fs.chmodSync(path.join(options.cwd, scriptPath), '777'); - } - - try { - let command: string = ''; - let args:string[] = []; - const scriptPaths: string[] = scriptPath.split(' '); - if (scriptCmd !== undefined && scriptCmd.length > 0) { - command = scriptCmd; - args = args.concat(scriptPaths); - } else { - command = scriptPaths[0]; - args = args.concat(scriptPaths.slice(1)); - } - args = args.concat(options.args); - const child = spawn(command, args, { - cwd: options.cwd, - shell: false, - stdio: ['ignore', 'pipe', 'pipe'], - env - }); - const prefix = `[${runOptions.logPrefix ?? path.basename(scriptPath)}]`; - listenOnStream(prefix, child.stdout, 'cmdout'); - listenOnStream(prefix, child.stderr, 'cmderr'); - - cmdRet = await new Promise((resolve) => { - child.on('exit', (code, signal) => { - resolve({ code, signal }); - }); - }); - if (cmdRet.code === 0) { - executeResult = TaskResultStatus.Success; - } else { - executeResult = TaskResultStatus.Failure; - } - } catch (e) { - cmdRet.code = -1; - logger.error(`${e.message}\n${e.stack}`); - executeResult = TaskResultStatus.Failure; - } - if (cmdRet.code !== 0 || cmdRet.signal !== null) { - executeResult = TaskResultStatus.Failure; - const message = `Script return with result [${executeResult}] code [${cmdRet.code}] signal [${cmdRet.signal}] cwd [${options.cwd}]: ${scriptPath}`; - logger.log('cmderr', message); - } - return executeResult; -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/codeGeneration.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/codeGeneration.ts deleted file mode 100644 index cfa511bcc7b..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/codeGeneration.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { IsNotEmpty, validateOrReject } from 'class-validator'; -import { BeforeInsert, BeforeUpdate, Column, Entity, Index, ObjectIdColumn } from 'typeorm'; - -@Entity('sdkGenerations') -export class CodeGeneration { - @BeforeInsert() - @BeforeUpdate() - async validate() { - try { - await validateOrReject(this); - } catch (e) { - throw new Error(JSON.stringify(e, null, 2)); - } - } - @ObjectIdColumn() - id: number; - @Index({ unique: true }) - @Column() - @IsNotEmpty() - name: string; - @Column() - @IsNotEmpty() - service: string; - @Column() - @IsNotEmpty() - serviceType: string; - @Column() - resourcesToGenerate: string; - @Column() - tag: string; - @Column() - @IsNotEmpty() - sdk: string; - @Column() - @IsNotEmpty() - swaggerRepo: string; - @Column() - @IsNotEmpty() - sdkRepo: string; - @Column() - @IsNotEmpty() - codegenRepo: string; - @Column() - @IsNotEmpty() - type: string; - @Column() - ignoreFailure: string; - @Column() - stages: string; - @Column({ default: '' }) - lastPipelineBuildID: string; - @Column() - swaggerPR: string; - @Column() - codePR: string; - @Column() - @IsNotEmpty() - status: string; - @Column({ default: '' }) - owner: string; -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/commonType.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/commonType.ts deleted file mode 100644 index 49d9ffb2c4f..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/commonType.ts +++ /dev/null @@ -1,37 +0,0 @@ -export enum ORG { - Azure = 'Azure', - Ms = 'microsoft', -} - -export enum SDK { - GoSDK = 'go', - NetSDK = 'net', - JsSDK = 'js', - JavaSDK = 'java', - PythonSDK = 'python', -} - -export enum RepoType { - Github = 'github', - DevOps = 'devops', -} - -export enum AzureSDKTaskName { - Init = 'init', - GenerateAndBuild = 'generateAndBuild', - MockTest = 'mockTest', - LiveTest = 'liveTest', -} - -export enum ServiceType { - DataPlane = 'data-plane', - ResourceManager = 'resource-manager', -} - -export enum StorageType { - Blob = 'blob', - Db = 'db', - EventHub = 'eventhub', -} - -export type SDKPipelineStatus = 'bot_update' | 'queued' | 'in_progress' | 'completed' | 'skipped'; diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/events.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/events.ts deleted file mode 100644 index 0cb894e04d0..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/events.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { SDKPipelineStatus } from './commonType'; -import { TaskResult } from './taskResult'; - -export type CommonTrigger = { - name: string; // the agent, e.g. UnifiedPipeline, Release, individual -}; - -export type PipelineTriggerSource = 'github' | 'openapi_hub'; - -export type UnifiedPipelineTrigger = CommonTrigger & { - source: PipelineTriggerSource; - pullRequestNumber: string; // the pull request number if it is triggerred by pr - headSha: string; // the CI commit - unifiedPipelineBuildId: string; // a unique build id unified pipeline assigned for each completed pipeline build id - unifiedPipelineTaskKey: string; // a unified pipeline task key, e.g. LintDiff, Semantic - unifiedPipelineSubTaskKey?: string; // sub task key, for dynamic generated sub task message -}; - -export type Trigger = CommonTrigger | UnifiedPipelineTrigger; - -export type PipelineRun = { - trigger: Trigger; - pipelineBuildId: string; // the id of the record for the completed azure pipeline build. - status: SDKPipelineStatus; -}; - -export type QueuedEvent = PipelineRun & { - status: 'queued'; -}; - -export type SkippedEvent = PipelineRun & { - status: 'skipped'; - subTitle?: string; -}; - -export type InProgressEvent = PipelineRun & { - status: 'in_progress'; -}; - -export type CompletedEvent = PipelineRun & { - status: 'completed'; - result: TaskResult; - logPath: string; - subTitle?: string; -}; - -export type PipelineRunEvent = QueuedEvent | InProgressEvent | CompletedEvent | SkippedEvent; diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/index.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/index.ts deleted file mode 100644 index b689fc1ae8d..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from './taskBasicConfig'; -export * from './taskResult'; -export * from './taskInputAndOuputSchemaTypes'; -export * from './commonType'; -export * from './codeGeneration'; -export * from './events'; diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskBasicConfig.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskBasicConfig.ts deleted file mode 100644 index 37abd3c5936..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskBasicConfig.ts +++ /dev/null @@ -1,80 +0,0 @@ -import convict from 'convict'; - -export class TaskBasicConfig { - sdkRepo: string; - configPath: string; - pipelineId: string; - queuedAt: string; - pipeLog: string; - pipeFullLog: string; - azureStorageBlobSasUrl: string; - azureBlobContainerName: string; - sdkGenerationName: string; - buildId: string; - taskName: string; - mockServerLog: string; -} - -export const taskBasicConfig = { - sdkRepo: { - default: '', - env: 'SDK_REPO', - format: String - }, - configPath: { - default: 'eng/codegen_to_sdk_config.json', - env: 'CONFIG_PATH', - format: String - }, - pipelineId: { - default: '', - env: 'PIPELINE_ID', - format: String - }, - queuedAt: { - default: '', - env: 'QUEUE_AT', - format: String - }, - pipeLog: { - default: '/tmp/sdk-generation/pipe.log', - env: 'PIPE_LOG', - format: String - }, - pipeFullLog: { - default: '/tmp/sdk-generation/pipe.full.log', - env: 'PIPE_FULL_LOG', - format: String - }, - mockServerLog: { - default: '', - env: 'MOCK_SERVER_LOG', - format: String - }, - sdkGenerationName: { - default: '', - env: 'SDK_GENERATION_NAME', - format: String - }, - buildId: { - default: '', - env: 'BUILD_ID', - format: String - }, - taskName: { - default: '', - env: 'TASK_NAME', - format: String - }, - azureStorageBlobSasUrl: { - default: '', - env: 'AZURE_STORAGE_BLOB_SAS_URL', - format: String - }, - azureBlobContainerName: { - default: 'sdks', - env: 'AZURE_BLOB_CONTAINER_NAME', - format: String - } -}; -export const getTaskBasicConfig = convict(taskBasicConfig); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/CodegenToSdkConfig.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/CodegenToSdkConfig.ts deleted file mode 100644 index dc55845b69c..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/CodegenToSdkConfig.ts +++ /dev/null @@ -1,41 +0,0 @@ -import * as path from 'path'; - -import { requireJsonc } from '../../utils/requireJsonc'; -import { getTypeTransformer } from '../../utils/validator'; - -export const codegenToSdkConfigSchema = requireJsonc(path.join(__dirname, 'CodegenToSdkConfigSchema.json')); - -export type RunOptions = { - path: string; - script?: string; - envs?: string[]; - logPrefix?: string; - logFilter?: LogFilter; -}; - -export type LogFilter = { - error?: RegExp; - warning?: RegExp; -}; - -export type InitOptions = { - initScript: RunOptions; -}; -export type GenerateAndBuildOptions = { - generateAndBuildScript: RunOptions; -}; -export type MockTestOptions = { - mockTestScript: RunOptions; -}; -export type LiveTestOptions = { - liveTestScript: RunOptions; -}; - -export type CodegenToSdkConfig = { - init: InitOptions; - generateAndBuild: GenerateAndBuildOptions; - mockTest: MockTestOptions; - liveTest: LiveTestOptions; -}; - -export const getCodegenToSdkConfig = getTypeTransformer(codegenToSdkConfigSchema, 'CodegenToSdkConfig'); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/CodegenToSdkConfigSchema.json b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/CodegenToSdkConfigSchema.json deleted file mode 100644 index 04159ae723e..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/CodegenToSdkConfigSchema.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "type": "object", - "properties": { - "init": { - "$ref": "#/definitions/InitOptions" - }, - "generateAndBuild": { - "$ref": "#/definitions/GenerateAndBuildOptions" - }, - "mockTest": { - "$ref": "#/definitions/MockTestOptions" - }, - "liveTest": { - "$ref": "#/definitions/LiveTestOptions" - } - }, - "definitions": { - "InitOptions": { - // Init the environment. Install dependencies. - "type": "object", - "properties": { - "initScript": { - // Script to init dependencies. - // Param: - // initOutput.json: See #initOutput. - "$ref": "#/definitions/RunOptions" - } - }, - "required": ["initScript"] - }, - "GenerateAndBuildOptions": { - // Generate the SDK code and build generated code. - "type": "object", - "properties": { - "generateAndBuildScript": { - // Script to generate the SDK code. - // Param: - "$ref": "#/definitions/RunOptions" - } - }, - "required": ["generateAndBuildScript"] - }, - "MockTestOptions": { - // Test the generated codes with mock server. - "type": "object", - "properties": { - "mockTestScript": { - // Script to run mock test. - // Param: - "$ref": "#/definitions/RunOptions" - } - }, - "required": ["mockTestScript"] - }, - "LiveTestOptions": { - // Test the generated codes online. - "type": "object", - "properties": { - "liveTestScript": { - // Script to run mock test. - // Param: - "$ref": "#/definitions/RunOptions" - } - }, - "required": ["liveTestScript"] - }, - "RunOptions": { - // Options to run a script and collect log. - "type": "object", - "properties": { - "path": { - // Script path related to repo root - "type": "string" - }, - "envs": { - // Extra environment variable to be passed to the script (except initScript). - // By default the following envs will be passed: - // PWD (current directory) - "type": "array", - "items": { - "type": "string" - }, - "default": [] - }, - "logPrefix": { - // Prefix to be added to SDK Automation log. By default it would be filename of the script. - "type": "string" - }, - "logFilter": { - // filter for error msg and warning msg. - "$ref": "#/definitions/LogFilter" - } - }, - "required": ["path"] - }, - "LogFilter": { - "type": "object", - "properties": { - "error": { - "type": "string", - "format": "regex", - "default": "/(error|Error|ERROR|failed|Failed|FAILED|exception|Exception|EXCEPTION)/g" - }, - "warning": { - "type": "string", - "format": "regex", - "default": "/warn/g" - } - } - } - } -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/GenerateAndBuildInput.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/GenerateAndBuildInput.ts deleted file mode 100644 index ee5dc782bf8..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/GenerateAndBuildInput.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { requireJsonc } from '../../utils/requireJsonc'; -import { getTypeTransformer } from '../../utils/validator'; - -export const generateAndBuildInputSchema = requireJsonc(__dirname + '/GenerateAndBuildInputSchema.json'); - -export type GenerateAndBuildInput = { - specFolder: string; - headSha: string; - headRef: string; - repoHttpsUrl: string; - relatedReadmeMdFile?: string; - relatedTypeSpecProjectFolder?: string; - serviceType: string; - autorestConfig: string; - skipGeneration: boolean; -}; - -export const getGenerateAndBuildInput = getTypeTransformer( - generateAndBuildInputSchema, - 'GenerateAndBuildInput' -); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/GenerateAndBuildInputSchema.json b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/GenerateAndBuildInputSchema.json deleted file mode 100644 index 3b6ca04fe08..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/GenerateAndBuildInputSchema.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "type": "object", - "properties": { - "specFolder": { - // Path to local spec folder. path to the parent of service folders. e.g. azure-rest-api-specs/specifications - "type": "string" - }, - "headSha": { - // Git head sha. - // If spec folder is not git repo, it will be empty string. - "type": "string" - }, - "headRef": { - // Git head ref. - // Format will be "refs/pull//merge" or "refs/heads/". - "type": "string" - }, - "repoHttpsUrl": { - // Spec repo url in https without auth. - "type": "string" - }, - "relatedReadmeMdFile": { - // Related readme.md files that pending generation. - "type": "string" - }, - "relatedTypeSpecProjectFolder": { - // Related typespec project folder that pending generation. - "type": "string" - }, - "serviceType": { - // The type of related swagger: resource-manager or data-plane - "type": "string", - "enum": ["resource-manager", "data-plane"] - }, - "autorestConfig": { - // The autorest config got from /autorest.md, which is mounted by user - "type": "string" - }, - "skipGeneration": { - // Whether skip generation - "type": "boolean" - } - }, - "required": ["specFolder", "headSha", "headRef", "repoHttpsUrl"] -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/GenerateAndBuildOutput.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/GenerateAndBuildOutput.ts deleted file mode 100644 index a72577b8280..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/GenerateAndBuildOutput.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { requireJsonc } from '../../utils/requireJsonc'; -import { getTypeTransformer } from '../../utils/validator'; -import { TaskResultStatus } from '../taskResult'; - -export const generateAndBuildOutputSchema = requireJsonc(__dirname + '/GenerateAndBuildOutputSchema.json'); - -export type PackageResult = { - packageName: string; - result: TaskResultStatus; - path: string[]; - packageFolder: string; - changelog?: { - content: string; - hasBreakingChange?: boolean; - breakingChangeItems?: string[]; - }; - artifacts?: string[]; -}; - -export type GenerateAndBuildOutput = { - packages: PackageResult[]; -}; - -export const getGenerateAndBuildOutput = getTypeTransformer( - generateAndBuildOutputSchema, - 'GenerateAndBuildOutput' -); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/GenerateAndBuildOutputSchema.json b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/GenerateAndBuildOutputSchema.json deleted file mode 100644 index 744cc75c37e..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/GenerateAndBuildOutputSchema.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "type": "object", - "properties": { - "packages": { - "type": "array", - "items": { - "$ref": "#/definitions/PackageResult" - } - } - }, - "required": ["packages"], - "definitions": { - "PackageResult": { - "properties": { - "packageName": { - // Name of package. Will be used in branch name, PR title and the folder name to store the generated codes. - "type": "string" - }, - "result": { - // Status of package. By default it's succeeded. - "type": "string", - "enum": ["failed", "succeeded"], - "default": "succeeded" - }, - "path": { - // List of package content paths. - // If the path points to a folder then - // all the content under the folder will be included. - "type": "array", - "items": { - "type": "string" - } - }, - "packageFolder": { - // The path of package folder. - "type": "string" - }, - "changelog": { - "type": "object", - "properties": { - "content": { - // Content of changelog in markdown - "type": "string" - }, - "hasBreakingChange": { - // Does the new package has breaking change - "type": "boolean" - }, - "breakingChangeItems": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": ["content"] - }, - "artifacts": { - // The path to artifacts - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": ["packageName", "path", "packageFolder"] - } - } -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/InitOutput.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/InitOutput.ts deleted file mode 100644 index 00bd48b62b4..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/InitOutput.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { requireJsonc } from '../../utils/requireJsonc'; -import { getTypeTransformer } from '../../utils/validator'; - -export const initOutputSchema = requireJsonc(__dirname + '/InitOutputSchema.json'); - -export declare type StringMap = { - [key: string]: TValue; -}; -export type InitOutput = { - envs: StringMap; -}; - -export const initOutput = getTypeTransformer( - initOutputSchema, - 'InitOutput' -); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/InitOutputSchema.json b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/InitOutputSchema.json deleted file mode 100644 index a2353494ccb..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/InitOutputSchema.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "type": "object", - "properties": { - "envs": { - // Environment variable to be set in following scripts. - "additionalProperties": { - "type": "string" - } - } - } -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/LiveTestInput.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/LiveTestInput.ts deleted file mode 100644 index 3dc7ddbec5f..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/LiveTestInput.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { requireJsonc } from '../../utils/requireJsonc'; -import { getTypeTransformer } from '../../utils/validator'; - -export const liveTestInputSchema = requireJsonc(__dirname + '/LiveTestInputSchema.json'); - -export type LiveTestInput = { - packageFolder: string; -}; - -export const getLiveTestInput = getTypeTransformer(liveTestInputSchema, 'MockTestInput'); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/LiveTestInputSchema.json b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/LiveTestInputSchema.json deleted file mode 100644 index 25ae5d69741..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/LiveTestInputSchema.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "type": "object", - "properties": { - "packageFolder": { - // The path of package folder - "type": "string" - } - }, - "required": ["packageFolder"] -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/MockTestInput.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/MockTestInput.ts deleted file mode 100644 index 4cb2d6f10b3..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/MockTestInput.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { requireJsonc } from '../../utils/requireJsonc'; -import { getTypeTransformer } from '../../utils/validator'; - -export const mockTestInputSchema = requireJsonc(__dirname + '/MockTestInputSchema.json'); - -export type MockTestInput = { - packageFolder: string; - mockServerHost: string; -}; - -export const getMockTestInput = getTypeTransformer(mockTestInputSchema, 'MockTestInput'); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/MockTestInputSchema.json b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/MockTestInputSchema.json deleted file mode 100644 index c3bcd25b8e8..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/MockTestInputSchema.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "type": "object", - "properties": { - "packageFolder": { - // The path of package folder - "type": "string" - }, - "mockServerHost": { - "type": "string" - } - }, - "required": ["packageFolder", "mockServerHost"] -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/TestOutput.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/TestOutput.ts deleted file mode 100644 index dc883bbc9ce..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/TestOutput.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { requireJsonc } from '../../utils/requireJsonc'; -import { getTypeTransformer } from '../../utils/validator'; - -export const testOutputSchema = requireJsonc(__dirname + '/TestOutputSchema.json'); - -export type TestOutput = { - total: number; - success: number; - fail: number; - apiCoverage: number; - codeCoverage: number; -}; - -export const getTestOutput = getTypeTransformer(testOutputSchema, 'TestOutput'); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/TestOutputSchema.json b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/TestOutputSchema.json deleted file mode 100644 index 7dd2a753b37..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/TestOutputSchema.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "object", - "properties": { - // Test Result - "total": { - "type": "number" - }, - "success": { - "type": "number" - }, - "fail": { - "type": "number" - }, - "apiCoverage": { - "type": "number" - }, - "codeCoverage": { - "type": "number" - } - } -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/index.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/index.ts deleted file mode 100644 index e026e468bf5..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskInputAndOuputSchemaTypes/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from './InitOutput'; -export * from './GenerateAndBuildInput'; -export * from './GenerateAndBuildOutput'; -export * from './MockTestInput'; -export * from './LiveTestInput'; -export * from './TestOutput'; -export * from './CodegenToSdkConfig'; diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskResult.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskResult.ts deleted file mode 100644 index 26ec9333e2e..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskResult.ts +++ /dev/null @@ -1,161 +0,0 @@ -import * as fs from 'fs'; -import { Column, Entity, ObjectIdColumn } from 'typeorm'; - -import { logger } from '../utils/logger'; -import { requireJsonc } from '../utils/requireJsonc'; -import { getTaskBasicConfig, TaskBasicConfig } from './taskBasicConfig'; -import { GenerateAndBuildOutput } from './taskInputAndOuputSchemaTypes/GenerateAndBuildOutput'; -import { InitOutput } from './taskInputAndOuputSchemaTypes/InitOutput'; -import { TestOutput } from './taskInputAndOuputSchemaTypes/TestOutput'; - -@Entity('sdkGenerationResults') -export class TaskResultEntity { - @ObjectIdColumn() - id: string; - @Column() - key: string; - @Column() - pipelineBuildId: string; - @Column() - taskResult: TaskResult; -} - -export enum TaskResultStatus { - Success = 'succeeded', - Failure = 'failed', -} - -export type Extra = { - [key: string]: any; -}; - -export type MessageLevel = 'Info' | 'Warning' | 'Error'; - -export type JsonPath = { - tag: string; // meta info about the path, e.g. "swagger" or "example" - path: string; -}; - -export type MesssageContext = { - toolVersion: string; -}; -export type BaseMessageRecord = { - level: MessageLevel; - message: string; - time: Date; - extra?: Extra; -}; - -export type ResultMessageRecord = BaseMessageRecord & { - type: 'Result'; - id?: string; - code?: string; - docUrl?: string; - paths: JsonPath[]; -}; - -export type RawMessageRecord = BaseMessageRecord & { - type: 'Raw'; -}; - -export type MarkdownMessageRecord = BaseMessageRecord & { - type: 'Markdown'; - mode: 'replace' | 'append'; -}; -export type MessageRecord = ResultMessageRecord | RawMessageRecord | MarkdownMessageRecord; - -export type TaskResultCommon = { - name: string; - pipelineBuildId: string; - result: TaskResultStatus; - errorCount?: number; - warningCount?: number; - logUrl?: string; - messages?: MessageRecord[]; - codeUrl?: string; - pullRequest?: string; - artifacts?: Artifact[]; -}; - -export type Artifact = { - name: string; - path: string; - remoteUrl?: string; -}; - -export interface TestCase { - name: string; - passed: boolean; - message: string; -} -export type TestTaskResult = TaskResultCommon & { - total?: number; - success?: number; - fail?: number; - apiCoverage?: number; - codeCoverage?: number; - testCases?: TestCase[]; -}; - -export type TaskResult = TaskResultCommon | TestTaskResult; -export type TaskOutput = InitOutput | GenerateAndBuildOutput | TestOutput | undefined; - -export function setTaskResult(config: TaskBasicConfig, taskName: string) { - taskResult = { - name: taskName, - pipelineBuildId: '', - result: TaskResultStatus.Success, - errorCount: 0, - warningCount: 0 - }; -} - -export let taskResult: TaskResult; -export let testTaskResult: TestTaskResult; - -export function saveTaskResult() { - const config: TaskBasicConfig = getTaskBasicConfig.getProperties(); - fs.writeFileSync(config.pipeLog, JSON.stringify(taskResult, null, 2), { encoding: 'utf-8' }); -} - -export function generateTotalResult(taskResults: TaskResult[], pipelineBuildId: string): TaskResult { - const totalResult: TaskResult = { - name: 'total', - pipelineBuildId: pipelineBuildId, - result: TaskResultStatus.Success, - errorCount: 0, - messages: [] - }; - - if (taskResults.length === 0) { - totalResult.result = TaskResultStatus.Failure; - return totalResult; - } - - for (const taskResult of taskResults) { - if (taskResult.result !== TaskResultStatus.Success) { - totalResult.result = taskResult.result; - } - totalResult.errorCount += taskResult.errorCount; - if (taskResult.messages) { - for (const msg of taskResult.messages) { - totalResult.messages.push(msg); - } - } - } - - return totalResult; -} - -export function getTaskResults(taskResultsPath: string): TaskResult[] { - const taskResultsPathArray = JSON.parse(taskResultsPath); - const taskResults: TaskResult[] = []; - for (const taskResultPath of taskResultsPathArray) { - if (fs.existsSync(taskResultPath)) { - taskResults.push(requireJsonc(taskResultPath)); - } else { - logger.warn(`${taskResultPath} isn't exist, skip.`); - } - } - return taskResults; -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/blob/AzureBlobClient.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/blob/AzureBlobClient.ts deleted file mode 100644 index e93c44ca1a5..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/blob/AzureBlobClient.ts +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See License in the project root for license information. -import { BlobServiceClient } from '@azure/storage-blob'; - -import { logger } from '../logger'; - -export class AzureBlobClient { - private blobServiceClient: BlobServiceClient; - private containerName: string; - constructor(sasURL: string, containerName: string) { - this.blobServiceClient = new BlobServiceClient(sasURL); - this.containerName = containerName; - } - - public async publishBlob( - filePath: string, - blobName: string, - createContainer: boolean = true - ) { - const containerClient = - this.blobServiceClient.getContainerClient(this.containerName); - if (createContainer && !(await containerClient.exists())) { - const resp = await containerClient.create(); - if (resp.errorCode) { - throw new Error( - `Failed to create container for ${this.containerName}:${resp}` - ); - } - } - - const blockBlobClient = containerClient.getBlockBlobClient(blobName); - logger.info(`Uploading ${filePath} to ${this.containerName}/${blobName}`); - const resp = await blockBlobClient.uploadFile(filePath); - if (resp.errorCode) { - throw new Error(`Failed to upload ${filePath}:${resp}`); - } - - return resp; - } -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/blob/index.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/blob/index.ts deleted file mode 100644 index f07a4980dd2..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/blob/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './AzureBlobClient'; diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/db/codeGenerationDao.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/db/codeGenerationDao.ts deleted file mode 100644 index 1d97df3a9ba..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/db/codeGenerationDao.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { CodeGeneration } from '../../types/codeGeneration'; - -export interface CodeGenerationDao { - getCodeGenerationByName(name: string); - submitCodeGeneration(codegen: CodeGeneration); - updateCodeGenerationValuesByName(name: string, values: any); - deleteCodeGenerationByName(name: string); - listCodeGenerations(filters: any, filterCompleted?: boolean); - updateCodeGenerationValueByName(name: string, key: string, value: string); - listCodeGenerationsByStatus(status: string); -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/db/codeGenerationDaoImpl.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/db/codeGenerationDaoImpl.ts deleted file mode 100644 index 0f5cf9f8bd0..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/db/codeGenerationDaoImpl.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { DataSource, MongoRepository } from 'typeorm'; - -import { CodeGeneration } from '../../types/codeGeneration'; -import { CodeGenerationDao } from './codeGenerationDao'; - -export class CodeGenerationDaoImpl implements CodeGenerationDao { - private repo: MongoRepository; - - constructor(connection: DataSource) { - this.repo = connection.getMongoRepository(CodeGeneration); - } - - public async getCodeGenerationByName(name: string): Promise { - const codegen = await this.repo.findOneBy({ name: name }); - return codegen; - } - - public async submitCodeGeneration(codegen: CodeGeneration): Promise { - // findOneAndReplace will not trigger BeforeInsert and BeforeUpdate event, so validate here - await codegen.validate(); - try { - await this.repo.findOneAndReplace({ name: codegen.name }, codegen, { upsert: true }); - } catch (e) { - console.error(`${e.message} - ${e.stack}`); - } - } - - /* update code-gen information. */ - public async updateCodeGenerationValuesByName(name: string, values: any): Promise { - const codegen = await this.repo.findOneBy({ name: name }); - for (const key of Object.keys(values)) { - codegen[key] = values[key]; - } - await this.repo.save(codegen); - } - - public async deleteCodeGenerationByName(name: string): Promise { - const codegen = await this.repo.findOneBy({ name: name }); - await this.repo.deleteOne(codegen); - } - - /* Get all code generations of an special onboard type. */ - public async listCodeGenerations(filters: any = undefined, filterCompleted = false): Promise { - let finalFilters: any; - if (!filters) { - filters = {}; - } - if (filterCompleted) { - finalFilters = { - where: { $and: [{ status: { $ne: 'completed' } }, { status: { $ne: 'pipelineCompleted' } }, filters] } - }; - } else { - finalFilters = filters; - } - const codegens = await this.repo.find(finalFilters); - return codegens; - } - - /* update code-gen information. */ - public async updateCodeGenerationValueByName(name: string, key: string, value: string): Promise { - const codegen = await this.repo.findOneBy({ name: name }); - codegen[key] = value; - await this.repo.save(codegen); - } - - public async listCodeGenerationsByStatus(status: string): Promise { - const codegens = await this.repo.find({ status: status }); - return codegens; - } -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/db/index.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/db/index.ts deleted file mode 100644 index 88075e7a114..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/db/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './codeGenerationDao'; -export * from './codeGenerationDaoImpl'; -export * from './taskResultDao'; -export * from './taskResultDaoImpl'; diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/db/taskResultDao.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/db/taskResultDao.ts deleted file mode 100644 index 7a235b4066a..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/db/taskResultDao.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { TaskResult } from '../../types/taskResult'; - -export interface TaskResultDao { - getFromBuild(pipelineBuildId: string); - put(pipelineBuildId: string, taskResult: TaskResult); -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/db/taskResultDaoImpl.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/db/taskResultDaoImpl.ts deleted file mode 100644 index c070c15d689..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/db/taskResultDaoImpl.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Connection, MongoRepository } from 'typeorm'; - -import { TaskResult, TaskResultEntity } from '../../types/taskResult'; -import { TaskResultDao } from './taskResultDao'; - -export class TaskResultDaoImpl implements TaskResultDao { - private repo: MongoRepository; - - constructor(connection: Connection) { - this.repo = connection.getMongoRepository(TaskResultEntity); - } - - public async getFromBuild(pipelineBuildId: string): Promise { - const taskResults: TaskResultEntity[] = await this.repo.find({ - pipelineBuildId: pipelineBuildId - }); - const results: TaskResult[] = []; - for (const taskResult of taskResults) { - results.push(taskResult.taskResult); - } - return results; - } - - public async put(pipelineBuildId: string, taskResult: TaskResult) { - const key = `${pipelineBuildId}/${taskResult.name}`; - await this.repo.findOneAndReplace( - { key: key }, - { - key: key, - pipelineBuildId: pipelineBuildId, - taskResult: taskResult - }, - { upsert: true } - ); - } -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/eventhub/EventHubProducer.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/eventhub/EventHubProducer.ts deleted file mode 100644 index 1774e70e4ea..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/eventhub/EventHubProducer.ts +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See License in the project root for license information. -import { - CreateBatchOptions, - EventDataBatch, - EventHubProducerClient -} from '@azure/event-hubs'; - -import { logger } from '../logger'; - -export class EventHubProducer { - private producer: EventHubProducerClient; - constructor(sasUrl: string) { - this.producer = new EventHubProducerClient(sasUrl); - } - - private async createBatch(partitionKey?: string) { - const batchOptions: CreateBatchOptions = {}; - if (partitionKey) { - batchOptions.partitionKey = partitionKey; - } - - return await this.producer.createBatch(batchOptions); - } - - private async* getBatchIterator(events: string[], partitionKey?: string) { - let toAddIndex = 0; - if (toAddIndex >= events.length) { - return; - } - const batch = await this.createBatch(partitionKey); - - while (toAddIndex < events.length) { - const success = batch.tryAdd({ body: events[toAddIndex] }); - if (!success) { - if (batch.count > 0) { - // batch is full - break; - } else { - // none event in batch, maybe the event is too large - throw new Error( - `Failed to add ${JSON.stringify( - events[toAddIndex] - )} to batch` - ); - } - } - ++toAddIndex; - } - yield batch; - } - - public async send(events: string[], partitionKey?: string) { - logger.info(`events to send: ${events}`); - const batchIterator = this.getBatchIterator(events, partitionKey); - let next = await batchIterator.next(); - while (!next.done) { - if (next.value !== undefined) { - const batch: EventDataBatch = next.value as EventDataBatch; - await this.producer.sendBatch(batch); - } - next = await batchIterator.next(); - } - logger.info('Send events done'); - } - - public async close() { - try { - await this.producer.close(); - } catch (err) { - logger.error('Error when closing client: ', err); - } // swallow the error - } -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/eventhub/index.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/eventhub/index.ts deleted file mode 100644 index 42ad362465a..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/eventhub/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './EventHubProducer'; diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/index.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/index.ts deleted file mode 100644 index 52beb0e5551..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from './logger'; -export * from './requireJsonc'; -export * from './validator'; -export * from './blob'; -export * from './db'; -export * from './eventhub'; -export * from './metric'; diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/logger.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/logger.ts deleted file mode 100644 index 0152dbff07b..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/logger.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { createLogger, format, Logger, transports } from 'winston'; -import { FileTransportInstance } from 'winston/lib/winston/transports'; - -import { getTaskBasicConfig } from '../types'; - -const loggerLevels = { - levels: { - error: 0, - warn: 1, - cmdout: 2, - cmderr: 3, - info: 4, - debug: 5 - }, - colors: { - error: 'red', - warn: 'yellow', - cmdout: 'green underline', - cmderr: 'yellow underline', - info: 'green', - debug: 'blue' - } -}; - -type WinstonInfo = { - level: keyof typeof loggerLevels.levels; - message: string; - timestamp: string; -}; - -const fileTransportInstances: { - [key: string]: FileTransportInstance -} = {}; - -export function addFileLog(logger: Logger, logPath: string, taskName: string) { - const fileTransportInstance = new transports.File({ - level: 'info', - filename: logPath, - options: { flags: 'w' }, - format: format.combine( - format.timestamp({ format: 'YYYY-MM-DD hh:mm:ss' }), - format.printf((info: WinstonInfo) => { - const msg = `${info.timestamp} ${info.level} \t${info.message}`; - return msg; - }) - ) - }); - fileTransportInstances[taskName] = fileTransportInstance; - logger.add(fileTransportInstance); -} - -export function removeFileLog(logger: Logger, taskName: string) { - if (!fileTransportInstances[taskName]) { - throw new Error(`Try to remove non-existed logger transport: ${taskName}`); - } - logger.remove(fileTransportInstances[taskName]); -} - -export function initializeLogger(logPath: string, taskName: string, addConsoleLog: boolean = true): Logger { - const logger = createLogger({ - levels: loggerLevels.levels - }); - - addFileLog(logger, logPath, taskName); - - if (addConsoleLog) { - logger.add(new transports.Console({ - level: 'info', - format: format.combine( - format.colorize({ colors: loggerLevels.colors }), - format.timestamp({ format: 'YYYY-MM-DD hh:mm:ss' }), - format.printf((info: WinstonInfo) => { - const msg = `${info.timestamp} ${info.level} \t${info.message}`; - return msg; - }) - ) - })); - } - return logger; -} - -// export a default logger, which can be used by pipeline commands -export const logger = initializeLogger(getTaskBasicConfig?.getProperties()?.pipeFullLog, 'pipeline'); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/metric/MonitorClient.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/metric/MonitorClient.ts deleted file mode 100644 index 4e2b3ddfe47..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/metric/MonitorClient.ts +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See License in the project root for license information. -import * as statsd from 'hot-shots'; - -export enum Metrics { - Liveness = 'liveness', - ApiCalls = 'apiCalls', - InternalServerError = 'InternalServerError', - BadRequest = 'BadRequest', - NotFound = 'NotFound', - Success = 'success', -} - -export class MonitorClient { - private stats = undefined; - constructor(host: string, port: number, mock: boolean) { - this.stats = new statsd.StatsD({ - host: host, - port: port, - mock: mock - }); - } - - /** - * call to emit metrics from the service. - */ - public emitMetric( - metric: Metrics, - value: number, - env: string, - podName: string, - nodeName: string, - deploymentRegion: string, - serviceName: string, - dims?: { [key: string]: string | number } - ): void { - if (!dims) { - dims = {}; - } - dims.env = env; - dims.pod = podName; - dims.node = nodeName; - dims.region = deploymentRegion; - // Format must not be changed of the JSON object so it conforms with the Geneva statsd protocol. - const stat = JSON.stringify({ - Namespace: serviceName, - Metric: metric, - Dims: dims - }); - this.stats.gauge(stat, value); - } -} diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/metric/index.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/metric/index.ts deleted file mode 100644 index ba52427e696..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/metric/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './MonitorClient'; diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/requireJsonc.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/requireJsonc.ts deleted file mode 100644 index f885a38ee6f..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/requireJsonc.ts +++ /dev/null @@ -1,8 +0,0 @@ -import * as fs from 'fs'; -import { parse } from 'jsonc-parser'; - -export const requireJsonc = (path: string) => { - const contentStr = fs.readFileSync(path).toString(); - const content = parse(contentStr); - return content; -}; diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/validator.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/validator.ts deleted file mode 100644 index 4d8644d5486..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/utils/validator.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ValidateFunction } from 'ajv'; - -const ajvInstance = require('ajv'); - -const ajv = new ajvInstance({ - coerceTypes: true, - messages: true, - verbose: true, - useDefaults: true -}); - -export const getTypeTransformer = (schema: object, name: string) => { - let validator: ValidateFunction | undefined; - return (obj: unknown) => { - if (validator === undefined) { - validator = ajv.compile(schema); - } - if (!validator(obj)) { - const error = validator.errors![0]; - throw new Error(`Invalid ${name}: ${error.dataPath} ${error.message}`); - } - - return obj as T; - }; -}; diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/test/unit/ArtifactUploader.test.ts.tmp b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/test/unit/ArtifactUploader.test.ts.tmp deleted file mode 100644 index 9942a1b1ef7..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/test/unit/ArtifactUploader.test.ts.tmp +++ /dev/null @@ -1,8 +0,0 @@ -import { ArtifactBlobUploader } from '../../src/lib/ArtifactUploader'; - -// beforeAll(); -test('test constructor', async () => { - expect(new ArtifactBlobUploader(undefined)).toThrowError(); -}); - -// afterAll(); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/test/unit/ResultPublisher.test.ts.tmp b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/test/unit/ResultPublisher.test.ts.tmp deleted file mode 100644 index 5ad09bfe3a8..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/test/unit/ResultPublisher.test.ts.tmp +++ /dev/null @@ -1,4 +0,0 @@ -// beforeAll(); -// test('', async () => {}); - -// afterAll(); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/test/unit/codeGenerationDao.test.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/test/unit/codeGenerationDao.test.ts deleted file mode 100644 index 7b988901044..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/test/unit/codeGenerationDao.test.ts +++ /dev/null @@ -1,436 +0,0 @@ -import { Connection, createConnection } from 'typeorm'; - -import { CodeGeneration } from '../../src/types/codeGeneration'; -import { CodeGenerationDao } from '../../src/utils/db/codeGenerationDao'; -import { CodeGenerationDaoImpl } from '../../src/utils/db/codeGenerationDaoImpl'; - -let mongoDbConnection: Connection; - -async function initDaoTest() { - mongoDbConnection = await createConnection({ - name: 'mongodb', - type: 'mongodb', - host: '127.0.0.1', - port: 27017, - username: 'test', - password: '123456', - database: 'admin', - synchronize: true, - logging: true, - entities: [CodeGeneration] - }); -} - -beforeAll(async (done) => { - await initDaoTest(); - done(); -}); - -test('dao test submitCodeGeneration and getCodeGenerationByName1', async () => { - const cg: CodeGeneration = new CodeGeneration(); - cg.name = 'test1a'; - cg.service = 'msi'; - cg.serviceType = 'resource-manager'; - cg.resourcesToGenerate = ''; - cg.tag = null; - cg.sdk = 'javascript'; - cg.swaggerRepo = '{"type": "github", "path":"https://github.com/azure"}'; - cg.sdkRepo = '{"type":"github", "path":"https://github.com/azure"}'; - cg.codegenRepo = '{"type":"github", "path":"https://github.com/azure"}'; - cg.owner = 'SDK'; - cg.type = 'ad-hoc'; - cg.status = 'submit'; - - const codeGenerationDao: CodeGenerationDao = new CodeGenerationDaoImpl(mongoDbConnection); - await codeGenerationDao.deleteCodeGenerationByName(cg.name); - await codeGenerationDao.submitCodeGeneration(cg); - - const retCg: CodeGeneration = await codeGenerationDao.getCodeGenerationByName(cg.name); - expect(retCg.service).toBe('msi'); - expect(retCg.serviceType).toBe('resource-manager'); - expect(retCg.tag).toBeNull(); - expect(retCg.sdk).toBe('javascript'); - expect(retCg.swaggerRepo).toBe('{"type": "github", "path":"https://github.com/azure"}'); - expect(retCg.sdkRepo).toBe('{"type":"github", "path":"https://github.com/azure"}'); - expect(retCg.codegenRepo).toBe('{"type":"github", "path":"https://github.com/azure"}'); - expect(retCg.owner).toBe('SDK'); - expect(retCg.type).toBe('ad-hoc'); - expect(retCg.status).toBe('submit'); -}); - -test('dao test submitCodeGeneration and getCodeGenerationByName2', async () => { - const cg: CodeGeneration = new CodeGeneration(); - cg.name = 'test1b'; - cg.service = 'msi'; - cg.serviceType = 'resource-manager'; - cg.resourcesToGenerate = ''; - cg.tag = null; - cg.sdk = 'javascript'; - cg.swaggerRepo = '{"type": "github", "path":"https://github.com/azure"}'; - cg.sdkRepo = '{"type":"github", "path":"https://github.com/azure"}'; - cg.codegenRepo = '{"type":"github", "path":"https://github.com/azure"}'; - cg.type = 'ad-hoc'; - cg.status = 'submit'; - cg.ignoreFailure = null; - cg.stages = null; - cg.swaggerPR = null; - cg.codePR = null; - cg.owner = null; - - const codeGenerationDao: CodeGenerationDao = new CodeGenerationDaoImpl(mongoDbConnection); - await codeGenerationDao.deleteCodeGenerationByName(cg.name); - await codeGenerationDao.submitCodeGeneration(cg); - - const retCg: CodeGeneration = await codeGenerationDao.getCodeGenerationByName(cg.name); - expect(retCg.service).toBe('msi'); - expect(retCg.serviceType).toBe('resource-manager'); - expect(retCg.tag).toBeNull(); - expect(retCg.sdk).toBe('javascript'); - expect(retCg.swaggerRepo).toBe('{"type": "github", "path":"https://github.com/azure"}'); - expect(retCg.sdkRepo).toBe('{"type":"github", "path":"https://github.com/azure"}'); - expect(retCg.codegenRepo).toBe('{"type":"github", "path":"https://github.com/azure"}'); - expect(retCg.owner).toBeNull(); - expect(retCg.type).toBe('ad-hoc'); - expect(retCg.status).toBe('submit'); - expect(retCg.ignoreFailure).toBeNull(); - expect(retCg.stages).toBeNull(); - expect(retCg.swaggerPR).toBeNull(); - expect(retCg.codePR).toBeNull(); -}); - -test('dao test submitCodeGeneration and getCodeGenerationByName3', async () => { - const cg: CodeGeneration = new CodeGeneration(); - cg.name = 'test1c'; - cg.service = 'msi'; - cg.serviceType = 'resource-manager'; - cg.resourcesToGenerate = ''; - cg.tag = null; - cg.sdk = 'javascript'; - cg.swaggerRepo = '{"type": "github", "path":"https://github.com/azure"}'; - cg.sdkRepo = '{"type":"github", "path":"https://github.com/azure"}'; - cg.codegenRepo = '{"type":"github", "path":"https://github.com/azure"}'; - cg.type = 'ad-hoc'; - cg.status = 'submit'; - cg.ignoreFailure = null; - cg.stages = null; - cg.swaggerPR = null; - cg.codePR = null; - cg.owner = null; - - const cg2: CodeGeneration = new CodeGeneration(); - cg2.name = 'test1c'; - cg2.service = 'msi'; - cg2.serviceType = 'resource-manager'; - cg2.resourcesToGenerate = ''; - cg2.tag = null; - cg2.sdk = 'javascript'; - cg2.swaggerRepo = '{"type": "github", "path":"https://github.com/azure"}'; - cg2.sdkRepo = '{"type":"github", "path":"https://github.com/azure"}'; - cg2.codegenRepo = '{"type":"github", "path":"https://github.com/azure"}'; - cg2.type = 'ad-hoc'; - cg2.status = 'submit'; - cg2.ignoreFailure = null; - cg2.stages = null; - cg2.swaggerPR = null; - cg2.codePR = null; - cg2.owner = null; - - const codeGenerationDao: CodeGenerationDao = new CodeGenerationDaoImpl(mongoDbConnection); - - await codeGenerationDao.deleteCodeGenerationByName(cg.name); - await codeGenerationDao.submitCodeGeneration(cg); - // submitCodeGeneration will cover the instance which has the same codegen name - await codeGenerationDao.submitCodeGeneration(cg2); - - await codeGenerationDao.deleteCodeGenerationByName(cg.name); - cg.name = null; - - // one codeGen can't submit twice, unless delete the first one - // class-validator throw a array(not an error) and jest can't catch it, so use toBeTruthy - await expect(codeGenerationDao.submitCodeGeneration(cg)).rejects.toThrow(); - cg.name = 'test1c'; - // next cases check columns which can't be null - await codeGenerationDao.deleteCodeGenerationByName(cg.name); - cg.service = null; - await expect(codeGenerationDao.submitCodeGeneration(cg)).rejects.toBeTruthy(); - cg.service = 'msi'; - - await codeGenerationDao.deleteCodeGenerationByName(cg.name); - cg.serviceType = null; - await expect(codeGenerationDao.submitCodeGeneration(cg)).rejects.toBeTruthy(); - cg.serviceType = 'resource-manager'; - - await codeGenerationDao.deleteCodeGenerationByName(cg.name); - cg.sdk = null; - await expect(codeGenerationDao.submitCodeGeneration(cg)).rejects.toBeTruthy(); - cg.sdk = 'javascript'; - - await codeGenerationDao.deleteCodeGenerationByName(cg.name); - cg.swaggerRepo = null; - await expect(codeGenerationDao.submitCodeGeneration(cg)).rejects.toBeTruthy(); - cg.swaggerRepo = '{"type": "github", "path":"https://github.com/azure"}'; - - await codeGenerationDao.deleteCodeGenerationByName(cg.name); - cg.sdkRepo = null; - await expect(codeGenerationDao.submitCodeGeneration(cg)).rejects.toBeTruthy(); - cg.sdkRepo = '{"type":"github", "path":"https://github.com/azure"}'; - - await codeGenerationDao.deleteCodeGenerationByName(cg.name); - cg.codegenRepo = null; - await expect(codeGenerationDao.submitCodeGeneration(cg)).rejects.toBeTruthy(); - cg.codegenRepo = '{"type":"github", "path":"https://github.com/azure"}'; - - await codeGenerationDao.deleteCodeGenerationByName(cg.name); - cg.type = null; - await expect(codeGenerationDao.submitCodeGeneration(cg)).rejects.toBeTruthy(); - cg.type = 'ad-hoc'; - - await codeGenerationDao.deleteCodeGenerationByName(cg.name); - cg.status = null; - await expect(codeGenerationDao.submitCodeGeneration(cg)).rejects.toBeTruthy(); - cg.status = 'submit'; -}); - -test('dao test submitCodeGeneration, updateCodeGenerationValueByName and getCodeGenerationByName', async () => { - const cg: CodeGeneration = new CodeGeneration(); - cg.name = 'test2'; - cg.service = 'msi'; - cg.serviceType = 'resource-manager'; - cg.resourcesToGenerate = null; - cg.tag = null; - cg.sdk = 'javascript'; - cg.swaggerRepo = '{"type": "github", "path":"https://github.com/azure"}'; - cg.sdkRepo = '{"type":"github", "path":"https://github.com/azure"}'; - cg.codegenRepo = '{"type":"github", "path":"https://github.com/azure"}'; - cg.owner = 'SDK'; - cg.type = 'ad-hoc'; - cg.status = 'submit'; - - const codeGenerationDao: CodeGenerationDao = new CodeGenerationDaoImpl(mongoDbConnection); - await codeGenerationDao.deleteCodeGenerationByName(cg.name); - await codeGenerationDao.submitCodeGeneration(cg); - await codeGenerationDao.updateCodeGenerationValueByName(cg.name, 'owner', 'SWG'); - // check columns which can't be null - await expect(codeGenerationDao.updateCodeGenerationValueByName(cg.name, 'status', null)).rejects.toBeTruthy(); - - const retCg: CodeGeneration = await codeGenerationDao.getCodeGenerationByName(cg.name); - expect(retCg.service).toBe('msi'); - expect(retCg.serviceType).toBe('resource-manager'); - expect(retCg.tag).toBeNull(); - expect(retCg.sdk).toBe('javascript'); - expect(retCg.swaggerRepo).toBe('{"type": "github", "path":"https://github.com/azure"}'); - expect(retCg.sdkRepo).toBe('{"type":"github", "path":"https://github.com/azure"}'); - expect(retCg.codegenRepo).toBe('{"type":"github", "path":"https://github.com/azure"}'); - expect(retCg.owner).toBe('SWG'); - expect(retCg.type).toBe('ad-hoc'); - expect(retCg.status).toBe('submit'); -}); - -test('dao test submitCodeGeneration, getCodeGenerationByName and deleteCodeGenerationByName', async () => { - const cg: CodeGeneration = new CodeGeneration(); - cg.name = 'test3'; - cg.service = 'msi'; - cg.serviceType = 'resource-manager'; - cg.resourcesToGenerate = ''; - cg.tag = null; - cg.sdk = 'javascript'; - cg.swaggerRepo = '{"type": "github", "path":"https://github.com/azure"}'; - cg.sdkRepo = '{"type":"github", "path":"https://github.com/azure"}'; - cg.codegenRepo = '{"type":"github", "path":"https://github.com/azure"}'; - cg.owner = 'SDK'; - cg.type = 'ad-hoc'; - cg.status = 'submit'; - - const codeGenerationDao: CodeGenerationDao = new CodeGenerationDaoImpl(mongoDbConnection); - await codeGenerationDao.deleteCodeGenerationByName(cg.name); - await codeGenerationDao.submitCodeGeneration(cg); - - const retCg: CodeGeneration = await codeGenerationDao.getCodeGenerationByName(cg.name); - expect(retCg.service).toBe('msi'); - expect(retCg.serviceType).toBe('resource-manager'); - expect(retCg.tag).toBeNull(); - expect(retCg.sdk).toBe('javascript'); - expect(retCg.swaggerRepo).toBe('{"type": "github", "path":"https://github.com/azure"}'); - expect(retCg.sdkRepo).toBe('{"type":"github", "path":"https://github.com/azure"}'); - expect(retCg.codegenRepo).toBe('{"type":"github", "path":"https://github.com/azure"}'); - expect(retCg.owner).toBe('SDK'); - expect(retCg.type).toBe('ad-hoc'); - expect(retCg.status).toBe('submit'); - - await codeGenerationDao.deleteCodeGenerationByName(cg.name); - const reqCg: CodeGeneration = await codeGenerationDao.getCodeGenerationByName(cg.name); - expect(reqCg).toBe(undefined); -}); - -test('dao test submitCodeGeneration, updateCodeGenerationValuesByName and getCodeGenerationByName', async () => { - const cg: CodeGeneration = new CodeGeneration(); - cg.name = 'test4'; - cg.service = 'msi'; - cg.serviceType = 'resource-manager'; - cg.resourcesToGenerate = ''; - cg.tag = null; - cg.sdk = 'javascript'; - cg.swaggerRepo = '{"type": "github", "path":"https://github.com/azure"}'; - cg.sdkRepo = '{"type":"github", "path":"https://github.com/azure"}'; - cg.codegenRepo = '{"type":"github", "path":"https://github.com/azure"}'; - cg.owner = 'SDK'; - cg.type = 'ad-hoc'; - cg.status = 'submit'; - - const codeGenerationDao: CodeGenerationDao = new CodeGenerationDaoImpl(mongoDbConnection); - await codeGenerationDao.deleteCodeGenerationByName(cg.name); - await codeGenerationDao.submitCodeGeneration(cg); - await codeGenerationDao.updateCodeGenerationValuesByName(cg.name, { type: 'ad-real', status: 'del' }); - - const retCg: CodeGeneration = await codeGenerationDao.getCodeGenerationByName(cg.name); - expect(retCg.service).toBe('msi'); - expect(retCg.serviceType).toBe('resource-manager'); - expect(retCg.tag).toBeNull(); - expect(retCg.sdk).toBe('javascript'); - expect(retCg.swaggerRepo).toBe('{"type": "github", "path":"https://github.com/azure"}'); - expect(retCg.sdkRepo).toBe('{"type":"github", "path":"https://github.com/azure"}'); - expect(retCg.codegenRepo).toBe('{"type":"github", "path":"https://github.com/azure"}'); - expect(retCg.owner).toBe('SDK'); - expect(retCg.type).toBe('ad-real'); - expect(retCg.status).toBe('del'); - - // check columns which can't be null - await expect(codeGenerationDao.updateCodeGenerationValuesByName(cg.name, { status: null })).rejects.toBeTruthy(); -}); - -test('dao test submitCodeGeneration and listCodeGenerationsByStatus', async () => { - const cg1: CodeGeneration = new CodeGeneration(); - cg1.name = 'test5a'; - cg1.service = 'msi'; - cg1.serviceType = 'resource-manager'; - cg1.resourcesToGenerate = ''; - cg1.tag = null; - cg1.sdk = 'javascript'; - cg1.swaggerRepo = '{"type": "github", "path":"https://github.com/azure"}'; - cg1.sdkRepo = '{"type":"github", "path":"https://github.com/azure"}'; - cg1.codegenRepo = '{"type":"github", "path":"https://github.com/azure"}'; - cg1.owner = 'SDK'; - cg1.type = 'ad-hoc'; - cg1.status = 'completed'; - - const cg2: CodeGeneration = new CodeGeneration(); - cg2.name = 'test5b'; - cg2.service = 'msi'; - cg2.serviceType = 'resource-manager'; - cg2.resourcesToGenerate = ''; - cg2.tag = null; - cg2.sdk = 'javascript'; - cg2.swaggerRepo = '{"type": "github", "path":"https://github.com/azure"}'; - cg2.sdkRepo = '{"type":"github", "path":"https://github.com/azure"}'; - cg2.codegenRepo = '{"type":"github", "path":"https://github.com/azure"}'; - cg2.owner = 'SDK'; - cg2.type = 'ad-hoc'; - cg2.status = 'submit'; - - const cg3: CodeGeneration = new CodeGeneration(); - cg3.name = 'test5c'; - cg3.service = 'msi'; - cg3.serviceType = 'resource-manager'; - cg3.resourcesToGenerate = ''; - cg3.tag = null; - cg3.sdk = 'javascript'; - cg3.swaggerRepo = '{"type": "github", "path":"https://github.com/azure"}'; - cg3.sdkRepo = '{"type":"github", "path":"https://github.com/azure"}'; - cg3.codegenRepo = '{"type":"github", "path":"https://github.com/azure"}'; - cg3.owner = 'SDK'; - cg3.type = 'ad-hoc'; - cg3.status = 'completed'; - - const codeGenerationDao: CodeGenerationDao = new CodeGenerationDaoImpl(mongoDbConnection); - await codeGenerationDao.deleteCodeGenerationByName(cg1.name); - await codeGenerationDao.deleteCodeGenerationByName(cg2.name); - await codeGenerationDao.deleteCodeGenerationByName(cg3.name); - await codeGenerationDao.submitCodeGeneration(cg1); - await codeGenerationDao.submitCodeGeneration(cg2); - await codeGenerationDao.submitCodeGeneration(cg3); - - const retCgs: CodeGeneration[] = await codeGenerationDao.listCodeGenerationsByStatus('completed'); - for (const retCg of retCgs) { - expect(retCg.status).toBe('completed'); - } - - const retCgs2: CodeGeneration[] = await codeGenerationDao.listCodeGenerationsByStatus(null); - expect(retCgs2.length).toBe(0); -}); - -test('dao test submitCodeGeneration and listCodeGenerationsByStatus', async () => { - const cg1: CodeGeneration = new CodeGeneration(); - cg1.name = 'test6a'; - cg1.service = 'msi'; - cg1.serviceType = 'resource-manager'; - cg1.resourcesToGenerate = ''; - cg1.tag = null; - cg1.sdk = 'javascript'; - cg1.swaggerRepo = '{"type": "github", "path":"https://github.com/azure"}'; - cg1.sdkRepo = '{"type":"github", "path":"https://github.com/azure"}'; - cg1.codegenRepo = '{"type":"github", "path":"https://github.com/azure"}'; - cg1.owner = 'SDK'; - cg1.type = 'ad-hoc'; - cg1.status = 'completed'; - - const cg2: CodeGeneration = new CodeGeneration(); - cg2.name = 'test6b'; - cg2.service = 'msi'; - cg2.serviceType = 'resource-manager'; - cg2.resourcesToGenerate = ''; - cg2.tag = null; - cg2.sdk = 'javascript'; - cg2.swaggerRepo = '{"type": "github", "path":"https://github.com/azure"}'; - cg2.sdkRepo = '{"type":"github", "path":"https://github.com/azure"}'; - cg2.codegenRepo = '{"type":"github", "path":"https://github.com/azure"}'; - cg2.owner = 'SDK'; - cg2.type = 'ad-test'; - cg2.status = 'submit'; - - const cg3: CodeGeneration = new CodeGeneration(); - cg3.name = 'test6c'; - cg3.service = 'msi'; - cg3.serviceType = 'resource-manager'; - cg3.resourcesToGenerate = ''; - cg3.tag = null; - cg3.sdk = 'javascript'; - cg3.swaggerRepo = '{"type": "github", "path":"https://github.com/azure"}'; - cg3.sdkRepo = '{"type":"github", "path":"https://github.com/azure"}'; - cg3.codegenRepo = '{"type":"github", "path":"https://github.com/azure"}'; - cg3.owner = 'SDK'; - cg3.type = 'ad-test'; - cg3.status = 'pipelineCompleted'; - - const codeGenerationDao: CodeGenerationDao = new CodeGenerationDaoImpl(mongoDbConnection); - await codeGenerationDao.deleteCodeGenerationByName(cg1.name); - await codeGenerationDao.deleteCodeGenerationByName(cg2.name); - await codeGenerationDao.deleteCodeGenerationByName(cg3.name); - await codeGenerationDao.submitCodeGeneration(cg1); - await codeGenerationDao.submitCodeGeneration(cg2); - await codeGenerationDao.submitCodeGeneration(cg3); - - const filters = { type: 'ad-test' }; - const retCgs1: CodeGeneration[] = await codeGenerationDao.listCodeGenerations(filters, true); - for (const retCg of retCgs1) { - expect(retCg.type).toBe('ad-test'); - } - const retCgs2: CodeGeneration[] = await codeGenerationDao.listCodeGenerations(filters, false); - for (const retCg of retCgs2) { - expect(retCg.type).toBe('ad-test'); - } -}); - -test('dao test deleteCodeGenerationByName', async () => { - const codeGenerationDao: CodeGenerationDao = new CodeGenerationDaoImpl(mongoDbConnection); - await codeGenerationDao.deleteCodeGenerationByName(''); - await codeGenerationDao.deleteCodeGenerationByName(undefined); -}); - -async function destroyDaoTest() { - await mongoDbConnection.close(); -} - -afterAll(async (done) => { - await destroyDaoTest(); - done(); -}); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/test/unit/generateResult.test.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/test/unit/generateResult.test.ts deleted file mode 100644 index a4c425e52a4..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/test/unit/generateResult.test.ts +++ /dev/null @@ -1,117 +0,0 @@ -import * as fs from 'fs'; - -import { createTaskResult, parseGenerateLog, spliteLog } from '../../src/lib/generateResult'; -import { AzureSDKTaskName } from '../../src/types/commonType'; -import { TaskResult, TaskResultCommon, TestTaskResult } from '../../src/types/taskResult'; - -test('spliteLog', async () => { - // Standard use case: single line - const correctStr = '2022-03-18 06:11:22 cmderr Error test error'; - const correctLines = spliteLog(correctStr); - expect(correctLines.length).toBeGreaterThan(0); - - // Standard use case2: multiple lines - const correctStr2 = '2022-03-18 06:11:22 cmderr Error test error\n2022-03-18 06:11:22 cmdout nextline'; - const correctLines2 = spliteLog(correctStr2); - expect(correctLines2.length).toBe(2); - - // Wrong use case: error data formate - const unmatchStr = '03-18 06:11:22 cmderr Error test error'; - const unmatchLines = spliteLog(unmatchStr); - expect(unmatchLines.length).toBe(0); -}); - -test('parseGenerateLog', async () => { - // Standard use case - const correctStr = '2022-03-18 06:11:22 cmderr Error test error\n2022-03-18 06:11:22 cmdout warning nextline'; - const parseGenerateLogTestFile = './parseGenerateLogTestFile.txt'; - - if (fs.existsSync(parseGenerateLogTestFile)) { - fs.unlinkSync(parseGenerateLogTestFile); - } - fs.writeFileSync(parseGenerateLogTestFile, correctStr, { - encoding: 'utf-8' - }); - const correctResult: TaskResultCommon = parseGenerateLog('testId', 'init', parseGenerateLogTestFile, undefined); - expect(correctResult.name).toBe('init'); - expect(correctResult.pipelineBuildId).toBe('testId'); - expect(correctResult.errorCount).toBe(1); - expect(correctResult.warningCount).toBe(1); - expect(correctResult.messages.length).toBeGreaterThan(0); - fs.unlinkSync(parseGenerateLogTestFile); - - // Wrong use case: logfile isn't exist, just throw error logs - expect(parseGenerateLog('testId', 'init', './fileNotExist.txt', undefined)).toBeTruthy(); -}); - -test('createTaskResult', async () => { - // Standard use case - const correctStr = '2022-03-18 06:11:22 cmderr Error test error\n2022-03-18 06:11:22 cmdout warning nextline'; - const createTaskResultTestFile = './createTaskResultTestFile.txt'; - - if (fs.existsSync(createTaskResultTestFile)) { - fs.unlinkSync(createTaskResultTestFile); - } - fs.writeFileSync(createTaskResultTestFile, correctStr, { - encoding: 'utf-8' - }); - - const correctResult: TaskResult = createTaskResult( - 'testId', - 'init' as AzureSDKTaskName, - 'success', - createTaskResultTestFile, - undefined, - undefined - ); - expect(correctResult.name).toBe('init'); - expect(correctResult.pipelineBuildId).toBe('testId'); - expect(correctResult.result).toBe('success'); - expect(correctResult.errorCount).toBe(0); - expect(correctResult.warningCount).toBe(0); - expect(correctResult.messages).toBeUndefined(); - - // Standard use case2: taskResult is failure - const correctResult2: TestTaskResult = createTaskResult( - 'testId', - 'mockTest' as AzureSDKTaskName, - 'failure', - createTaskResultTestFile, - undefined, - undefined - ); - expect(correctResult2.name).toBe('mockTest'); - expect(correctResult2.pipelineBuildId).toBe('testId'); - expect(correctResult2.result).toBe('failure'); - expect(correctResult2.errorCount).toBe(1); - expect(correctResult2.warningCount).toBe(1); - expect(correctResult2.messages.length).toBeGreaterThan(0); - expect(correctResult2.total).toBe(0); - expect(correctResult2.success).toBe(0); - expect(correctResult2.fail).toBe(0); - expect(correctResult2.apiCoverage).toBe(0); - expect(correctResult2.codeCoverage).toBe(0); - - // Standard use case3: taskResult is failure and taskOutput is valid - const correctResult3: TestTaskResult = createTaskResult( - 'testId', - 'mockTest' as AzureSDKTaskName, - 'failure', - createTaskResultTestFile, - undefined, - { total: 11, success: 10, fail: 1, apiCoverage: 99, codeCoverage: 80 } - ); - expect(correctResult3.name).toBe('mockTest'); - expect(correctResult3.pipelineBuildId).toBe('testId'); - expect(correctResult3.result).toBe('failure'); - expect(correctResult3.errorCount).toBe(1); - expect(correctResult3.warningCount).toBe(1); - expect(correctResult3.messages.length).toBeGreaterThan(0); - expect(correctResult3.total).toBe(11); - expect(correctResult3.success).toBe(10); - expect(correctResult3.fail).toBe(1); - expect(correctResult3.apiCoverage).toBe(99); - expect(correctResult3.codeCoverage).toBe(80); - - fs.unlinkSync(createTaskResultTestFile); -}); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/tsconfig.json b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/tsconfig.json deleted file mode 100644 index 45c274c4c7f..00000000000 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "compilerOptions": { - "lib": [ - "es2019", - "dom" - ], - "outDir": "dist", - "module": "commonjs", - "target": "es2017", - "sourceMap" :true, - "experimentalDecorators": true, - "emitDecoratorMetadata": true, - "strictNullChecks": false, - "declaration": true, - "esModuleInterop": true - }, - "exclude": [ - "node_modules", - "test", - "tmp" - ] -} diff --git a/tools/sdk-generation-pipeline/pipelines/steps/generate-sdk.yml b/tools/sdk-generation-pipeline/pipelines/steps/generate-sdk.yml deleted file mode 100644 index e731644856a..00000000000 --- a/tools/sdk-generation-pipeline/pipelines/steps/generate-sdk.yml +++ /dev/null @@ -1,115 +0,0 @@ -parameters: - - name: readmeFile - type: string - - - name: typespecProject - type: string - - - name: trigger - type: string - - - name: triggerType - type: string - - - name: serviceType - type: string - - - name: sdk - type: string - - - name: sdkConfig - type: string - -steps: - - bash: | - publishResult \ - --storageType=eventhub \ - --pipelineStatus=in_progress \ - --buildId="$(Build.BuildId)" \ - --trigger='${{ parameters.trigger }}' - if [ $? -ne 0 ]; then - exit 1 - fi - displayName: Publish status - env: - EVENTHUB_SAS_URL: $(EVENTHUB_SAS_URL) - condition: ne('${{ parameters.triggerType }}', 'release') - - - bash: | - typespecProjectLen=`echo ${{ parameters.typespecProject }} | wc -L` - if [ 2 -lt ${typespecProjectLen} ]; then - docker run --privileged \ - -v $(SPEC_REPO):/spec-repo \ - -v $(SDK_REPO):/sdk-repo \ - -v /tmp/output:/tmp/output \ - $(DOCKER_IMAGE) \ - --typespec-project=${{ parameters.typespecProject }} $(DOCKER_EX_CMD) - else - if [ "${{ parameters.serviceType }}" = "resource-manager" ];then - docker run --privileged \ - -v $(SPEC_REPO):/spec-repo \ - -v $(SDK_REPO):/sdk-repo \ - -v /tmp/output:/tmp/output \ - $(DOCKER_IMAGE) \ - --readme=${{ parameters.readmeFile }} $(DOCKER_EX_CMD) - else - echo '${{ parameters.sdkConfig }}' > /tmp/output/autorest.md - configLen=`cat /tmp/output/autorest.md | wc -L` - echo "configLen is :${configLen}" - #check if config is default '' - if [ 2 -ge ${configLen} ];then - docker run --privileged \ - -v $(SPEC_REPO):/spec-repo \ - -v $(SDK_REPO):/sdk-repo \ - -v /tmp/output:/tmp/output \ - $(DOCKER_IMAGE) \ - --readme=${{ parameters.readmeFile }} $(DOCKER_EX_CMD) - else - docker run --privileged \ - -v $(SPEC_REPO):/spec-repo \ - -v $(SDK_REPO):/sdk-repo \ - -v /tmp/output/autorest.md:/autorest.md \ - -v /tmp/output:/tmp/output \ - $(DOCKER_IMAGE) \ - --readme=${{ parameters.readmeFile }} $(DOCKER_EX_CMD) - fi - fi - fi - displayName: Generate sdk - - - bash: | - echo "check output dir" - ls /tmp/output - echo "show docker.log" - head -n 30 /tmp/output/docker.log - echo "*****" - tail -n 30 /tmp/output/docker.log - echo "show generateAndBuild-task.log" - head -n 30 /tmp/output/generateAndBuild-task.log - echo "*****" - tail -n 30 /tmp/output/generateAndBuild-task.log - echo "show generateAndBuildInput.json" - cat /tmp/output/generateAndBuildInput.json - echo "show generateAndBuildOutputJson.json" - cat /tmp/output/generateAndBuildOutputJson.json - echo "show init-task.log" - head -n 30 /tmp/output/init-task.log - echo "*****" - tail -n 30 /tmp/output/init-task.log - echo "show taskResults.json" - cat /tmp/output/taskResults.json - - echo "show mock-host.log" - head -n 30 /tmp/output/mock-host.log | echo "don't quite even failed" - echo "*****" - tail -n 30 /tmp/output/mock-host.log | echo "don't quite even failed" - - echo "show mockTest-task.log" - head -n 30 /tmp/output/mockTest-task.log | echo "don't quite even failed" - echo "*****" - tail -n 30 /tmp/output/mockTest-task.log | echo "don't quite even failed" - - echo "show mockTestOutput.json" - cat /tmp/output/mockTestOutput.json | echo "don't quite even failed" - displayName: Check output dir - condition: ne('$(DEBUGMODE)', 'true') diff --git a/tools/sdk-generation-pipeline/pipelines/steps/parse-and-publish-result.yml b/tools/sdk-generation-pipeline/pipelines/steps/parse-and-publish-result.yml deleted file mode 100644 index 76c7b945912..00000000000 --- a/tools/sdk-generation-pipeline/pipelines/steps/parse-and-publish-result.yml +++ /dev/null @@ -1,215 +0,0 @@ -parameters: - - name: sdk - type: string - - - name: service - type: string - - - name: serviceType - type: string - - - name: trigger - type: string - - - name: sdkGenerationName - type: string - - - name: triggerType - type: string - - - name: sdkPR - type: object - - - name: swagger - type: object -steps: - - bash: | - echo "will parse task result" - LOG_Dir="/tmp/output/" - for TASK_NAME in "init" "generateAndBuild" "mockTest" - do - if [ ${TASK_NAME} = "mockTest" ]; then - TASK_OUTPUT_PATH="/tmp/output/mockTestOutput.json" - else - TASK_OUTPUT_PATH="" - fi - - generateResult \ - --buildId=$(Build.BuildId) \ - --taskName=${TASK_NAME} \ - --logfile="/tmp/output/${TASK_NAME}-task.log" \ - --resultOutputPath="/tmp/output/${TASK_NAME}-task-result.json" \ - --dockerResultFile="/tmp/output/taskResults.json" \ - --taskOutputPath="${TASK_OUTPUT_PATH}" - if [ $? -ne 0 ]; then - #TODO: when all language support mock test, set exit 1 for parse task result failed - echo "wait all language support mock test" - #exit 1 - fi - done - displayName: Parse task result - condition: always() - - - bash: | - echo "will create PR" - git config --global user.email "$(GIT_USER_EMAIL)" - git config --global user.name "$(GIT_USER_NAME)" - - #packages=`cat /tmp/output/generateAndBuildOutputJson.json| jq -c '.packages|.[]'` - package=`cat /tmp/output/generateAndBuildOutputJson.json| jq -c '.packages|.[]'` - #for package in ${packages} - #do - packageName=`echo ${package} | jq -r '.packageName'` - paths=`echo ${package} | jq -r '.path|.[]'` - for path in ${paths} - do - git add ${path} - done - git commit -m '[auto]create by sdk generation' - branchName=sdkGen/${{ parameters.sdkGenerationName }}/${{ parameters.service }}-${packageName} - git checkout -b ${branchName} - pushSdkRepoUrl=$(echo $(sdkRepoUrl) | sed "s#https://#https://$(REPO_OWNER):$(azuresdk-github-pat)@#") - pushSdkRepoUrl=$(echo ${pushSdkRepoUrl} | sed "s#$(SDK_OWNER)#$(SDK_PUSH_OWNER)#") - git push ${pushSdkRepoUrl} --force - echo "git push finished:$?" - - prLinkParameter=${{ parameters.sdkPR.prLink }} - if [ 2 -lt ${#prLinkParameter} ];then - prNumber=${{ parameters.sdkPR.prNumber }} - prLink=${{ parameters.sdkPR.prLink }} - else - sdkRepoPullsApi=$(echo $(sdkRepoUrl) | sed "s#https://#https://api.#") - sdkRepoPullsApi=$(echo ${sdkRepoPullsApi} | sed "s#$(SDK_OWNER)#repos/$(SDK_PUSH_OWNER)#") - sdkRepoPullsApi=$(echo ${sdkRepoPullsApi} | sed "s#.git\$#/pulls#") - echo "will use api:${sdkRepoPullsApi}" - RESULT=$(curl \ - -u "$(REPO_OWNER)":"$(azuresdk-github-pat)" \ - -H "Accept: application/vnd.github.v3+json" \ - -X POST \ - -d '{"title":"[AutoPR-${{ parameters.service }}]${{ parameters.swagger.title }}","draft":true,"body":"Create to sync ${{ parameters.swagger.path }}/pull/${{ parameters.swagger.pullRequest }}","base":"'$(sdkMainBranch)'", "head":"$(SDK_PUSH_OWNER):'${branchName}'"}' \ - ${sdkRepoPullsApi}) - echo "creat pr finished:$?" - - prNumber=`echo ${RESULT} | jq -r '.number'` - prLink=`echo ${RESULT} | jq -r '.html_url'` - if [ 10 -gt ${#prLink} ];then - sdkRepoPullsList="${sdkRepoPullsApi}?state=open&head=$(SDK_PUSH_OWNER):${branchName}&base=$(sdkMainBranch)" - RESULT=$(curl \ - -u "$(REPO_OWNER)":"$(azuresdk-github-pat)" \ - -H "Accept: application/vnd.github.v3+json" \ - -X GET \ - ${sdkRepoPullsList}) - if [[ `echo ${RESULT} | jq -r '. | length'` -gt 0 ]]; then - prNumber=`echo ${RESULT} | jq -r '.[0].number'` - prLink=`echo ${RESULT} | jq -r '.[0].html_url'` - fi - fi - fi - - echo "##vso[task.setvariable variable=prNumber;]${prNumber}" - echo "##vso[task.setvariable variable=prLink;]${prLink}" - echo "##vso[task.setvariable variable=branchName;]${branchName}" - echo "##vso[task.setvariable variable=packageName;]${packageName}" - packageFolder=`echo ${package} | jq -r '.packageFolder'` - re="sdk/([^/]+)" - if [ "${{ parameters.sdk }}" = "go" ] && [ "${{ parameters.serviceType }}" = "resource-manager" ]; then - re="sdk/resourcemanager/([^/]+)" - fi - serviceDir=`if [[ ${packageFolder} =~ $re ]]; then echo ${BASH_REMATCH[1]}; fi` - if [ "${{ parameters.sdk }}" = "js" -o "${{ parameters.sdk }}" = "net" ] && [ "${{ parameters.serviceType }}" = "resource-manager" ];then - echo "##vso[task.setvariable variable=releasePipeline;]${{ parameters.sdk }} - ${serviceDir} - mgmt" - else - echo "##vso[task.setvariable variable=releasePipeline;]${{ parameters.sdk }} - ${serviceDir}" - fi - - git reset HEAD~ - #done - workingDirectory: $(SDK_REPO) - condition: always() - displayName: Submit Pull Request - - - bash: | - cp /tmp/output/docker.log $(System.ArtifactsDirectory)/logs/${{ parameters.sdkGenerationName }}-full.log - cp /tmp/output/init-task.log $(System.ArtifactsDirectory)/logs/${{ parameters.sdkGenerationName }}-init.log - cp /tmp/output/init-task-result.json $(System.ArtifactsDirectory)/logs/${{ parameters.sdkGenerationName }}-init-result.json - cp /tmp/output/generateAndBuild-task.log $(System.ArtifactsDirectory)/logs/${{ parameters.sdkGenerationName }}-generateAndBuild.log - cp /tmp/output/generateAndBuild-task-result.json $(System.ArtifactsDirectory)/logs/${{ parameters.sdkGenerationName }}-generateAndBuild-result.json - cp /tmp/output/mockTest-task.log $(System.ArtifactsDirectory)/logs/${{ parameters.sdkGenerationName }}-mockTest.log | echo "wait all language support mock test" - cp /tmp/output/mockTest-task-result.json $(System.ArtifactsDirectory)/logs/${{ parameters.sdkGenerationName }}-mockTest-result.json | echo "wait all language support mock test" - prepareArtifactFiles \ - --pipelineStatus=completed \ - --artifactDir="$(System.ArtifactsDirectory)" \ - --buildId="$(Build.BuildId)" \ - --generateAndBuildOutputFile="/tmp/output/generateAndBuildOutputJson.json" \ - --trigger='${{ parameters.trigger }}' \ - --logPath="tmplogpath.com" \ - --language="${{ parameters.sdk }}" \ - --resultsPath='["/tmp/output/init-task-result.json", - "/tmp/output/generateAndBuild-task-result.json", - "/tmp/output/mockTest-task-result.json"]' - - #check parse result and completion status - cat /tmp/output/generateAndBuild-task-result.json - cat $(System.ArtifactsDirectory)/completed/result.json - - if [ -n "$(prLink)" ];then - newtaskresult=$(cat $(System.ArtifactsDirectory)/completed/result.json | \ - jq --arg prNumber "$(prNumber)" --arg prLink "$(prLink)" --arg branchName "$(branchName)" \ - --arg packageName "$(packageName)" --arg serviceType "${{ parameters.serviceType }}" \ - --arg releasePipeline "$(releasePipeline)" \ - '.result += {prNumber:$prNumber, prLink:$prLink, branchName:$branchName, serviceType:$serviceType, releasePipeline:$releasePipeline} | - .package += [{packageName:$packageName}]' ) - echo ${newtaskresult} > $(System.ArtifactsDirectory)/completed/result.json - fi - - #recheck jq result - cat $(System.ArtifactsDirectory)/completed/result.json - displayName: Prepare artifact - workingDirectory: $(SDK_REPO) - condition: always() - - - task: PublishPipelineArtifact@1 - displayName: Publish artifact - inputs: - targetPath: $(System.ArtifactsDirectory)/${{ parameters.sdk }}/artifact/ - artifactName: sdk-generation-artifact - continueOnError: true - - - task: PublishPipelineArtifact@1 - displayName: Publish sourceCode - inputs: - targetPath: $(System.ArtifactsDirectory)/${{ parameters.sdk }}/sourceCode/ - artifactName: sdk-generation-sourceCode - continueOnError: true - - - task: PublishPipelineArtifact@1 - displayName: Publish logs - inputs: - targetPath: $(System.ArtifactsDirectory)/logs/ - artifactName: sdk-generation-logs - condition: always() - - - bash: | - publishResult \ - --storageType=eventhub \ - --pipelineStatus=completed \ - --buildId="$(Build.BuildId)" \ - --trigger='${{ parameters.trigger }}' \ - --logPath="www.demoLogUrl.com" \ - --resultsPath='["/tmp/output/init-task-result.json", - "/tmp/output/generateAndBuild-task-result.json", - "/tmp/output/mockTest-task-result.json"]' - if [ $? -ne 0 ]; then - exit 1 - fi - displayName: Publish status - env: - EVENTHUB_SAS_URL: $(EVENTHUB_SAS_URL) - condition: and(always(), ne('${{ parameters.triggerType }}', 'release')) - - - task: PublishPipelineArtifact@1 - displayName: Publish status artifact - inputs: - targetPath: $(System.ArtifactsDirectory)/completed/ - artifactName: sdk-generation-completed-result - condition: always() diff --git a/tools/sdk-generation-pipeline/pipelines/steps/pipeline-setup.yml b/tools/sdk-generation-pipeline/pipelines/steps/pipeline-setup.yml deleted file mode 100644 index c014444d81a..00000000000 --- a/tools/sdk-generation-pipeline/pipelines/steps/pipeline-setup.yml +++ /dev/null @@ -1,92 +0,0 @@ -parameters: - - name: sdk - type: string - - - name: trigger - type: string - - - name: swagger - type: object - - - name: triggerType - type: string - -steps: - - task: NodeTool@0 - displayName: Specify Node Version - inputs: - versionSpec: 14.x - - - bash: | - #install tools - cd tools/sdk-generation-pipeline - npm install -g @microsoft/rush@5.92.0 - rush update - rush build - cd packages/sdk-generation-cli - rushx pack - PACKAGE_TGZ=`ls azure-tools-sdk-generation-cli*.tgz` - npm install -g ${PACKAGE_TGZ} - npm install -g autorest - - #mkdir for artifacts - cd $(System.ArtifactsDirectory) - echo "mkdir for docker output" - mkdir -p /tmp/output - echo "mkdir for pipeline artifact" - mkdir -p logs - cd $(Agent.BuildDirectory) - getRepoName SPEC_REPO ${{ parameters.swagger.path }} - getRepoName SDK_REPO $(sdkRepoUrl) - #mkdir for result artifact - mkdir -p $(System.ArtifactsDirectory)/in_progress/ - mkdir -p $(System.ArtifactsDirectory)/completed/ - displayName: Setup Pipeline Runtime Environment - - - bash: | - publishResult \ - --storageType=eventhub \ - --pipelineStatus=queued \ - --buildId="$(Build.BuildId)" \ - --trigger='${{ parameters.trigger }}' - if [ $? -ne 0 ]; then - exit 1 - fi - displayName: Publish status - env: - EVENTHUB_SAS_URL: $(EVENTHUB_SAS_URL) - condition: ne('${{ parameters.triggerType }}', 'release') - - - bash: | - prepareArtifactFiles \ - --pipelineStatus=in_progress \ - --artifactDir="$(System.ArtifactsDirectory)" \ - --buildId="$(Build.BuildId)" \ - --trigger='${{ parameters.trigger }}' - displayName: Prepare in progress status - condition: always() - - - task: PublishPipelineArtifact@1 - displayName: Publish status artifact - inputs: - targetPath: $(System.ArtifactsDirectory)/in_progress/ - artifactName: sdk-generation-in_progress-result - continueOnError: true - - - bash: | - git clone ${{ parameters.swagger.path }} - downloadSdkRepoUrl=$(echo $(sdkRepoUrl) | sed "s#https://#https://$(REPO_OWNER):$(azuresdk-github-pat)@#") - git clone --depth 1 --branch $(sdkMainBranch) ${downloadSdkRepoUrl} - cd $(SPEC_REPO) - export GITHUB_TOKEN=$(azuresdk-github-pat) - if [ -n "${{ parameters.swagger.branch }}" ];then - git checkout ${{ parameters.swagger.branch }} - elif [ -n "${{ parameters.swagger.pullRequest }}" ];then - gh pr checkout ${{ parameters.swagger.pullRequest }} - else - echo "invalid swagger parameters" - exit 1 - fi - - displayName: Repo pull - workingDirectory: ../ diff --git a/tools/sdk-generation-pipeline/pipelines/steps/precheck.yml b/tools/sdk-generation-pipeline/pipelines/steps/precheck.yml deleted file mode 100644 index 8f932cc9de2..00000000000 --- a/tools/sdk-generation-pipeline/pipelines/steps/precheck.yml +++ /dev/null @@ -1,30 +0,0 @@ -parameters: - - name: swagger - type: object - - - name: sdk - type: string - values: - - js - - java - - go - - net - - python - - - name: service - type: string - - - name: sdkRepoBaseBranch - type: string -steps: - - bash: | - if [ -z ${{ parameters.swagger.path }} ];then - echo "swagger.path is empty" - exit 1 - fi - displayName: Check parameters - - - bash: | - echo "##vso[task.setvariable variable=sdkRepoUrl;]https://github.com/$(SDK_OWNER)/azure-sdk-for-${{parameters.sdk}}.git" - echo "##vso[task.setvariable variable=sdkMainBranch;]$(sdkRepoBaseBranch)" - displayName: Set sdk repo diff --git a/tools/sdk-generation-pipeline/rush.json b/tools/sdk-generation-pipeline/rush.json deleted file mode 100644 index 1f1b1e08777..00000000000 --- a/tools/sdk-generation-pipeline/rush.json +++ /dev/null @@ -1,338 +0,0 @@ -/** - * This is the main configuration file for Rush. - * For full documentation, please see https://rushjs.io - */ -{ - "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/rush.schema.json", - - /** - * (Required) This specifies the version of the Rush engine to be used in this repo. - * Rush's "version selector" feature ensures that the globally installed tool will - * behave like this release, regardless of which version is installed globally. - * - * The common/scripts/install-run-rush.js automation script also uses this version. - * - * NOTE: If you upgrade to a new major version of Rush, you should replace the "v5" - * path segment in the "$schema" field for all your Rush config files. This will ensure - * correct error-underlining and tab-completion for editors such as VS Code. - */ - "rushVersion": "5.107.0", - - /** - * The next field selects which package manager should be installed and determines its version. - * Rush installs its own local copy of the package manager to ensure that your build process - * is fully isolated from whatever tools are present in the local environment. - * - * Specify one of: "pnpmVersion", "npmVersion", or "yarnVersion". See the Rush documentation - * for details about these alternatives. - */ - "pnpmVersion": "8.15.3", - - // "npmVersion": "6.14.15", - // "yarnVersion": "1.9.4", - - /** - * Older releases of the Node.js engine may be missing features required by your system. - * Other releases may have bugs. In particular, the "latest" version will not be a - * Long Term Support (LTS) version and is likely to have regressions. - * - * Specify a SemVer range to ensure developers use a Node.js version that is appropriate - * for your repo. - * - * LTS schedule: https://nodejs.org/en/about/releases/ - * LTS versions: https://nodejs.org/en/download/releases/ - */ - "nodeSupportedVersionRange": ">=18.20.2 <19.0.0", - - /** - * Odd-numbered major versions of Node.js are experimental. Even-numbered releases - * spend six months in a stabilization period before the first Long Term Support (LTS) version. - * For example, 8.9.0 was the first LTS version of Node.js 8. Pre-LTS versions are not recommended - * for production usage because they frequently have bugs. They may cause Rush itself - * to malfunction. - * - * Rush normally prints a warning if it detects a pre-LTS Node.js version. If you are testing - * pre-LTS versions in preparation for supporting the first LTS version, you can use this setting - * to disable Rush's warning. - */ - // "suppressNodeLtsWarning": false, - - /** - * If you would like the version specifiers for your dependencies to be consistent, then - * uncomment this line. This is effectively similar to running "rush check" before any - * of the following commands: - * - * rush install, rush update, rush link, rush version, rush publish - * - * In some cases you may want this turned on, but need to allow certain packages to use a different - * version. In those cases, you will need to add an entry to the "allowedAlternativeVersions" - * section of the common-versions.json. - */ - // "ensureConsistentVersions": true, - - /** - * Large monorepos can become intimidating for newcomers if project folder paths don't follow - * a consistent and recognizable pattern. When the system allows nested folder trees, - * we've found that teams will often use subfolders to create islands that isolate - * their work from others ("shipping the org"). This hinders collaboration and code sharing. - * - * The Rush developers recommend a "category folder" model, where buildable project folders - * must always be exactly two levels below the repo root. The parent folder acts as the category. - * This provides a basic facility for grouping related projects (e.g. "apps", "libraries", - * "tools", "prototypes") while still encouraging teams to organize their projects into - * a unified taxonomy. Limiting to 2 levels seems very restrictive at first, but if you have - * 20 categories and 20 projects in each category, this scheme can easily accommodate hundreds - * of projects. In practice, you will find that the folder hierarchy needs to be rebalanced - * occasionally, but if that's painful, it's a warning sign that your development style may - * discourage refactoring. Reorganizing the categories should be an enlightening discussion - * that brings people together, and maybe also identifies poor coding practices (e.g. file - * references that reach into other project's folders without using Node.js module resolution). - * - * The defaults are projectFolderMinDepth=1 and projectFolderMaxDepth=2. - * - * To remove these restrictions, you could set projectFolderMinDepth=1 - * and set projectFolderMaxDepth to a large number. - */ - // "projectFolderMinDepth": 2, - // "projectFolderMaxDepth": 2, - - /** - * Today the npmjs.com registry enforces fairly strict naming rules for packages, but in the early - * days there was no standard and hardly any enforcement. A few large legacy projects are still using - * nonstandard package names, and private registries sometimes allow it. Set "allowMostlyStandardPackageNames" - * to true to relax Rush's enforcement of package names. This allows upper case letters and in the future may - * relax other rules, however we want to minimize these exceptions. Many popular tools use certain punctuation - * characters as delimiters, based on the assumption that they will never appear in a package name; thus if we relax - * the rules too much it is likely to cause very confusing malfunctions. - * - * The default value is false. - */ - // "allowMostlyStandardPackageNames": true, - - /** - * This feature helps you to review and approve new packages before they are introduced - * to your monorepo. For example, you may be concerned about licensing, code quality, - * performance, or simply accumulating too many libraries with overlapping functionality. - * The approvals are tracked in two config files "browser-approved-packages.json" - * and "nonbrowser-approved-packages.json". See the Rush documentation for details. - */ - // "approvedPackagesPolicy": { - // /** - // * The review categories allow you to say for example "This library is approved for usage - // * in prototypes, but not in production code." - // * - // * Each project can be associated with one review category, by assigning the "reviewCategory" field - // * in the "projects" section of rush.json. The approval is then recorded in the files - // * "common/config/rush/browser-approved-packages.json" and "nonbrowser-approved-packages.json" - // * which are automatically generated during "rush update". - // * - // * Designate categories with whatever granularity is appropriate for your review process, - // * or you could just have a single category called "default". - // */ - // "reviewCategories": [ - // // Some example categories: - // "production", // projects that ship to production - // "tools", // non-shipping projects that are part of the developer toolchain - // "prototypes" // experiments that should mostly be ignored by the review process - // ], - // - // /** - // * A list of NPM package scopes that will be excluded from review. - // * We recommend to exclude TypeScript typings (the "@types" scope), because - // * if the underlying package was already approved, this would imply that the typings - // * are also approved. - // */ - // // "ignoredNpmScopes": ["@types"] - // }, - - /** - * If you use Git as your version control system, this section has some additional - * optional features you can use. - */ - "gitPolicy": { - /** - * Work at a big company? Tired of finding Git commits at work with unprofessional Git - * emails such as "beer-lover@my-college.edu"? Rush can validate people's Git email address - * before they get started. - * - * Define a list of regular expressions describing allowable e-mail patterns for Git commits. - * They are case-insensitive anchored JavaScript RegExps. Example: ".*@example\.com" - * - * IMPORTANT: Because these are regular expressions encoded as JSON string literals, - * RegExp escapes need two backslashes, and ordinary periods should be "\\.". - */ - // "allowedEmailRegExps": [ - // "[^@]+@users\\.noreply\\.github\\.com", - // "rush-bot@example\\.org" - // ], - - /** - * When Rush reports that the address is malformed, the notice can include an example - * of a recommended email. Make sure it conforms to one of the allowedEmailRegExps - * expressions. - */ - // "sampleEmail": "example@users.noreply.github.com", - - /** - * The commit message to use when committing changes during 'rush publish'. - * - * For example, if you want to prevent these commits from triggering a CI build, - * you might configure your system's trigger to look for a special string such as "[skip-ci]" - * in the commit message, and then customize Rush's message to contain that string. - */ - // "versionBumpCommitMessage": "Bump versions [skip ci]", - - /** - * The commit message to use when committing changes during 'rush version'. - * - * For example, if you want to prevent these commits from triggering a CI build, - * you might configure your system's trigger to look for a special string such as "[skip-ci]" - * in the commit message, and then customize Rush's message to contain that string. - */ - // "changeLogUpdateCommitMessage": "Update changelogs [skip ci]", - - /** - * The commit message to use when commiting changefiles during 'rush change --commit' - * - * If no commit message is set it will default to 'Rush change' - */ - // "changefilesCommitMessage": "Rush change" - }, - - "repository": { - /** - * The URL of this Git repository, used by "rush change" to determine the base branch for your PR. - * - * The "rush change" command needs to determine which files are affected by your PR diff. - * If you merged or cherry-picked commits from the main branch into your PR branch, those commits - * should be excluded from this diff (since they belong to some other PR). In order to do that, - * Rush needs to know where to find the base branch for your PR. This information cannot be - * determined from Git alone, since the "pull request" feature is not a Git concept. Ideally - * Rush would use a vendor-specific protocol to query the information from GitHub, Azure DevOps, etc. - * But to keep things simple, "rush change" simply assumes that your PR is against the "main" branch - * of the Git remote indicated by the repository.url setting in rush.json. If you are working in - * a GitHub "fork" of the real repo, this setting will be different from the repository URL of your - * your PR branch, and in this situation "rush change" will also automatically invoke "git fetch" - * to retrieve the latest activity for the remote main branch. - */ - // "url": "https://github.com/microsoft/rush-example", - - /** - * The default branch name. This tells "rush change" which remote branch to compare against. - * The default value is "main" - */ - // "defaultBranch": "main", - - /** - * The default remote. This tells "rush change" which remote to compare against if the remote URL is - * not set or if a remote matching the provided remote URL is not found. - */ - // "defaultRemote": "origin" - }, - - /** - * Event hooks are customized script actions that Rush executes when specific events occur - */ - "eventHooks": { - /** - * The list of shell commands to run before the Rush installation starts - */ - "preRushInstall": [ - // "common/scripts/pre-rush-install.js" - ], - - /** - * The list of shell commands to run after the Rush installation finishes - */ - "postRushInstall": [], - - /** - * The list of shell commands to run before the Rush build command starts - */ - "preRushBuild": [], - - /** - * The list of shell commands to run after the Rush build command finishes - */ - "postRushBuild": [] - }, - - /** - * Installation variants allow you to maintain a parallel set of configuration files that can be - * used to build the entire monorepo with an alternate set of dependencies. For example, suppose - * you upgrade all your projects to use a new release of an important framework, but during a transition period - * you intend to maintain compatibility with the old release. In this situation, you probably want your - * CI validation to build the entire repo twice: once with the old release, and once with the new release. - * - * Rush "installation variants" correspond to sets of config files located under this folder: - * - * common/config/rush/variants/ - * - * The variant folder can contain an alternate common-versions.json file. Its "preferredVersions" field can be used - * to select older versions of dependencies (within a loose SemVer range specified in your package.json files). - * To install a variant, run "rush install --variant ". - * - * For more details and instructions, see this article: https://rushjs.io/pages/advanced/installation_variants/ - */ - "variants": [ - // { - // /** - // * The folder name for this variant. - // */ - // "variantName": "old-sdk", - // - // /** - // * An informative description - // */ - // "description": "Build this repo using the previous release of the SDK" - // } - ], - - /** - * Rush can collect anonymous telemetry about everyday developer activity such as - * success/failure of installs, builds, and other operations. You can use this to identify - * problems with your toolchain or Rush itself. THIS TELEMETRY IS NOT SHARED WITH MICROSOFT. - * It is written into JSON files in the common/temp folder. It's up to you to write scripts - * that read these JSON files and do something with them. These scripts are typically registered - * in the "eventHooks" section. - */ - // "telemetryEnabled": false, - - /** - * Allows creation of hotfix changes. This feature is experimental so it is disabled by default. - * If this is set, 'rush change' only allows a 'hotfix' change type to be specified. This change type - * will be used when publishing subsequent changes from the monorepo. - */ - // "hotfixChangeEnabled": false, - - /** - * This is an optional, but recommended, list of allowed tags that can be applied to Rush projects - * using the "tags" setting in this file. This list is useful for preventing mistakes such as misspelling, - * and it also provides a centralized place to document your tags. If "allowedProjectTags" list is - * not specified, then any valid tag is allowed. A tag name must be one or more words - * separated by hyphens or slashes, where a word may contain lowercase ASCII letters, digits, - * ".", and "@" characters. - */ - // "allowedProjectTags": [ "tools", "frontend-team", "1.0.0-release" ], - - /** - * (Required) This is the inventory of projects to be managed by Rush. - * - * Rush does not automatically scan for projects using wildcards, for a few reasons: - * 1. Depth-first scans are expensive, particularly when tools need to repeatedly collect the list. - * 2. On a caching CI machine, scans can accidentally pick up files left behind from a previous build. - * 3. It's useful to have a centralized inventory of all projects and their important metadata. - */ - "projects": [ - { - "packageName": "@azure-tools/sdk-generation-lib", - "projectFolder": "packages/sdk-generation-lib", - "reviewCategory": "tools" - }, - { - "packageName": "@azure-tools/sdk-generation-cli", - "projectFolder": "packages/sdk-generation-cli", - "reviewCategory": "tools" - } - ] -} diff --git a/tools/sdk-generation-pipeline/scripts/change-owner.sh b/tools/sdk-generation-pipeline/scripts/change-owner.sh deleted file mode 100644 index 67895c7dacb..00000000000 --- a/tools/sdk-generation-pipeline/scripts/change-owner.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/sh - -SPEC_REPO=/spec-repo -WORK_DIR=/work-dir -SDK_REPO=/sdk-repo - -while [ ! -d "${SPEC_REPO}" ]; do - sleep 10 -done - -if [ -d "${SPEC_REPO}" ]; then - while true - do - USER_GROUP_ID=`stat -c "%u:%g" ${SPEC_REPO}` - if [ -d "${WORK_DIR}" ]; then - chown -R ${USER_GROUP_ID} ${WORK_DIR} > /dev/null 2>&1 - fi - if [ -d "${SDK_REPO}" ]; then - chown -R ${USER_GROUP_ID} ${SDK_REPO} > /dev/null 2>&1 - fi - sleep 5s - done -else - echo "Error: '${SPEC_REPO}' NOT found." - exit 1 -fi - diff --git a/tools/sdk-generation-pipeline/scripts/entrypoint.sh b/tools/sdk-generation-pipeline/scripts/entrypoint.sh deleted file mode 100755 index 28c672ec5aa..00000000000 --- a/tools/sdk-generation-pipeline/scripts/entrypoint.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash -set -e -dockerd > /dev/null 2>&1 & -sh /change-owner.sh & -run-mock-host "$@" & -docker-cli "$@" -if [ -f "/tmp/notExit" ]; then - bash -fi \ No newline at end of file diff --git a/tools/sdk-generation-pipeline/scripts/install-vscode-server.sh b/tools/sdk-generation-pipeline/scripts/install-vscode-server.sh deleted file mode 100644 index 8ffab6d6bd3..00000000000 --- a/tools/sdk-generation-pipeline/scripts/install-vscode-server.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh -set -e - -commit_sha="da15b6fd3ef856477bf6f4fb29ba1b7af717770d" -archive="vscode-server-linux-x64.tar.gz" - -# Download VS Code Server tarball to tmp directory. -curl -L "https://update.code.visualstudio.com/commit:${commit_sha}/server-linux-x64/stable" -o "/tmp/${archive}" - -mkdir -vp ~/.vscode-server/bin/"${commit_sha}" - -tar --no-same-owner -xzv --strip-components=1 -C ~/.vscode-server/bin/"${commit_sha}" -f "/tmp/${archive}" - -sh /root/.vscode-server/bin/${commit_sha}/bin/code-server --install-extension vscjava.vscode-java-pack -sh /root/.vscode-server/bin/${commit_sha}/bin/code-server --install-extension ms-dotnettools.csharp -sh /root/.vscode-server/bin/${commit_sha}/bin/code-server --install-extension ms-python.python diff --git a/tools/sdk-generation-pipeline/scripts/rerun-tasks b/tools/sdk-generation-pipeline/scripts/rerun-tasks deleted file mode 100755 index b096546c01f..00000000000 --- a/tools/sdk-generation-pipeline/scripts/rerun-tasks +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -set -e -docker-cli "$@" --skip-generation=false diff --git a/tools/sdk-generation-pipeline/sdk-generation-pipeline.yml b/tools/sdk-generation-pipeline/sdk-generation-pipeline.yml deleted file mode 100644 index 41745908b15..00000000000 --- a/tools/sdk-generation-pipeline/sdk-generation-pipeline.yml +++ /dev/null @@ -1,123 +0,0 @@ -trigger: none - -variables: - - template: ../../eng/pipelines/templates/variables/globals.yml - - - name: codegenRepo - value: https://github.com/Azure/azure-sdk-tools.git - - - name: sdkRepoBaseBranch - value: main - - - name: sdkRepoType - value: github - -parameters: - - name: sdkToGenerate - type: string - values: - - js - - java - - go - - net - - python - - - name: service - type: string - - - name: relativeReadmeFilePath - type: string - default: "''" - - - name: relativeTypeSpecProjectPath - type: string - default: "''" - - - name: tag - type: string - default: "''" - - - name: serviceType - type: string - values: - - resource-manager - - data-plane - - - name: swagger - type: object - default: - "type": "github" - "path": "https://github.com/azure/azure-rest-api-specs" - "baseBranch": "main" - "branch": "main" - "commit": "" - "pullRequest": "" - "title": "" - - - name: clientAgent - type: string - - - name: sdkGenerationName - type: string - - - name: triggerType - type: string - values: - - release - - ad-hoc - - ci - - - name: sdkConfig - type: string - default: "''" - - - name: sdkPR - type: object - default: - "prLink": "''" - "prNumber": "''" - -stages: - - stage: SdkGeneration - jobs: - - job: SdkGeneration - pool: - name: azsdk-pool-mms-ubuntu-2004-general - vmImage: ubuntu-20.04 - timeoutInMinutes: 180 - displayName: ${{ parameters.sdkToGenerate }}-${{ parameters.serviceType }}-${{ parameters.service }} - steps: - - template: ./pipelines/steps/precheck.yml - parameters: - swagger: ${{ parameters.swagger }} - sdk: ${{ parameters.sdkToGenerate }} - service: ${{ parameters.service }} - sdkRepoBaseBranch: ${{ variables.sdkRepoBaseBranch }} - - - template: ./pipelines/steps/pipeline-setup.yml - parameters: - sdk: ${{ parameters.sdkToGenerate }} - trigger: ${{ parameters.clientAgent }} - swagger: ${{ parameters.swagger }} - triggerType: ${{ parameters.triggerType }} - - - template: ./pipelines/steps/generate-sdk.yml - parameters: - readmeFile: ${{ parameters.relativeReadmeFilePath }} - typespecProject: ${{ parameters.relativeTypeSpecProjectPath }} - trigger: ${{ parameters.clientAgent }} - triggerType: ${{ parameters.triggerType }} - serviceType: ${{ parameters.serviceType }} - sdk: ${{ parameters.sdkToGenerate }} - sdkConfig: ${{ parameters.sdkConfig }} - - - template: ./pipelines/steps/parse-and-publish-result.yml - parameters: - sdk: ${{ parameters.sdkToGenerate }} - service: ${{ parameters.service }} - serviceType: ${{ parameters.serviceType }} - trigger: ${{ parameters.clientAgent }} - sdkGenerationName: ${{ parameters.sdkGenerationName }} - triggerType: ${{ parameters.triggerType }} - sdkPR: ${{ parameters.sdkPR }} - swagger: ${{ parameters.swagger }} \ No newline at end of file