From e7f833324b22cbf8c6e522b6f8e2ec0ba77030c9 Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Fri, 16 Dec 2022 12:56:06 +0300 Subject: [PATCH 01/58] init cli and config, implemented msxi repo builder --- .gitignore | 5 + .vscode/.env.template | 4 + .vscode/launch.json | 19 + .vscode/tasks.json | 12 + eslint.config.mjs | 5 +- package.json | 8 + pnpm-lock.yaml | 1057 ++++++++++++++++++++++++++++++++++- src/artifactory-utils.ts | 168 ++++++ src/cli.ts | 20 + src/config.ts | 53 ++ src/http.ts | 87 +++ src/index.ts | 29 + src/jewel-case.config.mjs | 7 + src/jewel-case.ts | 57 ++ src/repo-builder.ts | 94 ++++ src/tsconfig.json | 5 +- src/utils.ts | 85 +++ src/windows-repo-builder.ts | 125 +++++ 18 files changed, 1809 insertions(+), 31 deletions(-) create mode 100644 .vscode/.env.template create mode 100644 .vscode/launch.json create mode 100644 .vscode/tasks.json create mode 100644 src/artifactory-utils.ts create mode 100644 src/cli.ts create mode 100644 src/config.ts create mode 100644 src/http.ts create mode 100644 src/jewel-case.config.mjs create mode 100644 src/jewel-case.ts create mode 100644 src/repo-builder.ts create mode 100644 src/utils.ts create mode 100644 src/windows-repo-builder.ts diff --git a/.gitignore b/.gitignore index 56c9d65..b1a8d3e 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,10 @@ node_modules/ # build output directories dist/ +# default output directory +out/ + # coverage report directory /coverage/ + +.vscode/.env diff --git a/.vscode/.env.template b/.vscode/.env.template new file mode 100644 index 0000000..378cd9d --- /dev/null +++ b/.vscode/.env.template @@ -0,0 +1,4 @@ +# Remove with your credits and rename file to .evn +ARTIFACTORY_HOST="artifactory.com" +ARTIFACTORY_USER="yaropolk" +ARTIFACTORY_API_KEY="1234" diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..3fc869e --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,19 @@ +{ + + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Start", + "runtimeArgs": [ + ], + "args" : [ + "${workspaceFolder}/dist/index.js", + "--artifactory-project-key", "tradingview-desktop", + "plan", "./out", "C:/Users/ekush/Documents/dev/tvd/desktop-packages/src" + ], + "envFile": "${workspaceFolder}/.vscode/.env" + } + ] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..eb1cfcb --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,12 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Build", + "type": "shell", + "group": "build", + "command": "npx pnpm build", + "problemMatcher": [] + } + ] +} diff --git a/eslint.config.mjs b/eslint.config.mjs index 4d938c6..cb9434e 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -18,7 +18,7 @@ export default [ 'comma-dangle': ['error', 'always-multiline'], 'dot-location': 'off', 'dot-notation': 'off', - 'func-style': ['error', 'declaration'], + 'func-style': 'off', 'function-call-argument-newline': ['error', 'consistent'], 'function-paren-newline': 'off', 'id-length': 'off', @@ -40,6 +40,7 @@ export default [ 'no-tabs': 'off', 'no-ternary': 'off', 'no-undefined': 'off', + 'no-undef-init': 'off', 'no-underscore-dangle': 'off', 'object-curly-spacing': ['error', 'always'], 'object-property-newline': ['error', { allowAllPropertiesOnSameLine: true }], @@ -49,7 +50,7 @@ export default [ 'prefer-destructuring': 'off', 'quote-props': ['error', 'consistent-as-needed'], 'quotes': ['error', 'single'], - 'sort-imports': ['error', { allowSeparatedGroups: true }], + 'sort-imports': ['error', { allowSeparatedGroups: true, ignoreCase: true }], 'sort-keys': 'off', 'space-before-function-paren': ['error', 'never'], }, diff --git a/package.json b/package.json index 0c579d1..705b459 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,11 @@ { + "type": "module", "devDependencies": { "@jest/globals": "^29.3.1", "@tsconfig/node16-strictest-esm": "^1.0.3", "@types/node": "16.18.1", + "@types/semver": "^7.3.13", + "@types/yargs": "^17.0.16", "@typescript-eslint/eslint-plugin": "^5.45.1", "@typescript-eslint/parser": "^5.45.1", "cross-env": "^7.0.3", @@ -31,5 +34,10 @@ }, "volta": { "node": "16.18.1" + }, + "dependencies": { + "s3-groundskeeper": "^0.2.2", + "semver": "^7.3.8", + "yargs": "^17.6.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ab5ce4d..fcaf524 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,8 @@ specifiers: '@jest/globals': ^29.3.1 '@tsconfig/node16-strictest-esm': ^1.0.3 '@types/node': 16.18.1 + '@types/semver': ^7.3.13 + '@types/yargs': ^17.0.16 '@typescript-eslint/eslint-plugin': ^5.45.1 '@typescript-eslint/parser': ^5.45.1 cross-env: ^7.0.3 @@ -12,14 +14,24 @@ specifiers: husky: ^8.0.0 jest: ^29.3.1 lint-staged: ^13.0.4 + s3-groundskeeper: ^0.2.2 + semver: ^7.3.8 ts-jest: ^29.0.3 ts-node: ^10.9.1 typescript: ^4.9.3 + yargs: ^17.6.2 + +dependencies: + s3-groundskeeper: 0.2.2 + semver: 7.3.8 + yargs: 17.6.2 devDependencies: '@jest/globals': 29.3.1 '@tsconfig/node16-strictest-esm': 1.0.3 '@types/node': 16.18.1 + '@types/semver': 7.3.13 + '@types/yargs': 17.0.16 '@typescript-eslint/eslint-plugin': 5.45.1_tdm6ms4ntwhlpozn7kjqrhum74 '@typescript-eslint/parser': 5.45.1_s5ps7njkmjlaqajutnox5ntcla cross-env: 7.0.3 @@ -42,6 +54,957 @@ packages: '@jridgewell/trace-mapping': 0.3.17 dev: true + /@aws-crypto/crc32/2.0.0: + resolution: {integrity: sha512-TvE1r2CUueyXOuHdEigYjIZVesInd9KN+K/TFFNfkkxRThiNxO6i4ZqqAVMoEjAamZZ1AA8WXJkjCz7YShHPQA==} + dependencies: + '@aws-crypto/util': 2.0.2 + '@aws-sdk/types': 3.226.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/crc32c/2.0.0: + resolution: {integrity: sha512-vF0eMdMHx3O3MoOXUfBZry8Y4ZDtcuskjjKgJz8YfIDjLStxTZrYXk+kZqtl6A0uCmmiN/Eb/JbC/CndTV1MHg==} + dependencies: + '@aws-crypto/util': 2.0.2 + '@aws-sdk/types': 3.226.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/ie11-detection/2.0.2: + resolution: {integrity: sha512-5XDMQY98gMAf/WRTic5G++jfmS/VLM0rwpiOpaainKi4L0nqWMSB1SzsrEG5rjFZGYN6ZAefO+/Yta2dFM0kMw==} + dependencies: + tslib: 1.14.1 + dev: false + + /@aws-crypto/sha1-browser/2.0.0: + resolution: {integrity: sha512-3fIVRjPFY8EG5HWXR+ZJZMdWNRpwbxGzJ9IH9q93FpbgCH8u8GHRi46mZXp3cYD7gealmyqpm3ThZwLKJjWJhA==} + dependencies: + '@aws-crypto/ie11-detection': 2.0.2 + '@aws-crypto/supports-web-crypto': 2.0.2 + '@aws-sdk/types': 3.226.0 + '@aws-sdk/util-locate-window': 3.208.0 + '@aws-sdk/util-utf8-browser': 3.188.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/sha256-browser/2.0.0: + resolution: {integrity: sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==} + dependencies: + '@aws-crypto/ie11-detection': 2.0.2 + '@aws-crypto/sha256-js': 2.0.0 + '@aws-crypto/supports-web-crypto': 2.0.2 + '@aws-crypto/util': 2.0.2 + '@aws-sdk/types': 3.226.0 + '@aws-sdk/util-locate-window': 3.208.0 + '@aws-sdk/util-utf8-browser': 3.188.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/sha256-js/2.0.0: + resolution: {integrity: sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==} + dependencies: + '@aws-crypto/util': 2.0.2 + '@aws-sdk/types': 3.226.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/supports-web-crypto/2.0.2: + resolution: {integrity: sha512-6mbSsLHwZ99CTOOswvCRP3C+VCWnzBf+1SnbWxzzJ9lR0mA0JnY2JEAhp8rqmTE0GPFy88rrM27ffgp62oErMQ==} + dependencies: + tslib: 1.14.1 + dev: false + + /@aws-crypto/util/2.0.2: + resolution: {integrity: sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==} + dependencies: + '@aws-sdk/types': 3.226.0 + '@aws-sdk/util-utf8-browser': 3.188.0 + tslib: 1.14.1 + dev: false + + /@aws-sdk/abort-controller/3.226.0: + resolution: {integrity: sha512-cJVzr1xxPBd08voknXvR0RLgtZKGKt6WyDpH/BaPCu3rfSqWCDZKzwqe940eqosjmKrxC6pUZNKASIqHOQ8xxQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/chunked-blob-reader-native/3.208.0: + resolution: {integrity: sha512-JeOZ95PW+fJ6bbuqPySYqLqHk1n4+4ueEEraJsiUrPBV0S1ZtyvOGHcnGztKUjr2PYNaiexmpWuvUve9K12HRA==} + dependencies: + '@aws-sdk/util-base64': 3.208.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/chunked-blob-reader/3.188.0: + resolution: {integrity: sha512-zkPRFZZPL3eH+kH86LDYYXImiClA1/sW60zYOjse9Pgka+eDJlvBN6hcYxwDEKjcwATYiSRR1aVQHcfCinlGXg==} + dependencies: + tslib: 2.4.1 + dev: false + + /@aws-sdk/client-s3/3.226.0: + resolution: {integrity: sha512-N8S0i5txBqlTY30IHaWgi15HUPzdWpQVX01zfYoHU80HmxKBRhqrefIrmCbn/121br0B+MysgpgdfiSfhyHkLw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha1-browser': 2.0.0 + '@aws-crypto/sha256-browser': 2.0.0 + '@aws-crypto/sha256-js': 2.0.0 + '@aws-sdk/client-sts': 3.226.0 + '@aws-sdk/config-resolver': 3.226.0 + '@aws-sdk/credential-provider-node': 3.226.0 + '@aws-sdk/eventstream-serde-browser': 3.226.0 + '@aws-sdk/eventstream-serde-config-resolver': 3.226.0 + '@aws-sdk/eventstream-serde-node': 3.226.0 + '@aws-sdk/fetch-http-handler': 3.226.0 + '@aws-sdk/hash-blob-browser': 3.226.0 + '@aws-sdk/hash-node': 3.226.0 + '@aws-sdk/hash-stream-node': 3.226.0 + '@aws-sdk/invalid-dependency': 3.226.0 + '@aws-sdk/md5-js': 3.226.0 + '@aws-sdk/middleware-bucket-endpoint': 3.226.0 + '@aws-sdk/middleware-content-length': 3.226.0 + '@aws-sdk/middleware-endpoint': 3.226.0 + '@aws-sdk/middleware-expect-continue': 3.226.0 + '@aws-sdk/middleware-flexible-checksums': 3.226.0 + '@aws-sdk/middleware-host-header': 3.226.0 + '@aws-sdk/middleware-location-constraint': 3.226.0 + '@aws-sdk/middleware-logger': 3.226.0 + '@aws-sdk/middleware-recursion-detection': 3.226.0 + '@aws-sdk/middleware-retry': 3.226.0 + '@aws-sdk/middleware-sdk-s3': 3.226.0 + '@aws-sdk/middleware-serde': 3.226.0 + '@aws-sdk/middleware-signing': 3.226.0 + '@aws-sdk/middleware-ssec': 3.226.0 + '@aws-sdk/middleware-stack': 3.226.0 + '@aws-sdk/middleware-user-agent': 3.226.0 + '@aws-sdk/node-config-provider': 3.226.0 + '@aws-sdk/node-http-handler': 3.226.0 + '@aws-sdk/protocol-http': 3.226.0 + '@aws-sdk/signature-v4-multi-region': 3.226.0 + '@aws-sdk/smithy-client': 3.226.0 + '@aws-sdk/types': 3.226.0 + '@aws-sdk/url-parser': 3.226.0 + '@aws-sdk/util-base64': 3.208.0 + '@aws-sdk/util-body-length-browser': 3.188.0 + '@aws-sdk/util-body-length-node': 3.208.0 + '@aws-sdk/util-defaults-mode-browser': 3.226.0 + '@aws-sdk/util-defaults-mode-node': 3.226.0 + '@aws-sdk/util-endpoints': 3.226.0 + '@aws-sdk/util-stream-browser': 3.226.0 + '@aws-sdk/util-stream-node': 3.226.0 + '@aws-sdk/util-user-agent-browser': 3.226.0 + '@aws-sdk/util-user-agent-node': 3.226.0 + '@aws-sdk/util-utf8-browser': 3.188.0 + '@aws-sdk/util-utf8-node': 3.208.0 + '@aws-sdk/util-waiter': 3.226.0 + '@aws-sdk/xml-builder': 3.201.0 + fast-xml-parser: 4.0.11 + tslib: 2.4.1 + transitivePeerDependencies: + - '@aws-sdk/signature-v4-crt' + - aws-crt + dev: false + + /@aws-sdk/client-sso-oidc/3.226.0: + resolution: {integrity: sha512-IKzAhL6RoPs7IZ/rJvekjedQ4oesazCO+Aqh9l2Xct+XY0MFBdh4amgg4t/8fjksfIzmJH48BZoNv5gVak6yRw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 2.0.0 + '@aws-crypto/sha256-js': 2.0.0 + '@aws-sdk/config-resolver': 3.226.0 + '@aws-sdk/fetch-http-handler': 3.226.0 + '@aws-sdk/hash-node': 3.226.0 + '@aws-sdk/invalid-dependency': 3.226.0 + '@aws-sdk/middleware-content-length': 3.226.0 + '@aws-sdk/middleware-endpoint': 3.226.0 + '@aws-sdk/middleware-host-header': 3.226.0 + '@aws-sdk/middleware-logger': 3.226.0 + '@aws-sdk/middleware-recursion-detection': 3.226.0 + '@aws-sdk/middleware-retry': 3.226.0 + '@aws-sdk/middleware-serde': 3.226.0 + '@aws-sdk/middleware-stack': 3.226.0 + '@aws-sdk/middleware-user-agent': 3.226.0 + '@aws-sdk/node-config-provider': 3.226.0 + '@aws-sdk/node-http-handler': 3.226.0 + '@aws-sdk/protocol-http': 3.226.0 + '@aws-sdk/smithy-client': 3.226.0 + '@aws-sdk/types': 3.226.0 + '@aws-sdk/url-parser': 3.226.0 + '@aws-sdk/util-base64': 3.208.0 + '@aws-sdk/util-body-length-browser': 3.188.0 + '@aws-sdk/util-body-length-node': 3.208.0 + '@aws-sdk/util-defaults-mode-browser': 3.226.0 + '@aws-sdk/util-defaults-mode-node': 3.226.0 + '@aws-sdk/util-endpoints': 3.226.0 + '@aws-sdk/util-user-agent-browser': 3.226.0 + '@aws-sdk/util-user-agent-node': 3.226.0 + '@aws-sdk/util-utf8-browser': 3.188.0 + '@aws-sdk/util-utf8-node': 3.208.0 + tslib: 2.4.1 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-sso/3.226.0: + resolution: {integrity: sha512-+Hl1YSLKrxPnQLijhWryI6uV8eKZIsUhvWlzFKx75kjxzjsC/jyk5zV59jnCu0SCCepXB8DKyLVa2WpH7iAHew==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 2.0.0 + '@aws-crypto/sha256-js': 2.0.0 + '@aws-sdk/config-resolver': 3.226.0 + '@aws-sdk/fetch-http-handler': 3.226.0 + '@aws-sdk/hash-node': 3.226.0 + '@aws-sdk/invalid-dependency': 3.226.0 + '@aws-sdk/middleware-content-length': 3.226.0 + '@aws-sdk/middleware-endpoint': 3.226.0 + '@aws-sdk/middleware-host-header': 3.226.0 + '@aws-sdk/middleware-logger': 3.226.0 + '@aws-sdk/middleware-recursion-detection': 3.226.0 + '@aws-sdk/middleware-retry': 3.226.0 + '@aws-sdk/middleware-serde': 3.226.0 + '@aws-sdk/middleware-stack': 3.226.0 + '@aws-sdk/middleware-user-agent': 3.226.0 + '@aws-sdk/node-config-provider': 3.226.0 + '@aws-sdk/node-http-handler': 3.226.0 + '@aws-sdk/protocol-http': 3.226.0 + '@aws-sdk/smithy-client': 3.226.0 + '@aws-sdk/types': 3.226.0 + '@aws-sdk/url-parser': 3.226.0 + '@aws-sdk/util-base64': 3.208.0 + '@aws-sdk/util-body-length-browser': 3.188.0 + '@aws-sdk/util-body-length-node': 3.208.0 + '@aws-sdk/util-defaults-mode-browser': 3.226.0 + '@aws-sdk/util-defaults-mode-node': 3.226.0 + '@aws-sdk/util-endpoints': 3.226.0 + '@aws-sdk/util-user-agent-browser': 3.226.0 + '@aws-sdk/util-user-agent-node': 3.226.0 + '@aws-sdk/util-utf8-browser': 3.188.0 + '@aws-sdk/util-utf8-node': 3.208.0 + tslib: 2.4.1 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-sts/3.226.0: + resolution: {integrity: sha512-ZBlqRVbnHvvbkN5g56+mXltNybHNzgV69+2ARubQ8ge9U2qF/LweCmGqZnZLWqdGXwaB9IOvz5ZW2npyJh1X/A==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 2.0.0 + '@aws-crypto/sha256-js': 2.0.0 + '@aws-sdk/config-resolver': 3.226.0 + '@aws-sdk/credential-provider-node': 3.226.0 + '@aws-sdk/fetch-http-handler': 3.226.0 + '@aws-sdk/hash-node': 3.226.0 + '@aws-sdk/invalid-dependency': 3.226.0 + '@aws-sdk/middleware-content-length': 3.226.0 + '@aws-sdk/middleware-endpoint': 3.226.0 + '@aws-sdk/middleware-host-header': 3.226.0 + '@aws-sdk/middleware-logger': 3.226.0 + '@aws-sdk/middleware-recursion-detection': 3.226.0 + '@aws-sdk/middleware-retry': 3.226.0 + '@aws-sdk/middleware-sdk-sts': 3.226.0 + '@aws-sdk/middleware-serde': 3.226.0 + '@aws-sdk/middleware-signing': 3.226.0 + '@aws-sdk/middleware-stack': 3.226.0 + '@aws-sdk/middleware-user-agent': 3.226.0 + '@aws-sdk/node-config-provider': 3.226.0 + '@aws-sdk/node-http-handler': 3.226.0 + '@aws-sdk/protocol-http': 3.226.0 + '@aws-sdk/smithy-client': 3.226.0 + '@aws-sdk/types': 3.226.0 + '@aws-sdk/url-parser': 3.226.0 + '@aws-sdk/util-base64': 3.208.0 + '@aws-sdk/util-body-length-browser': 3.188.0 + '@aws-sdk/util-body-length-node': 3.208.0 + '@aws-sdk/util-defaults-mode-browser': 3.226.0 + '@aws-sdk/util-defaults-mode-node': 3.226.0 + '@aws-sdk/util-endpoints': 3.226.0 + '@aws-sdk/util-user-agent-browser': 3.226.0 + '@aws-sdk/util-user-agent-node': 3.226.0 + '@aws-sdk/util-utf8-browser': 3.188.0 + '@aws-sdk/util-utf8-node': 3.208.0 + fast-xml-parser: 4.0.11 + tslib: 2.4.1 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/config-resolver/3.226.0: + resolution: {integrity: sha512-0UWXtfnTT0OtnRP8jJodc8V7xAnWSqsh4RCRyV5uu3Z2Tv+xyW91GKxO+gOXoUP0hHu0lvBM9lYiMJcJWZYLYw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/signature-v4': 3.226.0 + '@aws-sdk/types': 3.226.0 + '@aws-sdk/util-config-provider': 3.208.0 + '@aws-sdk/util-middleware': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/credential-provider-env/3.226.0: + resolution: {integrity: sha512-sd8uK1ojbXxaZXlthzw/VXZwCPUtU3PjObOfr3Evj7MPIM2IH8h29foOlggx939MdLQGboJf9gKvLlvKDWtJRA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/property-provider': 3.226.0 + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/credential-provider-imds/3.226.0: + resolution: {integrity: sha512-//z/COQm2AjYFI1Lb0wKHTQSrvLFTyuKLFQGPJsKS7DPoxGOCKB7hmYerlbl01IDoCxTdyL//TyyPxbZEOQD5Q==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/node-config-provider': 3.226.0 + '@aws-sdk/property-provider': 3.226.0 + '@aws-sdk/types': 3.226.0 + '@aws-sdk/url-parser': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/credential-provider-ini/3.226.0: + resolution: {integrity: sha512-Sj7SGl53qmKkD7wvgU0MSTyj8ho6A3tKVbadTHljVz60jiauTEM97Z1DIai6U3oPFVteaKqx7npc8ozeK6mKNg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/credential-provider-env': 3.226.0 + '@aws-sdk/credential-provider-imds': 3.226.0 + '@aws-sdk/credential-provider-sso': 3.226.0 + '@aws-sdk/credential-provider-web-identity': 3.226.0 + '@aws-sdk/property-provider': 3.226.0 + '@aws-sdk/shared-ini-file-loader': 3.226.0 + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/credential-provider-node/3.226.0: + resolution: {integrity: sha512-kuOeiVmlhSyMC1Eix0pqHmb4EmpbMHrTw+9ObZbQ2bRXy05Q9fLA6SVBcI01bI1KVh7Qqz9i8ojOY3A2zscjyA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/credential-provider-env': 3.226.0 + '@aws-sdk/credential-provider-imds': 3.226.0 + '@aws-sdk/credential-provider-ini': 3.226.0 + '@aws-sdk/credential-provider-process': 3.226.0 + '@aws-sdk/credential-provider-sso': 3.226.0 + '@aws-sdk/credential-provider-web-identity': 3.226.0 + '@aws-sdk/property-provider': 3.226.0 + '@aws-sdk/shared-ini-file-loader': 3.226.0 + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/credential-provider-process/3.226.0: + resolution: {integrity: sha512-iUDMdnrTvbvaCFhWwqyXrhvQ9+ojPqPqXhwZtY1X/Qaz+73S9gXBPJHZaZb2Ke0yKE1Ql3bJbKvmmxC/qLQMng==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/property-provider': 3.226.0 + '@aws-sdk/shared-ini-file-loader': 3.226.0 + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/credential-provider-sso/3.226.0: + resolution: {integrity: sha512-QSBeyOIAus4/8u/DeAstE8w/zw+F7PQohdB8JFP/BPaCfc8uKue4UkqqvQWRfm4VSEnHeXt037MDopmCpd98Iw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/client-sso': 3.226.0 + '@aws-sdk/property-provider': 3.226.0 + '@aws-sdk/shared-ini-file-loader': 3.226.0 + '@aws-sdk/token-providers': 3.226.0 + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/credential-provider-web-identity/3.226.0: + resolution: {integrity: sha512-CCpv847rLB0SFOHz2igvUMFAzeT2fD3YnY4C8jltuJoEkn0ITn1Hlgt13nTJ5BUuvyti2mvyXZHmNzhMIMrIlw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/property-provider': 3.226.0 + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/eventstream-codec/3.226.0: + resolution: {integrity: sha512-6uPtR8vSwz3fqoZk9hrb6qBYdp3PJ22+JxV5Wimdesvow4kJXSgDQXIxEkxbv6SxB9tNRB4uJHD84RetHEi15Q==} + dependencies: + '@aws-crypto/crc32': 2.0.0 + '@aws-sdk/types': 3.226.0 + '@aws-sdk/util-hex-encoding': 3.201.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/eventstream-serde-browser/3.226.0: + resolution: {integrity: sha512-otYC5aZE9eJUqAlKpy8w0rPDQ1eKGvZPtgxWXmFYSO2lDVGfI1nBBNmdZ4MdHqNuQ7ucsKMQYF8BFJ65K2tYPA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/eventstream-serde-universal': 3.226.0 + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/eventstream-serde-config-resolver/3.226.0: + resolution: {integrity: sha512-A56Gypg+lyEfA5cna+EUH9XTrj0SvRG1gwNW7lrUzviN36SeA/LFTUIOEjxVML3Lowy+EPAcrSZ67h6aepoAig==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/eventstream-serde-node/3.226.0: + resolution: {integrity: sha512-KWLnKkKDzI9RNkiK6OiSYpG/XjZfue6Bsp/vRG+H5z3fbXdHv4X2+iW+Efu2Kvn7jsUyUv82TCl57DyJ/HKYhQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/eventstream-serde-universal': 3.226.0 + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/eventstream-serde-universal/3.226.0: + resolution: {integrity: sha512-Q8viYM1Sv90/yIUqyWNeG1GEvyVlAI3GIrInQcCMC+xT59jS+IKGy2y7ojCvSWXnhf5/HMXKcmG092QsqeKy0Q==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/eventstream-codec': 3.226.0 + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/fetch-http-handler/3.226.0: + resolution: {integrity: sha512-JewZPMNEBXfi1xVnRa7pVtK/zgZD8/lQ/YnD8pq79WuMa2cwyhDtr8oqCoqsPW+WJT5ScXoMtuHxN78l8eKWgg==} + dependencies: + '@aws-sdk/protocol-http': 3.226.0 + '@aws-sdk/querystring-builder': 3.226.0 + '@aws-sdk/types': 3.226.0 + '@aws-sdk/util-base64': 3.208.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/hash-blob-browser/3.226.0: + resolution: {integrity: sha512-5DCvWE6L4xGoViEHyjcPFuUe1G2EtNx8TqswWaoaKgyasP/yuRm4H99Ra7rqIrjCcSTAGD9NVsUQvVVw1bGt9w==} + dependencies: + '@aws-sdk/chunked-blob-reader': 3.188.0 + '@aws-sdk/chunked-blob-reader-native': 3.208.0 + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/hash-node/3.226.0: + resolution: {integrity: sha512-MdlJhJ9/Espwd0+gUXdZRsHuostB2WxEVAszWxobP0FTT9PnicqnfK7ExmW+DUAc0ywxtEbR3e0UND65rlSTVw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.226.0 + '@aws-sdk/util-buffer-from': 3.208.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/hash-stream-node/3.226.0: + resolution: {integrity: sha512-cgNTGlF8SdHaQXtjEmuLXz2U8SLM2JDKtIVPku/lHTMsUsEn+fuv2C+h1f/hvd4aNw5t1zggym7sO1/h/rv56Q==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/invalid-dependency/3.226.0: + resolution: {integrity: sha512-QXOYFmap8g9QzRjumcRCIo2GEZkdCwd7ePQW0OABWPhKHzlJ74vvBxywjU3s39EEBEluWXtZ7Iufg6GxZM4ifw==} + dependencies: + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/is-array-buffer/3.201.0: + resolution: {integrity: sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.4.1 + dev: false + + /@aws-sdk/md5-js/3.226.0: + resolution: {integrity: sha512-ENigJRNudqyh6xsch166SZ4gggHd3XzZJ8gkCU4CWPne04HcR3BkWSO774IuWooCHt8zkaEHKecPurRz6qR+Vw==} + dependencies: + '@aws-sdk/types': 3.226.0 + '@aws-sdk/util-utf8-browser': 3.188.0 + '@aws-sdk/util-utf8-node': 3.208.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/middleware-bucket-endpoint/3.226.0: + resolution: {integrity: sha512-A1Vq5W2X7jgTfjqcKPmjoHohF0poP+9fxwL97fQMvzcwmjhtoCV3bLEpo6CGYx0pKPiSlRJXZkRwRPj2hDHDmA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/protocol-http': 3.226.0 + '@aws-sdk/types': 3.226.0 + '@aws-sdk/util-arn-parser': 3.208.0 + '@aws-sdk/util-config-provider': 3.208.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/middleware-content-length/3.226.0: + resolution: {integrity: sha512-ksUzlHJN2JMuyavjA46a4sctvnrnITqt2tbGGWWrAuXY1mel2j+VbgnmJUiwHKUO6bTFBBeft5Vd1TSOb4JmiA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/protocol-http': 3.226.0 + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/middleware-endpoint/3.226.0: + resolution: {integrity: sha512-EvLFafjtUxTT0AC9p3aBQu1/fjhWdIeK58jIXaNFONfZ3F8QbEYUPuF/SqZvJM6cWfOO9qwYKkRDbCSTYhprIg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/middleware-serde': 3.226.0 + '@aws-sdk/protocol-http': 3.226.0 + '@aws-sdk/signature-v4': 3.226.0 + '@aws-sdk/types': 3.226.0 + '@aws-sdk/url-parser': 3.226.0 + '@aws-sdk/util-config-provider': 3.208.0 + '@aws-sdk/util-middleware': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/middleware-expect-continue/3.226.0: + resolution: {integrity: sha512-YxvQKTV/eA9P8AgW0hXOgj5Qa+TSnNFfyOkfeP089aP3f6p92b1cESf33TEOKsddive2mHT5LRCN6MuPcgWWrA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/protocol-http': 3.226.0 + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/middleware-flexible-checksums/3.226.0: + resolution: {integrity: sha512-8A9Ot9A7794UP5tMGl2MnfTW/UM/jYy1wRWF9YkR/hPIcPb7OmE0hmlwIQGzb/7grxpYw66ETKf0WeH/41YfeQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/crc32': 2.0.0 + '@aws-crypto/crc32c': 2.0.0 + '@aws-sdk/is-array-buffer': 3.201.0 + '@aws-sdk/protocol-http': 3.226.0 + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/middleware-host-header/3.226.0: + resolution: {integrity: sha512-haVkWVh6BUPwKgWwkL6sDvTkcZWvJjv8AgC8jiQuSl8GLZdzHTB8Qhi3IsfFta9HAuoLjxheWBE5Z/L0UrfhLA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/protocol-http': 3.226.0 + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/middleware-location-constraint/3.226.0: + resolution: {integrity: sha512-qHiYaBYPc2R37KxG2uqsUUwh4usrQMHfGkrpTUnx5d4rGzM3mC+muPsTpSHnAL63K2/yJOHQJFjss3GGwV4SSA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/middleware-logger/3.226.0: + resolution: {integrity: sha512-m9gtLrrYnpN6yckcQ09rV7ExWOLMuq8mMPF/K3DbL/YL0TuILu9i2T1W+JuxSX+K9FMG2HrLAKivE/kMLr55xA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/middleware-recursion-detection/3.226.0: + resolution: {integrity: sha512-mwRbdKEUeuNH5TEkyZ5FWxp6bL2UC1WbY+LDv6YjHxmSMKpAoOueEdtU34PqDOLrpXXxIGHDFmjeGeMfktyEcA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/protocol-http': 3.226.0 + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/middleware-retry/3.226.0: + resolution: {integrity: sha512-uMn4dSkv9Na2uvt6K3HgTnVrCRAlGv1MBAtUDLXONqUv1L/Z1fp3CkFkLKQHKylfBwBhe6dXfYEo87i8LZFoqg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/protocol-http': 3.226.0 + '@aws-sdk/service-error-classification': 3.226.0 + '@aws-sdk/types': 3.226.0 + '@aws-sdk/util-middleware': 3.226.0 + tslib: 2.4.1 + uuid: 8.3.2 + dev: false + + /@aws-sdk/middleware-sdk-s3/3.226.0: + resolution: {integrity: sha512-sOFLFCnlN3kPgSI8C9mq/X3o6Oy4lIk4jz5kuB11zfvsm+YlIlxL4s06FkYqHsGDBH9hmh8dEuOxQ+YktyyeoA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/middleware-bucket-endpoint': 3.226.0 + '@aws-sdk/protocol-http': 3.226.0 + '@aws-sdk/types': 3.226.0 + '@aws-sdk/util-arn-parser': 3.208.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/middleware-sdk-sts/3.226.0: + resolution: {integrity: sha512-NN9T/qoSD1kZvAT+VLny3NnlqgylYQcsgV3rvi/8lYzw/G/2s8VS6sm/VTWGGZhx08wZRv20MWzYu3bftcyqUg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/middleware-signing': 3.226.0 + '@aws-sdk/property-provider': 3.226.0 + '@aws-sdk/protocol-http': 3.226.0 + '@aws-sdk/signature-v4': 3.226.0 + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/middleware-serde/3.226.0: + resolution: {integrity: sha512-nPuOOAkSfx9TxzdKFx0X2bDlinOxGrqD7iof926K/AEflxGD1DBdcaDdjlYlPDW2CVE8LV/rAgbYuLxh/E/1VA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/middleware-signing/3.226.0: + resolution: {integrity: sha512-E6HmtPcl+IjYDDzi1xI2HpCbBq2avNWcjvCriMZWuTAtRVpnA6XDDGW5GY85IfS3A8G8vuWqEVPr8JcYUcjfew==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/property-provider': 3.226.0 + '@aws-sdk/protocol-http': 3.226.0 + '@aws-sdk/signature-v4': 3.226.0 + '@aws-sdk/types': 3.226.0 + '@aws-sdk/util-middleware': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/middleware-ssec/3.226.0: + resolution: {integrity: sha512-DR97oWoLHiMdaUP/wu99HtzG7/ijvCrjZGDH37WBO1rxFtEti6L7T09wgHzwxMN8gtL8FJA7dU8IrffGSC9VmA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/middleware-stack/3.226.0: + resolution: {integrity: sha512-85wF29LvPvpoed60fZGDYLwv1Zpd/cM0C22WSSFPw1SSJeqO4gtFYyCg2squfT3KI6kF43IIkOCJ+L7GtryPug==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.4.1 + dev: false + + /@aws-sdk/middleware-user-agent/3.226.0: + resolution: {integrity: sha512-N1WnfzCW1Y5yWhVAphf8OPGTe8Df3vmV7/LdsoQfmpkCZgLZeK2o0xITkUQhRj1mbw7yp8tVFLFV3R2lMurdAQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/protocol-http': 3.226.0 + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/node-config-provider/3.226.0: + resolution: {integrity: sha512-B8lQDqiRk7X5izFEUMXmi8CZLOKCTWQJU9HQf3ako+sF0gexo4nHN3jhoRWyLtcgC5S3on/2jxpAcqtm7kuY3w==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/property-provider': 3.226.0 + '@aws-sdk/shared-ini-file-loader': 3.226.0 + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/node-http-handler/3.226.0: + resolution: {integrity: sha512-xQCddnZNMiPmjr3W7HYM+f5ir4VfxgJh37eqZwX6EZmyItFpNNeVzKUgA920ka1VPz/ZUYB+2OFGiX3LCLkkaA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/abort-controller': 3.226.0 + '@aws-sdk/protocol-http': 3.226.0 + '@aws-sdk/querystring-builder': 3.226.0 + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/property-provider/3.226.0: + resolution: {integrity: sha512-TsljjG+Sg0LmdgfiAlWohluWKnxB/k8xenjeozZfzOr5bHmNHtdbWv6BtNvD/R83hw7SFXxbJHlD5H4u9p2NFg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/protocol-http/3.226.0: + resolution: {integrity: sha512-zWkVqiTA9RXL6y0hhfZc9bcU4DX2NI6Hw9IhQmSPeM59mdbPjJlY4bLlMr5YxywqO3yQ/ylNoAfrEzrDjlOSRg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/querystring-builder/3.226.0: + resolution: {integrity: sha512-LVurypuNeotO4lmirKXRC4NYrZRAyMJXuwO0f2a5ZAUJCjauwYrifKue6yCfU7bls7gut7nfcR6B99WBYpHs3g==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.226.0 + '@aws-sdk/util-uri-escape': 3.201.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/querystring-parser/3.226.0: + resolution: {integrity: sha512-FzB+VrQ47KAFxiPt2YXrKZ8AOLZQqGTLCKHzx4bjxGmwgsjV8yIbtJiJhZLMcUQV4LtGeIY9ixIqQhGvnZHE4A==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/service-error-classification/3.226.0: + resolution: {integrity: sha512-9R01dBpE8JILe2CTft7YN2tMufT2mMWMTqxmHwPSmOpsxHTj8hEII7GTfvpb95ThHwW7XMNhg7pbHLbrTJZCVA==} + engines: {node: '>=14.0.0'} + dev: false + + /@aws-sdk/shared-ini-file-loader/3.226.0: + resolution: {integrity: sha512-661VQefsARxVyyV2FX9V61V+nNgImk7aN2hYlFKla6BCwZfMng+dEtD0xVGyg1PfRw0qvEv5LQyxMVgHcUSevA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/signature-v4-multi-region/3.226.0: + resolution: {integrity: sha512-QHxNuf9ynK208v7Y3imdsa3Cz8ynYV7ZOf3sBJdItuEtHN6uy/KxaOrtvpF8I5Hyn48Hc8z5miTSMujFKT7GEw==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@aws-sdk/signature-v4-crt': ^3.118.0 + peerDependenciesMeta: + '@aws-sdk/signature-v4-crt': + optional: true + dependencies: + '@aws-sdk/protocol-http': 3.226.0 + '@aws-sdk/signature-v4': 3.226.0 + '@aws-sdk/types': 3.226.0 + '@aws-sdk/util-arn-parser': 3.208.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/signature-v4/3.226.0: + resolution: {integrity: sha512-/R5q5agdPd7HJB68XMzpxrNPk158EHUvkFkuRu5Qf3kkkHebEzWEBlWoVpUe6ss4rP9Tqcue6xPuaftEmhjpYw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/is-array-buffer': 3.201.0 + '@aws-sdk/types': 3.226.0 + '@aws-sdk/util-hex-encoding': 3.201.0 + '@aws-sdk/util-middleware': 3.226.0 + '@aws-sdk/util-uri-escape': 3.201.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/smithy-client/3.226.0: + resolution: {integrity: sha512-BWr1FhWSUhkSBp0TLzliD5AQBjA2Jmo9FlOOt+cBwd9BKkSGlGj+HgATYJ83Sjjg2+J6qvEZBxB78LKVHhorBw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/middleware-stack': 3.226.0 + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/token-providers/3.226.0: + resolution: {integrity: sha512-3ouRt2i3ve8ivg54PxPhtOTcipzf6BoQsMw0EiO23yYKujhyeFH2IkxV4EYC687xFrUjheqJf8FWU/DD8EQ/ow==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/client-sso-oidc': 3.226.0 + '@aws-sdk/property-provider': 3.226.0 + '@aws-sdk/shared-ini-file-loader': 3.226.0 + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/types/3.226.0: + resolution: {integrity: sha512-MmmNHrWeO4man7wpOwrAhXlevqtOV9ZLcH4RhnG5LmRce0RFOApx24HoKENfFCcOyCm5LQBlsXCqi0dZWDWU0A==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.4.1 + dev: false + + /@aws-sdk/url-parser/3.226.0: + resolution: {integrity: sha512-p5RLE0QWyP0OcTOLmFcLdVgUcUEzmEfmdrnOxyNzomcYb0p3vUagA5zfa1HVK2azsQJFBv28GfvMnba9bGhObg==} + dependencies: + '@aws-sdk/querystring-parser': 3.226.0 + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/util-arn-parser/3.208.0: + resolution: {integrity: sha512-QV4af+kscova9dv4VuHOgH8wEr/IIYHDGcnyVtkUEqahCejWr1Kuk+SBK0xMwnZY5LSycOtQ8aeqHOn9qOjZtA==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.4.1 + dev: false + + /@aws-sdk/util-base64/3.208.0: + resolution: {integrity: sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/util-buffer-from': 3.208.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/util-body-length-browser/3.188.0: + resolution: {integrity: sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==} + dependencies: + tslib: 2.4.1 + dev: false + + /@aws-sdk/util-body-length-node/3.208.0: + resolution: {integrity: sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.4.1 + dev: false + + /@aws-sdk/util-buffer-from/3.208.0: + resolution: {integrity: sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/is-array-buffer': 3.201.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/util-config-provider/3.208.0: + resolution: {integrity: sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.4.1 + dev: false + + /@aws-sdk/util-defaults-mode-browser/3.226.0: + resolution: {integrity: sha512-chLx+6AeMSjuPsCVbI1B4Pg3jftjjcsuTsJucjo0DKBb1VSWqPCitmOILQVvKiA2Km8TSs3VcbUuOCyDExkzAg==} + engines: {node: '>= 10.0.0'} + dependencies: + '@aws-sdk/property-provider': 3.226.0 + '@aws-sdk/types': 3.226.0 + bowser: 2.11.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/util-defaults-mode-node/3.226.0: + resolution: {integrity: sha512-Zr0AEj6g8gqiOhr31Pa2tdOFdPQciaAUCg3Uj/eH0znNBdVoptCj67oCW/I5v4pY4ZLZtGhr3uuoxDJH2MB3yg==} + engines: {node: '>= 10.0.0'} + dependencies: + '@aws-sdk/config-resolver': 3.226.0 + '@aws-sdk/credential-provider-imds': 3.226.0 + '@aws-sdk/node-config-provider': 3.226.0 + '@aws-sdk/property-provider': 3.226.0 + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/util-endpoints/3.226.0: + resolution: {integrity: sha512-iqOkac/zLmyPBUJd7SLN0PeZMkOmlGgD5PHmmekTClOkce2eUjK9SNX1PzL73aXPoPTyhg9QGLH8uEZEQ8YUzg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/util-hex-encoding/3.201.0: + resolution: {integrity: sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.4.1 + dev: false + + /@aws-sdk/util-locate-window/3.208.0: + resolution: {integrity: sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.4.1 + dev: false + + /@aws-sdk/util-middleware/3.226.0: + resolution: {integrity: sha512-B96CQnwX4gRvQdaQkdUtqvDPkrptV5+va6FVeJOocU/DbSYMAScLxtR3peMS8cnlOT6nL1Eoa42OI9AfZz1VwQ==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.4.1 + dev: false + + /@aws-sdk/util-stream-browser/3.226.0: + resolution: {integrity: sha512-ZvjlA1ySaLd0DqUWTKmL7LsxfPhroAONpzsinaHmw9aZVL40s2cADU9eWgBdHTuAOeFklL7NP0cc6UiTFHKe8g==} + dependencies: + '@aws-sdk/fetch-http-handler': 3.226.0 + '@aws-sdk/types': 3.226.0 + '@aws-sdk/util-base64': 3.208.0 + '@aws-sdk/util-hex-encoding': 3.201.0 + '@aws-sdk/util-utf8-browser': 3.188.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/util-stream-node/3.226.0: + resolution: {integrity: sha512-HADXiIgDGoXcCLSKuPnjCLENf0iC0lzqqnymZu9H2FoACZhJB7DvJ9LnP51Pvw9lfCu+yvLzbMqSPdbXtMbRWg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/node-http-handler': 3.226.0 + '@aws-sdk/types': 3.226.0 + '@aws-sdk/util-buffer-from': 3.208.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/util-uri-escape/3.201.0: + resolution: {integrity: sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.4.1 + dev: false + + /@aws-sdk/util-user-agent-browser/3.226.0: + resolution: {integrity: sha512-PhBIu2h6sPJPcv2I7ELfFizdl5pNiL4LfxrasMCYXQkJvVnoXztHA1x+CQbXIdtZOIlpjC+6BjDcE0uhnpvfcA==} + dependencies: + '@aws-sdk/types': 3.226.0 + bowser: 2.11.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/util-user-agent-node/3.226.0: + resolution: {integrity: sha512-othPc5Dz/pkYkxH+nZPhc1Al0HndQT8zHD4e9h+EZ+8lkd8n+IsnLfTS/mSJWrfiC6UlNRVw55cItstmJyMe/A==} + engines: {node: '>=14.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + dependencies: + '@aws-sdk/node-config-provider': 3.226.0 + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/util-utf8-browser/3.188.0: + resolution: {integrity: sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==} + dependencies: + tslib: 2.4.1 + dev: false + + /@aws-sdk/util-utf8-node/3.208.0: + resolution: {integrity: sha512-jKY87Acv0yWBdFxx6bveagy5FYjz+dtV8IPT7ay1E2WPWH1czoIdMAkc8tSInK31T6CRnHWkLZ1qYwCbgRfERQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/util-buffer-from': 3.208.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/util-waiter/3.226.0: + resolution: {integrity: sha512-qYQMRxnu5k8qQihJXoIWMkBOj0+XkHHj/drLdbRnwL6ni6NcG8++cs9M3DSjIcxmxgF/7SLpDjn1H3sC7cYo4g==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/abort-controller': 3.226.0 + '@aws-sdk/types': 3.226.0 + tslib: 2.4.1 + dev: false + + /@aws-sdk/xml-builder/3.201.0: + resolution: {integrity: sha512-brRdB1wwMgjWEnOQsv7zSUhIQuh7DEicrfslAqHop4S4FtSI3GQAShpQqgOpMTNFYcpaWKmE/Y1MJmNY7xLCnw==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.4.1 + dev: false + /@babel/code-frame/7.18.6: resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} engines: {node: '>=6.9.0'} @@ -642,7 +1605,7 @@ packages: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 '@types/node': 18.11.10 - '@types/yargs': 17.0.15 + '@types/yargs': 17.0.16 chalk: 4.1.2 dev: true @@ -827,8 +1790,8 @@ packages: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} dev: true - /@types/yargs/17.0.15: - resolution: {integrity: sha512-ZHc4W2dnEQPfhn06TBEdWaiUHEZAocYaiVMfwOipY5jcJt/251wVrKCBWBetGZWO5CF8tdb7L3DmdxVlZ2BOIg==} + /@types/yargs/17.0.16: + resolution: {integrity: sha512-Mh3OP0oh8X7O7F9m5AplC+XHYLBWuPKNkGVD3gIZFLFebBnuFI2Nz5Sf8WLvwGxECJ8YjifQvFdh79ubODkdug==} dependencies: '@types/yargs-parser': 21.0.0 dev: true @@ -1017,7 +1980,6 @@ packages: /ansi-regex/5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - dev: true /ansi-regex/6.0.1: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} @@ -1036,7 +1998,6 @@ packages: engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - dev: true /ansi-styles/5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} @@ -1154,14 +2115,16 @@ packages: /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true + + /bowser/2.11.0: + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + dev: false /brace-expansion/1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - dev: true /braces/3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} @@ -1281,6 +2244,14 @@ packages: string-width: 5.1.2 dev: true + /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'} @@ -1288,7 +2259,6 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: true /co/4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} @@ -1310,7 +2280,6 @@ packages: engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 - dev: true /color-name/1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} @@ -1318,7 +2287,6 @@ packages: /color-name/1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true /colorette/2.0.19: resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} @@ -1331,7 +2299,6 @@ packages: /concat-map/0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true /convert-source-map/1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} @@ -1443,7 +2410,6 @@ packages: /emoji-regex/8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true /emoji-regex/9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} @@ -1458,7 +2424,6 @@ packages: /escalade/3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - dev: true /escape-string-regexp/1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} @@ -1672,6 +2637,13 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true + /fast-xml-parser/4.0.11: + resolution: {integrity: sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==} + hasBin: true + dependencies: + strnum: 1.0.5 + dev: false + /fastq/1.14.0: resolution: {integrity: sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==} dependencies: @@ -1757,7 +2729,6 @@ packages: /get-caller-file/2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - dev: true /get-package-type/0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} @@ -1934,7 +2905,6 @@ packages: /is-fullwidth-code-point/3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - dev: true /is-fullwidth-code-point/4.0.0: resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} @@ -2626,7 +3596,6 @@ packages: engines: {node: '>=10'} dependencies: yallist: 4.0.0 - dev: true /make-dir/3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} @@ -2672,6 +3641,12 @@ packages: engines: {node: '>=12'} dev: true + /minimatch/3.0.4: + resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} + dependencies: + brace-expansion: 1.1.11 + dev: false + /minimatch/3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -2942,7 +3917,6 @@ packages: /require-directory/2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - dev: true /resolve-cwd/3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} @@ -3011,6 +3985,18 @@ packages: tslib: 2.4.1 dev: true + /s3-groundskeeper/0.2.2: + resolution: {integrity: sha512-62ntqZMhd7v85yWM+YXKsVLJdf6us6Lc+L52Ia91kRpZMgb/E9hjeXKsIoydgN9XoALoUEL+/Rp37LUrKOOl4Q==} + hasBin: true + dependencies: + '@aws-sdk/client-s3': 3.226.0 + minimatch: 3.0.4 + yargs: 16.2.0 + transitivePeerDependencies: + - '@aws-sdk/signature-v4-crt' + - aws-crt + dev: false + /semver/6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true @@ -3022,7 +4008,6 @@ packages: hasBin: true dependencies: lru-cache: 6.0.0 - dev: true /shebang-command/2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} @@ -3118,7 +4103,6 @@ packages: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - dev: true /string-width/5.1.2: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} @@ -3134,7 +4118,6 @@ packages: engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 - dev: true /strip-ansi/7.0.1: resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} @@ -3163,6 +4146,10 @@ packages: engines: {node: '>=8'} dev: true + /strnum/1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + dev: false + /supports-color/5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -3304,11 +4291,9 @@ packages: /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true /tslib/2.4.1: resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} - dev: true /tsutils/3.21.0_typescript@4.9.3: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} @@ -3365,6 +4350,11 @@ packages: punycode: 2.1.1 dev: true + /uuid/8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: false + /v8-compile-cache-lib/3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true @@ -3424,7 +4414,6 @@ packages: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true /wrappy/1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -3441,21 +4430,36 @@ packages: /y18n/5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - dev: true /yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true /yaml/2.1.3: resolution: {integrity: sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg==} engines: {node: '>= 14'} dev: true + /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: true + + /yargs/16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + 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.6.2: resolution: {integrity: sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==} @@ -3468,7 +4472,6 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - dev: true /yn/3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} diff --git a/src/artifactory-utils.ts b/src/artifactory-utils.ts new file mode 100644 index 0000000..803f8f8 --- /dev/null +++ b/src/artifactory-utils.ts @@ -0,0 +1,168 @@ +import * as http from './http.js'; + +import { ArtifactoryClient, createArtifactoryClient } from 's3-groundskeeper'; +import { configuration } from './config.js'; +import type stream from 'stream'; + +let artifactoryHelperInstance: ArtifactoryHelper | undefined = undefined; + +export interface BuildsList { + buildsNumbers: { + uri: string, + started: string + }[] +} + +export interface BuildInfo { + buildInfo: { + modules: { + artifacts: Artifact[] + }[], + properties: { + 'buildInfo.env.CI_RUNNER_TAGS': string, + 'buildInfo.env.VERSION': string + } + } +} + +export interface Artifact { + type : string, + sha1 : string, + sha256 : string, + md5 : string, + name : string +} + +export interface ArtifactoryHelperConfig { + host: string; + user: string; + apiKey: string; + project: string; +} + +export class ArtifactoryHelper { + private artifactoryClient?: ArtifactoryClient; + private buildsList?: BuildsList; + private project: string; + + constructor(config: ArtifactoryHelperConfig) { + this.project = config.project; + this.artifactoryClient = createArtifactoryClient({ protocol: 'https', host: config.host, apiKey: config.apiKey, user: config.user }); + } + + public async init(): Promise { + if (!this.artifactoryClient) { + throw new Error('Artifactory client does not exists'); + } + + const apiEndpoint = this.artifactoryClient.resolveUri('api/build'); + const buildsEndpoint = `${apiEndpoint}/${this.project}`; + + const allBuilds = await http.get(buildsEndpoint); + this.buildsList = JSON.parse(allBuilds.toString()) as BuildsList; + } + + public client(): ArtifactoryClient { + if (!this.artifactoryClient) { + throw new Error('Artifactory client does not exists'); + } + + return this.artifactoryClient; + } + + public macOsArtifactsByBuildNumber(buildNumber: string): Promise { + return this.artifactsByBuildNumber(buildNumber, 'mac-shell'); + } + + public windowsArtifactsByBuildNumber(buildNumber: string): Promise { + return this.artifactsByBuildNumber(buildNumber, 'windows, code-signing'); + } + + public async debArtifactsByBuildNumber(buildNumber: string): Promise { + return (await this.artifactsByBuildNumber(buildNumber, 'tvd-runner')).filter(value => value.name.endsWith('.deb')); + } + + private async artifactsByBuildNumber(buildNumber: string, osKey: string): Promise { + const buildInfo = await this.buildInfoByNumber(buildNumber, osKey); + + if (buildInfo.buildInfo.modules.length !== 1) { + throw new Error('Build must contain only one module'); + } + + const firstModule = buildInfo.buildInfo.modules[0]; + + if (!firstModule) { + throw new Error('Build must contain only one module'); + } + + return firstModule.artifacts; + } + + private async buildInfoByNumber(buildNumber: string, osKey: string): Promise { + if (!this.artifactoryClient) { + throw new Error('Artifactory client does not exists'); + } + + const apiEndpoint = this.artifactoryClient?.resolveUri('api/build'); + const buildsEndpoint = `${apiEndpoint}/tradingview-desktop`; + + const buildTimes = (buildUri: string): Date[] => { + const times: Date[] = []; + + this.buildsList?.buildsNumbers.forEach(build => { + if (build.uri === `/${buildUri}`) { + times.push(new Date(build.started)); + } + }); + + return times; + }; + + const buildInfoResult: Promise[] = []; + + for (const value of buildTimes(buildNumber)) { + const buildInfoEndpoint = `${buildsEndpoint}/${buildNumber}?started=${value.toISOString()}`; + buildInfoResult.push(http.get(buildInfoEndpoint)); + } + + const result = (await Promise.all(buildInfoResult)); + + for (const buildInfo of result) { + const parsedInfo = JSON.parse(buildInfo.toString()) as BuildInfo; + if (parsedInfo.buildInfo.properties['buildInfo.env.CI_RUNNER_TAGS'] === osKey) { + return parsedInfo; + } + } + + throw new Error(`No build with build number: ${buildNumber} and osKey: ${osKey} found`); + } +} + +export function artifactoryHelper(): ArtifactoryHelper { + if (!artifactoryHelperInstance) { + const host = configuration().artifactoryHost; + const user = configuration().artifactoryUser; + const apiKey = configuration().artifactoryApiKey; + const project = configuration().artifactoryProjectKey; + + if (!host) { + throw new Error('Artifactory host must be specified'); + } + + if (!user) { + throw new Error('Artifactory user must be specified'); + } + + if (!apiKey) { + throw new Error('Artifactory API key must be specified'); + } + + if (!project) { + throw new Error('Artifactory project key must be specified'); + } + + artifactoryHelperInstance = new ArtifactoryHelper({ host, user, apiKey, project }); + } + + return artifactoryHelperInstance; +} diff --git a/src/cli.ts b/src/cli.ts new file mode 100644 index 0000000..02de88c --- /dev/null +++ b/src/cli.ts @@ -0,0 +1,20 @@ +import yargs from 'yargs'; + +export const cli = await yargs(process.argv.slice(2)) + .option('artifactory-host', { description: 'JFrog Artifactory host. Alternale env:ARTIFACTORY_HOST', group: 'JFrog Artifactory:', string: true }) + .option('artifactory-user', { description: 'JFrog Artifactory username. Alternale env:ARTIFACTORY_USER', group: 'JFrog Artifactory:', string: true }) + .option('artifactory-api-key', { description: 'JFrog Artifactory ApiKey. Alternale env:ARTIFACTORY_API_KEY', group: 'JFrog Artifactory:', string: true }) + .option('artifactory-project-key', { description: 'JFrog Artifactory Project key.', group: 'JFrog Artifactory:', string: true }) + .option('s3-access-key-id', { description: 'Amazon S3 access key id. Alternale env:S3_ACCESS_KEY_ID', group: 'AWS S3:', string: true }) + .option('s3-secret-access-key', { description: 'Amazon S3 secret access key. Alternale env:S3_SECRET_ACCESS_KEY', group: 'AWS S3:', string: true }) + .option('s3-region', { description: 'Amazon S3 region. Alternale env:S3_REGION', group: 'AWS S3:', string: true }) + .option('s3-bucket', { description: 'Amazon S3 bucket. Alternale env:S3_BUCKET', group: 'AWS S3:', string: true }) + .option('gpg-key-name', { description: 'Signing GPG key name. Alternale env:GPG_KEY_NAME', group: 'Linux specific:', string: true }) + .command('plan [source-dir]', 'Prepare repositories for deploy', yargs => { + yargs.positional('repo-out', { describe: 'Outup dir wich will contain prepeared repository', type: 'string', default: 'out' }) + .positional('source-dir', { describe: 'Source dir wich contains releases description', type: 'string' }); + }) + .command('apply ', 'Deploy repositories', yargs => { + yargs.positional('repo-dir', { describe: 'Source dir wich contains repository prepeared before. Only for S3 deploying', type: 'string' }); + }) + .parse(); diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 0000000..80dfb50 --- /dev/null +++ b/src/config.ts @@ -0,0 +1,53 @@ +import * as configFile from './jewel-case.config.mjs'; + +import { cli } from './cli.js'; + +let cfg: Config | undefined = undefined; + +class Config { + artifactoryHost: string | undefined; + artifactoryUser: string | undefined; + artifactoryApiKey: string | undefined; + artifactoryProjectKey: string | undefined; + s3AccessKeyId: string | undefined; + s3SecretAccessKey: string | undefined; + s3Region: string | undefined; + s3Bucket: string | undefined; + gpgKeyName: string | undefined; + exhaust = configFile.default.exhaust; + + constructor() { + const ARTIFACTORY_HOST = 'ARTIFACTORY_HOST'; + const ARTIFACTORY_USER = 'ARTIFACTORY_USER'; + const ARTIFACTORY_API_KEY = 'ARTIFACTORY_API_KEY'; + const S3_ACCESS_KEY_ID = 'S3_ACCESS_KEY_ID'; + const S3_SECRET_ACCESS_KEY = 'S3_SECRET_ACCESS_KEY'; + const S3_REGION = 'S3_REGION'; + const S3_BUCKET = 'S3_BUCKET'; + const GPG_KEY_NAME = 'GPG_KEY_NAME'; + + this.artifactoryHost = envToString(ARTIFACTORY_HOST) ?? cli.artifactoryHost; + this.artifactoryUser = envToString(ARTIFACTORY_USER) ?? cli.artifactoryUser; + this.artifactoryApiKey = envToString(ARTIFACTORY_API_KEY) ?? cli.artifactoryApiKey; + this.artifactoryProjectKey = cli.artifactoryProjectKey; + this.s3AccessKeyId = envToString(S3_ACCESS_KEY_ID) ?? cli.s3AccessKeyId; + this.s3SecretAccessKey = envToString(S3_SECRET_ACCESS_KEY) ?? cli.s3SecretAccessKey; + this.s3Region = envToString(S3_REGION) ?? cli.s3Region; + this.s3Bucket = envToString(S3_BUCKET) ?? cli.s3Bucket; + this.gpgKeyName = envToString(GPG_KEY_NAME) ?? cli.gpgKeyName; + } +} + +function envToString(envName: string): string | undefined { + const value = process.env[envName]; + + return value; +} + +export function configuration(): Config { + if (!cfg) { + cfg = new Config(); + } + + return cfg; +} diff --git a/src/http.ts b/src/http.ts new file mode 100644 index 0000000..762b8ac --- /dev/null +++ b/src/http.ts @@ -0,0 +1,87 @@ +import * as https from 'https'; + +import type * as stream from 'stream'; +import type { IncomingMessage } from 'http'; + +export interface RequestBody { + content: string | Buffer; + contentType?: string; +} + +export interface RequestData { + headers?: Record; + body?: RequestBody; + redirectHandler?: (url: string) => string | undefined; +} + +export function requestStream(url: string, method: string, requestData?: RequestData): Promise { + return new Promise((resolve, reject) => { + try { + const req = https.request(url, { method }); + + req + .on('response', (incomingMessage: IncomingMessage) => { + if (incomingMessage.statusCode !== 200) { + const stCode = incomingMessage.statusCode ?? 'NO_CODE'; + const stMessage = incomingMessage.statusMessage ?? 'NO_MESSAGE'; + const message = `[${method} ${url}]:${stCode}/${stMessage}`; + reject(new Error(message)); + return; + } + + resolve(incomingMessage); + }) + .on('error', (err: Error) => { + const errno = (err as {errno?: string}).errno ?? ''; + if (errno === 'ETIMEDOUT') { + reject(new Error(`Request (${url}) timeout.`)); + } else { + reject(err); + } + }); + + if (requestData?.headers) { + for (const key of Object.getOwnPropertyNames(requestData.headers)) { + const value = requestData.headers[key]; + + if (value) { + req.setHeader(key, value); + } + } + } + + if (requestData?.body) { + if (requestData.body.contentType) { + req.setHeader('Content-Type', requestData.body.contentType); + } + req.write(requestData.body.content); + } + + req.end(); + } catch (err) { + reject(err); + } + }); +} + + +export async function request(url: string, method: string, requestData?: RequestData): Promise { + const responseStream = await requestStream(url, method, requestData); + + let buffer: Buffer | undefined = undefined; + + for await (const item of responseStream) { + const chunk = item as Buffer; + buffer = (typeof buffer === 'undefined') ? chunk : Buffer.concat([buffer, chunk]); + } + + return buffer ? buffer : Buffer.from(''); +} + +export function get(url: string, opt: {stream: boolean} = { stream: false }): Promise { + return opt.stream ? requestStream(url, 'GET', undefined) : request(url, 'GET', undefined); +} + +export function post(url: string, requestData?: RequestData): Promise { + return request(url, 'POST', requestData); +} diff --git a/src/index.ts b/src/index.ts index e69de29..d850838 100644 --- a/src/index.ts +++ b/src/index.ts @@ -0,0 +1,29 @@ +import { apply, plan } from './jewel-case.js'; +import { getMessageOfError } from './utils.js'; + +import { cli } from './cli.js'; +import { exit } from 'process'; + +async function main(): Promise { + const command = cli._[0]; + + if (command === 'plan') { + await plan(cli['repo-out'] as string, cli['source-dir'] as string); + } + + if (command === 'apply') { + apply(cli['repo-dir'] as string); + } + + return 0; +} + +main().then((code: number) => { + if (!code) { + exit(code); + } +}) + .catch((error: unknown) => { + console.error(getMessageOfError(error)); + exit(-1); + }); diff --git a/src/jewel-case.config.mjs b/src/jewel-case.config.mjs new file mode 100644 index 0000000..c6cab69 --- /dev/null +++ b/src/jewel-case.config.mjs @@ -0,0 +1,7 @@ +export default { + exhaust: [ + { + type: 'msix-s3', + }, + ], +}; diff --git a/src/jewel-case.ts b/src/jewel-case.ts new file mode 100644 index 0000000..c03b0e0 --- /dev/null +++ b/src/jewel-case.ts @@ -0,0 +1,57 @@ +import { Repo, RepoBuilder, scanSourceDir } from './repo-builder.js'; + +import { artifactoryHelper } from './artifactory-utils.js'; +import { configuration } from './config.js'; +import { WindowsRepoBuilder } from './windows-repo-builder.js'; + +export async function plan(outDir: string, sourceDir: string): Promise { + console.log(outDir); + console.log(sourceDir); + + checkConfig('plan'); + + await artifactoryHelper().init(); + const repo = await scanSourceDir(sourceDir); + const builders = createBuilders(repo, outDir); + + const repoBuildResilts: Promise[] = []; + builders.forEach(builder => { + repoBuildResilts.push(builder.build()); + }); + + await Promise.all(repoBuildResilts); +} + +export function apply(repoDir?: string): void { + console.log(repoDir); + + checkConfig('apply'); +} + +function checkConfig(command: 'plan' | 'apply'): void { + console.debug('Checking configuration'); + + if (command === 'plan') { + // const hasS3 = configuration().exhaust.some(value => value.type.endsWith('s3')); + const linuxDebS3 = configuration().exhaust.some(value => value.type.includes('linux-deb-s3')); + + if (linuxDebS3) { + if (!configuration().gpgKeyName) { + throw new Error('GPG key must be specified'); + } + } + } + + console.debug('Checking configuration done'); +} + +function createBuilders(repo: Repo, outDir: string): RepoBuilder[] { + const builders: RepoBuilder[] = []; + const hasMsixS3 = configuration().exhaust.some(value => value.type.endsWith('msix-s3')); + + if (hasMsixS3) { + builders.push(new WindowsRepoBuilder(artifactoryHelper(), repo, outDir)); + } + + return builders; +} diff --git a/src/repo-builder.ts b/src/repo-builder.ts new file mode 100644 index 0000000..9ea53a4 --- /dev/null +++ b/src/repo-builder.ts @@ -0,0 +1,94 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import * as semver from 'semver'; + +export interface Package { + version: string, + buildNumber: string, +} + +interface Release { + packages: Package[], + highest: Package, +} + +type Channel = string; +export type Repo = Map; + +export interface RepoBuilder { + build(): Promise; +} + +export async function scanSourceDir(sourceDir: string): Promise { + console.log(`Prepearing meta repo from "${sourceDir}"`); + const repo: Repo = new Map(); + + const processChannelDirectory = async(srcPath: string, channel: string): Promise => { + const fullChannelPath = path.resolve(srcPath, channel); + const list: string[] = await fs.promises.readdir(fullChannelPath); + const packages: Package[] = []; + + const findHighestVersion = (packs: Package[]): Package => { + let highest: Package = { + version: '0.0.0', + buildNumber: '', + }; + + for (const pack of packs) { + if (semver.compare(pack.version, highest.version) > 0) { + highest = pack; + } + } + + if (highest.version === '0.0.0') { + throw new Error('Could not find highest version'); + } + + return highest; + }; + + if (list.length === 0) { + throw new Error(`Channel directory "${fullChannelPath}" is empty`); + } + + for (const releasePath of list) { + const fullReleasePath = path.resolve(fullChannelPath, releasePath); + const key = path.relative(sourceDir, fullReleasePath); + const stats = fs.lstatSync(fullReleasePath); + + console.log(`${key} found`); + + const version = path.basename(releasePath, '.txt'); + + if (stats.isDirectory()) { + console.log(`Skipping directory - ${fullReleasePath}`); + } else if (stats.isFile()) { + const buildNumber = fs.readFileSync(fullReleasePath).toString(); + packages.push({ version, buildNumber }); + } + } + + repo.set(channel, { packages, highest: findHighestVersion(packages) }); + }; + + const iterateDirectory = async(dirPath: string): Promise => { + const list: string[] = await fs.promises.readdir(dirPath); + + if (list.length === 0) { + throw new Error(`Source directory "${dirPath}" is empty`); + } + + const processResults: Promise[] = []; + for (const channel of list) { + processResults.push(processChannelDirectory(dirPath, channel)); + } + + await Promise.all(processResults); + }; + + await iterateDirectory(sourceDir); + + return repo; +} + + diff --git a/src/tsconfig.json b/src/tsconfig.json index bc3520f..1f55618 100644 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -1,12 +1,13 @@ { "extends": "../tsconfig-base.json", - "include": ["**/*"], + "include": ["**/*", "jewel-case.config.mjs"], "exclude": ["**/*.spec.ts"], "compilerOptions": { "composite": true, "declaration": true, "module": "es2022", "moduleResolution": "node16", - "outDir": "../dist" + "outDir": "../dist", + "sourceMap": true } } diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 0000000..4c53760 --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,85 @@ +import * as fs from 'fs'; + +import { spawnSync } from 'child_process'; + +export function createMetapointerContent(fileMd5Hash: string): string { + return `#metapointer jfrogart\noid md5:${fileMd5Hash}`; +} + +export function createFile(path: string, content: string): void { + const dirPath = path.split('/').slice(0, -1) + .join('/'); + + createDir(dirPath); + + fs.writeFileSync(path, content); +} + +export function createDir(dirName: string): void { + if (!fs.existsSync(dirName)) { + fs.mkdirSync(dirName, { recursive: true }); + } +} + +export function ignorePromise(promise: Promise): void { + promise.catch((error: unknown) => { + const err = error as Error; + console.warn(`Ignoring promise, but error: ${err.message}`); + console.warn(err.stack); + }); +} + +// eslint-disable-next-line max-params +export async function execToolToFile(tool: string, args: string[], outputPath?: string, append?: boolean): Promise { + if (!append && outputPath && fs.existsSync(outputPath)) { + await fs.promises.unlink(outputPath); + } + + const toolProcessResult = spawnSync(tool, args, { stdio: 'pipe', encoding: 'utf-8' }); + const toolOutput = toolProcessResult.stdout; + + const dumpToolOutput = (): void => { + const toolErrOutput = toolProcessResult.stderr; + if (toolOutput && toolOutput.length > 0) { + console.log(toolOutput); + } + if (toolErrOutput && toolErrOutput.length > 0) { + console.warn(toolErrOutput); + } + }; + + if (outputPath) { + console.log(`Execute ${tool} ${args.join(' ')} => ${outputPath}`); + dumpToolOutput(); + if (append) { + return fs.promises.appendFile(outputPath, toolOutput); + } + + return fs.promises.writeFile(outputPath, toolOutput); + } + + console.log(`Execute ${tool} ${args.join(' ')}`); + dumpToolOutput(); + + return Promise.resolve(); +} + +export function getMessageOfError(error: unknown): string { + if (error === null || typeof error === 'undefined') { + return ''; + } + + if (error instanceof Error) { + return error.message; + } + + if (typeof error === 'string') { + return error; + } + + if (typeof error === 'object') { + return (error as { message?: string; }).message ?? 'unknown error'; + } + + return 'unknown error'; +} diff --git a/src/windows-repo-builder.ts b/src/windows-repo-builder.ts new file mode 100644 index 0000000..6020789 --- /dev/null +++ b/src/windows-repo-builder.ts @@ -0,0 +1,125 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import { TextEncoder } from 'util'; + +import type { Artifact, ArtifactoryHelper } from './artifactory-utils.js'; +import type { Package, Repo, RepoBuilder } from './repo-builder.js'; + +import { createDir, createFile, createMetapointerContent } from './utils.js'; + +export class WindowsRepoBuilder implements RepoBuilder { + private readonly artifactory: ArtifactoryHelper; + private readonly repo: Repo; + private readonly out: string; + private readonly arch: string = 'x64'; + + constructor(artifactory: ArtifactoryHelper, repo: Repo, out: string) { + this.artifactory = artifactory; + this.repo = repo; + this.out = out; + } + + public build(): Promise { + return this.prepareJfrogMetaFiles(); + } + + private async prepareJfrogMetaFiles(): Promise { + console.log('WindowsBuilder: prepareJfrogMetaFiles'); + + const channelResult: Promise[] = []; + const latestResult: Promise[] = []; + + for (const [channel, release] of this.repo) { + channelResult.push(this.makeChannel(channel, release.packages)); + } + + await Promise.all(channelResult); + + for (const [channel, release] of this.repo) { + latestResult.push(this.makeLatest(channel, release.highest)); + } + + // eslint-disable-next-line no-empty-function + return Promise.all(latestResult).then(() => {}); + } + + private async artifactsWithVersion(version: string, buildNumber: string): Promise<{ version: string, artifacts: Artifact[] }> { + return { version, artifacts: await this.artifactory.windowsArtifactsByBuildNumber(buildNumber) }; + } + + private async makeChannel(channel: string, packs: Package[]): Promise { + const artifactsResult: Promise<{ version: string, artifacts: Artifact[] }>[] = []; + + packs.forEach(pack => { + artifactsResult.push(this.artifactsWithVersion(pack.version, pack.buildNumber)); + }); + + const artifacts = await Promise.all(artifactsResult); + + artifacts.forEach(value => { + console.log(`WindowsBuilder: Processing ${value.version}`); + value.artifacts.forEach(artifact => { + const msixDir = path.join(this.out, channel, value.version, 'win32', this.arch); + createDir(msixDir); + createMsix(msixDir, artifact.md5); + }); + }); + } + + private async makeLatest(channel: string, highest: Package): Promise { + console.log('WindowsBuilder: makeRelease'); + + const latestDir = path.join(this.out, channel, 'latest', 'win32'); + createDir(latestDir); + + this.createAppInstallerFile(latestDir, `${highest.version}.${highest.buildNumber}`, channel); + await fs.promises.copyFile(path.join(this.out, channel, highest.version, 'win32', this.arch, 'TradingView.msix'), + path.join(latestDir, 'TradingView.msix')); + } + + private createAppInstallerFile(out: string, version: string, channel: string): void { + const appInstallerContent = this.appInstallerFileContent(version, channel); + const adjustedAppInstallerContent = adjustAppinstallerSize(appInstallerContent); + + createFile(`${out}/TradingView.appinstaller`, adjustedAppInstallerContent); + } + + private appInstallerFileContent(version: string, channel: string): string { + return ` + + + + + + \n`; + } +} + +function createMsix(out: string, md5: string): void { + createFile(`${out}/TradingView.msix`, createMetapointerContent(md5)); +} + +function adjustAppinstallerSize(appInstallerContent: string): string { + const encoder = new TextEncoder(); + const appInstallerRequiredSize = 4096; + + const createFillComment = (fillComment: string): string => ``; + + const appInstallerContentSize = encoder.encode(appInstallerContent).length; + const fillCommentSize = appInstallerRequiredSize - appInstallerContentSize - encoder.encode(createFillComment('')).length; + + if (fillCommentSize >= 0) { + const commentStr = new Array(fillCommentSize + 1).join('X'); + return `${appInstallerContent}${createFillComment(commentStr)}`; + } + + throw new Error('Appinstaller file is too big'); +} From 75b716268a470eb7d1817f68e779f5e4c7aa8280 Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Fri, 16 Dec 2022 16:15:32 +0300 Subject: [PATCH 02/58] readme sketch --- README.md | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/README.md b/README.md index b2a663a..01fea36 100644 --- a/README.md +++ b/README.md @@ -12,3 +12,78 @@ Lifecycle commands: | `npx pnpm lint` | lint all files | | `npx pnpm lint-staged` | lint all staged files | | `npx pnpm test` | run unit tests | + +## Usage +#### CLI commands: +Build repositories according to config: +```sh +jewel-case plan [source-dir] +``` +Distribute repository: +```sh +jewel-case apply +``` +#### Source dir layout +Layout example: +* `src` + * `beta` + * `1.0.19` + * `stable` + * `1.0.10` + * `1.0.11` + * `1.0.12` + * `1.0.13` + * `1.0.14` + * `1.0.15` + * `1.0.16` + * `1.0.9` + +Artifacts have to be uploaded with settled build number. See [JFROG Documentation](https://www.jfrog.com/confluence/display/JFROG/UploadArtifact). Version file must contain that build number: +``` +PS src> cat .\stable\1.0.10 +2830 +``` + +#### Artifactory config: +| CLI key | Environment variable | +|---------------------------|----------------------| +| --artifactory-host | ARTIFACTORY_HOST | +| --artifactory-user | ARTIFACTORY_USER | +| --artifactory-api-key | ARTIFACTORY_API_KEY | +| --artifactory-project-key | - | + +#### AWS S3 config: +| CLI key | Environment variable | +|---------------------------|----------------------| +| --s3-access-key-id | S3_ACCESS_KEY_ID | +| --s3-secret-access-key | S3_SECRET_ACCESS_KEY | +| --s3-region | S3_REGION | +| --s3-bucket | S3_BUCKET | + +#### Other config: +| CLI key | Environment variable | Description | +|----------------|-----------------------|------------------------------| +| --gpg-key-name | GPG_KEY_NAME | Need for sign deb repository | + +## Exhaust +To configure exhaust You'll need `jewel-case.config.mjs` file in directory with rules configured like this: +```ts +export default { + exhaust: [ + { + type: 'msix-s3', + }, + ], +}; +``` + +Repository builders: +* msix-s3 +* darwin-s3 _(in progress)_ +* deb-s3 _(in progress)_ +* rpm-s3 _(in progress)_ + +Distributors: +* [s3-groundskeeper](https://github.com/tradingview/s3-groundskeeper) +* msix-store _(in progress)_ +* snap-store _(in progress)_ From c6454c0ef322e6a000fb47f912e87a8728865360 Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Fri, 16 Dec 2022 16:20:29 +0300 Subject: [PATCH 03/58] linter fix --- README.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 01fea36..c5461c4 100644 --- a/README.md +++ b/README.md @@ -24,19 +24,19 @@ Distribute repository: jewel-case apply ``` #### Source dir layout -Layout example: +Layout example: * `src` - * `beta` - * `1.0.19` - * `stable` - * `1.0.10` - * `1.0.11` - * `1.0.12` - * `1.0.13` - * `1.0.14` - * `1.0.15` - * `1.0.16` - * `1.0.9` + * `beta` + * `1.0.19` + * `stable` + * `1.0.10` + * `1.0.11` + * `1.0.12` + * `1.0.13` + * `1.0.14` + * `1.0.15` + * `1.0.16` + * `1.0.9` Artifacts have to be uploaded with settled build number. See [JFROG Documentation](https://www.jfrog.com/confluence/display/JFROG/UploadArtifact). Version file must contain that build number: ``` From c5c0822b4d6ee162a39ff268b459f4cea126769d Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Mon, 19 Dec 2022 17:40:30 +0300 Subject: [PATCH 04/58] dynamically loaded config, configurable appinstaller --- .gitignore | 2 ++ src/artifactory-utils.ts | 6 ++--- src/config.ts | 22 +++++++++++++++-- src/index.ts | 2 ++ src/jewel-case.config.mjs | 7 ------ src/jewel-case.ts | 23 +----------------- src/tsconfig.json | 1 - src/windows-repo-builder.ts | 48 +++++++++++++++++++++++++++---------- 8 files changed, 63 insertions(+), 48 deletions(-) delete mode 100644 src/jewel-case.config.mjs diff --git a/.gitignore b/.gitignore index b1a8d3e..0e78403 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,5 @@ out/ /coverage/ .vscode/.env + +jewel-case.config.mjs diff --git a/src/artifactory-utils.ts b/src/artifactory-utils.ts index 803f8f8..5d58b81 100644 --- a/src/artifactory-utils.ts +++ b/src/artifactory-utils.ts @@ -74,8 +74,8 @@ export class ArtifactoryHelper { return this.artifactsByBuildNumber(buildNumber, 'mac-shell'); } - public windowsArtifactsByBuildNumber(buildNumber: string): Promise { - return this.artifactsByBuildNumber(buildNumber, 'windows, code-signing'); + public async windowsArtifactsByBuildNumber(buildNumber: string): Promise { + return (await this.artifactsByBuildNumber(buildNumber, 'windows, code-signing')).filter(value => value.name.endsWith('.msix')); } public async debArtifactsByBuildNumber(buildNumber: string): Promise { @@ -104,7 +104,7 @@ export class ArtifactoryHelper { } const apiEndpoint = this.artifactoryClient?.resolveUri('api/build'); - const buildsEndpoint = `${apiEndpoint}/tradingview-desktop`; + const buildsEndpoint = `${apiEndpoint}/${this.project}`; const buildTimes = (buildUri: string): Date[] => { const times: Date[] = []; diff --git a/src/config.ts b/src/config.ts index 80dfb50..92f6896 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,9 +1,16 @@ -import * as configFile from './jewel-case.config.mjs'; +import fs from 'fs'; +import path from 'path'; +import { pathToFileURL } from 'url'; import { cli } from './cli.js'; +import type { MsixS3Config } from './windows-repo-builder.js'; let cfg: Config | undefined = undefined; +interface ExhaustConfig { + msixS3?: MsixS3Config; +} + class Config { artifactoryHost: string | undefined; artifactoryUser: string | undefined; @@ -14,7 +21,7 @@ class Config { s3Region: string | undefined; s3Bucket: string | undefined; gpgKeyName: string | undefined; - exhaust = configFile.default.exhaust; + exhaust: ExhaustConfig | undefined; constructor() { const ARTIFACTORY_HOST = 'ARTIFACTORY_HOST'; @@ -36,6 +43,17 @@ class Config { this.s3Bucket = envToString(S3_BUCKET) ?? cli.s3Bucket; this.gpgKeyName = envToString(GPG_KEY_NAME) ?? cli.gpgKeyName; } + + async init(): Promise { + const resolvedPath = path.resolve(process.cwd(), 'jewel-case.config.mjs'); + if (resolvedPath && fs.existsSync(resolvedPath)) { + this.exhaust = (await import(pathToFileURL(resolvedPath).toString())).default as ExhaustConfig; + + return; + } + + throw new Error('jewel-case.config.mjs not found'); + } } function envToString(envName: string): string | undefined { diff --git a/src/index.ts b/src/index.ts index d850838..31c5b2d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,10 +2,12 @@ import { apply, plan } from './jewel-case.js'; import { getMessageOfError } from './utils.js'; import { cli } from './cli.js'; +import { configuration } from './config.js'; import { exit } from 'process'; async function main(): Promise { const command = cli._[0]; + await configuration().init(); if (command === 'plan') { await plan(cli['repo-out'] as string, cli['source-dir'] as string); diff --git a/src/jewel-case.config.mjs b/src/jewel-case.config.mjs deleted file mode 100644 index c6cab69..0000000 --- a/src/jewel-case.config.mjs +++ /dev/null @@ -1,7 +0,0 @@ -export default { - exhaust: [ - { - type: 'msix-s3', - }, - ], -}; diff --git a/src/jewel-case.ts b/src/jewel-case.ts index c03b0e0..c000956 100644 --- a/src/jewel-case.ts +++ b/src/jewel-case.ts @@ -8,8 +8,6 @@ export async function plan(outDir: string, sourceDir: string): Promise { console.log(outDir); console.log(sourceDir); - checkConfig('plan'); - await artifactoryHelper().init(); const repo = await scanSourceDir(sourceDir); const builders = createBuilders(repo, outDir); @@ -24,30 +22,11 @@ export async function plan(outDir: string, sourceDir: string): Promise { export function apply(repoDir?: string): void { console.log(repoDir); - - checkConfig('apply'); -} - -function checkConfig(command: 'plan' | 'apply'): void { - console.debug('Checking configuration'); - - if (command === 'plan') { - // const hasS3 = configuration().exhaust.some(value => value.type.endsWith('s3')); - const linuxDebS3 = configuration().exhaust.some(value => value.type.includes('linux-deb-s3')); - - if (linuxDebS3) { - if (!configuration().gpgKeyName) { - throw new Error('GPG key must be specified'); - } - } - } - - console.debug('Checking configuration done'); } function createBuilders(repo: Repo, outDir: string): RepoBuilder[] { const builders: RepoBuilder[] = []; - const hasMsixS3 = configuration().exhaust.some(value => value.type.endsWith('msix-s3')); + const hasMsixS3 = Boolean(configuration().exhaust?.msixS3); if (hasMsixS3) { builders.push(new WindowsRepoBuilder(artifactoryHelper(), repo, outDir)); diff --git a/src/tsconfig.json b/src/tsconfig.json index 1f55618..0586730 100644 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -1,6 +1,5 @@ { "extends": "../tsconfig-base.json", - "include": ["**/*", "jewel-case.config.mjs"], "exclude": ["**/*.spec.ts"], "compilerOptions": { "composite": true, diff --git a/src/windows-repo-builder.ts b/src/windows-repo-builder.ts index 6020789..453a767 100644 --- a/src/windows-repo-builder.ts +++ b/src/windows-repo-builder.ts @@ -1,22 +1,44 @@ import * as fs from 'fs'; import * as path from 'path'; + import { TextEncoder } from 'util'; import type { Artifact, ArtifactoryHelper } from './artifactory-utils.js'; import type { Package, Repo, RepoBuilder } from './repo-builder.js'; import { createDir, createFile, createMetapointerContent } from './utils.js'; +import { configuration } from './config.js'; + +export interface MsixS3Config { + msixName: string, + appInstaller: { + name: string, + host: string, + hoursBetweenUpdateChecks: number, + packageName: string, + publisher: string + } +} export class WindowsRepoBuilder implements RepoBuilder { private readonly artifactory: ArtifactoryHelper; private readonly repo: Repo; private readonly out: string; + private readonly config: MsixS3Config; private readonly arch: string = 'x64'; constructor(artifactory: ArtifactoryHelper, repo: Repo, out: string) { this.artifactory = artifactory; this.repo = repo; this.out = out; + + const msixConfig = configuration().exhaust?.msixS3; + + if (msixConfig) { + this.config = msixConfig; + } else { + throw new Error('MsixS3Config must be specified'); + } } public build(): Promise { @@ -61,7 +83,7 @@ export class WindowsRepoBuilder implements RepoBuilder { value.artifacts.forEach(artifact => { const msixDir = path.join(this.out, channel, value.version, 'win32', this.arch); createDir(msixDir); - createMsix(msixDir, artifact.md5); + this.createMsix(msixDir, artifact.md5); }); }); } @@ -69,42 +91,42 @@ export class WindowsRepoBuilder implements RepoBuilder { private async makeLatest(channel: string, highest: Package): Promise { console.log('WindowsBuilder: makeRelease'); - const latestDir = path.join(this.out, channel, 'latest', 'win32'); + const latestDir = path.join(this.out, channel, 'latest', 'win32', this.arch); createDir(latestDir); this.createAppInstallerFile(latestDir, `${highest.version}.${highest.buildNumber}`, channel); - await fs.promises.copyFile(path.join(this.out, channel, highest.version, 'win32', this.arch, 'TradingView.msix'), - path.join(latestDir, 'TradingView.msix')); + await fs.promises.copyFile(path.join(this.out, channel, highest.version, 'win32', this.arch, `${this.config.msixName}.msix`), + path.join(latestDir, `${this.config.msixName}.msix`)); } private createAppInstallerFile(out: string, version: string, channel: string): void { const appInstallerContent = this.appInstallerFileContent(version, channel); const adjustedAppInstallerContent = adjustAppinstallerSize(appInstallerContent); - createFile(`${out}/TradingView.appinstaller`, adjustedAppInstallerContent); + createFile(`${out}/${this.config.appInstaller.name}.appinstaller`, adjustedAppInstallerContent); } private appInstallerFileContent(version: string, channel: string): string { return ` + Uri="${this.config.appInstaller.host}/${channel}/${version}/win32/${this.arch}/${this.config.msixName}.msix" /> - + \n`; } -} -function createMsix(out: string, md5: string): void { - createFile(`${out}/TradingView.msix`, createMetapointerContent(md5)); + private createMsix(out: string, md5: string): void { + createFile(`${out}/${this.config.msixName}.msix`, createMetapointerContent(md5)); + } } function adjustAppinstallerSize(appInstallerContent: string): string { From 5888bc9273a9467266bc0c1f1e1bcb4763e7ef81 Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Mon, 19 Dec 2022 18:00:09 +0300 Subject: [PATCH 05/58] fix tsconfig --- src/tsconfig.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tsconfig.json b/src/tsconfig.json index 0586730..8bf4bd9 100644 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -1,5 +1,6 @@ { "extends": "../tsconfig-base.json", + "include": ["**/*"], "exclude": ["**/*.spec.ts"], "compilerOptions": { "composite": true, From e9b9e25a5299a6020d4c6b77906626d9c40b9085 Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Mon, 19 Dec 2022 18:36:00 +0300 Subject: [PATCH 06/58] fixed exhaust config example in README --- README.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c5461c4..b104442 100644 --- a/README.md +++ b/README.md @@ -69,12 +69,18 @@ PS src> cat .\stable\1.0.10 To configure exhaust You'll need `jewel-case.config.mjs` file in directory with rules configured like this: ```ts export default { - exhaust: [ - { - type: 'msix-s3', + msixS3: { + msixName: 'TradingView', + appInstaller: { + name: 'TradingView', + host: 'https://tvd-packages.tradingview.com', + hoursBetweenUpdateChecks: 1, + packageName: 'TradingView.Desktop', + publisher: 'CN="TradingView, Inc.", O="TradingView, Inc.", S=Ohio, C=US', }, - ], + }, }; + ``` Repository builders: From e82fb8b7035d010f38bd376afecd5f1836e238dc Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Mon, 19 Dec 2022 19:18:42 +0300 Subject: [PATCH 07/58] refactor cli and config initialization --- src/cli.ts | 28 +++++++++++++++++++++++++--- src/config.ts | 35 ++++++++++++++++++++++------------- src/index.ts | 19 +++++++++++-------- src/jewel-case.ts | 3 --- 4 files changed, 58 insertions(+), 27 deletions(-) diff --git a/src/cli.ts b/src/cli.ts index 02de88c..1159829 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -1,6 +1,9 @@ import yargs from 'yargs'; -export const cli = await yargs(process.argv.slice(2)) +type CliType = Awaited>; +let cliInstance: CliType | undefined = undefined; + +const yargsParsePromise = yargs(process.argv.slice(2)) .option('artifactory-host', { description: 'JFrog Artifactory host. Alternale env:ARTIFACTORY_HOST', group: 'JFrog Artifactory:', string: true }) .option('artifactory-user', { description: 'JFrog Artifactory username. Alternale env:ARTIFACTORY_USER', group: 'JFrog Artifactory:', string: true }) .option('artifactory-api-key', { description: 'JFrog Artifactory ApiKey. Alternale env:ARTIFACTORY_API_KEY', group: 'JFrog Artifactory:', string: true }) @@ -16,5 +19,24 @@ export const cli = await yargs(process.argv.slice(2)) }) .command('apply ', 'Deploy repositories', yargs => { yargs.positional('repo-dir', { describe: 'Source dir wich contains repository prepeared before. Only for S3 deploying', type: 'string' }); - }) - .parse(); + }); + +export async function initCli(): Promise { + if (cliInstance) { + throw new Error('CLI already initialized'); + } + + const tmp = await yargsParsePromise.parse(); + + if (!cliInstance) { + cliInstance = tmp; + } +} + +export function cli(): CliType { + if (!cliInstance) { + throw new Error('CLI must be initialized before use'); + } + + return cliInstance; +} diff --git a/src/config.ts b/src/config.ts index 92f6896..6ee11c5 100644 --- a/src/config.ts +++ b/src/config.ts @@ -5,7 +5,7 @@ import { pathToFileURL } from 'url'; import { cli } from './cli.js'; import type { MsixS3Config } from './windows-repo-builder.js'; -let cfg: Config | undefined = undefined; +let configurationInstance: Config | undefined = undefined; interface ExhaustConfig { msixS3?: MsixS3Config; @@ -33,15 +33,15 @@ class Config { const S3_BUCKET = 'S3_BUCKET'; const GPG_KEY_NAME = 'GPG_KEY_NAME'; - this.artifactoryHost = envToString(ARTIFACTORY_HOST) ?? cli.artifactoryHost; - this.artifactoryUser = envToString(ARTIFACTORY_USER) ?? cli.artifactoryUser; - this.artifactoryApiKey = envToString(ARTIFACTORY_API_KEY) ?? cli.artifactoryApiKey; - this.artifactoryProjectKey = cli.artifactoryProjectKey; - this.s3AccessKeyId = envToString(S3_ACCESS_KEY_ID) ?? cli.s3AccessKeyId; - this.s3SecretAccessKey = envToString(S3_SECRET_ACCESS_KEY) ?? cli.s3SecretAccessKey; - this.s3Region = envToString(S3_REGION) ?? cli.s3Region; - this.s3Bucket = envToString(S3_BUCKET) ?? cli.s3Bucket; - this.gpgKeyName = envToString(GPG_KEY_NAME) ?? cli.gpgKeyName; + this.artifactoryHost = envToString(ARTIFACTORY_HOST) ?? cli().artifactoryHost; + this.artifactoryUser = envToString(ARTIFACTORY_USER) ?? cli().artifactoryUser; + this.artifactoryApiKey = envToString(ARTIFACTORY_API_KEY) ?? cli().artifactoryApiKey; + this.artifactoryProjectKey = cli().artifactoryProjectKey; + this.s3AccessKeyId = envToString(S3_ACCESS_KEY_ID) ?? cli().s3AccessKeyId; + this.s3SecretAccessKey = envToString(S3_SECRET_ACCESS_KEY) ?? cli().s3SecretAccessKey; + this.s3Region = envToString(S3_REGION) ?? cli().s3Region; + this.s3Bucket = envToString(S3_BUCKET) ?? cli().s3Bucket; + this.gpgKeyName = envToString(GPG_KEY_NAME) ?? cli().gpgKeyName; } async init(): Promise { @@ -62,10 +62,19 @@ function envToString(envName: string): string | undefined { return value; } +export function initConfiguration(): Promise { + if (configurationInstance) { + throw new Error('Configuration already initialized'); + } + + configurationInstance = new Config(); + return configurationInstance.init(); +} + export function configuration(): Config { - if (!cfg) { - cfg = new Config(); + if (!configurationInstance) { + throw new Error('Configuration must be initialized before use'); } - return cfg; + return configurationInstance; } diff --git a/src/index.ts b/src/index.ts index 31c5b2d..83ca468 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,20 +1,23 @@ +import { exit } from 'process'; + import { apply, plan } from './jewel-case.js'; -import { getMessageOfError } from './utils.js'; +import { cli, initCli } from './cli.js'; -import { cli } from './cli.js'; -import { configuration } from './config.js'; -import { exit } from 'process'; +import { getMessageOfError } from './utils.js'; +import { initConfiguration } from './config.js'; async function main(): Promise { - const command = cli._[0]; - await configuration().init(); + await initCli(); + await initConfiguration(); + + const command = cli()._[0]; if (command === 'plan') { - await plan(cli['repo-out'] as string, cli['source-dir'] as string); + await plan(cli()['repo-out'] as string, cli()['source-dir'] as string); } if (command === 'apply') { - apply(cli['repo-dir'] as string); + apply(cli()['repo-dir'] as string); } return 0; diff --git a/src/jewel-case.ts b/src/jewel-case.ts index c000956..b8e75fd 100644 --- a/src/jewel-case.ts +++ b/src/jewel-case.ts @@ -5,9 +5,6 @@ import { configuration } from './config.js'; import { WindowsRepoBuilder } from './windows-repo-builder.js'; export async function plan(outDir: string, sourceDir: string): Promise { - console.log(outDir); - console.log(sourceDir); - await artifactoryHelper().init(); const repo = await scanSourceDir(sourceDir); const builders = createBuilders(repo, outDir); From 8560eef95f16f66e23a3fa83889f2c59b62d2c29 Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Mon, 19 Dec 2022 19:24:30 +0300 Subject: [PATCH 08/58] exhaust config will be type of unite of other config types --- src/config.ts | 4 +--- src/windows-repo-builder.ts | 36 +++++++++++++++++++----------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/config.ts b/src/config.ts index 6ee11c5..631682f 100644 --- a/src/config.ts +++ b/src/config.ts @@ -7,9 +7,7 @@ import type { MsixS3Config } from './windows-repo-builder.js'; let configurationInstance: Config | undefined = undefined; -interface ExhaustConfig { - msixS3?: MsixS3Config; -} +type ExhaustConfig = MsixS3Config; class Config { artifactoryHost: string | undefined; diff --git a/src/windows-repo-builder.ts b/src/windows-repo-builder.ts index 453a767..2ae6fdd 100644 --- a/src/windows-repo-builder.ts +++ b/src/windows-repo-builder.ts @@ -10,13 +10,15 @@ import { createDir, createFile, createMetapointerContent } from './utils.js'; import { configuration } from './config.js'; export interface MsixS3Config { - msixName: string, - appInstaller: { - name: string, - host: string, - hoursBetweenUpdateChecks: number, - packageName: string, - publisher: string + msixS3: { + msixName: string, + appInstaller: { + name: string, + host: string, + hoursBetweenUpdateChecks: number, + packageName: string, + publisher: string + } } } @@ -35,7 +37,7 @@ export class WindowsRepoBuilder implements RepoBuilder { const msixConfig = configuration().exhaust?.msixS3; if (msixConfig) { - this.config = msixConfig; + this.config = { msixS3: msixConfig }; } else { throw new Error('MsixS3Config must be specified'); } @@ -95,37 +97,37 @@ export class WindowsRepoBuilder implements RepoBuilder { createDir(latestDir); this.createAppInstallerFile(latestDir, `${highest.version}.${highest.buildNumber}`, channel); - await fs.promises.copyFile(path.join(this.out, channel, highest.version, 'win32', this.arch, `${this.config.msixName}.msix`), - path.join(latestDir, `${this.config.msixName}.msix`)); + await fs.promises.copyFile(path.join(this.out, channel, highest.version, 'win32', this.arch, `${this.config.msixS3.msixName}.msix`), + path.join(latestDir, `${this.config.msixS3.msixName}.msix`)); } private createAppInstallerFile(out: string, version: string, channel: string): void { const appInstallerContent = this.appInstallerFileContent(version, channel); const adjustedAppInstallerContent = adjustAppinstallerSize(appInstallerContent); - createFile(`${out}/${this.config.appInstaller.name}.appinstaller`, adjustedAppInstallerContent); + createFile(`${out}/${this.config.msixS3.appInstaller.name}.appinstaller`, adjustedAppInstallerContent); } private appInstallerFileContent(version: string, channel: string): string { return ` + Uri="${this.config.msixS3.appInstaller.host}/${channel}/${version}/win32/${this.arch}/${this.config.msixS3.msixName}.msix" /> - + \n`; } private createMsix(out: string, md5: string): void { - createFile(`${out}/${this.config.msixName}.msix`, createMetapointerContent(md5)); + createFile(`${out}/${this.config.msixS3.msixName}.msix`, createMetapointerContent(md5)); } } From 15323b34df5f9cc6971fbff9bea7bc1075211b9c Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Fri, 27 Jan 2023 19:59:24 +0300 Subject: [PATCH 09/58] initial cli and configuration setup --- .vscode/launch.json | 17 +++++++++++++ .vscode/tasks.json | 12 +++++++++ eslint.config.mjs | 6 +++-- package.json | 6 ++++- pnpm-lock.yaml | 28 +++++++------------- src/cli.mts | 62 +++++++++++++++++++++++++++++++++++++++++++++ src/config.mts | 41 ++++++++++++++++++++++++++++++ src/index.mts | 7 +++++ src/index.ts | 0 src/tsconfig.json | 3 ++- src/utils.mts | 19 ++++++++++++++ tools/package.mjs | 57 +++++++++++++++++++++++++++++++++++++++++ 12 files changed, 235 insertions(+), 23 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 .vscode/tasks.json create mode 100644 src/cli.mts create mode 100644 src/config.mts create mode 100644 src/index.mts delete mode 100644 src/index.ts create mode 100644 src/utils.mts create mode 100644 tools/package.mjs diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..ab1fd0f --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Start", + "runtimeArgs": [ + ], + "args" : [ + "${workspaceFolder}/dist/cli.mjs", + "plan" + ] + } + ] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..eb1cfcb --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,12 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Build", + "type": "shell", + "group": "build", + "command": "npx pnpm build", + "problemMatcher": [] + } + ] +} diff --git a/eslint.config.mjs b/eslint.config.mjs index 4d938c6..d2b39ad 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -18,7 +18,7 @@ export default [ 'comma-dangle': ['error', 'always-multiline'], 'dot-location': 'off', 'dot-notation': 'off', - 'func-style': ['error', 'declaration'], + 'func-style': 'off', 'function-call-argument-newline': ['error', 'consistent'], 'function-paren-newline': 'off', 'id-length': 'off', @@ -40,6 +40,7 @@ export default [ 'no-tabs': 'off', 'no-ternary': 'off', 'no-undefined': 'off', + 'no-undef-init': 'off', 'no-underscore-dangle': 'off', 'object-curly-spacing': ['error', 'always'], 'object-property-newline': ['error', { allowAllPropertiesOnSameLine: true }], @@ -49,7 +50,7 @@ export default [ 'prefer-destructuring': 'off', 'quote-props': ['error', 'consistent-as-needed'], 'quotes': ['error', 'single'], - 'sort-imports': ['error', { allowSeparatedGroups: true }], + 'sort-imports': ['error', { allowSeparatedGroups: true, ignoreCase: true }], 'sort-keys': 'off', 'space-before-function-paren': ['error', 'never'], }, @@ -59,6 +60,7 @@ export default [ '**/*.ts', '**/*.cts', '**/*.mts', + '**/*.mjs', ], languageOptions: { ecmaVersion: 2022, diff --git a/package.json b/package.json index 0c579d1..e84e176 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "@jest/globals": "^29.3.1", "@tsconfig/node16-strictest-esm": "^1.0.3", "@types/node": "16.18.1", + "@types/yargs": "^17.0.16", "@typescript-eslint/eslint-plugin": "^5.45.1", "@typescript-eslint/parser": "^5.45.1", "cross-env": "^7.0.3", @@ -23,7 +24,7 @@ "private": true, "scripts": { "build": "pnpm build:src", - "build:src": "tsc --build src", + "build:src": "tsc --build src && node tools/package.mjs", "lint": "pnpm lint:ec && pnpm lint:eslint", "lint:ec": "ec", "lint:eslint": "cross-env ESLINT_USE_FLAT_CONFIG=true eslint -c eslint.config.mjs .", @@ -31,5 +32,8 @@ }, "volta": { "node": "16.18.1" + }, + "dependencies": { + "yargs": "^17.6.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ab5ce4d..cbcea73 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,7 @@ specifiers: '@jest/globals': ^29.3.1 '@tsconfig/node16-strictest-esm': ^1.0.3 '@types/node': 16.18.1 + '@types/yargs': ^17.0.16 '@typescript-eslint/eslint-plugin': ^5.45.1 '@typescript-eslint/parser': ^5.45.1 cross-env: ^7.0.3 @@ -15,11 +16,16 @@ specifiers: ts-jest: ^29.0.3 ts-node: ^10.9.1 typescript: ^4.9.3 + yargs: ^17.6.2 + +dependencies: + yargs: 17.6.2 devDependencies: '@jest/globals': 29.3.1 '@tsconfig/node16-strictest-esm': 1.0.3 '@types/node': 16.18.1 + '@types/yargs': 17.0.20 '@typescript-eslint/eslint-plugin': 5.45.1_tdm6ms4ntwhlpozn7kjqrhum74 '@typescript-eslint/parser': 5.45.1_s5ps7njkmjlaqajutnox5ntcla cross-env: 7.0.3 @@ -642,7 +648,7 @@ packages: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 '@types/node': 18.11.10 - '@types/yargs': 17.0.15 + '@types/yargs': 17.0.20 chalk: 4.1.2 dev: true @@ -827,8 +833,8 @@ packages: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} dev: true - /@types/yargs/17.0.15: - resolution: {integrity: sha512-ZHc4W2dnEQPfhn06TBEdWaiUHEZAocYaiVMfwOipY5jcJt/251wVrKCBWBetGZWO5CF8tdb7L3DmdxVlZ2BOIg==} + /@types/yargs/17.0.20: + resolution: {integrity: sha512-eknWrTHofQuPk2iuqDm1waA7V6xPlbgBoaaXEgYkClhLOnB0TtbW+srJaOToAgawPxPlHQzwypFA2bhZaUGP5A==} dependencies: '@types/yargs-parser': 21.0.0 dev: true @@ -1017,7 +1023,6 @@ packages: /ansi-regex/5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - dev: true /ansi-regex/6.0.1: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} @@ -1036,7 +1041,6 @@ packages: engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - dev: true /ansi-styles/5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} @@ -1288,7 +1292,6 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: true /co/4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} @@ -1310,7 +1313,6 @@ packages: engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 - dev: true /color-name/1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} @@ -1318,7 +1320,6 @@ packages: /color-name/1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true /colorette/2.0.19: resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} @@ -1443,7 +1444,6 @@ packages: /emoji-regex/8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true /emoji-regex/9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} @@ -1458,7 +1458,6 @@ packages: /escalade/3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - dev: true /escape-string-regexp/1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} @@ -1757,7 +1756,6 @@ packages: /get-caller-file/2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - dev: true /get-package-type/0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} @@ -1934,7 +1932,6 @@ packages: /is-fullwidth-code-point/3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - dev: true /is-fullwidth-code-point/4.0.0: resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} @@ -2942,7 +2939,6 @@ packages: /require-directory/2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - dev: true /resolve-cwd/3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} @@ -3118,7 +3114,6 @@ packages: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - dev: true /string-width/5.1.2: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} @@ -3134,7 +3129,6 @@ packages: engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 - dev: true /strip-ansi/7.0.1: resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} @@ -3424,7 +3418,6 @@ packages: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true /wrappy/1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -3441,7 +3434,6 @@ packages: /y18n/5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - dev: true /yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -3455,7 +3447,6 @@ packages: /yargs-parser/21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - dev: true /yargs/17.6.2: resolution: {integrity: sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==} @@ -3468,7 +3459,6 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - dev: true /yn/3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} diff --git a/src/cli.mts b/src/cli.mts new file mode 100644 index 0000000..4f49d83 --- /dev/null +++ b/src/cli.mts @@ -0,0 +1,62 @@ +import { exit } from 'process'; +import yargs from 'yargs'; + +import { initConfiguration } from './config.mjs'; + +import { apply, plan } from './index.mjs'; +import { getMessageOfError } from './utils.mjs'; + +type CliType = Awaited>; +let cliInstance: CliType | undefined = undefined; + +const yargsParsePromise = yargs(process.argv.slice(2)) + .option('config', { alias: 'c', description: 'Path to config file', string: true, default: './jewel-case.config.mjs' }) + .command('plan', 'Prepare repositories for deploy') + .command('apply', 'Deploy repositories'); + +async function initCli(): Promise { + if (cliInstance) { + throw new Error('CLI already initialized'); + } + + const tmp = await yargsParsePromise.parse(); + + if (!cliInstance) { + cliInstance = tmp; + } +} + +export function cli(): CliType { + if (!cliInstance) { + throw new Error('CLI must be initialized before use'); + } + + return cliInstance; +} + +async function main(): Promise { + await initCli(); + await initConfiguration(cli().config); + + const command = cli()._[0]; + + if (command === 'plan') { + plan(); + } + + if (command === 'apply') { + apply(); + } + + return 0; +} + +main().then((code: number) => { + if (!code) { + exit(code); + } +}) + .catch((error: unknown) => { + console.error(getMessageOfError(error)); + exit(-1); + }); diff --git a/src/config.mts b/src/config.mts new file mode 100644 index 0000000..885c83b --- /dev/null +++ b/src/config.mts @@ -0,0 +1,41 @@ +import path from 'path'; +import { pathToFileURL } from 'url'; + +let configurationInstance: Config | undefined = undefined; + +interface IOConfig { + sourceDir: string; + repoOut: string; + repoDir: string; +} + +class Config { + path: string; + configFile: IOConfig | undefined; + + constructor(path: string) { + this.path = path; + } + + async init(): Promise { + const resolvedPath = path.resolve(this.path); + this.configFile = (await import(pathToFileURL(resolvedPath).toString())).default as IOConfig; + } +} + +export function initConfiguration(path: string): Promise { + if (configurationInstance) { + throw new Error('Configuration already initialized'); + } + + configurationInstance = new Config(path); + return configurationInstance.init(); +} + +export function configuration(): Config { + if (!configurationInstance) { + throw new Error('Configuration must be initialized before use'); + } + + return configurationInstance; +} diff --git a/src/index.mts b/src/index.mts new file mode 100644 index 0000000..338a48d --- /dev/null +++ b/src/index.mts @@ -0,0 +1,7 @@ +export function plan(): void { + console.log('plan()'); +} + +export function apply(): void { + console.log('apply()'); +} diff --git a/src/index.ts b/src/index.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/tsconfig.json b/src/tsconfig.json index bc3520f..8bf4bd9 100644 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -7,6 +7,7 @@ "declaration": true, "module": "es2022", "moduleResolution": "node16", - "outDir": "../dist" + "outDir": "../dist", + "sourceMap": true } } diff --git a/src/utils.mts b/src/utils.mts new file mode 100644 index 0000000..f43ecb8 --- /dev/null +++ b/src/utils.mts @@ -0,0 +1,19 @@ +export function getMessageOfError(error: unknown): string { + if (error === null || typeof error === 'undefined') { + return ''; + } + + if (error instanceof Error) { + return error.message; + } + + if (typeof error === 'string') { + return error; + } + + if (typeof error === 'object') { + return (error as { message?: string; }).message ?? 'unknown error'; + } + + return 'unknown error'; +} diff --git a/tools/package.mjs b/tools/package.mjs new file mode 100644 index 0000000..f9a4365 --- /dev/null +++ b/tools/package.mjs @@ -0,0 +1,57 @@ + +import { readFileSync, writeFileSync } from 'fs'; +import { join } from 'path'; + +import { exit } from 'process'; + +import { hideBin } from 'yargs/helpers'; +import yargs from 'yargs'; + +function getArgs() { + const argv = yargs(hideBin(process.argv)) + .version(false) + .option('version', { demand: true, alias: 'v', type: 'string', default: '0.0.0', description: 'Version' }) + .option('output', { demand: false, alias: 'o', default: 'dist', description: 'Output directory' }) + .option('root', { demand: false, alias: 'r', default: '.', description: 'Root directory' }) + .argv; + + return argv; +} + +function generatePackage() { + const packageMetadata = (version, dependencies) => ({ + name: 'jewel-case', + version, + author: 'TradingView, Inc.', + description: 'Desktop application destribution', + license: 'MIT', + keywords: ['msix', 'deb', 's3', 'dmg'], + repository: { + type: 'git', + url: 'https://github.com/tradingview/jewel-case', + }, + main: 'index.js', + bin: { + jewelcase: 'cli.js', + }, + type: 'module', + dependencies, + }); + + const packageJson = packageMetadata(getArgs().version, JSON.parse(readFileSync(join(getArgs().root, 'package.json'))).dependencies); + + writeFileSync(join(getArgs().output, 'package.json'), JSON.stringify(packageJson, null, '\t')); +} + +function main() { + try { + generatePackage(); + console.log('Successful compiled.'); + } catch (err) { + console.error('FAIL:'); + console.error(err); + exit(1); + } +} + +main(); From 76cdee7b0ad48d03e2bda165ac16b49b23ff9e07 Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Wed, 15 Feb 2023 16:47:01 +0300 Subject: [PATCH 10/58] removed global state of config --- src/cli.mts | 3 --- src/config.mts | 21 +++++---------------- tools/package.mjs | 6 +++--- 3 files changed, 8 insertions(+), 22 deletions(-) diff --git a/src/cli.mts b/src/cli.mts index 4f49d83..ffb8ce0 100644 --- a/src/cli.mts +++ b/src/cli.mts @@ -1,8 +1,6 @@ import { exit } from 'process'; import yargs from 'yargs'; -import { initConfiguration } from './config.mjs'; - import { apply, plan } from './index.mjs'; import { getMessageOfError } from './utils.mjs'; @@ -36,7 +34,6 @@ export function cli(): CliType { async function main(): Promise { await initCli(); - await initConfiguration(cli().config); const command = cli()._[0]; diff --git a/src/config.mts b/src/config.mts index 885c83b..4ad76cd 100644 --- a/src/config.mts +++ b/src/config.mts @@ -1,15 +1,13 @@ import path from 'path'; import { pathToFileURL } from 'url'; -let configurationInstance: Config | undefined = undefined; - interface IOConfig { sourceDir: string; repoOut: string; repoDir: string; } -class Config { +export class Config { path: string; configFile: IOConfig | undefined; @@ -23,19 +21,10 @@ class Config { } } -export function initConfiguration(path: string): Promise { - if (configurationInstance) { - throw new Error('Configuration already initialized'); - } - - configurationInstance = new Config(path); - return configurationInstance.init(); -} - -export function configuration(): Config { - if (!configurationInstance) { - throw new Error('Configuration must be initialized before use'); - } +export async function createConfig(path: string): Promise { + const configurationInstance = new Config(path); + await configurationInstance.init(); return configurationInstance; } + diff --git a/tools/package.mjs b/tools/package.mjs index f9a4365..3579292 100644 --- a/tools/package.mjs +++ b/tools/package.mjs @@ -23,16 +23,16 @@ function generatePackage() { name: 'jewel-case', version, author: 'TradingView, Inc.', - description: 'Desktop application destribution', + description: 'Application distribution', license: 'MIT', keywords: ['msix', 'deb', 's3', 'dmg'], repository: { type: 'git', url: 'https://github.com/tradingview/jewel-case', }, - main: 'index.js', + main: 'index.mjs', bin: { - jewelcase: 'cli.js', + jewelcase: 'cli.mjs', }, type: 'module', dependencies, From 0e52df0e714b0686e078140c0429de0bd8328f35 Mon Sep 17 00:00:00 2001 From: Stanislav Makarov Date: Wed, 22 Feb 2023 22:25:38 +0300 Subject: [PATCH 11/58] chore: use `program` to specify path to executable --- .vscode/launch.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index ab1fd0f..ecc24f2 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -8,8 +8,8 @@ "name": "Start", "runtimeArgs": [ ], + "program": "${workspaceFolder}/dist/cli.mjs", "args" : [ - "${workspaceFolder}/dist/cli.mjs", "plan" ] } From 2bfab2d81f94db923614638e504c04e12f6a9eaf Mon Sep 17 00:00:00 2001 From: Stanislav Makarov Date: Mon, 6 Mar 2023 20:32:35 +0300 Subject: [PATCH 12/58] chore: create a separate package for integration tests --- package.json | 2 +- pnpm-lock.yaml | 81 ++++++++++++++++++++++++--------------------- pnpm-workspace.yaml | 2 ++ tests/index.mts | 3 ++ tests/package.json | 9 +++++ tests/tsconfig.json | 7 ++++ tools/package.mjs | 3 +- 7 files changed, 67 insertions(+), 40 deletions(-) create mode 100644 pnpm-workspace.yaml create mode 100644 tests/index.mts create mode 100644 tests/package.json create mode 100644 tests/tsconfig.json diff --git a/package.json b/package.json index e84e176..ff5354e 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "lint": "pnpm lint:ec && pnpm lint:eslint", "lint:ec": "ec", "lint:eslint": "cross-env ESLINT_USE_FLAT_CONFIG=true eslint -c eslint.config.mjs .", - "test": "jest --passWithNoTests" + "test": "jest --passWithNoTests && cd tests && pnpm start" }, "volta": { "node": "16.18.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cbcea73..22c160e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,42 +1,49 @@ lockfileVersion: 5.4 -specifiers: - '@jest/globals': ^29.3.1 - '@tsconfig/node16-strictest-esm': ^1.0.3 - '@types/node': 16.18.1 - '@types/yargs': ^17.0.16 - '@typescript-eslint/eslint-plugin': ^5.45.1 - '@typescript-eslint/parser': ^5.45.1 - cross-env: ^7.0.3 - editorconfig-checker: ^4.0.2 - eslint: ^8.29.0 - husky: ^8.0.0 - jest: ^29.3.1 - lint-staged: ^13.0.4 - ts-jest: ^29.0.3 - ts-node: ^10.9.1 - typescript: ^4.9.3 - yargs: ^17.6.2 - -dependencies: - yargs: 17.6.2 - -devDependencies: - '@jest/globals': 29.3.1 - '@tsconfig/node16-strictest-esm': 1.0.3 - '@types/node': 16.18.1 - '@types/yargs': 17.0.20 - '@typescript-eslint/eslint-plugin': 5.45.1_tdm6ms4ntwhlpozn7kjqrhum74 - '@typescript-eslint/parser': 5.45.1_s5ps7njkmjlaqajutnox5ntcla - cross-env: 7.0.3 - editorconfig-checker: 4.0.2 - eslint: 8.29.0 - husky: 8.0.2 - jest: 29.3.1_qypvtqa6r6yb6tpkajpqa7nibu - lint-staged: 13.0.4 - ts-jest: 29.0.3_4f6uxrzmuwipl5rr3bcogf6k74 - ts-node: 10.9.1_bgmnw6nd7vwjbdimonwk7pvgau - typescript: 4.9.3 +importers: + + .: + specifiers: + '@jest/globals': ^29.3.1 + '@tsconfig/node16-strictest-esm': ^1.0.3 + '@types/node': 16.18.1 + '@types/yargs': ^17.0.16 + '@typescript-eslint/eslint-plugin': ^5.45.1 + '@typescript-eslint/parser': ^5.45.1 + cross-env: ^7.0.3 + editorconfig-checker: ^4.0.2 + eslint: ^8.29.0 + husky: ^8.0.0 + jest: ^29.3.1 + lint-staged: ^13.0.4 + ts-jest: ^29.0.3 + ts-node: ^10.9.1 + typescript: ^4.9.3 + yargs: ^17.6.2 + dependencies: + yargs: 17.6.2 + devDependencies: + '@jest/globals': 29.3.1 + '@tsconfig/node16-strictest-esm': 1.0.3 + '@types/node': 16.18.1 + '@types/yargs': 17.0.20 + '@typescript-eslint/eslint-plugin': 5.45.1_tdm6ms4ntwhlpozn7kjqrhum74 + '@typescript-eslint/parser': 5.45.1_s5ps7njkmjlaqajutnox5ntcla + cross-env: 7.0.3 + editorconfig-checker: 4.0.2 + eslint: 8.29.0 + husky: 8.0.2 + jest: 29.3.1_qypvtqa6r6yb6tpkajpqa7nibu + lint-staged: 13.0.4 + ts-jest: 29.0.3_4f6uxrzmuwipl5rr3bcogf6k74 + ts-node: 10.9.1_bgmnw6nd7vwjbdimonwk7pvgau + typescript: 4.9.3 + + tests: + specifiers: + jewel-case: workspace:../dist + dependencies: + jewel-case: link:../dist packages: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..f23329a --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +packages: +- 'tests' diff --git a/tests/index.mts b/tests/index.mts new file mode 100644 index 0000000..215a487 --- /dev/null +++ b/tests/index.mts @@ -0,0 +1,3 @@ +import { plan } from 'jewel-case'; + +plan(); diff --git a/tests/package.json b/tests/package.json new file mode 100644 index 0000000..bbd446d --- /dev/null +++ b/tests/package.json @@ -0,0 +1,9 @@ +{ + "private": true, + "scripts": { + "start": "ts-node-esm index.mts" + }, + "dependencies": { + "jewel-case": "workspace:../dist" + } +} diff --git a/tests/tsconfig.json b/tests/tsconfig.json new file mode 100644 index 0000000..b6f503e --- /dev/null +++ b/tests/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../tsconfig-base.json", + "compilerOptions": { + "module": "es2022", + "moduleResolution": "node16" + } +} diff --git a/tools/package.mjs b/tools/package.mjs index 3579292..2c1b129 100644 --- a/tools/package.mjs +++ b/tools/package.mjs @@ -30,11 +30,10 @@ function generatePackage() { type: 'git', url: 'https://github.com/tradingview/jewel-case', }, - main: 'index.mjs', + exports: './index.mjs', bin: { jewelcase: 'cli.mjs', }, - type: 'module', dependencies, }); From f74dbaf9d91ec800c36d114033a915ad2005537c Mon Sep 17 00:00:00 2001 From: Stanislav Makarov Date: Wed, 22 Mar 2023 23:36:41 +0300 Subject: [PATCH 13/58] chore: unit tests via Jest --- jest.config.ts => jest.config.mjs | 27 +++++++++++++++++++++++---- package.json | 2 +- src/index.spec.mts | 15 +++++++++++++++ src/jest.config.mjs | 3 +++ src/tsconfig.json | 4 ++-- tools/mjs-resolver.cjs | 15 +++++++++++++++ 6 files changed, 59 insertions(+), 7 deletions(-) rename jest.config.ts => jest.config.mjs (65%) create mode 100644 src/index.spec.mts create mode 100644 src/jest.config.mjs create mode 100644 tools/mjs-resolver.cjs diff --git a/jest.config.ts b/jest.config.mjs similarity index 65% rename from jest.config.ts rename to jest.config.mjs index 1c4a808..a7ede64 100644 --- a/jest.config.ts +++ b/jest.config.mjs @@ -8,8 +8,16 @@ export default { // Indicates whether the coverage information should be collected while executing the test collectCoverage: true, + collectCoverageFrom: ['**/*.mts'], + + coveragePathIgnorePatterns: [ + 'src/cli.mts', + 'src/config.mts', + 'src/utils.mts', + ], + // The directory where Jest should output its coverage files - coverageDirectory: 'coverage', + coverageDirectory: '/../coverage', // Indicates which provider should be used to instrument code for coverage coverageProvider: 'v8', @@ -24,9 +32,20 @@ export default { }, }, - // A list of paths to directories that Jest should use to search for files in - roots: ['./src'], - // The number of seconds after which a test is considered as slow and reported as such in the results. slowTestThreshold: 10, + + extensionsToTreatAsEsm: ['.mts'], + resolver: '/../tools/mjs-resolver.cjs', + moduleFileExtensions: ['js', 'mts'], + testRegex: ['.*.spec.mts'], + transform: { + // to process mts with `ts-jest` + '^.+\\.mts$': [ + 'ts-jest', + { + useESM: true, + }, + ], + }, }; diff --git a/package.json b/package.json index ff5354e..7c5e071 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "lint": "pnpm lint:ec && pnpm lint:eslint", "lint:ec": "ec", "lint:eslint": "cross-env ESLINT_USE_FLAT_CONFIG=true eslint -c eslint.config.mjs .", - "test": "jest --passWithNoTests && cd tests && pnpm start" + "test": "jest --projects src && cd tests && pnpm start" }, "volta": { "node": "16.18.1" diff --git a/src/index.spec.mts b/src/index.spec.mts new file mode 100644 index 0000000..0d4f8d9 --- /dev/null +++ b/src/index.spec.mts @@ -0,0 +1,15 @@ +import { describe, expect, it } from '@jest/globals'; + +import { apply, plan } from './index.mjs'; + +describe('apply', () => { + it('should return undefined', () => { + expect(apply()).toBe(undefined); + }); +}); + +describe('plan', () => { + it('should return undefined', () => { + expect(plan()).toBe(undefined); + }); +}); diff --git a/src/jest.config.mjs b/src/jest.config.mjs new file mode 100644 index 0000000..7b99959 --- /dev/null +++ b/src/jest.config.mjs @@ -0,0 +1,3 @@ +import base from '../jest.config.mjs'; + +export default { ...base }; diff --git a/src/tsconfig.json b/src/tsconfig.json index 8bf4bd9..2d9a415 100644 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../tsconfig-base.json", - "include": ["**/*"], - "exclude": ["**/*.spec.ts"], + "include": ["**/*.mts"], + "exclude": ["**/*.spec.mts"], "compilerOptions": { "composite": true, "declaration": true, diff --git a/tools/mjs-resolver.cjs b/tools/mjs-resolver.cjs new file mode 100644 index 0000000..7f979be --- /dev/null +++ b/tools/mjs-resolver.cjs @@ -0,0 +1,15 @@ +'use strict'; + +module.exports = (path, options) => { + const mjsExtRegex = /\.mjs$/iu; + const resolver = options.defaultResolver; + if (mjsExtRegex.test(path)) { + try { + return resolver(path.replace(mjsExtRegex, '.mts'), options); + } catch { + // use default resolver + } + } + + return resolver(path, options); +}; From 104bf65032018d00024e099a96cf88ed6b97b379 Mon Sep 17 00:00:00 2001 From: Stanislav Makarov Date: Tue, 4 Apr 2023 18:14:31 +0300 Subject: [PATCH 14/58] chore(tests): integration tests via Jest --- jest.config.mjs | 29 +---------------------------- package.json | 2 +- src/jest.config.mjs | 31 ++++++++++++++++++++++++++++++- tests/index.spec.mts | 15 +++++++++++++++ tests/jest.config.mjs | 3 +++ tests/package.json | 2 +- 6 files changed, 51 insertions(+), 31 deletions(-) create mode 100644 tests/index.spec.mts create mode 100644 tests/jest.config.mjs diff --git a/jest.config.mjs b/jest.config.mjs index a7ede64..44d8175 100644 --- a/jest.config.mjs +++ b/jest.config.mjs @@ -5,39 +5,12 @@ export default { // Automatically clear mock calls, instances, contexts and results before every test clearMocks: true, - // Indicates whether the coverage information should be collected while executing the test - collectCoverage: true, - - collectCoverageFrom: ['**/*.mts'], - - coveragePathIgnorePatterns: [ - 'src/cli.mts', - 'src/config.mts', - 'src/utils.mts', - ], - - // The directory where Jest should output its coverage files - coverageDirectory: '/../coverage', - - // Indicates which provider should be used to instrument code for coverage - coverageProvider: 'v8', - - // An object that configures minimum threshold enforcement for coverage results - coverageThreshold: { - global: { - branches: 100, - functions: 100, - lines: 100, - statements: 100, - }, - }, - // The number of seconds after which a test is considered as slow and reported as such in the results. slowTestThreshold: 10, extensionsToTreatAsEsm: ['.mts'], resolver: '/../tools/mjs-resolver.cjs', - moduleFileExtensions: ['js', 'mts'], + moduleFileExtensions: ['js', 'mjs', 'mts'], testRegex: ['.*.spec.mts'], transform: { // to process mts with `ts-jest` diff --git a/package.json b/package.json index 7c5e071..fa327d3 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "lint": "pnpm lint:ec && pnpm lint:eslint", "lint:ec": "ec", "lint:eslint": "cross-env ESLINT_USE_FLAT_CONFIG=true eslint -c eslint.config.mjs .", - "test": "jest --projects src && cd tests && pnpm start" + "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --projects src && pnpm --filter ./tests start" }, "volta": { "node": "16.18.1" diff --git a/src/jest.config.mjs b/src/jest.config.mjs index 7b99959..36e15e3 100644 --- a/src/jest.config.mjs +++ b/src/jest.config.mjs @@ -1,3 +1,32 @@ import base from '../jest.config.mjs'; -export default { ...base }; +export default { + ...base, + + // Indicates whether the coverage information should be collected while executing the test + collectCoverage: true, + + collectCoverageFrom: ['**/*.mts'], + + coveragePathIgnorePatterns: [ + 'src/cli.mts', + 'src/config.mts', + 'src/utils.mts', + ], + + // The directory where Jest should output its coverage files + coverageDirectory: '/../coverage', + + // Indicates which provider should be used to instrument code for coverage + coverageProvider: 'v8', + + // An object that configures minimum threshold enforcement for coverage results + coverageThreshold: { + global: { + branches: 100, + functions: 100, + lines: 100, + statements: 100, + }, + }, +}; diff --git a/tests/index.spec.mts b/tests/index.spec.mts new file mode 100644 index 0000000..01c72ce --- /dev/null +++ b/tests/index.spec.mts @@ -0,0 +1,15 @@ +import { describe, expect, it } from '@jest/globals'; + +import { apply, plan } from 'jewel-case'; + +describe('apply', () => { + it('should return undefined', () => { + expect(apply()).toBe(undefined); + }); +}); + +describe('plan', () => { + it('should return undefined', () => { + expect(plan()).toBe(undefined); + }); +}); diff --git a/tests/jest.config.mjs b/tests/jest.config.mjs new file mode 100644 index 0000000..7b99959 --- /dev/null +++ b/tests/jest.config.mjs @@ -0,0 +1,3 @@ +import base from '../jest.config.mjs'; + +export default { ...base }; diff --git a/tests/package.json b/tests/package.json index bbd446d..ec9888c 100644 --- a/tests/package.json +++ b/tests/package.json @@ -1,7 +1,7 @@ { "private": true, "scripts": { - "start": "ts-node-esm index.mts" + "start": "cross-env NODE_OPTIONS=--experimental-vm-modules jest" }, "dependencies": { "jewel-case": "workspace:../dist" From 56b2933a826496e8fc3942ab975dce76af47669a Mon Sep 17 00:00:00 2001 From: Stanislav Makarov Date: Tue, 4 Apr 2023 18:28:27 +0300 Subject: [PATCH 15/58] chore: Volta + pnpm = love --- .github/workflows/ci.yml | 10 ++++++---- .husky/pre-commit | 2 +- .vscode/tasks.json | 2 +- README.md | 14 +++++++------- package.json | 3 ++- 5 files changed, 17 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8d3aa0f..387f6e7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,11 +6,13 @@ on: jobs: build: runs-on: ubuntu-latest + env: + VOLTA_FEATURE_PNPM: 1 steps: - uses: actions/checkout@v3 - name: Setup Volta and Node.js uses: volta-cli/action@v3 - - run: npx pnpm install - - run: npx pnpm build - - run: npx pnpm lint - - run: npx pnpm test + - run: pnpm install + - run: pnpm build + - run: pnpm lint + - run: pnpm test diff --git a/.husky/pre-commit b/.husky/pre-commit index 8b2af5c..3ff7e6c 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1,4 @@ #!/usr/bin/env sh . "$(dirname "$0")/_/husky.sh" -npx pnpm lint-staged +pnpm lint-staged diff --git a/.vscode/tasks.json b/.vscode/tasks.json index eb1cfcb..4fd077b 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -5,7 +5,7 @@ "label": "Build", "type": "shell", "group": "build", - "command": "npx pnpm build", + "command": "pnpm build", "problemMatcher": [] } ] diff --git a/README.md b/README.md index b2a663a..4339cf3 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,14 @@ # jewel-case ## Development -[Volta](https://volta.sh/) is recommended to install pinned version of Node. See `volta` field in the top-level [`package.json`](./package.json). +[Volta](https://volta.sh/) is recommended to install pinned versions of Node and pnpm. See `volta` field in the top-level [`package.json`](./package.json). Please also set `VOLTA_FEATURE_PNPM` environment variable to value `1`. Lifecycle commands: | Command | Description | |--------------------------| ----------------------------------------| -| `npx pnpm install` | install all dependencies for a project | -| `npx pnpm husky install` | enable Git hooks | -| `npx pnpm build` | build everything | -| `npx pnpm lint` | lint all files | -| `npx pnpm lint-staged` | lint all staged files | -| `npx pnpm test` | run unit tests | +| `pnpm install` | install all dependencies for a project | +| `pnpm husky install` | enable Git hooks | +| `pnpm build` | build everything | +| `pnpm lint` | lint all files | +| `pnpm lint-staged` | lint all staged files | +| `pnpm test` | run unit tests | diff --git a/package.json b/package.json index fa327d3..352b58f 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,8 @@ "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --projects src && pnpm --filter ./tests start" }, "volta": { - "node": "16.18.1" + "node": "16.18.1", + "pnpm": "7.17.1" }, "dependencies": { "yargs": "^17.6.2" From 066fdf8778eff4eaee06be5db768fd594d0d2ec2 Mon Sep 17 00:00:00 2001 From: Stanislav Makarov Date: Fri, 7 Apr 2023 02:16:37 +0300 Subject: [PATCH 16/58] chore: lint-staged: use package.json script to call eslint --- lint-staged.config.mjs | 2 +- package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lint-staged.config.mjs b/lint-staged.config.mjs index 0db10bd..da8ec4d 100644 --- a/lint-staged.config.mjs +++ b/lint-staged.config.mjs @@ -1,4 +1,4 @@ export default { '*': 'ec', - '*.{js,cjs,mjs,ts,cts,mts}': 'cross-env ESLINT_USE_FLAT_CONFIG=true pnpm eslint -c eslint.config.mjs', + '*.{js,cjs,mjs,ts,cts,mts}': 'pnpm lint:eslint', }; diff --git a/package.json b/package.json index 352b58f..edc2b91 100644 --- a/package.json +++ b/package.json @@ -25,9 +25,9 @@ "scripts": { "build": "pnpm build:src", "build:src": "tsc --build src && node tools/package.mjs", - "lint": "pnpm lint:ec && pnpm lint:eslint", + "lint": "pnpm lint:ec && pnpm lint:eslint .", "lint:ec": "ec", - "lint:eslint": "cross-env ESLINT_USE_FLAT_CONFIG=true eslint -c eslint.config.mjs .", + "lint:eslint": "cross-env ESLINT_USE_FLAT_CONFIG=true eslint -c eslint.config.mjs", "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --projects src && pnpm --filter ./tests start" }, "volta": { From de91febc987178dada85ae1ced8cfaf99e27dbf0 Mon Sep 17 00:00:00 2001 From: Stanislav Makarov Date: Fri, 7 Apr 2023 02:36:27 +0300 Subject: [PATCH 17/58] chore: migrate from cross-env to pnpm's shell emulator --- .npmrc | 1 + package.json | 5 ++--- pnpm-lock.yaml | 10 ---------- tests/package.json | 2 +- 4 files changed, 4 insertions(+), 14 deletions(-) create mode 100644 .npmrc diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..3bd3b7d --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +shell-emulator=true diff --git a/package.json b/package.json index edc2b91..c316176 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,6 @@ "@types/yargs": "^17.0.16", "@typescript-eslint/eslint-plugin": "^5.45.1", "@typescript-eslint/parser": "^5.45.1", - "cross-env": "^7.0.3", "editorconfig-checker": "^4.0.2", "eslint": "^8.29.0", "husky": "^8.0.0", @@ -27,8 +26,8 @@ "build:src": "tsc --build src && node tools/package.mjs", "lint": "pnpm lint:ec && pnpm lint:eslint .", "lint:ec": "ec", - "lint:eslint": "cross-env ESLINT_USE_FLAT_CONFIG=true eslint -c eslint.config.mjs", - "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --projects src && pnpm --filter ./tests start" + "lint:eslint": "ESLINT_USE_FLAT_CONFIG=true eslint -c eslint.config.mjs", + "test": "NODE_OPTIONS=--experimental-vm-modules jest --projects src && pnpm --filter ./tests start" }, "volta": { "node": "16.18.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 22c160e..bff0f16 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,6 @@ importers: '@types/yargs': ^17.0.16 '@typescript-eslint/eslint-plugin': ^5.45.1 '@typescript-eslint/parser': ^5.45.1 - cross-env: ^7.0.3 editorconfig-checker: ^4.0.2 eslint: ^8.29.0 husky: ^8.0.0 @@ -29,7 +28,6 @@ importers: '@types/yargs': 17.0.20 '@typescript-eslint/eslint-plugin': 5.45.1_tdm6ms4ntwhlpozn7kjqrhum74 '@typescript-eslint/parser': 5.45.1_s5ps7njkmjlaqajutnox5ntcla - cross-env: 7.0.3 editorconfig-checker: 4.0.2 eslint: 8.29.0 husky: 8.0.2 @@ -1353,14 +1351,6 @@ packages: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true - /cross-env/7.0.3: - resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} - engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} - hasBin: true - dependencies: - cross-spawn: 7.0.3 - dev: true - /cross-spawn/7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} diff --git a/tests/package.json b/tests/package.json index ec9888c..803a8a5 100644 --- a/tests/package.json +++ b/tests/package.json @@ -1,7 +1,7 @@ { "private": true, "scripts": { - "start": "cross-env NODE_OPTIONS=--experimental-vm-modules jest" + "start": "NODE_OPTIONS=--experimental-vm-modules jest" }, "dependencies": { "jewel-case": "workspace:../dist" From b473122cc1180dc63de49c60651878fdd04579db Mon Sep 17 00:00:00 2001 From: Stanislav Makarov Date: Fri, 7 Apr 2023 15:46:50 +0300 Subject: [PATCH 18/58] chore: unit tests in Visual Studio Code --- .vscode/launch.json | 23 ++++++++++++++++++++++- .vscode/settings.json | 3 +++ README.md | 4 +++- package.json | 9 ++++++--- 4 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/launch.json b/.vscode/launch.json index ecc24f2..5efcca3 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -9,9 +9,30 @@ "runtimeArgs": [ ], "program": "${workspaceFolder}/dist/cli.mjs", - "args" : [ + "args": [ "plan" ] + }, + { + "type": "node", + "name": "vscode-jest-tests.v2", + "request": "launch", + "env": { + "NODE_OPTIONS": "--experimental-vm-modules" + }, + "args": [ + "${workspaceRoot}/node_modules/jest/bin/jest", + "--runInBand", + "--no-coverage", + "--watchAll=false", + "--testNamePattern", + "${jest.testNamePattern}", + "--runTestsByPath", + "${jest.testFile}" + ], + "cwd": "${workspaceFolder}/src", + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen" } ] } diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..57c3044 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "jest.jestCommandLine": "pnpm src:test" +} diff --git a/README.md b/README.md index 4339cf3..dd61c6a 100644 --- a/README.md +++ b/README.md @@ -11,4 +11,6 @@ Lifecycle commands: | `pnpm build` | build everything | | `pnpm lint` | lint all files | | `pnpm lint-staged` | lint all staged files | -| `pnpm test` | run unit tests | +| `pnpm src:test` | run unit tests | +| `pnpm tests:start` | run integration tests | +| `pnpm test` | run all tests | diff --git a/package.json b/package.json index c316176..a83b4b8 100644 --- a/package.json +++ b/package.json @@ -22,12 +22,15 @@ "packageManager": "pnpm@7.17.1", "private": true, "scripts": { - "build": "pnpm build:src", - "build:src": "tsc --build src && node tools/package.mjs", + "jest": "jest", + "build": "pnpm src:build", "lint": "pnpm lint:ec && pnpm lint:eslint .", "lint:ec": "ec", "lint:eslint": "ESLINT_USE_FLAT_CONFIG=true eslint -c eslint.config.mjs", - "test": "NODE_OPTIONS=--experimental-vm-modules jest --projects src && pnpm --filter ./tests start" + "test": "pnpm src:test && pnpm tests:start", + "src:build": "tsc --build src && node tools/package.mjs", + "src:test": "NODE_OPTIONS=--experimental-vm-modules jest --projects src", + "tests:start": "pnpm --filter ./tests start" }, "volta": { "node": "16.18.1", From e14e4458833a992a645402798eaf2fb21b0d7afb Mon Sep 17 00:00:00 2001 From: Stanislav Makarov Date: Fri, 7 Apr 2023 17:46:15 +0300 Subject: [PATCH 19/58] chore: move common TypeScript compiler options to base config, fix include/exclude globs for tests --- src/tsconfig.json | 2 -- tests/tsconfig.json | 5 +---- tsconfig-base.json | 4 ++++ 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/tsconfig.json b/src/tsconfig.json index 2d9a415..9dc687e 100644 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -5,8 +5,6 @@ "compilerOptions": { "composite": true, "declaration": true, - "module": "es2022", - "moduleResolution": "node16", "outDir": "../dist", "sourceMap": true } diff --git a/tests/tsconfig.json b/tests/tsconfig.json index b6f503e..93039b4 100644 --- a/tests/tsconfig.json +++ b/tests/tsconfig.json @@ -1,7 +1,4 @@ { "extends": "../tsconfig-base.json", - "compilerOptions": { - "module": "es2022", - "moduleResolution": "node16" - } + "include": ["**/*.mts"] } diff --git a/tsconfig-base.json b/tsconfig-base.json index 408fefb..ccfa87e 100644 --- a/tsconfig-base.json +++ b/tsconfig-base.json @@ -1,3 +1,7 @@ { "extends": "@tsconfig/node16-strictest-esm/tsconfig.json", + "compilerOptions": { + "module": "es2022", + "moduleResolution": "node16" + } } From cc7bc9df7b17fb2f8f4eea1f00ad918bb171a1c2 Mon Sep 17 00:00:00 2001 From: Stanislav Makarov Date: Fri, 14 Apr 2023 20:54:41 +0300 Subject: [PATCH 20/58] chore(tests): fix Volta configuration --- tests/package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/package.json b/tests/package.json index 803a8a5..127b3f3 100644 --- a/tests/package.json +++ b/tests/package.json @@ -5,5 +5,8 @@ }, "dependencies": { "jewel-case": "workspace:../dist" + }, + "volta": { + "extends": "../package.json" } } From 75774bddaf6f7a350248313b9e349fb8ed6aa437 Mon Sep 17 00:00:00 2001 From: Stanislav Makarov Date: Fri, 14 Apr 2023 20:57:27 +0300 Subject: [PATCH 21/58] fix(tests): remove unused module (fixes 104bf65032018d00024e099a96cf88ed6b97b379) --- tests/index.mts | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 tests/index.mts diff --git a/tests/index.mts b/tests/index.mts deleted file mode 100644 index 215a487..0000000 --- a/tests/index.mts +++ /dev/null @@ -1,3 +0,0 @@ -import { plan } from 'jewel-case'; - -plan(); From ed85a5a8dd576d7ecafacace8c38e9eee59bcb19 Mon Sep 17 00:00:00 2001 From: Stanislav Makarov Date: Mon, 17 Apr 2023 23:37:28 +0300 Subject: [PATCH 22/58] chore: update TypeScript to 5.0.4 :arrow_up: --- package.json | 2 +- pnpm-lock.yaml | 72 +++++++++++++++++++++++----------------------- tsconfig-base.json | 1 + 3 files changed, 38 insertions(+), 37 deletions(-) diff --git a/package.json b/package.json index a83b4b8..7163c73 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "lint-staged": "^13.0.4", "ts-jest": "^29.0.3", "ts-node": "^10.9.1", - "typescript": "^4.9.3" + "typescript": "^5.0.4" }, "engines": { "node": "^16.18.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bff0f16..a610dca 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,7 +17,7 @@ importers: lint-staged: ^13.0.4 ts-jest: ^29.0.3 ts-node: ^10.9.1 - typescript: ^4.9.3 + typescript: ^5.0.4 yargs: ^17.6.2 dependencies: yargs: 17.6.2 @@ -26,16 +26,16 @@ importers: '@tsconfig/node16-strictest-esm': 1.0.3 '@types/node': 16.18.1 '@types/yargs': 17.0.20 - '@typescript-eslint/eslint-plugin': 5.45.1_tdm6ms4ntwhlpozn7kjqrhum74 - '@typescript-eslint/parser': 5.45.1_s5ps7njkmjlaqajutnox5ntcla + '@typescript-eslint/eslint-plugin': 5.45.1_du7ehko5z56zwldgvkicxmpcbu + '@typescript-eslint/parser': 5.45.1_ciy6efmzm3ojqwizabpgnljozq editorconfig-checker: 4.0.2 eslint: 8.29.0 husky: 8.0.2 jest: 29.3.1_qypvtqa6r6yb6tpkajpqa7nibu lint-staged: 13.0.4 - ts-jest: 29.0.3_4f6uxrzmuwipl5rr3bcogf6k74 - ts-node: 10.9.1_bgmnw6nd7vwjbdimonwk7pvgau - typescript: 4.9.3 + ts-jest: 29.0.3_agn56dcmrvrjxyb3wli3ryy5gy + ts-node: 10.9.1_prmsu5cq6ukh7eypgb4uwwpoa4 + typescript: 5.0.4 tests: specifiers: @@ -844,7 +844,7 @@ packages: '@types/yargs-parser': 21.0.0 dev: true - /@typescript-eslint/eslint-plugin/5.45.1_tdm6ms4ntwhlpozn7kjqrhum74: + /@typescript-eslint/eslint-plugin/5.45.1_du7ehko5z56zwldgvkicxmpcbu: resolution: {integrity: sha512-cOizjPlKEh0bXdFrBLTrI/J6B/QMlhwE9auOov53tgB+qMukH6/h8YAK/qw+QJGct/PTbdh2lytGyipxCcEtAw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -855,23 +855,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.45.1_s5ps7njkmjlaqajutnox5ntcla + '@typescript-eslint/parser': 5.45.1_ciy6efmzm3ojqwizabpgnljozq '@typescript-eslint/scope-manager': 5.45.1 - '@typescript-eslint/type-utils': 5.45.1_s5ps7njkmjlaqajutnox5ntcla - '@typescript-eslint/utils': 5.45.1_s5ps7njkmjlaqajutnox5ntcla + '@typescript-eslint/type-utils': 5.45.1_ciy6efmzm3ojqwizabpgnljozq + '@typescript-eslint/utils': 5.45.1_ciy6efmzm3ojqwizabpgnljozq debug: 4.3.4 eslint: 8.29.0 ignore: 5.2.1 natural-compare-lite: 1.4.0 regexpp: 3.2.0 semver: 7.3.8 - tsutils: 3.21.0_typescript@4.9.3 - typescript: 4.9.3 + tsutils: 3.21.0_typescript@5.0.4 + typescript: 5.0.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.45.1_s5ps7njkmjlaqajutnox5ntcla: + /@typescript-eslint/parser/5.45.1_ciy6efmzm3ojqwizabpgnljozq: resolution: {integrity: sha512-JQ3Ep8bEOXu16q0ztsatp/iQfDCtvap7sp/DKo7DWltUquj5AfCOpX2zSzJ8YkAVnrQNqQ5R62PBz2UtrfmCkA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -883,10 +883,10 @@ packages: dependencies: '@typescript-eslint/scope-manager': 5.45.1 '@typescript-eslint/types': 5.45.1 - '@typescript-eslint/typescript-estree': 5.45.1_typescript@4.9.3 + '@typescript-eslint/typescript-estree': 5.45.1_typescript@5.0.4 debug: 4.3.4 eslint: 8.29.0 - typescript: 4.9.3 + typescript: 5.0.4 transitivePeerDependencies: - supports-color dev: true @@ -899,7 +899,7 @@ packages: '@typescript-eslint/visitor-keys': 5.45.1 dev: true - /@typescript-eslint/type-utils/5.45.1_s5ps7njkmjlaqajutnox5ntcla: + /@typescript-eslint/type-utils/5.45.1_ciy6efmzm3ojqwizabpgnljozq: resolution: {integrity: sha512-aosxFa+0CoYgYEl3aptLe1svP910DJq68nwEJzyQcrtRhC4BN0tJAvZGAe+D0tzjJmFXe+h4leSsiZhwBa2vrA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -909,12 +909,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.45.1_typescript@4.9.3 - '@typescript-eslint/utils': 5.45.1_s5ps7njkmjlaqajutnox5ntcla + '@typescript-eslint/typescript-estree': 5.45.1_typescript@5.0.4 + '@typescript-eslint/utils': 5.45.1_ciy6efmzm3ojqwizabpgnljozq debug: 4.3.4 eslint: 8.29.0 - tsutils: 3.21.0_typescript@4.9.3 - typescript: 4.9.3 + tsutils: 3.21.0_typescript@5.0.4 + typescript: 5.0.4 transitivePeerDependencies: - supports-color dev: true @@ -924,7 +924,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.45.1_typescript@4.9.3: + /@typescript-eslint/typescript-estree/5.45.1_typescript@5.0.4: resolution: {integrity: sha512-76NZpmpCzWVrrb0XmYEpbwOz/FENBi+5W7ipVXAsG3OoFrQKJMiaqsBMbvGRyLtPotGqUfcY7Ur8j0dksDJDng==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -939,13 +939,13 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.8 - tsutils: 3.21.0_typescript@4.9.3 - typescript: 4.9.3 + tsutils: 3.21.0_typescript@5.0.4 + typescript: 5.0.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils/5.45.1_s5ps7njkmjlaqajutnox5ntcla: + /@typescript-eslint/utils/5.45.1_ciy6efmzm3ojqwizabpgnljozq: resolution: {integrity: sha512-rlbC5VZz68+yjAzQBc4I7KDYVzWG2X/OrqoZrMahYq3u8FFtmQYc+9rovo/7wlJH5kugJ+jQXV5pJMnofGmPRw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -955,7 +955,7 @@ packages: '@types/semver': 7.3.13 '@typescript-eslint/scope-manager': 5.45.1 '@typescript-eslint/types': 5.45.1 - '@typescript-eslint/typescript-estree': 5.45.1_typescript@4.9.3 + '@typescript-eslint/typescript-estree': 5.45.1_typescript@5.0.4 eslint: 8.29.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0_eslint@8.29.0 @@ -2115,7 +2115,7 @@ packages: pretty-format: 29.3.1 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1_bgmnw6nd7vwjbdimonwk7pvgau + ts-node: 10.9.1_prmsu5cq6ukh7eypgb4uwwpoa4 transitivePeerDependencies: - supports-color dev: true @@ -2155,7 +2155,7 @@ packages: pretty-format: 29.3.1 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1_bgmnw6nd7vwjbdimonwk7pvgau + ts-node: 10.9.1_prmsu5cq6ukh7eypgb4uwwpoa4 transitivePeerDependencies: - supports-color dev: true @@ -3229,7 +3229,7 @@ packages: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: true - /ts-jest/29.0.3_4f6uxrzmuwipl5rr3bcogf6k74: + /ts-jest/29.0.3_agn56dcmrvrjxyb3wli3ryy5gy: resolution: {integrity: sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -3258,11 +3258,11 @@ packages: lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.3.8 - typescript: 4.9.3 + typescript: 5.0.4 yargs-parser: 21.1.1 dev: true - /ts-node/10.9.1_bgmnw6nd7vwjbdimonwk7pvgau: + /ts-node/10.9.1_prmsu5cq6ukh7eypgb4uwwpoa4: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -3288,7 +3288,7 @@ packages: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 4.9.3 + typescript: 5.0.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true @@ -3301,14 +3301,14 @@ packages: resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} dev: true - /tsutils/3.21.0_typescript@4.9.3: + /tsutils/3.21.0_typescript@5.0.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.9.3 + typescript: 5.0.4 dev: true /type-check/0.4.0: @@ -3333,9 +3333,9 @@ packages: engines: {node: '>=10'} dev: true - /typescript/4.9.3: - resolution: {integrity: sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==} - engines: {node: '>=4.2.0'} + /typescript/5.0.4: + resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} + engines: {node: '>=12.20'} hasBin: true dev: true diff --git a/tsconfig-base.json b/tsconfig-base.json index ccfa87e..7f15764 100644 --- a/tsconfig-base.json +++ b/tsconfig-base.json @@ -1,6 +1,7 @@ { "extends": "@tsconfig/node16-strictest-esm/tsconfig.json", "compilerOptions": { + "ignoreDeprecations": "5.0", "module": "es2022", "moduleResolution": "node16" } From e8081a74124d8eb73575d0c84962c62ceda7260e Mon Sep 17 00:00:00 2001 From: Stanislav Makarov Date: Mon, 17 Apr 2023 23:48:49 +0300 Subject: [PATCH 23/58] chore: migrate to separate @tsconfig packages (thanks to multiple configuration file support in `extends` by TypeScript 5.0) --- package.json | 4 +++- pnpm-lock.yaml | 20 ++++++++++++++------ tsconfig-base.json | 7 +++++-- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 7163c73..8e01bde 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,9 @@ { "devDependencies": { "@jest/globals": "^29.3.1", - "@tsconfig/node16-strictest-esm": "^1.0.3", + "@tsconfig/esm": "^1.0.2", + "@tsconfig/node16": "^1.0.3", + "@tsconfig/strictest": "^2.0.0", "@types/node": "16.18.1", "@types/yargs": "^17.0.16", "@typescript-eslint/eslint-plugin": "^5.45.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a610dca..0da65b9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,7 +5,9 @@ importers: .: specifiers: '@jest/globals': ^29.3.1 - '@tsconfig/node16-strictest-esm': ^1.0.3 + '@tsconfig/esm': ^1.0.2 + '@tsconfig/node16': ^1.0.3 + '@tsconfig/strictest': ^2.0.0 '@types/node': 16.18.1 '@types/yargs': ^17.0.16 '@typescript-eslint/eslint-plugin': ^5.45.1 @@ -23,7 +25,9 @@ importers: yargs: 17.6.2 devDependencies: '@jest/globals': 29.3.1 - '@tsconfig/node16-strictest-esm': 1.0.3 + '@tsconfig/esm': 1.0.2 + '@tsconfig/node16': 1.0.3 + '@tsconfig/strictest': 2.0.0 '@types/node': 16.18.1 '@types/yargs': 17.0.20 '@typescript-eslint/eslint-plugin': 5.45.1_du7ehko5z56zwldgvkicxmpcbu @@ -739,6 +743,10 @@ packages: '@sinonjs/commons': 1.8.6 dev: true + /@tsconfig/esm/1.0.2: + resolution: {integrity: sha512-awiISx+G4L+7k97nKnfA5QF6rukawiuycMPfASFHG/0fqjrUlYBuNISy3Yjl1SHIpVi57lYf7dc6L/FoQQCKcA==} + dev: true + /@tsconfig/node10/1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: true @@ -751,14 +759,14 @@ packages: resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} dev: true - /@tsconfig/node16-strictest-esm/1.0.3: - resolution: {integrity: sha512-0/QTPDkKmE2dy0dMRstPCv4VJ+gUGgvMKzaWd5P3hgdlmPqYqe1pJxDGUlNYbSgUBlncIvvX+mIeZarokysNgg==} - dev: true - /@tsconfig/node16/1.0.3: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} dev: true + /@tsconfig/strictest/2.0.0: + resolution: {integrity: sha512-E0dpiZNdwO20c8d3seh7OmjAvDpwoRkTcU6M8cvggzB45Bd45tyTU2XJeA5Wfq+8NzVGhunvqOJ30AjSkywMXA==} + dev: true + /@types/babel__core/7.1.20: resolution: {integrity: sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==} dependencies: diff --git a/tsconfig-base.json b/tsconfig-base.json index 7f15764..456bf2c 100644 --- a/tsconfig-base.json +++ b/tsconfig-base.json @@ -1,7 +1,10 @@ { - "extends": "@tsconfig/node16-strictest-esm/tsconfig.json", + "extends": [ + "@tsconfig/node16/tsconfig.json", + "@tsconfig/strictest/tsconfig.json", + "@tsconfig/esm/tsconfig.json" + ], "compilerOptions": { - "ignoreDeprecations": "5.0", "module": "es2022", "moduleResolution": "node16" } From 84d53d65eb459a57c0075a696d2081a9dac8ff5d Mon Sep 17 00:00:00 2001 From: Stanislav Makarov Date: Mon, 17 Apr 2023 23:50:34 +0300 Subject: [PATCH 24/58] chore: update ts-jest to support TypeScript 5.x :arrow_up: --- package.json | 2 +- pnpm-lock.yaml | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 8e01bde..647ac4b 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "husky": "^8.0.0", "jest": "^29.3.1", "lint-staged": "^13.0.4", - "ts-jest": "^29.0.3", + "ts-jest": "^29.1.0", "ts-node": "^10.9.1", "typescript": "^5.0.4" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0da65b9..0dfd696 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,7 +17,7 @@ importers: husky: ^8.0.0 jest: ^29.3.1 lint-staged: ^13.0.4 - ts-jest: ^29.0.3 + ts-jest: ^29.1.0 ts-node: ^10.9.1 typescript: ^5.0.4 yargs: ^17.6.2 @@ -37,7 +37,7 @@ importers: husky: 8.0.2 jest: 29.3.1_qypvtqa6r6yb6tpkajpqa7nibu lint-staged: 13.0.4 - ts-jest: 29.0.3_agn56dcmrvrjxyb3wli3ryy5gy + ts-jest: 29.1.0_agn56dcmrvrjxyb3wli3ryy5gy ts-node: 10.9.1_prmsu5cq6ukh7eypgb4uwwpoa4 typescript: 5.0.4 @@ -86,7 +86,7 @@ packages: convert-source-map: 1.9.0 debug: 4.3.4 gensync: 1.0.0-beta.2 - json5: 2.2.1 + json5: 2.2.3 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -2516,8 +2516,8 @@ packages: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true - /json5/2.2.1: - resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} + /json5/2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true dev: true @@ -3237,8 +3237,8 @@ packages: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: true - /ts-jest/29.0.3_agn56dcmrvrjxyb3wli3ryy5gy: - resolution: {integrity: sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==} + /ts-jest/29.1.0_agn56dcmrvrjxyb3wli3ryy5gy: + resolution: {integrity: sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -3247,7 +3247,7 @@ packages: babel-jest: ^29.0.0 esbuild: '*' jest: ^29.0.0 - typescript: '>=4.3' + typescript: '>=4.3 <6' peerDependenciesMeta: '@babel/core': optional: true @@ -3262,7 +3262,7 @@ packages: fast-json-stable-stringify: 2.1.0 jest: 29.3.1_qypvtqa6r6yb6tpkajpqa7nibu jest-util: 29.3.1 - json5: 2.2.1 + json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.3.8 From 0c80e80171492f5c2ac796495c041fc594b2d08f Mon Sep 17 00:00:00 2001 From: Stanislav Makarov Date: Wed, 19 Apr 2023 13:00:53 +0300 Subject: [PATCH 25/58] refactor: make things a bit simpler --- src/cli.mts | 28 +++------------------------- 1 file changed, 3 insertions(+), 25 deletions(-) diff --git a/src/cli.mts b/src/cli.mts index ffb8ce0..21aacce 100644 --- a/src/cli.mts +++ b/src/cli.mts @@ -4,38 +4,16 @@ import yargs from 'yargs'; import { apply, plan } from './index.mjs'; import { getMessageOfError } from './utils.mjs'; -type CliType = Awaited>; -let cliInstance: CliType | undefined = undefined; +type CommandLineArgs = Awaited>; const yargsParsePromise = yargs(process.argv.slice(2)) .option('config', { alias: 'c', description: 'Path to config file', string: true, default: './jewel-case.config.mjs' }) .command('plan', 'Prepare repositories for deploy') .command('apply', 'Deploy repositories'); -async function initCli(): Promise { - if (cliInstance) { - throw new Error('CLI already initialized'); - } - - const tmp = await yargsParsePromise.parse(); - - if (!cliInstance) { - cliInstance = tmp; - } -} - -export function cli(): CliType { - if (!cliInstance) { - throw new Error('CLI must be initialized before use'); - } - - return cliInstance; -} - async function main(): Promise { - await initCli(); - - const command = cli()._[0]; + const args: CommandLineArgs = await yargsParsePromise.parse(); + const command = args._[0]; if (command === 'plan') { plan(); From dafe416f7997f27ac4506d156484613edcac8fd5 Mon Sep 17 00:00:00 2001 From: Stanislav Makarov Date: Thu, 20 Apr 2023 00:13:34 +0300 Subject: [PATCH 26/58] chore: update Node.js to 18.13.0 :arrow_up: --- package.json | 8 +-- pnpm-lock.yaml | 118 +++++++++++++++------------------------------ tsconfig-base.json | 2 +- 3 files changed, 44 insertions(+), 84 deletions(-) diff --git a/package.json b/package.json index 647ac4b..07b9d94 100644 --- a/package.json +++ b/package.json @@ -2,9 +2,9 @@ "devDependencies": { "@jest/globals": "^29.3.1", "@tsconfig/esm": "^1.0.2", - "@tsconfig/node16": "^1.0.3", + "@tsconfig/node18": "^2.0.0", "@tsconfig/strictest": "^2.0.0", - "@types/node": "16.18.1", + "@types/node": "18.13.0", "@types/yargs": "^17.0.16", "@typescript-eslint/eslint-plugin": "^5.45.1", "@typescript-eslint/parser": "^5.45.1", @@ -18,7 +18,7 @@ "typescript": "^5.0.4" }, "engines": { - "node": "^16.18.1", + "node": "^18.13.0", "pnpm": "^7.17.1" }, "packageManager": "pnpm@7.17.1", @@ -35,7 +35,7 @@ "tests:start": "pnpm --filter ./tests start" }, "volta": { - "node": "16.18.1", + "node": "18.13.0", "pnpm": "7.17.1" }, "dependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0dfd696..11e92b3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,9 +6,9 @@ importers: specifiers: '@jest/globals': ^29.3.1 '@tsconfig/esm': ^1.0.2 - '@tsconfig/node16': ^1.0.3 + '@tsconfig/node18': ^2.0.0 '@tsconfig/strictest': ^2.0.0 - '@types/node': 16.18.1 + '@types/node': 18.13.0 '@types/yargs': ^17.0.16 '@typescript-eslint/eslint-plugin': ^5.45.1 '@typescript-eslint/parser': ^5.45.1 @@ -26,19 +26,19 @@ importers: devDependencies: '@jest/globals': 29.3.1 '@tsconfig/esm': 1.0.2 - '@tsconfig/node16': 1.0.3 + '@tsconfig/node18': 2.0.0 '@tsconfig/strictest': 2.0.0 - '@types/node': 16.18.1 + '@types/node': 18.13.0 '@types/yargs': 17.0.20 '@typescript-eslint/eslint-plugin': 5.45.1_du7ehko5z56zwldgvkicxmpcbu '@typescript-eslint/parser': 5.45.1_ciy6efmzm3ojqwizabpgnljozq editorconfig-checker: 4.0.2 eslint: 8.29.0 husky: 8.0.2 - jest: 29.3.1_qypvtqa6r6yb6tpkajpqa7nibu + jest: 29.3.1_ucpl6toqp57nqodtp3vxxi6g5a lint-staged: 13.0.4 ts-jest: 29.1.0_agn56dcmrvrjxyb3wli3ryy5gy - ts-node: 10.9.1_prmsu5cq6ukh7eypgb4uwwpoa4 + ts-node: 10.9.1_ztltjo43tmsep75uum5mceyifa typescript: 5.0.4 tests: @@ -453,7 +453,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.3.1 - '@types/node': 18.11.10 + '@types/node': 18.13.0 chalk: 4.1.2 jest-message-util: 29.3.1 jest-util: 29.3.1 @@ -474,14 +474,14 @@ packages: '@jest/test-result': 29.3.1 '@jest/transform': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.10 + '@types/node': 18.13.0 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.7.0 exit: 0.1.2 graceful-fs: 4.2.10 jest-changed-files: 29.2.0 - jest-config: 29.3.1_j5wyyouvf5aixckc7ltaxrydha + jest-config: 29.3.1_ucpl6toqp57nqodtp3vxxi6g5a jest-haste-map: 29.3.1 jest-message-util: 29.3.1 jest-regex-util: 29.2.0 @@ -508,7 +508,7 @@ packages: dependencies: '@jest/fake-timers': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.10 + '@types/node': 18.13.0 jest-mock: 29.3.1 dev: true @@ -535,7 +535,7 @@ packages: dependencies: '@jest/types': 29.3.1 '@sinonjs/fake-timers': 9.1.2 - '@types/node': 18.11.10 + '@types/node': 18.13.0 jest-message-util: 29.3.1 jest-mock: 29.3.1 jest-util: 29.3.1 @@ -568,7 +568,7 @@ packages: '@jest/transform': 29.3.1 '@jest/types': 29.3.1 '@jridgewell/trace-mapping': 0.3.17 - '@types/node': 18.11.10 + '@types/node': 18.13.0 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -656,7 +656,7 @@ packages: '@jest/schemas': 29.0.0 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.11.10 + '@types/node': 18.13.0 '@types/yargs': 17.0.20 chalk: 4.1.2 dev: true @@ -763,6 +763,10 @@ packages: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} dev: true + /@tsconfig/node18/2.0.0: + resolution: {integrity: sha512-uI/B0ShkiEwTk036pncXucVlj4y11EW6mycQvCEzC1PkR2TBvdQZ5Wf96dp+XXWAc70FEDfvwTqanoaDpP6rPw==} + dev: true + /@tsconfig/strictest/2.0.0: resolution: {integrity: sha512-E0dpiZNdwO20c8d3seh7OmjAvDpwoRkTcU6M8cvggzB45Bd45tyTU2XJeA5Wfq+8NzVGhunvqOJ30AjSkywMXA==} dev: true @@ -799,7 +803,7 @@ packages: /@types/graceful-fs/4.1.5: resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} dependencies: - '@types/node': 18.11.10 + '@types/node': 18.13.0 dev: true /@types/istanbul-lib-coverage/2.0.4: @@ -822,12 +826,8 @@ packages: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} dev: true - /@types/node/16.18.1: - resolution: {integrity: sha512-Z659t5cj2Tt2SaqbJxXRo5EaU86E4l2CxtklCY1VftxYXhR81Z75UsugwdI7l5MUAR1I+l8sdt3B5Y++ZV76WQ==} - dev: true - - /@types/node/18.11.10: - resolution: {integrity: sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==} + /@types/node/18.13.0: + resolution: {integrity: sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==} dev: true /@types/prettier/2.7.1: @@ -2041,7 +2041,7 @@ packages: '@jest/expect': 29.3.1 '@jest/test-result': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.10 + '@types/node': 18.13.0 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -2060,7 +2060,7 @@ packages: - supports-color dev: true - /jest-cli/29.3.1_qypvtqa6r6yb6tpkajpqa7nibu: + /jest-cli/29.3.1_ucpl6toqp57nqodtp3vxxi6g5a: resolution: {integrity: sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -2077,7 +2077,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.10 import-local: 3.1.0 - jest-config: 29.3.1_qypvtqa6r6yb6tpkajpqa7nibu + jest-config: 29.3.1_ucpl6toqp57nqodtp3vxxi6g5a jest-util: 29.3.1 jest-validate: 29.3.1 prompts: 2.4.2 @@ -2088,47 +2088,7 @@ packages: - ts-node dev: true - /jest-config/29.3.1_j5wyyouvf5aixckc7ltaxrydha: - resolution: {integrity: sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.20.5 - '@jest/test-sequencer': 29.3.1 - '@jest/types': 29.3.1 - '@types/node': 18.11.10 - babel-jest: 29.3.1_@babel+core@7.20.5 - chalk: 4.1.2 - ci-info: 3.7.0 - deepmerge: 4.2.2 - glob: 7.2.3 - graceful-fs: 4.2.10 - jest-circus: 29.3.1 - jest-environment-node: 29.3.1 - jest-get-type: 29.2.0 - jest-regex-util: 29.2.0 - jest-resolve: 29.3.1 - jest-runner: 29.3.1 - jest-util: 29.3.1 - jest-validate: 29.3.1 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.3.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 10.9.1_prmsu5cq6ukh7eypgb4uwwpoa4 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-config/29.3.1_qypvtqa6r6yb6tpkajpqa7nibu: + /jest-config/29.3.1_ucpl6toqp57nqodtp3vxxi6g5a: resolution: {integrity: sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -2143,7 +2103,7 @@ packages: '@babel/core': 7.20.5 '@jest/test-sequencer': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 16.18.1 + '@types/node': 18.13.0 babel-jest: 29.3.1_@babel+core@7.20.5 chalk: 4.1.2 ci-info: 3.7.0 @@ -2163,7 +2123,7 @@ packages: pretty-format: 29.3.1 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1_prmsu5cq6ukh7eypgb4uwwpoa4 + ts-node: 10.9.1_ztltjo43tmsep75uum5mceyifa transitivePeerDependencies: - supports-color dev: true @@ -2203,7 +2163,7 @@ packages: '@jest/environment': 29.3.1 '@jest/fake-timers': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.10 + '@types/node': 18.13.0 jest-mock: 29.3.1 jest-util: 29.3.1 dev: true @@ -2219,7 +2179,7 @@ packages: dependencies: '@jest/types': 29.3.1 '@types/graceful-fs': 4.1.5 - '@types/node': 18.11.10 + '@types/node': 18.13.0 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.10 @@ -2270,7 +2230,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.3.1 - '@types/node': 18.11.10 + '@types/node': 18.13.0 jest-util: 29.3.1 dev: true @@ -2325,7 +2285,7 @@ packages: '@jest/test-result': 29.3.1 '@jest/transform': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.10 + '@types/node': 18.13.0 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.10 @@ -2356,7 +2316,7 @@ packages: '@jest/test-result': 29.3.1 '@jest/transform': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.10 + '@types/node': 18.13.0 chalk: 4.1.2 cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 @@ -2412,7 +2372,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.3.1 - '@types/node': 18.11.10 + '@types/node': 18.13.0 chalk: 4.1.2 ci-info: 3.7.0 graceful-fs: 4.2.10 @@ -2437,7 +2397,7 @@ packages: dependencies: '@jest/test-result': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.10 + '@types/node': 18.13.0 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -2449,13 +2409,13 @@ packages: resolution: {integrity: sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 18.11.10 + '@types/node': 18.13.0 jest-util: 29.3.1 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true - /jest/29.3.1_qypvtqa6r6yb6tpkajpqa7nibu: + /jest/29.3.1_ucpl6toqp57nqodtp3vxxi6g5a: resolution: {integrity: sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -2468,7 +2428,7 @@ packages: '@jest/core': 29.3.1_ts-node@10.9.1 '@jest/types': 29.3.1 import-local: 3.1.0 - jest-cli: 29.3.1_qypvtqa6r6yb6tpkajpqa7nibu + jest-cli: 29.3.1_ucpl6toqp57nqodtp3vxxi6g5a transitivePeerDependencies: - '@types/node' - supports-color @@ -3260,7 +3220,7 @@ packages: dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.3.1_qypvtqa6r6yb6tpkajpqa7nibu + jest: 29.3.1_ucpl6toqp57nqodtp3vxxi6g5a jest-util: 29.3.1 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -3270,7 +3230,7 @@ packages: yargs-parser: 21.1.1 dev: true - /ts-node/10.9.1_prmsu5cq6ukh7eypgb4uwwpoa4: + /ts-node/10.9.1_ztltjo43tmsep75uum5mceyifa: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -3289,7 +3249,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 16.18.1 + '@types/node': 18.13.0 acorn: 8.8.1 acorn-walk: 8.2.0 arg: 4.1.3 diff --git a/tsconfig-base.json b/tsconfig-base.json index 456bf2c..964c3de 100644 --- a/tsconfig-base.json +++ b/tsconfig-base.json @@ -1,6 +1,6 @@ { "extends": [ - "@tsconfig/node16/tsconfig.json", + "@tsconfig/node18/tsconfig.json", "@tsconfig/strictest/tsconfig.json", "@tsconfig/esm/tsconfig.json" ], From 267b1550ac33292b6163363328e3db2df4edd816 Mon Sep 17 00:00:00 2001 From: Stanislav Makarov Date: Thu, 20 Apr 2023 00:18:56 +0300 Subject: [PATCH 27/58] chore: update pnpm to 8.3.1 and migrate lockfile to version 6.0 :arrow_up: --- package.json | 7 +- pnpm-lock.yaml | 1053 ++++++++++++++++++++++++------------------------ 2 files changed, 538 insertions(+), 522 deletions(-) diff --git a/package.json b/package.json index 07b9d94..823eb26 100644 --- a/package.json +++ b/package.json @@ -18,10 +18,9 @@ "typescript": "^5.0.4" }, "engines": { - "node": "^18.13.0", - "pnpm": "^7.17.1" + "node": "^18.13.0" }, - "packageManager": "pnpm@7.17.1", + "packageManager": "pnpm@8.3.1", "private": true, "scripts": { "jest": "jest", @@ -36,7 +35,7 @@ }, "volta": { "node": "18.13.0", - "pnpm": "7.17.1" + "pnpm": "8.3.1" }, "dependencies": { "yargs": "^17.6.2" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 11e92b3..52ea7be 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,55 +1,71 @@ -lockfileVersion: 5.4 +lockfileVersion: '6.0' importers: .: - specifiers: - '@jest/globals': ^29.3.1 - '@tsconfig/esm': ^1.0.2 - '@tsconfig/node18': ^2.0.0 - '@tsconfig/strictest': ^2.0.0 - '@types/node': 18.13.0 - '@types/yargs': ^17.0.16 - '@typescript-eslint/eslint-plugin': ^5.45.1 - '@typescript-eslint/parser': ^5.45.1 - editorconfig-checker: ^4.0.2 - eslint: ^8.29.0 - husky: ^8.0.0 - jest: ^29.3.1 - lint-staged: ^13.0.4 - ts-jest: ^29.1.0 - ts-node: ^10.9.1 - typescript: ^5.0.4 - yargs: ^17.6.2 dependencies: - yargs: 17.6.2 + yargs: + specifier: ^17.6.2 + version: 17.6.2 devDependencies: - '@jest/globals': 29.3.1 - '@tsconfig/esm': 1.0.2 - '@tsconfig/node18': 2.0.0 - '@tsconfig/strictest': 2.0.0 - '@types/node': 18.13.0 - '@types/yargs': 17.0.20 - '@typescript-eslint/eslint-plugin': 5.45.1_du7ehko5z56zwldgvkicxmpcbu - '@typescript-eslint/parser': 5.45.1_ciy6efmzm3ojqwizabpgnljozq - editorconfig-checker: 4.0.2 - eslint: 8.29.0 - husky: 8.0.2 - jest: 29.3.1_ucpl6toqp57nqodtp3vxxi6g5a - lint-staged: 13.0.4 - ts-jest: 29.1.0_agn56dcmrvrjxyb3wli3ryy5gy - ts-node: 10.9.1_ztltjo43tmsep75uum5mceyifa - typescript: 5.0.4 + '@jest/globals': + specifier: ^29.3.1 + version: 29.3.1 + '@tsconfig/esm': + specifier: ^1.0.2 + version: 1.0.2 + '@tsconfig/node18': + specifier: ^2.0.0 + version: 2.0.0 + '@tsconfig/strictest': + specifier: ^2.0.0 + version: 2.0.0 + '@types/node': + specifier: 18.13.0 + version: 18.13.0 + '@types/yargs': + specifier: ^17.0.16 + version: 17.0.20 + '@typescript-eslint/eslint-plugin': + specifier: ^5.45.1 + version: 5.45.1(@typescript-eslint/parser@5.45.1)(eslint@8.29.0)(typescript@5.0.4) + '@typescript-eslint/parser': + specifier: ^5.45.1 + version: 5.45.1(eslint@8.29.0)(typescript@5.0.4) + editorconfig-checker: + specifier: ^4.0.2 + version: 4.0.2 + eslint: + specifier: ^8.29.0 + version: 8.29.0 + husky: + specifier: ^8.0.0 + version: 8.0.2 + jest: + specifier: ^29.3.1 + version: 29.3.1(@types/node@18.13.0)(ts-node@10.9.1) + lint-staged: + specifier: ^13.0.4 + version: 13.0.4 + ts-jest: + specifier: ^29.1.0 + version: 29.1.0(@babel/core@7.20.5)(jest@29.3.1)(typescript@5.0.4) + ts-node: + specifier: ^10.9.1 + version: 10.9.1(@types/node@18.13.0)(typescript@5.0.4) + typescript: + specifier: ^5.0.4 + version: 5.0.4 tests: - specifiers: - jewel-case: workspace:../dist dependencies: - jewel-case: link:../dist + jewel-case: + specifier: workspace:../dist + version: link:../dist packages: - /@ampproject/remapping/2.2.0: + /@ampproject/remapping@2.2.0: resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} engines: {node: '>=6.0.0'} dependencies: @@ -57,26 +73,26 @@ packages: '@jridgewell/trace-mapping': 0.3.17 dev: true - /@babel/code-frame/7.18.6: + /@babel/code-frame@7.18.6: resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.18.6 dev: true - /@babel/compat-data/7.20.5: + /@babel/compat-data@7.20.5: resolution: {integrity: sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==} engines: {node: '>=6.9.0'} dev: true - /@babel/core/7.20.5: + /@babel/core@7.20.5: resolution: {integrity: sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.0 '@babel/code-frame': 7.18.6 '@babel/generator': 7.20.5 - '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.5 + '@babel/helper-compilation-targets': 7.20.0(@babel/core@7.20.5) '@babel/helper-module-transforms': 7.20.2 '@babel/helpers': 7.20.6 '@babel/parser': 7.20.5 @@ -92,7 +108,7 @@ packages: - supports-color dev: true - /@babel/generator/7.20.5: + /@babel/generator@7.20.5: resolution: {integrity: sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==} engines: {node: '>=6.9.0'} dependencies: @@ -101,7 +117,7 @@ packages: jsesc: 2.5.2 dev: true - /@babel/helper-compilation-targets/7.20.0_@babel+core@7.20.5: + /@babel/helper-compilation-targets@7.20.0(@babel/core@7.20.5): resolution: {integrity: sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -114,12 +130,12 @@ packages: semver: 6.3.0 dev: true - /@babel/helper-environment-visitor/7.18.9: + /@babel/helper-environment-visitor@7.18.9: resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-function-name/7.19.0: + /@babel/helper-function-name@7.19.0: resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} engines: {node: '>=6.9.0'} dependencies: @@ -127,21 +143,21 @@ packages: '@babel/types': 7.20.5 dev: true - /@babel/helper-hoist-variables/7.18.6: + /@babel/helper-hoist-variables@7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.5 dev: true - /@babel/helper-module-imports/7.18.6: + /@babel/helper-module-imports@7.18.6: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.5 dev: true - /@babel/helper-module-transforms/7.20.2: + /@babel/helper-module-transforms@7.20.2: resolution: {integrity: sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==} engines: {node: '>=6.9.0'} dependencies: @@ -157,41 +173,41 @@ packages: - supports-color dev: true - /@babel/helper-plugin-utils/7.20.2: + /@babel/helper-plugin-utils@7.20.2: resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-simple-access/7.20.2: + /@babel/helper-simple-access@7.20.2: resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.5 dev: true - /@babel/helper-split-export-declaration/7.18.6: + /@babel/helper-split-export-declaration@7.18.6: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.5 dev: true - /@babel/helper-string-parser/7.19.4: + /@babel/helper-string-parser@7.19.4: resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-identifier/7.19.1: + /@babel/helper-validator-identifier@7.19.1: resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-option/7.18.6: + /@babel/helper-validator-option@7.18.6: resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helpers/7.20.6: + /@babel/helpers@7.20.6: resolution: {integrity: sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==} engines: {node: '>=6.9.0'} dependencies: @@ -202,7 +218,7 @@ packages: - supports-color dev: true - /@babel/highlight/7.18.6: + /@babel/highlight@7.18.6: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} dependencies: @@ -211,7 +227,7 @@ packages: js-tokens: 4.0.0 dev: true - /@babel/parser/7.20.5: + /@babel/parser@7.20.5: resolution: {integrity: sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==} engines: {node: '>=6.0.0'} hasBin: true @@ -219,7 +235,7 @@ packages: '@babel/types': 7.20.5 dev: true - /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.20.5: + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.20.5): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -228,7 +244,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.20.5: + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.20.5): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -237,7 +253,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.20.5: + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.20.5): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -246,7 +262,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.20.5: + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.20.5): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -255,7 +271,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.20.5: + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.20.5): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -264,7 +280,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.5: + /@babel/plugin-syntax-jsx@7.18.6(@babel/core@7.20.5): resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} engines: {node: '>=6.9.0'} peerDependencies: @@ -274,7 +290,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.20.5: + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.20.5): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -283,7 +299,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.20.5: + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.20.5): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -292,7 +308,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.20.5: + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.20.5): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -301,7 +317,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.20.5: + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.20.5): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -310,7 +326,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.20.5: + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.20.5): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -319,7 +335,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.20.5: + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.20.5): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -328,7 +344,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.20.5: + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.20.5): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -338,7 +354,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.20.5: + /@babel/plugin-syntax-typescript@7.20.0(@babel/core@7.20.5): resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -348,7 +364,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/template/7.18.10: + /@babel/template@7.18.10: resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==} engines: {node: '>=6.9.0'} dependencies: @@ -357,7 +373,7 @@ packages: '@babel/types': 7.20.5 dev: true - /@babel/traverse/7.20.5: + /@babel/traverse@7.20.5: resolution: {integrity: sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==} engines: {node: '>=6.9.0'} dependencies: @@ -375,7 +391,7 @@ packages: - supports-color dev: true - /@babel/types/7.20.5: + /@babel/types@7.20.5: resolution: {integrity: sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==} engines: {node: '>=6.9.0'} dependencies: @@ -384,18 +400,18 @@ packages: to-fast-properties: 2.0.0 dev: true - /@bcoe/v8-coverage/0.2.3: + /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@cspotcode/source-map-support/0.8.1: + /@cspotcode/source-map-support@0.8.1: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} dependencies: '@jridgewell/trace-mapping': 0.3.9 dev: true - /@eslint/eslintrc/1.3.3: + /@eslint/eslintrc@1.3.3: resolution: {integrity: sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -412,7 +428,7 @@ packages: - supports-color dev: true - /@humanwhocodes/config-array/0.11.7: + /@humanwhocodes/config-array@0.11.7: resolution: {integrity: sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==} engines: {node: '>=10.10.0'} dependencies: @@ -423,16 +439,16 @@ packages: - supports-color dev: true - /@humanwhocodes/module-importer/1.0.1: + /@humanwhocodes/module-importer@1.0.1: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} dev: true - /@humanwhocodes/object-schema/1.2.1: + /@humanwhocodes/object-schema@1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@istanbuljs/load-nyc-config/1.1.0: + /@istanbuljs/load-nyc-config@1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} dependencies: @@ -443,12 +459,12 @@ packages: resolve-from: 5.0.0 dev: true - /@istanbuljs/schema/0.1.3: + /@istanbuljs/schema@0.1.3: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} dev: true - /@jest/console/29.3.1: + /@jest/console@29.3.1: resolution: {integrity: sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -460,7 +476,7 @@ packages: slash: 3.0.0 dev: true - /@jest/core/29.3.1_ts-node@10.9.1: + /@jest/core@29.3.1(ts-node@10.9.1): resolution: {integrity: sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -481,7 +497,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.10 jest-changed-files: 29.2.0 - jest-config: 29.3.1_ucpl6toqp57nqodtp3vxxi6g5a + jest-config: 29.3.1(@types/node@18.13.0)(ts-node@10.9.1) jest-haste-map: 29.3.1 jest-message-util: 29.3.1 jest-regex-util: 29.2.0 @@ -502,7 +518,7 @@ packages: - ts-node dev: true - /@jest/environment/29.3.1: + /@jest/environment@29.3.1: resolution: {integrity: sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -512,14 +528,14 @@ packages: jest-mock: 29.3.1 dev: true - /@jest/expect-utils/29.3.1: + /@jest/expect-utils@29.3.1: resolution: {integrity: sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-get-type: 29.2.0 dev: true - /@jest/expect/29.3.1: + /@jest/expect@29.3.1: resolution: {integrity: sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -529,7 +545,7 @@ packages: - supports-color dev: true - /@jest/fake-timers/29.3.1: + /@jest/fake-timers@29.3.1: resolution: {integrity: sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -541,7 +557,7 @@ packages: jest-util: 29.3.1 dev: true - /@jest/globals/29.3.1: + /@jest/globals@29.3.1: resolution: {integrity: sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -553,7 +569,7 @@ packages: - supports-color dev: true - /@jest/reporters/29.3.1: + /@jest/reporters@29.3.1: resolution: {integrity: sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -590,14 +606,14 @@ packages: - supports-color dev: true - /@jest/schemas/29.0.0: + /@jest/schemas@29.0.0: resolution: {integrity: sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@sinclair/typebox': 0.24.51 dev: true - /@jest/source-map/29.2.0: + /@jest/source-map@29.2.0: resolution: {integrity: sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -606,7 +622,7 @@ packages: graceful-fs: 4.2.10 dev: true - /@jest/test-result/29.3.1: + /@jest/test-result@29.3.1: resolution: {integrity: sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -616,7 +632,7 @@ packages: collect-v8-coverage: 1.0.1 dev: true - /@jest/test-sequencer/29.3.1: + /@jest/test-sequencer@29.3.1: resolution: {integrity: sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -626,7 +642,7 @@ packages: slash: 3.0.0 dev: true - /@jest/transform/29.3.1: + /@jest/transform@29.3.1: resolution: {integrity: sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -649,7 +665,7 @@ packages: - supports-color dev: true - /@jest/types/29.3.1: + /@jest/types@29.3.1: resolution: {integrity: sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -661,7 +677,7 @@ packages: chalk: 4.1.2 dev: true - /@jridgewell/gen-mapping/0.1.1: + /@jridgewell/gen-mapping@0.1.1: resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} engines: {node: '>=6.0.0'} dependencies: @@ -669,7 +685,7 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@jridgewell/gen-mapping/0.3.2: + /@jridgewell/gen-mapping@0.3.2: resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} engines: {node: '>=6.0.0'} dependencies: @@ -678,35 +694,35 @@ packages: '@jridgewell/trace-mapping': 0.3.17 dev: true - /@jridgewell/resolve-uri/3.1.0: + /@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/set-array/1.1.2: + /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/sourcemap-codec/1.4.14: + /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true - /@jridgewell/trace-mapping/0.3.17: + /@jridgewell/trace-mapping@0.3.17: resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@jridgewell/trace-mapping/0.3.9: + /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@nodelib/fs.scandir/2.1.5: + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} dependencies: @@ -714,12 +730,12 @@ packages: run-parallel: 1.2.0 dev: true - /@nodelib/fs.stat/2.0.5: + /@nodelib/fs.stat@2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} dev: true - /@nodelib/fs.walk/1.2.8: + /@nodelib/fs.walk@1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} dependencies: @@ -727,51 +743,51 @@ packages: fastq: 1.14.0 dev: true - /@sinclair/typebox/0.24.51: + /@sinclair/typebox@0.24.51: resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} dev: true - /@sinonjs/commons/1.8.6: + /@sinonjs/commons@1.8.6: resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} dependencies: type-detect: 4.0.8 dev: true - /@sinonjs/fake-timers/9.1.2: + /@sinonjs/fake-timers@9.1.2: resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==} dependencies: '@sinonjs/commons': 1.8.6 dev: true - /@tsconfig/esm/1.0.2: + /@tsconfig/esm@1.0.2: resolution: {integrity: sha512-awiISx+G4L+7k97nKnfA5QF6rukawiuycMPfASFHG/0fqjrUlYBuNISy3Yjl1SHIpVi57lYf7dc6L/FoQQCKcA==} dev: true - /@tsconfig/node10/1.0.9: + /@tsconfig/node10@1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: true - /@tsconfig/node12/1.0.11: + /@tsconfig/node12@1.0.11: resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} dev: true - /@tsconfig/node14/1.0.3: + /@tsconfig/node14@1.0.3: resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} dev: true - /@tsconfig/node16/1.0.3: + /@tsconfig/node16@1.0.3: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} dev: true - /@tsconfig/node18/2.0.0: + /@tsconfig/node18@2.0.0: resolution: {integrity: sha512-uI/B0ShkiEwTk036pncXucVlj4y11EW6mycQvCEzC1PkR2TBvdQZ5Wf96dp+XXWAc70FEDfvwTqanoaDpP6rPw==} dev: true - /@tsconfig/strictest/2.0.0: + /@tsconfig/strictest@2.0.0: resolution: {integrity: sha512-E0dpiZNdwO20c8d3seh7OmjAvDpwoRkTcU6M8cvggzB45Bd45tyTU2XJeA5Wfq+8NzVGhunvqOJ30AjSkywMXA==} dev: true - /@types/babel__core/7.1.20: + /@types/babel__core@7.1.20: resolution: {integrity: sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==} dependencies: '@babel/parser': 7.20.5 @@ -781,78 +797,78 @@ packages: '@types/babel__traverse': 7.18.3 dev: true - /@types/babel__generator/7.6.4: + /@types/babel__generator@7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: '@babel/types': 7.20.5 dev: true - /@types/babel__template/7.4.1: + /@types/babel__template@7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: '@babel/parser': 7.20.5 '@babel/types': 7.20.5 dev: true - /@types/babel__traverse/7.18.3: + /@types/babel__traverse@7.18.3: resolution: {integrity: sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==} dependencies: '@babel/types': 7.20.5 dev: true - /@types/graceful-fs/4.1.5: + /@types/graceful-fs@4.1.5: resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} dependencies: '@types/node': 18.13.0 dev: true - /@types/istanbul-lib-coverage/2.0.4: + /@types/istanbul-lib-coverage@2.0.4: resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} dev: true - /@types/istanbul-lib-report/3.0.0: + /@types/istanbul-lib-report@3.0.0: resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} dependencies: '@types/istanbul-lib-coverage': 2.0.4 dev: true - /@types/istanbul-reports/3.0.1: + /@types/istanbul-reports@3.0.1: resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} dependencies: '@types/istanbul-lib-report': 3.0.0 dev: true - /@types/json-schema/7.0.11: + /@types/json-schema@7.0.11: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} dev: true - /@types/node/18.13.0: + /@types/node@18.13.0: resolution: {integrity: sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==} dev: true - /@types/prettier/2.7.1: + /@types/prettier@2.7.1: resolution: {integrity: sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==} dev: true - /@types/semver/7.3.13: + /@types/semver@7.3.13: resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} dev: true - /@types/stack-utils/2.0.1: + /@types/stack-utils@2.0.1: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} dev: true - /@types/yargs-parser/21.0.0: + /@types/yargs-parser@21.0.0: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} dev: true - /@types/yargs/17.0.20: + /@types/yargs@17.0.20: resolution: {integrity: sha512-eknWrTHofQuPk2iuqDm1waA7V6xPlbgBoaaXEgYkClhLOnB0TtbW+srJaOToAgawPxPlHQzwypFA2bhZaUGP5A==} dependencies: '@types/yargs-parser': 21.0.0 dev: true - /@typescript-eslint/eslint-plugin/5.45.1_du7ehko5z56zwldgvkicxmpcbu: + /@typescript-eslint/eslint-plugin@5.45.1(@typescript-eslint/parser@5.45.1)(eslint@8.29.0)(typescript@5.0.4): resolution: {integrity: sha512-cOizjPlKEh0bXdFrBLTrI/J6B/QMlhwE9auOov53tgB+qMukH6/h8YAK/qw+QJGct/PTbdh2lytGyipxCcEtAw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -863,23 +879,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.45.1_ciy6efmzm3ojqwizabpgnljozq + '@typescript-eslint/parser': 5.45.1(eslint@8.29.0)(typescript@5.0.4) '@typescript-eslint/scope-manager': 5.45.1 - '@typescript-eslint/type-utils': 5.45.1_ciy6efmzm3ojqwizabpgnljozq - '@typescript-eslint/utils': 5.45.1_ciy6efmzm3ojqwizabpgnljozq + '@typescript-eslint/type-utils': 5.45.1(eslint@8.29.0)(typescript@5.0.4) + '@typescript-eslint/utils': 5.45.1(eslint@8.29.0)(typescript@5.0.4) debug: 4.3.4 eslint: 8.29.0 ignore: 5.2.1 natural-compare-lite: 1.4.0 regexpp: 3.2.0 semver: 7.3.8 - tsutils: 3.21.0_typescript@5.0.4 + tsutils: 3.21.0(typescript@5.0.4) typescript: 5.0.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.45.1_ciy6efmzm3ojqwizabpgnljozq: + /@typescript-eslint/parser@5.45.1(eslint@8.29.0)(typescript@5.0.4): resolution: {integrity: sha512-JQ3Ep8bEOXu16q0ztsatp/iQfDCtvap7sp/DKo7DWltUquj5AfCOpX2zSzJ8YkAVnrQNqQ5R62PBz2UtrfmCkA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -891,7 +907,7 @@ packages: dependencies: '@typescript-eslint/scope-manager': 5.45.1 '@typescript-eslint/types': 5.45.1 - '@typescript-eslint/typescript-estree': 5.45.1_typescript@5.0.4 + '@typescript-eslint/typescript-estree': 5.45.1(typescript@5.0.4) debug: 4.3.4 eslint: 8.29.0 typescript: 5.0.4 @@ -899,7 +915,7 @@ packages: - supports-color dev: true - /@typescript-eslint/scope-manager/5.45.1: + /@typescript-eslint/scope-manager@5.45.1: resolution: {integrity: sha512-D6fCileR6Iai7E35Eb4Kp+k0iW7F1wxXYrOhX/3dywsOJpJAQ20Fwgcf+P/TDtvQ7zcsWsrJaglaQWDhOMsspQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -907,7 +923,7 @@ packages: '@typescript-eslint/visitor-keys': 5.45.1 dev: true - /@typescript-eslint/type-utils/5.45.1_ciy6efmzm3ojqwizabpgnljozq: + /@typescript-eslint/type-utils@5.45.1(eslint@8.29.0)(typescript@5.0.4): resolution: {integrity: sha512-aosxFa+0CoYgYEl3aptLe1svP910DJq68nwEJzyQcrtRhC4BN0tJAvZGAe+D0tzjJmFXe+h4leSsiZhwBa2vrA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -917,22 +933,22 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.45.1_typescript@5.0.4 - '@typescript-eslint/utils': 5.45.1_ciy6efmzm3ojqwizabpgnljozq + '@typescript-eslint/typescript-estree': 5.45.1(typescript@5.0.4) + '@typescript-eslint/utils': 5.45.1(eslint@8.29.0)(typescript@5.0.4) debug: 4.3.4 eslint: 8.29.0 - tsutils: 3.21.0_typescript@5.0.4 + tsutils: 3.21.0(typescript@5.0.4) typescript: 5.0.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types/5.45.1: + /@typescript-eslint/types@5.45.1: resolution: {integrity: sha512-HEW3U0E5dLjUT+nk7b4lLbOherS1U4ap+b9pfu2oGsW3oPu7genRaY9dDv3nMczC1rbnRY2W/D7SN05wYoGImg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.45.1_typescript@5.0.4: + /@typescript-eslint/typescript-estree@5.45.1(typescript@5.0.4): resolution: {integrity: sha512-76NZpmpCzWVrrb0XmYEpbwOz/FENBi+5W7ipVXAsG3OoFrQKJMiaqsBMbvGRyLtPotGqUfcY7Ur8j0dksDJDng==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -947,13 +963,13 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.8 - tsutils: 3.21.0_typescript@5.0.4 + tsutils: 3.21.0(typescript@5.0.4) typescript: 5.0.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils/5.45.1_ciy6efmzm3ojqwizabpgnljozq: + /@typescript-eslint/utils@5.45.1(eslint@8.29.0)(typescript@5.0.4): resolution: {integrity: sha512-rlbC5VZz68+yjAzQBc4I7KDYVzWG2X/OrqoZrMahYq3u8FFtmQYc+9rovo/7wlJH5kugJ+jQXV5pJMnofGmPRw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -963,17 +979,17 @@ packages: '@types/semver': 7.3.13 '@typescript-eslint/scope-manager': 5.45.1 '@typescript-eslint/types': 5.45.1 - '@typescript-eslint/typescript-estree': 5.45.1_typescript@5.0.4 + '@typescript-eslint/typescript-estree': 5.45.1(typescript@5.0.4) eslint: 8.29.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.29.0 + eslint-utils: 3.0.0(eslint@8.29.0) semver: 7.3.8 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys/5.45.1: + /@typescript-eslint/visitor-keys@5.45.1: resolution: {integrity: sha512-cy9ln+6rmthYWjH9fmx+5FU/JDpjQb586++x2FZlveq7GdGuLLW9a2Jcst2TGekH82bXpfmRNSwP9tyEs6RjvQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -981,7 +997,7 @@ packages: eslint-visitor-keys: 3.3.0 dev: true - /acorn-jsx/5.3.2_acorn@8.8.1: + /acorn-jsx@5.3.2(acorn@8.8.1): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -989,18 +1005,18 @@ packages: acorn: 8.8.1 dev: true - /acorn-walk/8.2.0: + /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} dev: true - /acorn/8.8.1: + /acorn@8.8.1: resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /agent-base/6.0.2: + /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: @@ -1009,7 +1025,7 @@ packages: - supports-color dev: true - /aggregate-error/3.1.0: + /aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} dependencies: @@ -1017,7 +1033,7 @@ packages: indent-string: 4.0.0 dev: true - /ajv/6.12.6: + /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: fast-deep-equal: 3.1.3 @@ -1026,46 +1042,46 @@ packages: uri-js: 4.4.1 dev: true - /ansi-escapes/4.3.2: + /ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} dependencies: type-fest: 0.21.3 dev: true - /ansi-regex/5.0.1: + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - /ansi-regex/6.0.1: + /ansi-regex@6.0.1: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} dev: true - /ansi-styles/3.2.1: + /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} dependencies: color-convert: 1.9.3 dev: true - /ansi-styles/4.3.0: + /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - /ansi-styles/5.2.0: + /ansi-styles@5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} dev: true - /ansi-styles/6.2.1: + /ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} dev: true - /anymatch/3.1.3: + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} dependencies: @@ -1073,31 +1089,31 @@ packages: picomatch: 2.3.1 dev: true - /arg/4.1.3: + /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true - /argparse/1.0.10: + /argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: sprintf-js: 1.0.3 dev: true - /argparse/2.0.1: + /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true - /array-union/2.1.0: + /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} dev: true - /astral-regex/2.0.0: + /astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} dev: true - /babel-jest/29.3.1_@babel+core@7.20.5: + /babel-jest@29.3.1(@babel/core@7.20.5): resolution: {integrity: sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -1107,7 +1123,7 @@ packages: '@jest/transform': 29.3.1 '@types/babel__core': 7.1.20 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.2.0_@babel+core@7.20.5 + babel-preset-jest: 29.2.0(@babel/core@7.20.5) chalk: 4.1.2 graceful-fs: 4.2.10 slash: 3.0.0 @@ -1115,7 +1131,7 @@ packages: - supports-color dev: true - /babel-plugin-istanbul/6.1.1: + /babel-plugin-istanbul@6.1.1: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: @@ -1128,7 +1144,7 @@ packages: - supports-color dev: true - /babel-plugin-jest-hoist/29.2.0: + /babel-plugin-jest-hoist@29.2.0: resolution: {integrity: sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -1138,27 +1154,27 @@ packages: '@types/babel__traverse': 7.18.3 dev: true - /babel-preset-current-node-syntax/1.0.1_@babel+core@7.20.5: + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.20.5): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.20.5 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.5 - '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.20.5 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.20.5 - '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.20.5 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.5 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.5 - dev: true - - /babel-preset-jest/29.2.0_@babel+core@7.20.5: + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.20.5) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.20.5) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.20.5) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.20.5) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.20.5) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.20.5) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.20.5) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.20.5) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.20.5) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.20.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.20.5) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.20.5) + dev: true + + /babel-preset-jest@29.2.0(@babel/core@7.20.5): resolution: {integrity: sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -1166,28 +1182,28 @@ packages: dependencies: '@babel/core': 7.20.5 babel-plugin-jest-hoist: 29.2.0 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.5 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.20.5) dev: true - /balanced-match/1.0.2: + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /brace-expansion/1.1.11: + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 dev: true - /braces/3.0.2: + /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} dependencies: fill-range: 7.0.1 dev: true - /browserslist/4.21.4: + /browserslist@4.21.4: resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1195,46 +1211,46 @@ packages: caniuse-lite: 1.0.30001436 electron-to-chromium: 1.4.284 node-releases: 2.0.6 - update-browserslist-db: 1.0.10_browserslist@4.21.4 + update-browserslist-db: 1.0.10(browserslist@4.21.4) dev: true - /bs-logger/0.2.6: + /bs-logger@0.2.6: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} engines: {node: '>= 6'} dependencies: fast-json-stable-stringify: 2.1.0 dev: true - /bser/2.1.1: + /bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} dependencies: node-int64: 0.4.0 dev: true - /buffer-from/1.1.2: + /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true - /callsites/3.1.0: + /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} dev: true - /camelcase/5.3.1: + /camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} dev: true - /camelcase/6.3.0: + /camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} dev: true - /caniuse-lite/1.0.30001436: + /caniuse-lite@1.0.30001436: resolution: {integrity: sha512-ZmWkKsnC2ifEPoWUvSAIGyOYwT+keAaaWPHiQ9DfMqS1t6tfuyFYoWR78TeZtznkEQ64+vGXH9cZrElwR2Mrxg==} dev: true - /chalk/2.4.2: + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} dependencies: @@ -1243,7 +1259,7 @@ packages: supports-color: 5.5.0 dev: true - /chalk/4.1.2: + /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} dependencies: @@ -1251,38 +1267,38 @@ packages: supports-color: 7.2.0 dev: true - /char-regex/1.0.2: + /char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} dev: true - /chownr/2.0.0: + /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} dev: true - /ci-info/3.7.0: + /ci-info@3.7.0: resolution: {integrity: sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==} engines: {node: '>=8'} dev: true - /cjs-module-lexer/1.2.2: + /cjs-module-lexer@1.2.2: resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} dev: true - /clean-stack/2.2.0: + /clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} dev: true - /cli-cursor/3.1.0: + /cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} dependencies: restore-cursor: 3.1.0 dev: true - /cli-truncate/2.1.0: + /cli-truncate@2.1.0: resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} engines: {node: '>=8'} dependencies: @@ -1290,7 +1306,7 @@ packages: string-width: 4.2.3 dev: true - /cli-truncate/3.1.0: + /cli-truncate@3.1.0: resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: @@ -1298,7 +1314,7 @@ packages: string-width: 5.1.2 dev: true - /cliui/8.0.1: + /cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} dependencies: @@ -1306,60 +1322,60 @@ packages: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - /co/4.6.0: + /co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} dev: true - /collect-v8-coverage/1.0.1: + /collect-v8-coverage@1.0.1: resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} dev: true - /color-convert/1.9.3: + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 dev: true - /color-convert/2.0.1: + /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 - /color-name/1.1.3: + /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} dev: true - /color-name/1.1.4: + /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - /colorette/2.0.19: + /colorette@2.0.19: resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} dev: true - /commander/9.4.1: + /commander@9.4.1: resolution: {integrity: sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==} engines: {node: ^12.20.0 || >=14} dev: true - /concat-map/0.0.1: + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true - /convert-source-map/1.9.0: + /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} dev: true - /convert-source-map/2.0.0: + /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: true - /create-require/1.1.1: + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true - /cross-spawn/7.0.3: + /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} dependencies: @@ -1368,7 +1384,7 @@ packages: which: 2.0.2 dev: true - /debug/4.3.4: + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: @@ -1380,53 +1396,53 @@ packages: ms: 2.1.2 dev: true - /dedent/0.7.0: + /dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} dev: true - /deep-is/0.1.4: + /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true - /deepmerge/4.2.2: + /deepmerge@4.2.2: resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} engines: {node: '>=0.10.0'} dev: true - /detect-newline/3.1.0: + /detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} dev: true - /diff-sequences/29.3.1: + /diff-sequences@29.3.1: resolution: {integrity: sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /diff/4.0.2: + /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} dev: true - /dir-glob/3.0.1: + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} dependencies: path-type: 4.0.0 dev: true - /doctrine/3.0.0: + /doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 dev: true - /eastasianwidth/0.2.0: + /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /editorconfig-checker/4.0.2: + /editorconfig-checker@4.0.2: resolution: {integrity: sha512-tUI7ABIzMB1kfwTUQmX+gaZGCMNuUgGuRHJ+Xu4Tk9T8lV8Vy5w/EaQsSZ7NKrOgLxbekptw6MUgrzHTvhceLw==} hasBin: true dependencies: @@ -1438,48 +1454,48 @@ packages: - supports-color dev: true - /electron-to-chromium/1.4.284: + /electron-to-chromium@1.4.284: resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} dev: true - /emittery/0.13.1: + /emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} dev: true - /emoji-regex/8.0.0: + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - /emoji-regex/9.2.2: + /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true - /error-ex/1.3.2: + /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 dev: true - /escalade/3.1.1: + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - /escape-string-regexp/1.0.5: + /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} dev: true - /escape-string-regexp/2.0.0: + /escape-string-regexp@2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} dev: true - /escape-string-regexp/4.0.0: + /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} dev: true - /eslint-scope/5.1.1: + /eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} dependencies: @@ -1487,7 +1503,7 @@ packages: estraverse: 4.3.0 dev: true - /eslint-scope/7.1.1: + /eslint-scope@7.1.1: resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -1495,7 +1511,7 @@ packages: estraverse: 5.3.0 dev: true - /eslint-utils/3.0.0_eslint@8.29.0: + /eslint-utils@3.0.0(eslint@8.29.0): resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: @@ -1505,17 +1521,17 @@ packages: eslint-visitor-keys: 2.1.0 dev: true - /eslint-visitor-keys/2.1.0: + /eslint-visitor-keys@2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} dev: true - /eslint-visitor-keys/3.3.0: + /eslint-visitor-keys@3.3.0: resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint/8.29.0: + /eslint@8.29.0: resolution: {integrity: sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true @@ -1531,7 +1547,7 @@ packages: doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.1.1 - eslint-utils: 3.0.0_eslint@8.29.0 + eslint-utils: 3.0.0(eslint@8.29.0) eslint-visitor-keys: 3.3.0 espree: 9.4.1 esquery: 1.4.0 @@ -1563,51 +1579,51 @@ packages: - supports-color dev: true - /espree/9.4.1: + /espree@9.4.1: resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: acorn: 8.8.1 - acorn-jsx: 5.3.2_acorn@8.8.1 + acorn-jsx: 5.3.2(acorn@8.8.1) eslint-visitor-keys: 3.3.0 dev: true - /esprima/4.0.1: + /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true dev: true - /esquery/1.4.0: + /esquery@1.4.0: resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 dev: true - /esrecurse/4.3.0: + /esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 dev: true - /estraverse/4.3.0: + /estraverse@4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} engines: {node: '>=4.0'} dev: true - /estraverse/5.3.0: + /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} dev: true - /esutils/2.0.3: + /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} dev: true - /execa/5.1.1: + /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} dependencies: @@ -1622,7 +1638,7 @@ packages: strip-final-newline: 2.0.0 dev: true - /execa/6.1.0: + /execa@6.1.0: resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: @@ -1637,12 +1653,12 @@ packages: strip-final-newline: 3.0.0 dev: true - /exit/0.1.2: + /exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} dev: true - /expect/29.3.1: + /expect@29.3.1: resolution: {integrity: sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -1653,11 +1669,11 @@ packages: jest-util: 29.3.1 dev: true - /fast-deep-equal/3.1.3: + /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true - /fast-glob/3.2.12: + /fast-glob@3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} dependencies: @@ -1668,41 +1684,41 @@ packages: micromatch: 4.0.5 dev: true - /fast-json-stable-stringify/2.1.0: + /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true - /fast-levenshtein/2.0.6: + /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true - /fastq/1.14.0: + /fastq@1.14.0: resolution: {integrity: sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==} dependencies: reusify: 1.0.4 dev: true - /fb-watchman/2.0.2: + /fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} dependencies: bser: 2.1.1 dev: true - /file-entry-cache/6.0.1: + /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.0.4 dev: true - /fill-range/7.0.1: + /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 dev: true - /find-up/4.1.0: + /find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} dependencies: @@ -1710,7 +1726,7 @@ packages: path-exists: 4.0.0 dev: true - /find-up/5.0.0: + /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} dependencies: @@ -1718,7 +1734,7 @@ packages: path-exists: 4.0.0 dev: true - /flat-cache/3.0.4: + /flat-cache@3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: @@ -1726,22 +1742,22 @@ packages: rimraf: 3.0.2 dev: true - /flatted/3.2.7: + /flatted@3.2.7: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} dev: true - /fs-minipass/2.1.0: + /fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} dependencies: minipass: 3.3.6 dev: true - /fs.realpath/1.0.0: + /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true - /fsevents/2.3.2: + /fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -1749,44 +1765,44 @@ packages: dev: true optional: true - /function-bind/1.1.1: + /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} dev: true - /gensync/1.0.0-beta.2: + /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} dev: true - /get-caller-file/2.0.5: + /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - /get-package-type/0.1.0: + /get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} dev: true - /get-stream/6.0.1: + /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} dev: true - /glob-parent/5.1.2: + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 dev: true - /glob-parent/6.0.2: + /glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} dependencies: is-glob: 4.0.3 dev: true - /glob/7.2.3: + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: fs.realpath: 1.0.0 @@ -1797,19 +1813,19 @@ packages: path-is-absolute: 1.0.1 dev: true - /globals/11.12.0: + /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} dev: true - /globals/13.18.0: + /globals@13.18.0: resolution: {integrity: sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 dev: true - /globby/11.1.0: + /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} dependencies: @@ -1821,36 +1837,36 @@ packages: slash: 3.0.0 dev: true - /graceful-fs/4.2.10: + /graceful-fs@4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} dev: true - /grapheme-splitter/1.0.4: + /grapheme-splitter@1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: true - /has-flag/3.0.0: + /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} dev: true - /has-flag/4.0.0: + /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} dev: true - /has/1.0.3: + /has@1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 dev: true - /html-escaper/2.0.2: + /html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true - /https-proxy-agent/5.0.1: + /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} dependencies: @@ -1860,28 +1876,28 @@ packages: - supports-color dev: true - /human-signals/2.1.0: + /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} dev: true - /human-signals/3.0.1: + /human-signals@3.0.1: resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==} engines: {node: '>=12.20.0'} dev: true - /husky/8.0.2: + /husky@8.0.2: resolution: {integrity: sha512-Tkv80jtvbnkK3mYWxPZePGFpQ/tT3HNSs/sasF9P2YfkMezDl3ON37YN6jUUI4eTg5LcyVynlb6r4eyvOmspvg==} engines: {node: '>=14'} hasBin: true dev: true - /ignore/5.2.1: + /ignore@5.2.1: resolution: {integrity: sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==} engines: {node: '>= 4'} dev: true - /import-fresh/3.3.0: + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} dependencies: @@ -1889,7 +1905,7 @@ packages: resolve-from: 4.0.0 dev: true - /import-local/3.1.0: + /import-local@3.1.0: resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} engines: {node: '>=8'} hasBin: true @@ -1898,93 +1914,93 @@ packages: resolve-cwd: 3.0.0 dev: true - /imurmurhash/0.1.4: + /imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} dev: true - /indent-string/4.0.0: + /indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} dev: true - /inflight/1.0.6: + /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 dev: true - /inherits/2.0.4: + /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: true - /is-arrayish/0.2.1: + /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: true - /is-core-module/2.11.0: + /is-core-module@2.11.0: resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} dependencies: has: 1.0.3 dev: true - /is-extglob/2.1.1: + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} dev: true - /is-fullwidth-code-point/3.0.0: + /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - /is-fullwidth-code-point/4.0.0: + /is-fullwidth-code-point@4.0.0: resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} engines: {node: '>=12'} dev: true - /is-generator-fn/2.1.0: + /is-generator-fn@2.1.0: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} dev: true - /is-glob/4.0.3: + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 dev: true - /is-number/7.0.0: + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} dev: true - /is-path-inside/3.0.3: + /is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} dev: true - /is-stream/2.0.1: + /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} dev: true - /is-stream/3.0.0: + /is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /isexe/2.0.0: + /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true - /istanbul-lib-coverage/3.2.0: + /istanbul-lib-coverage@3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} dev: true - /istanbul-lib-instrument/5.2.1: + /istanbul-lib-instrument@5.2.1: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: @@ -1997,7 +2013,7 @@ packages: - supports-color dev: true - /istanbul-lib-report/3.0.0: + /istanbul-lib-report@3.0.0: resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} engines: {node: '>=8'} dependencies: @@ -2006,7 +2022,7 @@ packages: supports-color: 7.2.0 dev: true - /istanbul-lib-source-maps/4.0.1: + /istanbul-lib-source-maps@4.0.1: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: @@ -2017,7 +2033,7 @@ packages: - supports-color dev: true - /istanbul-reports/3.1.5: + /istanbul-reports@3.1.5: resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} engines: {node: '>=8'} dependencies: @@ -2025,7 +2041,7 @@ packages: istanbul-lib-report: 3.0.0 dev: true - /jest-changed-files/29.2.0: + /jest-changed-files@29.2.0: resolution: {integrity: sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2033,7 +2049,7 @@ packages: p-limit: 3.1.0 dev: true - /jest-circus/29.3.1: + /jest-circus@29.3.1: resolution: {integrity: sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2060,7 +2076,7 @@ packages: - supports-color dev: true - /jest-cli/29.3.1_ucpl6toqp57nqodtp3vxxi6g5a: + /jest-cli@29.3.1(@types/node@18.13.0)(ts-node@10.9.1): resolution: {integrity: sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -2070,14 +2086,14 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.3.1_ts-node@10.9.1 + '@jest/core': 29.3.1(ts-node@10.9.1) '@jest/test-result': 29.3.1 '@jest/types': 29.3.1 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.10 import-local: 3.1.0 - jest-config: 29.3.1_ucpl6toqp57nqodtp3vxxi6g5a + jest-config: 29.3.1(@types/node@18.13.0)(ts-node@10.9.1) jest-util: 29.3.1 jest-validate: 29.3.1 prompts: 2.4.2 @@ -2088,7 +2104,7 @@ packages: - ts-node dev: true - /jest-config/29.3.1_ucpl6toqp57nqodtp3vxxi6g5a: + /jest-config@29.3.1(@types/node@18.13.0)(ts-node@10.9.1): resolution: {integrity: sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -2104,7 +2120,7 @@ packages: '@jest/test-sequencer': 29.3.1 '@jest/types': 29.3.1 '@types/node': 18.13.0 - babel-jest: 29.3.1_@babel+core@7.20.5 + babel-jest: 29.3.1(@babel/core@7.20.5) chalk: 4.1.2 ci-info: 3.7.0 deepmerge: 4.2.2 @@ -2123,12 +2139,12 @@ packages: pretty-format: 29.3.1 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1_ztltjo43tmsep75uum5mceyifa + ts-node: 10.9.1(@types/node@18.13.0)(typescript@5.0.4) transitivePeerDependencies: - supports-color dev: true - /jest-diff/29.3.1: + /jest-diff@29.3.1: resolution: {integrity: sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2138,14 +2154,14 @@ packages: pretty-format: 29.3.1 dev: true - /jest-docblock/29.2.0: + /jest-docblock@29.2.0: resolution: {integrity: sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: detect-newline: 3.1.0 dev: true - /jest-each/29.3.1: + /jest-each@29.3.1: resolution: {integrity: sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2156,7 +2172,7 @@ packages: pretty-format: 29.3.1 dev: true - /jest-environment-node/29.3.1: + /jest-environment-node@29.3.1: resolution: {integrity: sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2168,12 +2184,12 @@ packages: jest-util: 29.3.1 dev: true - /jest-get-type/29.2.0: + /jest-get-type@29.2.0: resolution: {integrity: sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-haste-map/29.3.1: + /jest-haste-map@29.3.1: resolution: {integrity: sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2192,7 +2208,7 @@ packages: fsevents: 2.3.2 dev: true - /jest-leak-detector/29.3.1: + /jest-leak-detector@29.3.1: resolution: {integrity: sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2200,7 +2216,7 @@ packages: pretty-format: 29.3.1 dev: true - /jest-matcher-utils/29.3.1: + /jest-matcher-utils@29.3.1: resolution: {integrity: sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2210,7 +2226,7 @@ packages: pretty-format: 29.3.1 dev: true - /jest-message-util/29.3.1: + /jest-message-util@29.3.1: resolution: {integrity: sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2225,7 +2241,7 @@ packages: stack-utils: 2.0.6 dev: true - /jest-mock/29.3.1: + /jest-mock@29.3.1: resolution: {integrity: sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2234,7 +2250,7 @@ packages: jest-util: 29.3.1 dev: true - /jest-pnp-resolver/1.2.3_jest-resolve@29.3.1: + /jest-pnp-resolver@1.2.3(jest-resolve@29.3.1): resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} peerDependencies: @@ -2246,12 +2262,12 @@ packages: jest-resolve: 29.3.1 dev: true - /jest-regex-util/29.2.0: + /jest-regex-util@29.2.0: resolution: {integrity: sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-resolve-dependencies/29.3.1: + /jest-resolve-dependencies@29.3.1: resolution: {integrity: sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2261,14 +2277,14 @@ packages: - supports-color dev: true - /jest-resolve/29.3.1: + /jest-resolve@29.3.1: resolution: {integrity: sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 graceful-fs: 4.2.10 jest-haste-map: 29.3.1 - jest-pnp-resolver: 1.2.3_jest-resolve@29.3.1 + jest-pnp-resolver: 1.2.3(jest-resolve@29.3.1) jest-util: 29.3.1 jest-validate: 29.3.1 resolve: 1.22.1 @@ -2276,7 +2292,7 @@ packages: slash: 3.0.0 dev: true - /jest-runner/29.3.1: + /jest-runner@29.3.1: resolution: {integrity: sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2305,7 +2321,7 @@ packages: - supports-color dev: true - /jest-runtime/29.3.1: + /jest-runtime@29.3.1: resolution: {integrity: sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2335,14 +2351,14 @@ packages: - supports-color dev: true - /jest-snapshot/29.3.1: + /jest-snapshot@29.3.1: resolution: {integrity: sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/core': 7.20.5 '@babel/generator': 7.20.5 - '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.20.5 + '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.20.5) + '@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.20.5) '@babel/traverse': 7.20.5 '@babel/types': 7.20.5 '@jest/expect-utils': 29.3.1 @@ -2350,7 +2366,7 @@ packages: '@jest/types': 29.3.1 '@types/babel__traverse': 7.18.3 '@types/prettier': 2.7.1 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.5 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.20.5) chalk: 4.1.2 expect: 29.3.1 graceful-fs: 4.2.10 @@ -2367,7 +2383,7 @@ packages: - supports-color dev: true - /jest-util/29.3.1: + /jest-util@29.3.1: resolution: {integrity: sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2379,7 +2395,7 @@ packages: picomatch: 2.3.1 dev: true - /jest-validate/29.3.1: + /jest-validate@29.3.1: resolution: {integrity: sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2391,7 +2407,7 @@ packages: pretty-format: 29.3.1 dev: true - /jest-watcher/29.3.1: + /jest-watcher@29.3.1: resolution: {integrity: sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2405,7 +2421,7 @@ packages: string-length: 4.0.2 dev: true - /jest-worker/29.3.1: + /jest-worker@29.3.1: resolution: {integrity: sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2415,7 +2431,7 @@ packages: supports-color: 8.1.1 dev: true - /jest/29.3.1_ucpl6toqp57nqodtp3vxxi6g5a: + /jest@29.3.1(@types/node@18.13.0)(ts-node@10.9.1): resolution: {integrity: sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -2425,25 +2441,25 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.3.1_ts-node@10.9.1 + '@jest/core': 29.3.1(ts-node@10.9.1) '@jest/types': 29.3.1 import-local: 3.1.0 - jest-cli: 29.3.1_ucpl6toqp57nqodtp3vxxi6g5a + jest-cli: 29.3.1(@types/node@18.13.0)(ts-node@10.9.1) transitivePeerDependencies: - '@types/node' - supports-color - ts-node dev: true - /js-sdsl/4.2.0: + /js-sdsl@4.2.0: resolution: {integrity: sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==} dev: true - /js-tokens/4.0.0: + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true - /js-yaml/3.14.1: + /js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true dependencies: @@ -2451,48 +2467,48 @@ packages: esprima: 4.0.1 dev: true - /js-yaml/4.1.0: + /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true dependencies: argparse: 2.0.1 dev: true - /jsesc/2.5.2: + /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true dev: true - /json-parse-even-better-errors/2.3.1: + /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true - /json-schema-traverse/0.4.1: + /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true - /json-stable-stringify-without-jsonify/1.0.1: + /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true - /json5/2.2.3: + /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true dev: true - /kleur/3.0.3: + /kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} dev: true - /leven/3.1.0: + /leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} dev: true - /levn/0.4.1: + /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} dependencies: @@ -2500,16 +2516,16 @@ packages: type-check: 0.4.0 dev: true - /lilconfig/2.0.6: + /lilconfig@2.0.6: resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} engines: {node: '>=10'} dev: true - /lines-and-columns/1.2.4: + /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true - /lint-staged/13.0.4: + /lint-staged@13.0.4: resolution: {integrity: sha512-HxlHCXoYRsq9QCby5wFozmZW00hMs/9e3l+/dz6Qr8Kle4UH0kJTdABAbqhzG+3pcG6QjL9kz7NgGBfph+a5dw==} engines: {node: ^14.13.1 || >=16.0.0} hasBin: true @@ -2532,7 +2548,7 @@ packages: - supports-color dev: true - /listr2/5.0.6: + /listr2@5.0.6: resolution: {integrity: sha512-u60KxKBy1BR2uLJNTWNptzWQ1ob/gjMzIJPZffAENzpZqbMZ/5PrXXOomDcevIS/+IB7s1mmCEtSlT2qHWMqag==} engines: {node: ^14.13.1 || >=16.0.0} peerDependencies: @@ -2551,29 +2567,29 @@ packages: wrap-ansi: 7.0.0 dev: true - /locate-path/5.0.0: + /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} dependencies: p-locate: 4.1.0 dev: true - /locate-path/6.0.0: + /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} dependencies: p-locate: 5.0.0 dev: true - /lodash.memoize/4.1.2: + /lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} dev: true - /lodash.merge/4.6.2: + /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true - /log-update/4.0.0: + /log-update@4.0.0: resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} engines: {node: '>=10'} dependencies: @@ -2583,40 +2599,40 @@ packages: wrap-ansi: 6.2.0 dev: true - /lru-cache/6.0.0: + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} dependencies: yallist: 4.0.0 dev: true - /make-dir/3.1.0: + /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} dependencies: semver: 6.3.0 dev: true - /make-error/1.3.6: + /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true - /makeerror/1.0.12: + /makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: tmpl: 1.0.5 dev: true - /merge-stream/2.0.0: + /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true - /merge2/1.4.1: + /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} dev: true - /micromatch/4.0.5: + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} dependencies: @@ -2624,30 +2640,30 @@ packages: picomatch: 2.3.1 dev: true - /mimic-fn/2.1.0: + /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} dev: true - /mimic-fn/4.0.0: + /mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} dev: true - /minimatch/3.1.2: + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 dev: true - /minipass/3.3.6: + /minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} dependencies: yallist: 4.0.0 dev: true - /minizlib/2.1.2: + /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} dependencies: @@ -2655,25 +2671,25 @@ packages: yallist: 4.0.0 dev: true - /mkdirp/1.0.4: + /mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true dev: true - /ms/2.1.2: + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true - /natural-compare-lite/1.4.0: + /natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} dev: true - /natural-compare/1.4.0: + /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true - /node-fetch/2.6.7: + /node-fetch@2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} peerDependencies: @@ -2685,58 +2701,58 @@ packages: whatwg-url: 5.0.0 dev: true - /node-int64/0.4.0: + /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} dev: true - /node-releases/2.0.6: + /node-releases@2.0.6: resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} dev: true - /normalize-path/3.0.0: + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} dev: true - /npm-run-path/4.0.1: + /npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} dependencies: path-key: 3.1.1 dev: true - /npm-run-path/5.1.0: + /npm-run-path@5.1.0: resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: path-key: 4.0.0 dev: true - /object-inspect/1.12.2: + /object-inspect@1.12.2: resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} dev: true - /once/1.4.0: + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 dev: true - /onetime/5.1.2: + /onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} dependencies: mimic-fn: 2.1.0 dev: true - /onetime/6.0.0: + /onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} dependencies: mimic-fn: 4.0.0 dev: true - /optionator/0.9.1: + /optionator@0.9.1: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} engines: {node: '>= 0.8.0'} dependencies: @@ -2748,54 +2764,54 @@ packages: word-wrap: 1.2.3 dev: true - /p-limit/2.3.0: + /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} dependencies: p-try: 2.2.0 dev: true - /p-limit/3.1.0: + /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 dev: true - /p-locate/4.1.0: + /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} dependencies: p-limit: 2.3.0 dev: true - /p-locate/5.0.0: + /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: true - /p-map/4.0.0: + /p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} dependencies: aggregate-error: 3.1.0 dev: true - /p-try/2.2.0: + /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} dev: true - /parent-module/1.0.1: + /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} dependencies: callsites: 3.1.0 dev: true - /parse-json/5.2.0: + /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: @@ -2805,68 +2821,68 @@ packages: lines-and-columns: 1.2.4 dev: true - /path-exists/4.0.0: + /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} dev: true - /path-is-absolute/1.0.1: + /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} dev: true - /path-key/3.1.1: + /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} dev: true - /path-key/4.0.0: + /path-key@4.0.0: resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} engines: {node: '>=12'} dev: true - /path-parse/1.0.7: + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true - /path-type/4.0.0: + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} dev: true - /picocolors/1.0.0: + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true - /picomatch/2.3.1: + /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} dev: true - /pidtree/0.6.0: + /pidtree@0.6.0: resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} engines: {node: '>=0.10'} hasBin: true dev: true - /pirates/4.0.5: + /pirates@4.0.5: resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} engines: {node: '>= 6'} dev: true - /pkg-dir/4.2.0: + /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: true - /prelude-ls/1.2.1: + /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} dev: true - /pretty-format/29.3.1: + /pretty-format@29.3.1: resolution: {integrity: sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2875,7 +2891,7 @@ packages: react-is: 18.2.0 dev: true - /prompts/2.4.2: + /prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} dependencies: @@ -2883,51 +2899,51 @@ packages: sisteransi: 1.0.5 dev: true - /punycode/2.1.1: + /punycode@2.1.1: resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} engines: {node: '>=6'} dev: true - /queue-microtask/1.2.3: + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true - /react-is/18.2.0: + /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} dev: true - /regexpp/3.2.0: + /regexpp@3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} dev: true - /require-directory/2.1.1: + /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - /resolve-cwd/3.0.0: + /resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} dependencies: resolve-from: 5.0.0 dev: true - /resolve-from/4.0.0: + /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} dev: true - /resolve-from/5.0.0: + /resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} dev: true - /resolve.exports/1.1.0: + /resolve.exports@1.1.0: resolution: {integrity: sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==} engines: {node: '>=10'} dev: true - /resolve/1.22.1: + /resolve@1.22.1: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true dependencies: @@ -2936,7 +2952,7 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true - /restore-cursor/3.1.0: + /restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} dependencies: @@ -2944,40 +2960,40 @@ packages: signal-exit: 3.0.7 dev: true - /reusify/1.0.4: + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true - /rfdc/1.3.0: + /rfdc@1.3.0: resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} dev: true - /rimraf/3.0.2: + /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: glob: 7.2.3 dev: true - /run-parallel/1.2.0: + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 dev: true - /rxjs/7.5.7: + /rxjs@7.5.7: resolution: {integrity: sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==} dependencies: tslib: 2.4.1 dev: true - /semver/6.3.0: + /semver@6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true dev: true - /semver/7.3.8: + /semver@7.3.8: resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} engines: {node: '>=10'} hasBin: true @@ -2985,32 +3001,32 @@ packages: lru-cache: 6.0.0 dev: true - /shebang-command/2.0.0: + /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 dev: true - /shebang-regex/3.0.0: + /shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} dev: true - /signal-exit/3.0.7: + /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true - /sisteransi/1.0.5: + /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: true - /slash/3.0.0: + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} dev: true - /slice-ansi/3.0.0: + /slice-ansi@3.0.0: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} dependencies: @@ -3019,7 +3035,7 @@ packages: is-fullwidth-code-point: 3.0.0 dev: true - /slice-ansi/4.0.0: + /slice-ansi@4.0.0: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} dependencies: @@ -3028,7 +3044,7 @@ packages: is-fullwidth-code-point: 3.0.0 dev: true - /slice-ansi/5.0.0: + /slice-ansi@5.0.0: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} dependencies: @@ -3036,35 +3052,35 @@ packages: is-fullwidth-code-point: 4.0.0 dev: true - /source-map-support/0.5.13: + /source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 dev: true - /source-map/0.6.1: + /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} dev: true - /sprintf-js/1.0.3: + /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true - /stack-utils/2.0.6: + /stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} dependencies: escape-string-regexp: 2.0.0 dev: true - /string-argv/0.3.1: + /string-argv@0.3.1: resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} engines: {node: '>=0.6.19'} dev: true - /string-length/4.0.2: + /string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} dependencies: @@ -3072,7 +3088,7 @@ packages: strip-ansi: 6.0.1 dev: true - /string-width/4.2.3: + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} dependencies: @@ -3080,7 +3096,7 @@ packages: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string-width/5.1.2: + /string-width@5.1.2: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} dependencies: @@ -3089,66 +3105,66 @@ packages: strip-ansi: 7.0.1 dev: true - /strip-ansi/6.0.1: + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 - /strip-ansi/7.0.1: + /strip-ansi@7.0.1: resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 dev: true - /strip-bom/4.0.0: + /strip-bom@4.0.0: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} dev: true - /strip-final-newline/2.0.0: + /strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} dev: true - /strip-final-newline/3.0.0: + /strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} dev: true - /strip-json-comments/3.1.1: + /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} dev: true - /supports-color/5.5.0: + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} dependencies: has-flag: 3.0.0 dev: true - /supports-color/7.2.0: + /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} dependencies: has-flag: 4.0.0 dev: true - /supports-color/8.1.1: + /supports-color@8.1.1: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} dependencies: has-flag: 4.0.0 dev: true - /supports-preserve-symlinks-flag/1.0.0: + /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} dev: true - /tar/6.1.12: + /tar@6.1.12: resolution: {integrity: sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==} engines: {node: '>=10'} dependencies: @@ -3160,7 +3176,7 @@ packages: yallist: 4.0.0 dev: true - /test-exclude/6.0.0: + /test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} dependencies: @@ -3169,35 +3185,35 @@ packages: minimatch: 3.1.2 dev: true - /text-table/0.2.0: + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true - /through/2.3.8: + /through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} dev: true - /tmpl/1.0.5: + /tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} dev: true - /to-fast-properties/2.0.0: + /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} dev: true - /to-regex-range/5.0.1: + /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 dev: true - /tr46/0.0.3: + /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: true - /ts-jest/29.1.0_agn56dcmrvrjxyb3wli3ryy5gy: + /ts-jest@29.1.0(@babel/core@7.20.5)(jest@29.3.1)(typescript@5.0.4): resolution: {integrity: sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -3218,9 +3234,10 @@ packages: esbuild: optional: true dependencies: + '@babel/core': 7.20.5 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.3.1_ucpl6toqp57nqodtp3vxxi6g5a + jest: 29.3.1(@types/node@18.13.0)(ts-node@10.9.1) jest-util: 29.3.1 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -3230,7 +3247,7 @@ packages: yargs-parser: 21.1.1 dev: true - /ts-node/10.9.1_ztltjo43tmsep75uum5mceyifa: + /ts-node@10.9.1(@types/node@18.13.0)(typescript@5.0.4): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -3261,15 +3278,15 @@ packages: yn: 3.1.1 dev: true - /tslib/1.14.1: + /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /tslib/2.4.1: + /tslib@2.4.1: resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} dev: true - /tsutils/3.21.0_typescript@5.0.4: + /tsutils@3.21.0(typescript@5.0.4): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: @@ -3279,35 +3296,35 @@ packages: typescript: 5.0.4 dev: true - /type-check/0.4.0: + /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 dev: true - /type-detect/4.0.8: + /type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} dev: true - /type-fest/0.20.2: + /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} dev: true - /type-fest/0.21.3: + /type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} dev: true - /typescript/5.0.4: + /typescript@5.0.4: resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} engines: {node: '>=12.20'} hasBin: true dev: true - /update-browserslist-db/1.0.10_browserslist@4.21.4: + /update-browserslist-db@1.0.10(browserslist@4.21.4): resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} hasBin: true peerDependencies: @@ -3318,17 +3335,17 @@ packages: picocolors: 1.0.0 dev: true - /uri-js/4.4.1: + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.1.1 dev: true - /v8-compile-cache-lib/3.0.1: + /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true - /v8-to-istanbul/9.0.1: + /v8-to-istanbul@9.0.1: resolution: {integrity: sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==} engines: {node: '>=10.12.0'} dependencies: @@ -3337,24 +3354,24 @@ packages: convert-source-map: 1.9.0 dev: true - /walker/1.0.8: + /walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: makeerror: 1.0.12 dev: true - /webidl-conversions/3.0.1: + /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} dev: true - /whatwg-url/5.0.0: + /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 dev: true - /which/2.0.2: + /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true @@ -3362,12 +3379,12 @@ packages: isexe: 2.0.0 dev: true - /word-wrap/1.2.3: + /word-wrap@1.2.3: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} dev: true - /wrap-ansi/6.2.0: + /wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} dependencies: @@ -3376,7 +3393,7 @@ packages: strip-ansi: 6.0.1 dev: true - /wrap-ansi/7.0.0: + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} dependencies: @@ -3384,11 +3401,11 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 - /wrappy/1.0.2: + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true - /write-file-atomic/4.0.2: + /write-file-atomic@4.0.2: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: @@ -3396,24 +3413,24 @@ packages: signal-exit: 3.0.7 dev: true - /y18n/5.0.8: + /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - /yallist/4.0.0: + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true - /yaml/2.1.3: + /yaml@2.1.3: resolution: {integrity: sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg==} engines: {node: '>= 14'} dev: true - /yargs-parser/21.1.1: + /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - /yargs/17.6.2: + /yargs@17.6.2: resolution: {integrity: sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==} engines: {node: '>=12'} dependencies: @@ -3425,12 +3442,12 @@ packages: y18n: 5.0.8 yargs-parser: 21.1.1 - /yn/3.1.1: + /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} dev: true - /yocto-queue/0.1.0: + /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true From 5f774bbea161853c26fdcad46a12d4bed47dec92 Mon Sep 17 00:00:00 2001 From: Stanislav Makarov Date: Thu, 20 Apr 2023 00:24:32 +0300 Subject: [PATCH 28/58] docs: rephrase package description --- tools/package.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/package.mjs b/tools/package.mjs index 2c1b129..5aaae49 100644 --- a/tools/package.mjs +++ b/tools/package.mjs @@ -23,7 +23,7 @@ function generatePackage() { name: 'jewel-case', version, author: 'TradingView, Inc.', - description: 'Application distribution', + description: 'jewel-case: application releases as a code', license: 'MIT', keywords: ['msix', 'deb', 's3', 'dmg'], repository: { From c18baaeb7b68df22f8db5ee6c571b14731852588 Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Fri, 21 Apr 2023 10:15:51 +0300 Subject: [PATCH 29/58] some hepler things like artifactory, fs and http --- package.json | 1 + pnpm-lock.yaml | 1019 +++++++++++++++++++++++++++++++++++++++ src/artifactory.mts | 89 ++++ src/cli.mts | 8 +- src/config.mts | 5 +- src/deb/deb-builder.mts | 24 + src/deb/deb-config.mts | 4 + src/fs.mts | 19 + src/http.mts | 91 ++++ src/ibuilder.mts | 6 + src/index.mts | 8 +- 11 files changed, 1267 insertions(+), 7 deletions(-) create mode 100644 src/artifactory.mts create mode 100644 src/deb/deb-builder.mts create mode 100644 src/deb/deb-config.mts create mode 100644 src/fs.mts create mode 100644 src/http.mts create mode 100644 src/ibuilder.mts diff --git a/package.json b/package.json index 647ac4b..c856cdb 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "husky": "^8.0.0", "jest": "^29.3.1", "lint-staged": "^13.0.4", + "s3-groundskeeper": "0.2.2", "ts-jest": "^29.1.0", "ts-node": "^10.9.1", "typescript": "^5.0.4" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0dfd696..a0eeaa5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,7 @@ importers: husky: ^8.0.0 jest: ^29.3.1 lint-staged: ^13.0.4 + s3-groundskeeper: 0.2.2 ts-jest: ^29.1.0 ts-node: ^10.9.1 typescript: ^5.0.4 @@ -37,6 +38,7 @@ importers: husky: 8.0.2 jest: 29.3.1_qypvtqa6r6yb6tpkajpqa7nibu lint-staged: 13.0.4 + s3-groundskeeper: 0.2.2 ts-jest: 29.1.0_agn56dcmrvrjxyb3wli3ryy5gy ts-node: 10.9.1_prmsu5cq6ukh7eypgb4uwwpoa4 typescript: 5.0.4 @@ -57,6 +59,955 @@ packages: '@jridgewell/trace-mapping': 0.3.17 dev: true + /@aws-crypto/crc32/3.0.0: + resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==} + dependencies: + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.310.0 + tslib: 1.14.1 + dev: true + + /@aws-crypto/crc32c/3.0.0: + resolution: {integrity: sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==} + dependencies: + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.310.0 + tslib: 1.14.1 + dev: true + + /@aws-crypto/ie11-detection/3.0.0: + resolution: {integrity: sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==} + dependencies: + tslib: 1.14.1 + dev: true + + /@aws-crypto/sha1-browser/3.0.0: + resolution: {integrity: sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw==} + dependencies: + '@aws-crypto/ie11-detection': 3.0.0 + '@aws-crypto/supports-web-crypto': 3.0.0 + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-locate-window': 3.310.0 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + dev: true + + /@aws-crypto/sha256-browser/3.0.0: + resolution: {integrity: sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==} + dependencies: + '@aws-crypto/ie11-detection': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-crypto/supports-web-crypto': 3.0.0 + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-locate-window': 3.310.0 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + dev: true + + /@aws-crypto/sha256-js/3.0.0: + resolution: {integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==} + dependencies: + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.310.0 + tslib: 1.14.1 + dev: true + + /@aws-crypto/supports-web-crypto/3.0.0: + resolution: {integrity: sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==} + dependencies: + tslib: 1.14.1 + dev: true + + /@aws-crypto/util/3.0.0: + resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==} + dependencies: + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + dev: true + + /@aws-sdk/abort-controller/3.310.0: + resolution: {integrity: sha512-v1zrRQxDLA1MdPim159Vx/CPHqsB4uybSxRi1CnfHO5ZjHryx3a5htW2gdGAykVCul40+yJXvfpufMrELVxH+g==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/chunked-blob-reader/3.310.0: + resolution: {integrity: sha512-CrJS3exo4mWaLnWxfCH+w88Ou0IcAZSIkk4QbmxiHl/5Dq705OLoxf4385MVyExpqpeVJYOYQ2WaD8i/pQZ2fg==} + dependencies: + tslib: 2.5.0 + dev: true + + /@aws-sdk/client-s3/3.315.0: + resolution: {integrity: sha512-sE2pCFNrhkn1XdqkHx1GEd4eKg/kITk2zHETpkQCUMAVZ1MDuY/uUZzRjbAn9sm9EsJ03Z/vOuK4DkxlLFY+8g==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha1-browser': 3.0.0 + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sts': 3.315.0 + '@aws-sdk/config-resolver': 3.310.0 + '@aws-sdk/credential-provider-node': 3.315.0 + '@aws-sdk/eventstream-serde-browser': 3.310.0 + '@aws-sdk/eventstream-serde-config-resolver': 3.310.0 + '@aws-sdk/eventstream-serde-node': 3.310.0 + '@aws-sdk/fetch-http-handler': 3.310.0 + '@aws-sdk/hash-blob-browser': 3.310.0 + '@aws-sdk/hash-node': 3.310.0 + '@aws-sdk/hash-stream-node': 3.310.0 + '@aws-sdk/invalid-dependency': 3.310.0 + '@aws-sdk/md5-js': 3.310.0 + '@aws-sdk/middleware-bucket-endpoint': 3.310.0 + '@aws-sdk/middleware-content-length': 3.310.0 + '@aws-sdk/middleware-endpoint': 3.310.0 + '@aws-sdk/middleware-expect-continue': 3.310.0 + '@aws-sdk/middleware-flexible-checksums': 3.310.0 + '@aws-sdk/middleware-host-header': 3.310.0 + '@aws-sdk/middleware-location-constraint': 3.310.0 + '@aws-sdk/middleware-logger': 3.310.0 + '@aws-sdk/middleware-recursion-detection': 3.310.0 + '@aws-sdk/middleware-retry': 3.310.0 + '@aws-sdk/middleware-sdk-s3': 3.310.0 + '@aws-sdk/middleware-serde': 3.310.0 + '@aws-sdk/middleware-signing': 3.310.0 + '@aws-sdk/middleware-ssec': 3.310.0 + '@aws-sdk/middleware-stack': 3.310.0 + '@aws-sdk/middleware-user-agent': 3.310.0 + '@aws-sdk/node-config-provider': 3.310.0 + '@aws-sdk/node-http-handler': 3.310.0 + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/signature-v4-multi-region': 3.310.0 + '@aws-sdk/smithy-client': 3.315.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/url-parser': 3.310.0 + '@aws-sdk/util-base64': 3.310.0 + '@aws-sdk/util-body-length-browser': 3.310.0 + '@aws-sdk/util-body-length-node': 3.310.0 + '@aws-sdk/util-defaults-mode-browser': 3.315.0 + '@aws-sdk/util-defaults-mode-node': 3.315.0 + '@aws-sdk/util-endpoints': 3.310.0 + '@aws-sdk/util-retry': 3.310.0 + '@aws-sdk/util-stream-browser': 3.310.0 + '@aws-sdk/util-stream-node': 3.310.0 + '@aws-sdk/util-user-agent-browser': 3.310.0 + '@aws-sdk/util-user-agent-node': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + '@aws-sdk/util-waiter': 3.310.0 + '@aws-sdk/xml-builder': 3.310.0 + fast-xml-parser: 4.1.2 + tslib: 2.5.0 + transitivePeerDependencies: + - '@aws-sdk/signature-v4-crt' + - aws-crt + dev: true + + /@aws-sdk/client-sso-oidc/3.315.0: + resolution: {integrity: sha512-OJgtmx6SpCWHBDCxBBi36Ro44uCqZBufGkThP/PVYrgVnRVnJ4V18d2wNGKmS37zKmCHHJPnhMPlGOgE2qyVPQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/config-resolver': 3.310.0 + '@aws-sdk/fetch-http-handler': 3.310.0 + '@aws-sdk/hash-node': 3.310.0 + '@aws-sdk/invalid-dependency': 3.310.0 + '@aws-sdk/middleware-content-length': 3.310.0 + '@aws-sdk/middleware-endpoint': 3.310.0 + '@aws-sdk/middleware-host-header': 3.310.0 + '@aws-sdk/middleware-logger': 3.310.0 + '@aws-sdk/middleware-recursion-detection': 3.310.0 + '@aws-sdk/middleware-retry': 3.310.0 + '@aws-sdk/middleware-serde': 3.310.0 + '@aws-sdk/middleware-stack': 3.310.0 + '@aws-sdk/middleware-user-agent': 3.310.0 + '@aws-sdk/node-config-provider': 3.310.0 + '@aws-sdk/node-http-handler': 3.310.0 + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/smithy-client': 3.315.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/url-parser': 3.310.0 + '@aws-sdk/util-base64': 3.310.0 + '@aws-sdk/util-body-length-browser': 3.310.0 + '@aws-sdk/util-body-length-node': 3.310.0 + '@aws-sdk/util-defaults-mode-browser': 3.315.0 + '@aws-sdk/util-defaults-mode-node': 3.315.0 + '@aws-sdk/util-endpoints': 3.310.0 + '@aws-sdk/util-retry': 3.310.0 + '@aws-sdk/util-user-agent-browser': 3.310.0 + '@aws-sdk/util-user-agent-node': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + tslib: 2.5.0 + transitivePeerDependencies: + - aws-crt + dev: true + + /@aws-sdk/client-sso/3.315.0: + resolution: {integrity: sha512-P3QOOyHQER7EDVCzXOsAaJE2p/qfdsSFsYv8k2S8LqEKGH0fViQ4Ph540uKlmaOt1kEhwH1wI6cLRMJJX9XV4Q==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/config-resolver': 3.310.0 + '@aws-sdk/fetch-http-handler': 3.310.0 + '@aws-sdk/hash-node': 3.310.0 + '@aws-sdk/invalid-dependency': 3.310.0 + '@aws-sdk/middleware-content-length': 3.310.0 + '@aws-sdk/middleware-endpoint': 3.310.0 + '@aws-sdk/middleware-host-header': 3.310.0 + '@aws-sdk/middleware-logger': 3.310.0 + '@aws-sdk/middleware-recursion-detection': 3.310.0 + '@aws-sdk/middleware-retry': 3.310.0 + '@aws-sdk/middleware-serde': 3.310.0 + '@aws-sdk/middleware-stack': 3.310.0 + '@aws-sdk/middleware-user-agent': 3.310.0 + '@aws-sdk/node-config-provider': 3.310.0 + '@aws-sdk/node-http-handler': 3.310.0 + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/smithy-client': 3.315.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/url-parser': 3.310.0 + '@aws-sdk/util-base64': 3.310.0 + '@aws-sdk/util-body-length-browser': 3.310.0 + '@aws-sdk/util-body-length-node': 3.310.0 + '@aws-sdk/util-defaults-mode-browser': 3.315.0 + '@aws-sdk/util-defaults-mode-node': 3.315.0 + '@aws-sdk/util-endpoints': 3.310.0 + '@aws-sdk/util-retry': 3.310.0 + '@aws-sdk/util-user-agent-browser': 3.310.0 + '@aws-sdk/util-user-agent-node': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + tslib: 2.5.0 + transitivePeerDependencies: + - aws-crt + dev: true + + /@aws-sdk/client-sts/3.315.0: + resolution: {integrity: sha512-e34plg6m0hScADIPiu5kCKoiJVXRLRiAuens+iwMse0oPUmrv41hdjgufwWGA/pcNkEGzMdVS88Z4khxB3LHBw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/config-resolver': 3.310.0 + '@aws-sdk/credential-provider-node': 3.315.0 + '@aws-sdk/fetch-http-handler': 3.310.0 + '@aws-sdk/hash-node': 3.310.0 + '@aws-sdk/invalid-dependency': 3.310.0 + '@aws-sdk/middleware-content-length': 3.310.0 + '@aws-sdk/middleware-endpoint': 3.310.0 + '@aws-sdk/middleware-host-header': 3.310.0 + '@aws-sdk/middleware-logger': 3.310.0 + '@aws-sdk/middleware-recursion-detection': 3.310.0 + '@aws-sdk/middleware-retry': 3.310.0 + '@aws-sdk/middleware-sdk-sts': 3.310.0 + '@aws-sdk/middleware-serde': 3.310.0 + '@aws-sdk/middleware-signing': 3.310.0 + '@aws-sdk/middleware-stack': 3.310.0 + '@aws-sdk/middleware-user-agent': 3.310.0 + '@aws-sdk/node-config-provider': 3.310.0 + '@aws-sdk/node-http-handler': 3.310.0 + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/smithy-client': 3.315.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/url-parser': 3.310.0 + '@aws-sdk/util-base64': 3.310.0 + '@aws-sdk/util-body-length-browser': 3.310.0 + '@aws-sdk/util-body-length-node': 3.310.0 + '@aws-sdk/util-defaults-mode-browser': 3.315.0 + '@aws-sdk/util-defaults-mode-node': 3.315.0 + '@aws-sdk/util-endpoints': 3.310.0 + '@aws-sdk/util-retry': 3.310.0 + '@aws-sdk/util-user-agent-browser': 3.310.0 + '@aws-sdk/util-user-agent-node': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + fast-xml-parser: 4.1.2 + tslib: 2.5.0 + transitivePeerDependencies: + - aws-crt + dev: true + + /@aws-sdk/config-resolver/3.310.0: + resolution: {integrity: sha512-8vsT+/50lOqfDxka9m/rRt6oxv1WuGZoP8oPMk0Dt+TxXMbAzf4+rejBgiB96wshI1k3gLokYRjSQZn+dDtT8g==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-config-provider': 3.310.0 + '@aws-sdk/util-middleware': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/credential-provider-env/3.310.0: + resolution: {integrity: sha512-vvIPQpI16fj95xwS7M3D48F7QhZJBnnCgB5lR+b7So+vsG9ibm1mZRVGzVpdxCvgyOhHFbvrby9aalNJmmIP1A==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/credential-provider-imds/3.310.0: + resolution: {integrity: sha512-baxK7Zp6dai5AGW01FIW27xS2KAaPUmKLIXv5SvFYsUgXXvNW55im4uG3b+2gA0F7V+hXvVBH08OEqmwW6we5w==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/node-config-provider': 3.310.0 + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/url-parser': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/credential-provider-ini/3.315.0: + resolution: {integrity: sha512-TZbYNbQkNgANx3KsWmJEyBsnfUBq/XKqYYc/VQf1L4eI+GMUw2eKpNV0MTsyviViy2st7W4SiSgtsvXyeVp9xg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/credential-provider-env': 3.310.0 + '@aws-sdk/credential-provider-imds': 3.310.0 + '@aws-sdk/credential-provider-process': 3.310.0 + '@aws-sdk/credential-provider-sso': 3.315.0 + '@aws-sdk/credential-provider-web-identity': 3.310.0 + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/shared-ini-file-loader': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + transitivePeerDependencies: + - aws-crt + dev: true + + /@aws-sdk/credential-provider-node/3.315.0: + resolution: {integrity: sha512-OuzKAIg+xPAzBrb/Big5VKDpJmBhVR+N0Hfflrjj2BunQGWO7zxtkKFCz921MtP9ZunDV+UxzTpar8U5TAPtzA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/credential-provider-env': 3.310.0 + '@aws-sdk/credential-provider-imds': 3.310.0 + '@aws-sdk/credential-provider-ini': 3.315.0 + '@aws-sdk/credential-provider-process': 3.310.0 + '@aws-sdk/credential-provider-sso': 3.315.0 + '@aws-sdk/credential-provider-web-identity': 3.310.0 + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/shared-ini-file-loader': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + transitivePeerDependencies: + - aws-crt + dev: true + + /@aws-sdk/credential-provider-process/3.310.0: + resolution: {integrity: sha512-h73sg6GPMUWC+3zMCbA1nZ2O03nNJt7G96JdmnantiXBwHpRKWW8nBTLzx5uhXn6hTuTaoQRP/P+oxQJKYdMmA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/shared-ini-file-loader': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/credential-provider-sso/3.315.0: + resolution: {integrity: sha512-oMDGwT67cLgLiLEj5UwAiOVo7mb0l4vi2nk+5pgPMpC3cBlAfA0y1IJe4FHp+Vz52F0nvURZZbdWhX6RgMMaqQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/client-sso': 3.315.0 + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/shared-ini-file-loader': 3.310.0 + '@aws-sdk/token-providers': 3.315.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + transitivePeerDependencies: + - aws-crt + dev: true + + /@aws-sdk/credential-provider-web-identity/3.310.0: + resolution: {integrity: sha512-H4SzuZXILNhK6/IR1uVvsUDZvzc051hem7GLyYghBCu8mU+tq28YhKE8MfSroi6eL2e5Vujloij1OM2EQQkPkw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/eventstream-codec/3.310.0: + resolution: {integrity: sha512-clIeSgWbZbxwtsxZ/yoedNM0/kJFSIjjHPikuDGhxhqc+vP6TN3oYyVMFrYwFaTFhk2+S5wZcWYMw8Op1pWo+A==} + dependencies: + '@aws-crypto/crc32': 3.0.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-hex-encoding': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/eventstream-serde-browser/3.310.0: + resolution: {integrity: sha512-3S6ziuQVALgEyz0TANGtYDVeG8ArK4Y05mcgrs8qUTmsvlDIXX37cR/DvmVbNB76M4IrsZeSAIajL9644CywkA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/eventstream-serde-universal': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/eventstream-serde-config-resolver/3.310.0: + resolution: {integrity: sha512-8s1Qdn9STj+sV75nUp9yt0W6fHS4BZ2jTm4Z/1Pcbvh2Gqs0WjH5n2StS+pDW5Y9J/HSGBl0ogmUr5lC5bXFHg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/eventstream-serde-node/3.310.0: + resolution: {integrity: sha512-kSnRomCgW43K9TmQYuwN9+AoYPnhyOKroanUMyZEzJk7rpCPMj4OzaUpXfDYOvznFNYn7NLaH6nHLJAr0VPlJA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/eventstream-serde-universal': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/eventstream-serde-universal/3.310.0: + resolution: {integrity: sha512-Qyjt5k/waV5cDukpgT824ISZAz5U0pwzLz5ztR409u85AGNkF/9n7MS+LSyBUBSb0WJ5pUeSD47WBk+nLq9Nhw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/eventstream-codec': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/fetch-http-handler/3.310.0: + resolution: {integrity: sha512-Bi9vIwzdkw1zMcvi/zGzlWS9KfIEnAq4NNhsnCxbQ4OoIRU9wvU+WGZdBBhxg0ZxZmpp1j1aZhU53lLjA07MHw==} + dependencies: + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/querystring-builder': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-base64': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/hash-blob-browser/3.310.0: + resolution: {integrity: sha512-OoR8p0cbypToysLT0v3o2oyjy6+DKrY7GNCAzHOHJK9xmqXCt+DsjKoPeiY7o1sWX2aN6Plmvubj/zWxMKEn/A==} + dependencies: + '@aws-sdk/chunked-blob-reader': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/hash-node/3.310.0: + resolution: {integrity: sha512-NvE2fhRc8GRwCXBfDehxVAWCmVwVMILliAKVPAEr4yz2CkYs0tqU51S48x23dtna07H4qHtgpeNqVTthcIQOEQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-buffer-from': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/hash-stream-node/3.310.0: + resolution: {integrity: sha512-ZoXdybNgvMz1Hl6k/e32xVL3jmG5p2IEk5mTtLfFEuskTJ74Z+VMYKkkF1whyy7KQfH83H+TQGnsGtlRCchQKw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/invalid-dependency/3.310.0: + resolution: {integrity: sha512-1s5RG5rSPXoa/aZ/Kqr5U/7lqpx+Ry81GprQ2bxWqJvWQIJ0IRUwo5pk8XFxbKVr/2a+4lZT/c3OGoBOM1yRRA==} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/is-array-buffer/3.310.0: + resolution: {integrity: sha512-urnbcCR+h9NWUnmOtet/s4ghvzsidFmspfhYaHAmSRdy9yDjdjBJMFjjsn85A1ODUktztm+cVncXjQ38WCMjMQ==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.5.0 + dev: true + + /@aws-sdk/md5-js/3.310.0: + resolution: {integrity: sha512-x5sRBUrEfLWAS1EhwbbDQ7cXq6uvBxh3qR2XAsnGvFFceTeAadk7cVogWxlk3PC+OCeeym7c3/6Bv2HQ2f1YyQ==} + dependencies: + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/middleware-bucket-endpoint/3.310.0: + resolution: {integrity: sha512-uJJfHI7v4AgbJZRLtyI8ap2QRWkBokGc3iyUoQ+dVNT3/CE2ZCu694A6W+H0dRqg79dIE+f9CRNdtLGa/Ehhvg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-arn-parser': 3.310.0 + '@aws-sdk/util-config-provider': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/middleware-content-length/3.310.0: + resolution: {integrity: sha512-P8tQZxgDt6CAh1wd/W6WPzjc+uWPJwQkm+F7rAwRlM+k9q17HrhnksGDKcpuuLyIhPQYdmOMIkpKVgXGa4avhQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/middleware-endpoint/3.310.0: + resolution: {integrity: sha512-Z+N2vOL8K354/lstkClxLLsr6hCpVRh+0tCMXrVj66/NtKysCEZ/0b9LmqOwD9pWHNiI2mJqXwY0gxNlKAroUg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/middleware-serde': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/url-parser': 3.310.0 + '@aws-sdk/util-middleware': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/middleware-expect-continue/3.310.0: + resolution: {integrity: sha512-l3d1z2gt+gINJDnPSyu84IxfzjzPfCQrqC1sunw2cZGo/sXtEiq698Q3SiTcO2PGP4LBQAy2RHb5wVBJP708CQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/middleware-flexible-checksums/3.310.0: + resolution: {integrity: sha512-5ndnLgzgGVpWkmHBAiYkagHqiSuow8q62J4J6E2PzaQ77+fm8W3nfdy7hK5trHokEyouCZdxT/XK/IRhgj/4PA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/crc32': 3.0.0 + '@aws-crypto/crc32c': 3.0.0 + '@aws-sdk/is-array-buffer': 3.310.0 + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/middleware-host-header/3.310.0: + resolution: {integrity: sha512-QWSA+46/hXorXyWa61ic2K7qZzwHTiwfk2e9mRRjeIRepUgI3qxFjsYqrWtrOGBjmFmq0pYIY8Bb/DCJuQqcoA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/middleware-location-constraint/3.310.0: + resolution: {integrity: sha512-LFm0JTQWwTPWL/tZU2wsQTl8J5PpDEkXjEhaXVKamtyH0xhysRqd+0n92n65dc8oztAuQkb9xUbErGn5b6gsew==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/middleware-logger/3.310.0: + resolution: {integrity: sha512-Lurm8XofrASBRnAVtiSNuDSRsRqPNg27RIFLLsLp/pqog9nFJ0vz0kgdb9S5Z+zw83Mm+UlqOe6D8NTUNp4fVg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/middleware-recursion-detection/3.310.0: + resolution: {integrity: sha512-SuB75/xk/gyue24gkriTwO2jFd7YcUGZDClQYuRejgbXSa3CO0lWyawQtfLcSSEBp9izrEVXuFH24K1eAft5nQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/middleware-retry/3.310.0: + resolution: {integrity: sha512-oTPsRy2W4s+dfxbJPW7Km+hHtv/OMsNsVfThAq8DDYKC13qlr1aAyOqGLD+dpBy2aKe7ss517Sy2HcHtHqm7/g==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/service-error-classification': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-middleware': 3.310.0 + '@aws-sdk/util-retry': 3.310.0 + tslib: 2.5.0 + uuid: 8.3.2 + dev: true + + /@aws-sdk/middleware-sdk-s3/3.310.0: + resolution: {integrity: sha512-QK9x9g2ksg0hOjjYgqddeFcn5ctUEGdxJVu4OumPXceulefMcSO2jyH2qTybYSA93nqNQFdFmg5wQfvIRUWFCQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-arn-parser': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/middleware-sdk-sts/3.310.0: + resolution: {integrity: sha512-+5PFwlYNLvLLIfw0ASAoWV/iIF8Zv6R6QGtyP0CclhRSvNjgbQDVnV0g95MC5qvh+GB/Yjlkt8qAjLSPjHfsrQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/middleware-signing': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/middleware-serde/3.310.0: + resolution: {integrity: sha512-RNeeTVWSLTaentUeCgQKZhAl+C6hxtwD78cQWS10UymWpQFwbaxztzKUu4UQS5xA2j6PxwPRRUjqa4jcFjfLsg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/middleware-signing/3.310.0: + resolution: {integrity: sha512-f9mKq+XMdW207Af3hKjdTnpNhdtwqWuvFs/ZyXoOkp/g1MY1O6L23Jy6i52m29LxbT4AuNRG1oKODfXM0vYVjQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/signature-v4': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-middleware': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/middleware-ssec/3.310.0: + resolution: {integrity: sha512-CnEwNKVpd5bXnrCKPaePF8mWTA9ET21OMBb54y9b0fd8K02zoOcdBz4DWfh1SjFD4HkgCdja4egd8l2ivyvqmw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/middleware-stack/3.310.0: + resolution: {integrity: sha512-010O1PD+UAcZVKRvqEusE1KJqN96wwrf6QsqbRM0ywsKQ21NDweaHvEDlds2VHpgmofxkRLRu/IDrlPkKRQrRg==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.5.0 + dev: true + + /@aws-sdk/middleware-user-agent/3.310.0: + resolution: {integrity: sha512-x3IOwSwSbwKidlxRk3CNVHVUb06SRuaELxggCaR++QVI8NU6qD/l4VHXKVRvbTHiC/cYxXE/GaBDgQVpDR7V/g==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-endpoints': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/node-config-provider/3.310.0: + resolution: {integrity: sha512-T/Pp6htc6hq/Cq+MLNDSyiwWCMVF6GqbBbXKVlO5L8rdHx4sq9xPdoPveZhGWrxvkanjA6eCwUp6E0riBOSVng==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/shared-ini-file-loader': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/node-http-handler/3.310.0: + resolution: {integrity: sha512-irv9mbcM9xC2xYjArQF5SYmHBMu4ciMWtGsoHII1nRuFOl9FoT4ffTvEPuLlfC6pznzvKt9zvnm6xXj7gDChKg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/abort-controller': 3.310.0 + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/querystring-builder': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/property-provider/3.310.0: + resolution: {integrity: sha512-3lxDb0akV6BBzmFe4nLPaoliQbAifyWJhuvuDOu7e8NzouvpQXs0275w9LePhhcgjKAEVXUIse05ZW2DLbxo/g==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/protocol-http/3.310.0: + resolution: {integrity: sha512-fgZ1aw/irQtnrsR58pS8ThKOWo57Py3xX6giRvwSgZDEcxHfVzuQjy9yPuV++v04fdmdtgpbGf8WfvAAJ11yXQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/querystring-builder/3.310.0: + resolution: {integrity: sha512-ZHH8GV/80+pWGo7DzsvwvXR5xVxUHXUvPJPFAkhr6nCf78igdoF8gR10ScFoEKbtEapoNTaZlKHPXxpD8aPG7A==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-uri-escape': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/querystring-parser/3.310.0: + resolution: {integrity: sha512-YkIznoP6lsiIUHinx++/lbb3tlMURGGqMpo0Pnn32zYzGrJXA6eC3D0as2EcMjo55onTfuLcIiX4qzXes2MYOA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/service-error-classification/3.310.0: + resolution: {integrity: sha512-PuyC7k3qfIKeH2LCnDwbttMOKq3qAx4buvg0yfnJtQOz6t1AR8gsnAq0CjKXXyfkXwNKWTqCpE6lVNUIkXgsMw==} + engines: {node: '>=14.0.0'} + dev: true + + /@aws-sdk/shared-ini-file-loader/3.310.0: + resolution: {integrity: sha512-N0q9pG0xSjQwc690YQND5bofm+4nfUviQ/Ppgan2kU6aU0WUq8KwgHJBto/YEEI+VlrME30jZJnxtOvcZJc2XA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/signature-v4-multi-region/3.310.0: + resolution: {integrity: sha512-q8W+RIomTS/q85Ntgks/CoDElwqkC9+4OCicee5YznNHjQ4gtNWhUkYIyIRWRmXa/qx/AUreW9DM8FAecCOdng==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@aws-sdk/signature-v4-crt': ^3.118.0 + peerDependenciesMeta: + '@aws-sdk/signature-v4-crt': + optional: true + dependencies: + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/signature-v4': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/signature-v4/3.310.0: + resolution: {integrity: sha512-1M60P1ZBNAjCFv9sYW29OF6okktaeibWyW3lMXqzoHF70lHBZh+838iUchznXUA5FLabfn4jBFWMRxlAXJUY2Q==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/is-array-buffer': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-hex-encoding': 3.310.0 + '@aws-sdk/util-middleware': 3.310.0 + '@aws-sdk/util-uri-escape': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/smithy-client/3.315.0: + resolution: {integrity: sha512-qTm0lwTh6IZMiWs3U9k2veoF6gV9yE0B9Z34yMxagOfQFQgxMih0aiH25MD25eRigjJ3sfUeZ+B0mRycmJZdkQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/middleware-stack': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/token-providers/3.315.0: + resolution: {integrity: sha512-EjLUQ9JLqU3eJfJyzpcVjFnuJ1MCCodZaVJmuX/a/as4TK41bKMvkVojjsU7pDSYzl+tuXE+ceivcWK4H0HQdQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/client-sso-oidc': 3.315.0 + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/shared-ini-file-loader': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + transitivePeerDependencies: + - aws-crt + dev: true + + /@aws-sdk/types/3.310.0: + resolution: {integrity: sha512-j8eamQJ7YcIhw7fneUfs8LYl3t01k4uHi4ZDmNRgtbmbmTTG3FZc2MotStZnp3nZB6vLiPF1o5aoJxWVvkzS6A==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.5.0 + dev: true + + /@aws-sdk/url-parser/3.310.0: + resolution: {integrity: sha512-mCLnCaSB9rQvAgx33u0DujLvr4d5yEm/W5r789GblwwQnlNXedVu50QRizMLTpltYWyAUoXjJgQnJHmJMaKXhw==} + dependencies: + '@aws-sdk/querystring-parser': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/util-arn-parser/3.310.0: + resolution: {integrity: sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.5.0 + dev: true + + /@aws-sdk/util-base64/3.310.0: + resolution: {integrity: sha512-v3+HBKQvqgdzcbL+pFswlx5HQsd9L6ZTlyPVL2LS9nNXnCcR3XgGz9jRskikRUuUvUXtkSG1J88GAOnJ/apTPg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/util-buffer-from': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/util-body-length-browser/3.310.0: + resolution: {integrity: sha512-sxsC3lPBGfpHtNTUoGXMQXLwjmR0zVpx0rSvzTPAuoVILVsp5AU/w5FphNPxD5OVIjNbZv9KsKTuvNTiZjDp9g==} + dependencies: + tslib: 2.5.0 + dev: true + + /@aws-sdk/util-body-length-node/3.310.0: + resolution: {integrity: sha512-2tqGXdyKhyA6w4zz7UPoS8Ip+7sayOg9BwHNidiGm2ikbDxm1YrCfYXvCBdwaJxa4hJfRVz+aL9e+d3GqPI9pQ==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.5.0 + dev: true + + /@aws-sdk/util-buffer-from/3.310.0: + resolution: {integrity: sha512-i6LVeXFtGih5Zs8enLrt+ExXY92QV25jtEnTKHsmlFqFAuL3VBeod6boeMXkN2p9lbSVVQ1sAOOYZOHYbYkntw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/is-array-buffer': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/util-config-provider/3.310.0: + resolution: {integrity: sha512-xIBaYo8dwiojCw8vnUcIL4Z5tyfb1v3yjqyJKJWV/dqKUFOOS0U591plmXbM+M/QkXyML3ypon1f8+BoaDExrg==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.5.0 + dev: true + + /@aws-sdk/util-defaults-mode-browser/3.315.0: + resolution: {integrity: sha512-5cqNvfGos3FB/MHNl+g2fr+tPY7s3k3+96V3wOPWLOksdACth10OxPpHfboXXZDHHkR0hmyJwJcfgA4uQrUcGg==} + engines: {node: '>= 10.0.0'} + dependencies: + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/types': 3.310.0 + bowser: 2.11.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/util-defaults-mode-node/3.315.0: + resolution: {integrity: sha512-vSPIGpzh6NJIMLoh31p7CczSatN46kJdJBrHfODHaIGe4t156x+LfkkcxGQhtifqxglhL7l+fmn5D1fM5exHuA==} + engines: {node: '>= 10.0.0'} + dependencies: + '@aws-sdk/config-resolver': 3.310.0 + '@aws-sdk/credential-provider-imds': 3.310.0 + '@aws-sdk/node-config-provider': 3.310.0 + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/util-endpoints/3.310.0: + resolution: {integrity: sha512-zG+/d/O5KPmAaeOMPd6bW1abifdT0H03f42keLjYEoRZzYtHPC5DuPE0UayiWGckI6BCDgy0sRKXCYS49UNFaQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/util-hex-encoding/3.310.0: + resolution: {integrity: sha512-sVN7mcCCDSJ67pI1ZMtk84SKGqyix6/0A1Ab163YKn+lFBQRMKexleZzpYzNGxYzmQS6VanP/cfU7NiLQOaSfA==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.5.0 + dev: true + + /@aws-sdk/util-locate-window/3.310.0: + resolution: {integrity: sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.5.0 + dev: true + + /@aws-sdk/util-middleware/3.310.0: + resolution: {integrity: sha512-FTSUKL/eRb9X6uEZClrTe27QFXUNNp7fxYrPndZwk1hlaOP5ix+MIHBcI7pIiiY/JPfOUmPyZOu+HetlFXjWog==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.5.0 + dev: true + + /@aws-sdk/util-retry/3.310.0: + resolution: {integrity: sha512-FwWGhCBLfoivTMUHu1LIn4NjrN9JLJ/aX5aZmbcPIOhZVFJj638j0qDgZXyfvVqBuBZh7M8kGq0Oahy3dp69OA==} + engines: {node: '>= 14.0.0'} + dependencies: + '@aws-sdk/service-error-classification': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/util-stream-browser/3.310.0: + resolution: {integrity: sha512-bysXZHwFwvbqOTCScCdCnoLk1K3GCo0HRIYEZuL7O7MHrQmfaYRXcaft/p22+GUv9VeFXS/eJJZ5r4u32az94w==} + dependencies: + '@aws-sdk/fetch-http-handler': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-base64': 3.310.0 + '@aws-sdk/util-hex-encoding': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/util-stream-node/3.310.0: + resolution: {integrity: sha512-hueAXFK0GVvnfYFgqbF7587xZfMZff5jlIFZOHqx7XVU7bl7qrRUCnphHk8H6yZ7RoQbDPcfmHJgtEoAJg1T1Q==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/node-http-handler': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-buffer-from': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/util-uri-escape/3.310.0: + resolution: {integrity: sha512-drzt+aB2qo2LgtDoiy/3sVG8w63cgLkqFIa2NFlGpUgHFWTXkqtbgf4L5QdjRGKWhmZsnqkbtL7vkSWEcYDJ4Q==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.5.0 + dev: true + + /@aws-sdk/util-user-agent-browser/3.310.0: + resolution: {integrity: sha512-yU/4QnHHuQ5z3vsUqMQVfYLbZGYwpYblPiuZx4Zo9+x0PBkNjYMqctdDcrpoH9Z2xZiDN16AmQGK1tix117ZKw==} + dependencies: + '@aws-sdk/types': 3.310.0 + bowser: 2.11.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/util-user-agent-node/3.310.0: + resolution: {integrity: sha512-Ra3pEl+Gn2BpeE7KiDGpi4zj7WJXZA5GXnGo3mjbi9+Y3zrbuhJAbdZO3mO/o7xDgMC6ph4xCTbaSGzU6b6EDg==} + engines: {node: '>=14.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + dependencies: + '@aws-sdk/node-config-provider': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/util-utf8-browser/3.259.0: + resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} + dependencies: + tslib: 2.5.0 + dev: true + + /@aws-sdk/util-utf8/3.310.0: + resolution: {integrity: sha512-DnLfFT8uCO22uOJc0pt0DsSNau1GTisngBCDw8jQuWT5CqogMJu4b/uXmwEqfj8B3GX6Xsz8zOd6JpRlPftQoA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/util-buffer-from': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/util-waiter/3.310.0: + resolution: {integrity: sha512-AV5j3guH/Y4REu+Qh3eXQU9igljHuU4XjX2sADAgf54C0kkhcCCkkiuzk3IsX089nyJCqIcj5idbjdvpnH88Vw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/abort-controller': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: true + + /@aws-sdk/xml-builder/3.310.0: + resolution: {integrity: sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.5.0 + dev: true + /@babel/code-frame/7.18.6: resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} engines: {node: '>=6.9.0'} @@ -1173,6 +2124,10 @@ packages: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true + /bowser/2.11.0: + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + dev: true + /brace-expansion/1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -1298,6 +2253,14 @@ packages: string-width: 5.1.2 dev: true + /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: true + /cliui/8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -1676,6 +2639,13 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true + /fast-xml-parser/4.1.2: + resolution: {integrity: sha512-CDYeykkle1LiA/uqQyNwYpFbyF6Axec6YapmpUP+/RHWIoR1zKjocdvNaTsxCxZzQ6v9MLXaSYm9Qq0thv0DHg==} + hasBin: true + dependencies: + strnum: 1.0.5 + dev: true + /fastq/1.14.0: resolution: {integrity: sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==} dependencies: @@ -2674,6 +3644,12 @@ packages: engines: {node: '>=12'} dev: true + /minimatch/3.0.4: + resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} + dependencies: + brace-expansion: 1.1.11 + dev: true + /minimatch/3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -3012,6 +3988,18 @@ packages: tslib: 2.4.1 dev: true + /s3-groundskeeper/0.2.2: + resolution: {integrity: sha512-62ntqZMhd7v85yWM+YXKsVLJdf6us6Lc+L52Ia91kRpZMgb/E9hjeXKsIoydgN9XoALoUEL+/Rp37LUrKOOl4Q==} + hasBin: true + dependencies: + '@aws-sdk/client-s3': 3.315.0 + minimatch: 3.0.4 + yargs: 16.2.0 + transitivePeerDependencies: + - '@aws-sdk/signature-v4-crt' + - aws-crt + dev: true + /semver/6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true @@ -3162,6 +4150,10 @@ packages: engines: {node: '>=8'} dev: true + /strnum/1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + dev: true + /supports-color/5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -3309,6 +4301,10 @@ packages: resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} dev: true + /tslib/2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + dev: true + /tsutils/3.21.0_typescript@5.0.4: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} @@ -3364,6 +4360,11 @@ packages: punycode: 2.1.1 dev: true + /uuid/8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: true + /v8-compile-cache-lib/3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true @@ -3449,10 +4450,28 @@ packages: engines: {node: '>= 14'} dev: true + /yargs-parser/20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + /yargs-parser/21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + /yargs/16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + 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: true + /yargs/17.6.2: resolution: {integrity: sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==} engines: {node: '>=12'} diff --git a/src/artifactory.mts b/src/artifactory.mts new file mode 100644 index 0000000..72c953b --- /dev/null +++ b/src/artifactory.mts @@ -0,0 +1,89 @@ +import { type ArtifactoryClient, createArtifactoryClient } from 's3-groundskeeper'; + +import { get } from './http.mjs'; + +export interface BuildsList { + buildsNumbers: { + uri: string, + started: string + }[] +} + +export interface BuildInfo { + buildInfo: { + modules: { + artifacts: Artifact[] + }[] + } +} + +export interface Artifact { + type : string, + sha1 : string, + sha256 : string, + md5 : string, + name : string +} + +export class ArtifactoryHelper { + private artifactoryClient: ArtifactoryClient; + private buildsList?: BuildsList; + + constructor(host: string, apiKey: string, user: string) { + this.artifactoryClient = createArtifactoryClient({protocol: 'https', host, apiKey, user}); + } + + public client(): ArtifactoryClient { + return this.artifactoryClient; + } + + public async artifactsByBuildNumber(project: string, buildNumber: string): Promise { + const buildInfos = await this.buildInfosByNumber(project, buildNumber); + const result: Artifact[] = []; + + for (const buildInfo of buildInfos) { + for (const module of buildInfo.buildInfo.modules) { + result.push(...module.artifacts); + } + } + + return result; + } + + private async buildInfosByNumber(project: string, buildNumber: string): Promise { + if (!this.artifactoryClient) { + throw new Error('Artifactory client does not exists'); + } + + const result: BuildInfo[] = []; + + const buildsEndpoint = this.artifactoryClient.resolveUri(`api/build/${ project }`);; + + if (!this.buildsList) { + const allBuilds = await get(buildsEndpoint); + this.buildsList = JSON.parse(allBuilds.toString()) as BuildsList; + } + + const buildTimes = (buildUri: string): Date[] => { + const times: Date[] = []; + + this.buildsList?.buildsNumbers.forEach(build => { + if (build.uri === `/${ buildUri}`) { + times.push(new Date(build.started)); + } + }); + + return times; + }; + + for (const value of buildTimes(buildNumber)) { + const buildInfoEndpoint = `${ buildsEndpoint }/${ buildNumber }?started=${ value.toISOString() }`; + const info = (await get(buildInfoEndpoint)).toString(); + const buildInfo = JSON.parse(info) as BuildInfo; + + result.push(buildInfo); + } + + return result; + } +} diff --git a/src/cli.mts b/src/cli.mts index ffb8ce0..1383c83 100644 --- a/src/cli.mts +++ b/src/cli.mts @@ -1,7 +1,7 @@ import { exit } from 'process'; import yargs from 'yargs'; -import { apply, plan } from './index.mjs'; +import { apply, createConfig, plan } from './index.mjs'; import { getMessageOfError } from './utils.mjs'; type CliType = Awaited>; @@ -37,12 +37,14 @@ async function main(): Promise { const command = cli()._[0]; + const config = await createConfig(cli().config); + if (command === 'plan') { - plan(); + plan(config); } if (command === 'apply') { - apply(); + apply(config); } return 0; diff --git a/src/config.mts b/src/config.mts index 4ad76cd..7e17f4f 100644 --- a/src/config.mts +++ b/src/config.mts @@ -1,5 +1,6 @@ import path from 'path'; import { pathToFileURL } from 'url'; +import type { DebConfig } from './deb/deb-config.mjs'; interface IOConfig { sourceDir: string; @@ -9,7 +10,7 @@ interface IOConfig { export class Config { path: string; - configFile: IOConfig | undefined; + config: (IOConfig & DebConfig) | undefined; constructor(path: string) { this.path = path; @@ -17,7 +18,7 @@ export class Config { async init(): Promise { const resolvedPath = path.resolve(this.path); - this.configFile = (await import(pathToFileURL(resolvedPath).toString())).default as IOConfig; + this.config = (await import(pathToFileURL(resolvedPath).toString())).default as (IOConfig & DebConfig); } } diff --git a/src/deb/deb-builder.mts b/src/deb/deb-builder.mts new file mode 100644 index 0000000..2b12511 --- /dev/null +++ b/src/deb/deb-builder.mts @@ -0,0 +1,24 @@ +import type { Config } from '../config.mjs'; +import type { IBuilder } from '../ibuilder.mjs'; + +export class DebBuilder implements IBuilder { + private config: Config; + private debRepo: { + channel: string, + debs: { + name: string, + md5: string + }[]}[] = []; + + constructor(config: Config) { + this.config = config; + } + + public plan(config: Config): void { + + } + + public apply(config: Config): void { + + } +} diff --git a/src/deb/deb-config.mts b/src/deb/deb-config.mts new file mode 100644 index 0000000..c24918f --- /dev/null +++ b/src/deb/deb-config.mts @@ -0,0 +1,4 @@ +export interface DebConfig { + gpgKeyName: string; + debName: string; +} diff --git a/src/fs.mts b/src/fs.mts new file mode 100644 index 0000000..2de6d55 --- /dev/null +++ b/src/fs.mts @@ -0,0 +1,19 @@ +import { writeFileSync, mkdirSync, existsSync} from 'fs'; + +export function createFile(path: string, content: string): void { + const dirPath = path.split('/').slice(0, -1).join('/'); + + createDir(dirPath); + + writeFileSync(path, content); +} + +export function createDir(dirName: string): void { + if (!existsSync(dirName)) { + mkdirSync(dirName, { recursive: true }); + } +} + +export function createMetapointerContent(fileMd5Hash: string): string { + return `#metapointer jfrogart\noid md5:${fileMd5Hash}`; +} \ No newline at end of file diff --git a/src/http.mts b/src/http.mts new file mode 100644 index 0000000..922e4fd --- /dev/null +++ b/src/http.mts @@ -0,0 +1,91 @@ +import * as stream from 'stream'; +import { IncomingMessage } from 'http'; +import * as https from 'https'; + +export interface RequestBody { + content: string | Buffer; + contentType?: string; +} + +export interface RequestData { + headers?: Record; + body?: RequestBody; + redirectHandler?: (url: string) => string | undefined; +} + +export async function requestStream(url: string, method: string, requestData?: RequestData): Promise { + return new Promise((resolve, reject) => { + try { + const req = https.request(url, { method }); + + req + .on('response', (incomingMessage: IncomingMessage) => { + if (incomingMessage.statusCode !== 200) { + const stCode = incomingMessage.statusCode ?? 'NO_CODE'; + const stMessage = incomingMessage.statusMessage ?? 'NO_MESSAGE'; + const message = `[${method} ${url}]:${stCode}/${stMessage}`; + reject(new Error(message)); + return; + } + + resolve(incomingMessage); + }) + .on('error', (err: Error) => { + const errno = (err as {errno?: string}).errno ?? ''; + if (errno === 'ETIMEDOUT') { + reject(new Error(`Request (${url}) timeout.`)); + } + else { + reject(err); + } + }); + + if (requestData) { + if (requestData.headers) { + for (const key of Object.getOwnPropertyNames(requestData.headers)) { + const value = requestData.headers[key]; + req.setHeader(key, value); + } + } + + if (requestData.body) { + if (requestData.body.contentType) { + req.setHeader('Content-Type', requestData.body.contentType); + } + req.write(requestData.body.content); + } + } + + req.end(); + } + catch (err) { + reject(err); + } + }); +} + + +export async function request(url: string, method: string, requestData?: RequestData): Promise { + + const responseStream = await requestStream(url, method, requestData); + + let buffer: Buffer | undefined; + + for await (const item of responseStream) { + const chunk = item as Buffer; + buffer = (typeof buffer === 'undefined') ? chunk : Buffer.concat([buffer, chunk ]); + } + + return buffer ? buffer : Buffer.from(''); +} + +export function get(url: string, opt?: {stream: false} ): Promise; +export function get(url: string, opt?: {stream: true} ): Promise; + +export async function get(url: string, opt: {stream: boolean} = {stream: false}): Promise { + return opt.stream ? requestStream(url, 'GET', undefined ) : request(url, 'GET', undefined ); +} + +export function post(url: string, requestData?: RequestData): Promise { + return request(url, 'POST', requestData ); +} diff --git a/src/ibuilder.mts b/src/ibuilder.mts new file mode 100644 index 0000000..03aa295 --- /dev/null +++ b/src/ibuilder.mts @@ -0,0 +1,6 @@ +import { Config } from './config.mjs'; + +export interface IBuilder { + plan(config: Config): void; + apply(config: Config): void; +} diff --git a/src/index.mts b/src/index.mts index 338a48d..c139009 100644 --- a/src/index.mts +++ b/src/index.mts @@ -1,7 +1,11 @@ -export function plan(): void { +import { Config } from './config.mjs'; + +export { Config, createConfig } from './config.mjs'; + +export function plan(config: Config): void { console.log('plan()'); } -export function apply(): void { +export function apply(config: Config): void { console.log('apply()'); } From 2dfd854132a1f2d5aaaaa0844411c1193c24d91d Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Fri, 21 Apr 2023 11:09:37 +0300 Subject: [PATCH 30/58] conflicts resolved --- src/cli.mts | 2 +- src/http.mts | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/cli.mts b/src/cli.mts index 3387b3f..b1b79bb 100644 --- a/src/cli.mts +++ b/src/cli.mts @@ -15,7 +15,7 @@ async function main(): Promise { const args: CommandLineArgs = await yargsParsePromise.parse(); const command = args._[0]; - const config = await createConfig(cli().config); + const config = await createConfig(args.config); if (command === 'plan') { plan(config); diff --git a/src/http.mts b/src/http.mts index 922e4fd..b830401 100644 --- a/src/http.mts +++ b/src/http.mts @@ -44,7 +44,10 @@ export async function requestStream(url: string, method: string, requestData?: R if (requestData.headers) { for (const key of Object.getOwnPropertyNames(requestData.headers)) { const value = requestData.headers[key]; - req.setHeader(key, value); + + if (value) { + req.setHeader(key, value); + } } } From 991df403742a0a7f7551d1e4c3a3be9a845fd53d Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Thu, 27 Apr 2023 18:58:10 +0700 Subject: [PATCH 31/58] moved some parts of deb logick --- package.json | 2 + pnpm-lock.yaml | 32 +++-- src/artifacts-provider-config.mts | 12 ++ src/artifacts-provider.mts | 13 +++ src/cli.mts | 8 +- src/config.mts | 40 ++++--- src/deb/deb-builder-config.mts | 6 + src/deb/deb-builder.mts | 110 ++++++++++++++++-- src/deb/deb-config.mts | 4 - src/fs.mts | 8 +- src/http.mts | 54 +++++++-- src/ibuilder.mts | 6 +- src/index.mts | 22 +++- .../jfrog-artifacts-provider.mts} | 42 ++++--- src/repo.mts | 15 +++ 15 files changed, 301 insertions(+), 73 deletions(-) create mode 100644 src/artifacts-provider-config.mts create mode 100644 src/artifacts-provider.mts create mode 100644 src/deb/deb-builder-config.mts delete mode 100644 src/deb/deb-config.mts rename src/{artifactory.mts => jfrog/jfrog-artifacts-provider.mts} (56%) create mode 100644 src/repo.mts diff --git a/package.json b/package.json index 1d127c9..877e551 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "@tsconfig/node18": "^2.0.0", "@tsconfig/strictest": "^2.0.0", "@types/node": "18.13.0", + "@types/tar": "^6.1.4", "@types/yargs": "^17.0.16", "@typescript-eslint/eslint-plugin": "^5.45.1", "@typescript-eslint/parser": "^5.45.1", @@ -39,6 +40,7 @@ "pnpm": "8.3.1" }, "dependencies": { + "tar": "^6.1.13", "yargs": "^17.6.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8ace406..cec3061 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,9 @@ importers: .: dependencies: + tar: + specifier: ^6.1.13 + version: 6.1.13 yargs: specifier: ^17.6.2 version: 17.6.2 @@ -23,6 +26,9 @@ importers: '@types/node': specifier: 18.13.0 version: 18.13.0 + '@types/tar': + specifier: ^6.1.4 + version: 6.1.4 '@types/yargs': specifier: ^17.0.16 version: 17.0.20 @@ -1810,6 +1816,13 @@ packages: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} dev: true + /@types/tar@6.1.4: + resolution: {integrity: sha512-Cp4oxpfIzWt7mr2pbhHT2OTXGMAL0szYCzuf8lRWyIMCgsx6/Hfc3ubztuhvzXHXgraTQxyOCmmg7TDGIMIJJQ==} + dependencies: + '@types/node': 18.13.0 + minipass: 4.2.8 + dev: true + /@types/yargs-parser@21.0.0: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} dev: true @@ -2231,7 +2244,6 @@ packages: /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} - dev: true /ci-info@3.7.0: resolution: {integrity: sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==} @@ -2412,7 +2424,7 @@ packages: dependencies: https-proxy-agent: 5.0.1 node-fetch: 2.6.7 - tar: 6.1.12 + tar: 6.1.13 transitivePeerDependencies: - encoding - supports-color @@ -2722,7 +2734,6 @@ packages: engines: {node: '>= 8'} dependencies: minipass: 3.3.6 - dev: true /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -3638,7 +3649,10 @@ packages: engines: {node: '>=8'} dependencies: yallist: 4.0.0 - dev: true + + /minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} @@ -3646,13 +3660,11 @@ packages: dependencies: minipass: 3.3.6 yallist: 4.0.0 - dev: true /mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true - dev: true /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -4157,17 +4169,16 @@ packages: engines: {node: '>= 0.4'} dev: true - /tar@6.1.12: - resolution: {integrity: sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==} + /tar@6.1.13: + resolution: {integrity: sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==} engines: {node: '>=10'} dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 - minipass: 3.3.6 + minipass: 4.2.8 minizlib: 2.1.2 mkdirp: 1.0.4 yallist: 4.0.0 - dev: true /test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} @@ -4421,7 +4432,6 @@ packages: /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true /yaml@2.1.3: resolution: {integrity: sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg==} diff --git a/src/artifacts-provider-config.mts b/src/artifacts-provider-config.mts new file mode 100644 index 0000000..50edcf1 --- /dev/null +++ b/src/artifacts-provider-config.mts @@ -0,0 +1,12 @@ +export type ProviderType = 'jfrog'; + +export interface ArtifactsProviderConfig { + artifactsProvider: { + type: ProviderType, + protocol: string, + host: string, + project: string, + apiKey: string, + user: string + } +} \ No newline at end of file diff --git a/src/artifacts-provider.mts b/src/artifacts-provider.mts new file mode 100644 index 0000000..a5c28b8 --- /dev/null +++ b/src/artifacts-provider.mts @@ -0,0 +1,13 @@ +export interface Artifact { + name: string, + type: string, + path: string, + sha1: string, + sha256: string, + md5: string +} + +export interface ArtifactsProvider { + artifactsByBuildNumber(buildNumber: string): Promise; + artifactUrl(artifact: Artifact): string; +} diff --git a/src/cli.mts b/src/cli.mts index b1b79bb..cd51486 100644 --- a/src/cli.mts +++ b/src/cli.mts @@ -1,7 +1,7 @@ import { exit } from 'process'; import yargs from 'yargs'; -import { apply, createConfig, plan } from './index.mjs'; +import { apply, createConfigProvider, plan } from './index.mjs'; import { getMessageOfError } from './utils.mjs'; type CommandLineArgs = Awaited>; @@ -15,14 +15,14 @@ async function main(): Promise { const args: CommandLineArgs = await yargsParsePromise.parse(); const command = args._[0]; - const config = await createConfig(args.config); + const configProvider = await createConfigProvider(args.config); if (command === 'plan') { - plan(config); + plan(configProvider.config); } if (command === 'apply') { - apply(config); + apply(configProvider.config); } return 0; diff --git a/src/config.mts b/src/config.mts index 7e17f4f..6354ace 100644 --- a/src/config.mts +++ b/src/config.mts @@ -1,16 +1,22 @@ import path from 'path'; import { pathToFileURL } from 'url'; -import type { DebConfig } from './deb/deb-config.mjs'; -interface IOConfig { - sourceDir: string; - repoOut: string; - repoDir: string; +import type { DebBuilderConfig } from './deb/deb-builder-config.mjs'; +import type { ArtifactsProviderConfig } from './artifacts-provider-config.mjs'; +import type { Repo } from './repo.mjs'; + +interface BaseConfig { + base: { + out: string; + repo: Repo; + } } -export class Config { - path: string; - config: (IOConfig & DebConfig) | undefined; +export type Config = BaseConfig & DebBuilderConfig & ArtifactsProviderConfig; + +export class ConfigProvider { + private path: string; + private configInstance: Config | undefined; constructor(path: string) { this.path = path; @@ -18,14 +24,22 @@ export class Config { async init(): Promise { const resolvedPath = path.resolve(this.path); - this.config = (await import(pathToFileURL(resolvedPath).toString())).default as (IOConfig & DebConfig); + this.configInstance = (await import(pathToFileURL(resolvedPath).toString())).default as Config; + } + + get config(): Config { + if (!this.configInstance) { + throw new Error('Config not initialized'); + } + + return this.configInstance; } } -export async function createConfig(path: string): Promise { - const configurationInstance = new Config(path); - await configurationInstance.init(); +export async function createConfigProvider(path: string): Promise { + const configProviderInstance = new ConfigProvider(path); + await configProviderInstance.init(); - return configurationInstance; + return configProviderInstance; } diff --git a/src/deb/deb-builder-config.mts b/src/deb/deb-builder-config.mts new file mode 100644 index 0000000..82e4790 --- /dev/null +++ b/src/deb/deb-builder-config.mts @@ -0,0 +1,6 @@ +export interface DebBuilderConfig { + debBuilder: { + gpgKeyName: string; + repoName: string; + } +} diff --git a/src/deb/deb-builder.mts b/src/deb/deb-builder.mts index 2b12511..a64bdbd 100644 --- a/src/deb/deb-builder.mts +++ b/src/deb/deb-builder.mts @@ -1,24 +1,120 @@ -import type { Config } from '../config.mjs'; +import type { Artifact, ArtifactsProvider } from '../artifacts-provider.mjs'; +import { createDir, removeDir } from '../fs.mjs'; import type { IBuilder } from '../ibuilder.mjs'; +import { requestRange } from '../http.mjs'; +import type { Config } from '../config.mjs'; +import * as path from 'path'; +import * as fs from 'fs'; +import * as tar from 'tar'; export class DebBuilder implements IBuilder { - private config: Config; + private readonly config: Config; + private readonly artifactsProvider: ArtifactsProvider; + + private readonly pool: string; + private readonly dists: string; + private readonly keys: string; + private debRepo: { channel: string, debs: { - name: string, - md5: string + version: string, + url: string, + arch: string, + artifact: Artifact }[]}[] = []; - constructor(config: Config) { + constructor(artifactsProvider: ArtifactsProvider, config: Config) { this.config = config; + + this.pool = `${ this.config.base.out }/repo/${ this.config.debBuilder.repoName }/deb/pool`; + this.dists = `${ this.config.base.out }/repo/${ this.config.debBuilder.repoName }/deb/dists`; + this.keys = `${ this.config.base.out }/repo/${ this.config.debBuilder.repoName }/deb/keys`; + this.keys; + this.artifactsProvider = artifactsProvider; } - public plan(config: Config): void { + public async plan(): Promise { + for (const entry of this.config.base.repo) { + let debs: { + version: string, + url: string, + arch: string, + artifact: Artifact + }[] = []; + + for (const pack of entry.packages.packages) { + const debArtifactItems = (await this.artifactsProvider.artifactsByBuildNumber(pack.buildNumber)).filter(artifact => artifact.type === 'deb'); + + for (const artifact of debArtifactItems) { + const arch = 'hui'; + debs.push({ + version: pack.version, + url: this.artifactsProvider.artifactUrl(artifact), + arch: arch, + artifact: artifact + }); + } + } + + this.debRepo.push({ channel: entry.channel, debs }); + } + + + for (const channel of this.debRepo) { + for (const deb of channel.debs) { + const debUrl = await this.artifactsProvider.artifactUrl(deb.artifact); + const controlTarSizeRange = '120-129'; + + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + const cocntrolTarSize = Number((await requestRange(debUrl, controlTarSizeRange)).read().toString().trim()); + const controlTarRange = `132-${ 131 + cocntrolTarSize }`; + const controlTar = await requestRange(debUrl, controlTarRange); + + const whereExtract = path.join(this.dists, channel.channel, 'main', `binary-${ deb.arch }`, path.basename(debUrl, '.deb')); + + createDir(whereExtract); + + await new Promise((resolve) => { + controlTar + .pipe(tar.extract({ cwd: whereExtract, strip: 1 }, ['./control'])) + .on('finish', () => { + const targetMetaPath = path.join(this.dists, channel.channel, 'main', `binary-${ deb.arch }`, `${ this.debName(deb) }.meta`); + fs.renameSync(path.join(whereExtract, 'control'), targetMetaPath); + + removeDir(whereExtract); + + const fileName = path.relative(`${ this.config.base.out }/repo/${ this.config.debBuilder.repoName }/deb`, path.join(this.pool, 'main', `t/tradingviewdesktop-${ channel.channel }`, this.debName(deb))); + const debSize = controlTar.headers['content-range']?.split('/')[1]; + const sha1 = controlTar.headers['x-checksum-sha1']; + const sha256 = controlTar.headers['x-checksum-sha256']; + const md5 = controlTar.headers['x-checksum-md5']; + + if (typeof sha1 !== 'string' || typeof sha256 !== 'string' || typeof md5 !== 'string' || typeof debSize !== 'string') { + throw new Error('No checksum was found in headers'); + } + + const dataToAppend = `Filename: ${ fileName }\nSize: ${ debSize }\nSHA1: ${ sha1 }\nSHA256: ${ sha256 }\nMD5Sum: ${ md5 }\n`; + + fs.appendFile(targetMetaPath, dataToAppend, (err) => { + if (err) { + throw err; + } + + resolve(); + }); + }); + }); + } + } } - public apply(config: Config): void { + public apply(): void { + + } + private debName(deb: { version: string, arch: string }): string { + return `${ this.config.debBuilder.repoName }-${ deb.version }_${ deb.arch }.deb`; } } diff --git a/src/deb/deb-config.mts b/src/deb/deb-config.mts deleted file mode 100644 index c24918f..0000000 --- a/src/deb/deb-config.mts +++ /dev/null @@ -1,4 +0,0 @@ -export interface DebConfig { - gpgKeyName: string; - debName: string; -} diff --git a/src/fs.mts b/src/fs.mts index 2de6d55..615639c 100644 --- a/src/fs.mts +++ b/src/fs.mts @@ -1,4 +1,4 @@ -import { writeFileSync, mkdirSync, existsSync} from 'fs'; +import { writeFileSync, mkdirSync, existsSync, rmdirSync } from 'fs'; export function createFile(path: string, content: string): void { const dirPath = path.split('/').slice(0, -1).join('/'); @@ -14,6 +14,12 @@ export function createDir(dirName: string): void { } } +export function removeDir(dirName: string): void { + if (existsSync(dirName)) { + rmdirSync(dirName, {recursive: true}); + } +} + export function createMetapointerContent(fileMd5Hash: string): string { return `#metapointer jfrogart\noid md5:${fileMd5Hash}`; } \ No newline at end of file diff --git a/src/http.mts b/src/http.mts index b830401..e52e9e5 100644 --- a/src/http.mts +++ b/src/http.mts @@ -1,6 +1,5 @@ -import * as stream from 'stream'; -import { IncomingMessage } from 'http'; -import * as https from 'https'; +import { Readable } from 'stream'; +import { IncomingMessage, request as httpRequest } from 'http'; export interface RequestBody { content: string | Buffer; @@ -16,7 +15,7 @@ export interface RequestData { export async function requestStream(url: string, method: string, requestData?: RequestData): Promise { return new Promise((resolve, reject) => { try { - const req = https.request(url, { method }); + const req = httpRequest(url, { method }); req .on('response', (incomingMessage: IncomingMessage) => { @@ -67,7 +66,6 @@ export async function requestStream(url: string, method: string, requestData?: R }); } - export async function request(url: string, method: string, requestData?: RequestData): Promise { const responseStream = await requestStream(url, method, requestData); @@ -82,10 +80,52 @@ export async function request(url: string, method: string, requestData?: Request return buffer ? buffer : Buffer.from(''); } +export async function requestRange(url: string, range: string): Promise { + return new Promise((resolve, reject) => { + try { + const req = httpRequest(url, { method: 'GET' }); + + req.on('response', (incomingMessage: IncomingMessage) => { + if (incomingMessage.statusCode === 206) { + resolve(incomingMessage); + return; + } + + if (incomingMessage.statusCode !== 200) { + const stCode = incomingMessage.statusCode ?? 'NO_CODE'; + const stMessage = incomingMessage.statusMessage ?? 'NO_MESSAGE'; + const message = `[GET ${url}]:${stCode}/${stMessage}`; + reject(new Error(message)); + return; + } + + resolve(incomingMessage); + }) + .on('error', (err: Error) => { + const errno = (err as {errno?: string}).errno ?? ''; + if (errno === 'ETIMEDOUT') { + reject(new Error(`Request (${url}) timeout.`)); + } + else { + reject(err); + } + }); + + + req.setHeader('Range', `bytes=${ range }`); + + req.end(); + } + catch (err) { + reject(err); + } + }); +} + export function get(url: string, opt?: {stream: false} ): Promise; -export function get(url: string, opt?: {stream: true} ): Promise; +export function get(url: string, opt?: {stream: true} ): Promise; -export async function get(url: string, opt: {stream: boolean} = {stream: false}): Promise { +export async function get(url: string, opt: {stream: boolean} = {stream: false}): Promise { return opt.stream ? requestStream(url, 'GET', undefined ) : request(url, 'GET', undefined ); } diff --git a/src/ibuilder.mts b/src/ibuilder.mts index 03aa295..3e1a283 100644 --- a/src/ibuilder.mts +++ b/src/ibuilder.mts @@ -1,6 +1,4 @@ -import { Config } from './config.mjs'; - export interface IBuilder { - plan(config: Config): void; - apply(config: Config): void; + plan(): Promise; + apply(): void; } diff --git a/src/index.mts b/src/index.mts index c139009..2a43588 100644 --- a/src/index.mts +++ b/src/index.mts @@ -1,11 +1,27 @@ -import { Config } from './config.mjs'; +import type { Config } from './config.mjs'; +import type { IBuilder } from './ibuilder.mjs'; +import { JfrogArtifactsProvider } from './jfrog/jfrog-artifacts-provider.mjs'; +import { DebBuilder } from './deb/deb-builder.mjs'; -export { Config, createConfig } from './config.mjs'; +export { type Config, createConfigProvider } from './config.mjs'; + +export async function plan(config: Config): Promise { + const artifactsProvider = new JfrogArtifactsProvider(config); + + let builders: IBuilder[] = []; + + if (config.debBuilder) { + builders.push(new DebBuilder(artifactsProvider, config)); + } + + for (const builder of builders) { + await builder.plan(); + } -export function plan(config: Config): void { console.log('plan()'); } export function apply(config: Config): void { + config; console.log('apply()'); } diff --git a/src/artifactory.mts b/src/jfrog/jfrog-artifacts-provider.mts similarity index 56% rename from src/artifactory.mts rename to src/jfrog/jfrog-artifacts-provider.mts index 72c953b..52b8c19 100644 --- a/src/artifactory.mts +++ b/src/jfrog/jfrog-artifacts-provider.mts @@ -1,6 +1,8 @@ import { type ArtifactoryClient, createArtifactoryClient } from 's3-groundskeeper'; -import { get } from './http.mjs'; +import { get } from '../http.mjs'; +import type { Artifact, ArtifactsProvider } from '../artifacts-provider.mjs'; +import type { ArtifactsProviderConfig } from '../artifacts-provider-config.mjs'; export interface BuildsList { buildsNumbers: { @@ -17,28 +19,24 @@ export interface BuildInfo { } } -export interface Artifact { - type : string, - sha1 : string, - sha256 : string, - md5 : string, - name : string -} - -export class ArtifactoryHelper { +export class JfrogArtifactsProvider implements ArtifactsProvider { private artifactoryClient: ArtifactoryClient; private buildsList?: BuildsList; - constructor(host: string, apiKey: string, user: string) { - this.artifactoryClient = createArtifactoryClient({protocol: 'https', host, apiKey, user}); - } + private readonly config: ArtifactsProviderConfig; - public client(): ArtifactoryClient { - return this.artifactoryClient; + constructor(config: ArtifactsProviderConfig) { + this.config = config; + this.artifactoryClient = createArtifactoryClient({ + protocol: this.config.artifactsProvider.protocol, + host: this.config.artifactsProvider.host, + apiKey: this.config.artifactsProvider.apiKey, + user: this.config.artifactsProvider.user + }); } - public async artifactsByBuildNumber(project: string, buildNumber: string): Promise { - const buildInfos = await this.buildInfosByNumber(project, buildNumber); + public async artifactsByBuildNumber(buildNumber: string): Promise { + const buildInfos = await this.buildInfosByNumber(buildNumber); const result: Artifact[] = []; for (const buildInfo of buildInfos) { @@ -50,14 +48,20 @@ export class ArtifactoryHelper { return result; } - private async buildInfosByNumber(project: string, buildNumber: string): Promise { + public artifactUrl(artifact: Artifact): string { + const baseUrl = `${ this.config.artifactsProvider.protocol }://${ this.config.artifactsProvider.host }/artifactory`; + + return `${ baseUrl }/${ artifact.path }`; + } + + private async buildInfosByNumber(buildNumber: string): Promise { if (!this.artifactoryClient) { throw new Error('Artifactory client does not exists'); } const result: BuildInfo[] = []; - const buildsEndpoint = this.artifactoryClient.resolveUri(`api/build/${ project }`);; + const buildsEndpoint = this.artifactoryClient.resolveUri(`api/build/${ this.config.artifactsProvider.project }`);; if (!this.buildsList) { const allBuilds = await get(buildsEndpoint); diff --git a/src/repo.mts b/src/repo.mts new file mode 100644 index 0000000..6fca0fb --- /dev/null +++ b/src/repo.mts @@ -0,0 +1,15 @@ +export interface Package { + version: string, + buildNumber: string +} + +export interface Packages { + packages: Package[], + highest: Package, +} + +export type Channel = string; +export type Repo = { + channel: Channel, + packages: Packages +}[] From ba9d0d6efa3a8b5a319c15dca7e6afe0fe248147 Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Mon, 15 May 2023 14:33:32 +0300 Subject: [PATCH 32/58] lot of deb builder functionality --- .gitignore | 1 + .vscode/launch.json | 13 +- package.json | 2 + pnpm-lock.yaml | 15 ++ src/artifacts-provider.mts | 2 +- src/cli.mts | 2 +- src/deb/deb-builder-config.mts | 4 +- src/deb/deb-builder.mts | 204 +++++++++++++++++++------ src/http.mts | 10 +- src/jfrog/jfrog-artifacts-provider.mts | 22 ++- 10 files changed, 218 insertions(+), 57 deletions(-) diff --git a/.gitignore b/.gitignore index 56c9d65..af489f5 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ node_modules/ # build output directories dist/ +out/ # coverage report directory /coverage/ diff --git a/.vscode/launch.json b/.vscode/launch.json index 5efcca3..b0fefb7 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -5,7 +5,7 @@ { "type": "node", "request": "launch", - "name": "Start", + "name": "Start plan command", "runtimeArgs": [ ], "program": "${workspaceFolder}/dist/cli.mjs", @@ -13,6 +13,17 @@ "plan" ] }, + { + "type": "node", + "request": "launch", + "name": "Start apply command", + "runtimeArgs": [ + ], + "program": "${workspaceFolder}/dist/cli.mjs", + "args": [ + "apply" + ] + }, { "type": "node", "name": "vscode-jest-tests.v2", diff --git a/package.json b/package.json index 877e551..0698b01 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "@tsconfig/esm": "^1.0.2", "@tsconfig/node18": "^2.0.0", "@tsconfig/strictest": "^2.0.0", + "@types/ini": "^1.3.31", "@types/node": "18.13.0", "@types/tar": "^6.1.4", "@types/yargs": "^17.0.16", @@ -40,6 +41,7 @@ "pnpm": "8.3.1" }, "dependencies": { + "ini": "^4.1.0", "tar": "^6.1.13", "yargs": "^17.6.2" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cec3061..54918c6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,9 @@ importers: .: dependencies: + ini: + specifier: ^4.1.0 + version: 4.1.0 tar: specifier: ^6.1.13 version: 6.1.13 @@ -23,6 +26,9 @@ importers: '@tsconfig/strictest': specifier: ^2.0.0 version: 2.0.0 + '@types/ini': + specifier: ^1.3.31 + version: 1.3.31 '@types/node': specifier: 18.13.0 version: 18.13.0 @@ -1780,6 +1786,10 @@ packages: '@types/node': 18.13.0 dev: true + /@types/ini@1.3.31: + resolution: {integrity: sha512-8ecxxaG4AlVEM1k9+BsziMw8UsX0qy3jYI1ad/71RrDZ+rdL6aZB0wLfAuflQiDhkD5o4yJ0uPK3OSUic3fG0w==} + dev: true + /@types/istanbul-lib-coverage@2.0.4: resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} dev: true @@ -2917,6 +2927,11 @@ packages: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: true + /ini@4.1.0: + resolution: {integrity: sha512-HLR38RSF2iulAzc3I/sma4CoYxQP844rPYCNfzGDOHqa/YqVlwuuZgBx6M50/X8dKgzk0cm1qRg3+47mK2N+cQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: false + /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: true diff --git a/src/artifacts-provider.mts b/src/artifacts-provider.mts index a5c28b8..295f449 100644 --- a/src/artifacts-provider.mts +++ b/src/artifacts-provider.mts @@ -9,5 +9,5 @@ export interface Artifact { export interface ArtifactsProvider { artifactsByBuildNumber(buildNumber: string): Promise; - artifactUrl(artifact: Artifact): string; + artifactUrl(artifact: Artifact): Promise; } diff --git a/src/cli.mts b/src/cli.mts index cd51486..e63a4b0 100644 --- a/src/cli.mts +++ b/src/cli.mts @@ -18,7 +18,7 @@ async function main(): Promise { const configProvider = await createConfigProvider(args.config); if (command === 'plan') { - plan(configProvider.config); + await plan(configProvider.config); } if (command === 'apply') { diff --git a/src/deb/deb-builder-config.mts b/src/deb/deb-builder-config.mts index 82e4790..059ce4a 100644 --- a/src/deb/deb-builder-config.mts +++ b/src/deb/deb-builder-config.mts @@ -1,6 +1,8 @@ export interface DebBuilderConfig { debBuilder: { + gpgPublicKeyPath: string; gpgKeyName: string; - repoName: string; + applicationName: string; + component: string; } } diff --git a/src/deb/deb-builder.mts b/src/deb/deb-builder.mts index a64bdbd..5035308 100644 --- a/src/deb/deb-builder.mts +++ b/src/deb/deb-builder.mts @@ -6,6 +6,19 @@ import type { Config } from '../config.mjs'; import * as path from 'path'; import * as fs from 'fs'; import * as tar from 'tar'; +import * as ini from 'ini'; +import * as crypto from 'crypto'; +import * as os from 'os'; +import { createGzip } from 'zlib'; +import { spawnSync } from 'child_process'; + +const ReleaseFileTemplate = +`Origin: $ORIGIN +Label: Ubuntu/Debian +Architecture: $ARCH +Component: $COMPONENT +Codename: $CHANNEL\n`; + export class DebBuilder implements IBuilder { private readonly config: Config; @@ -20,16 +33,15 @@ export class DebBuilder implements IBuilder { debs: { version: string, url: string, - arch: string, artifact: Artifact }[]}[] = []; constructor(artifactsProvider: ArtifactsProvider, config: Config) { this.config = config; - this.pool = `${ this.config.base.out }/repo/${ this.config.debBuilder.repoName }/deb/pool`; - this.dists = `${ this.config.base.out }/repo/${ this.config.debBuilder.repoName }/deb/dists`; - this.keys = `${ this.config.base.out }/repo/${ this.config.debBuilder.repoName }/deb/keys`; + this.pool = `${ this.config.base.out }/repo/${ this.config.debBuilder.applicationName }/deb/pool`; + this.dists = `${ this.config.base.out }/repo/${ this.config.debBuilder.applicationName }/deb/dists`; + this.keys = `${ this.config.base.out }/repo/${ this.config.debBuilder.applicationName }/deb/keys`; this.keys; this.artifactsProvider = artifactsProvider; } @@ -39,7 +51,6 @@ export class DebBuilder implements IBuilder { let debs: { version: string, url: string, - arch: string, artifact: Artifact }[] = []; @@ -47,11 +58,9 @@ export class DebBuilder implements IBuilder { const debArtifactItems = (await this.artifactsProvider.artifactsByBuildNumber(pack.buildNumber)).filter(artifact => artifact.type === 'deb'); for (const artifact of debArtifactItems) { - const arch = 'hui'; debs.push({ version: pack.version, - url: this.artifactsProvider.artifactUrl(artifact), - arch: arch, + url: await this.artifactsProvider.artifactUrl(artifact), artifact: artifact }); } @@ -62,59 +71,158 @@ export class DebBuilder implements IBuilder { for (const channel of this.debRepo) { - for (const deb of channel.debs) { - const debUrl = await this.artifactsProvider.artifactUrl(deb.artifact); - const controlTarSizeRange = '120-129'; - - // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call - const cocntrolTarSize = Number((await requestRange(debUrl, controlTarSizeRange)).read().toString().trim()); - const controlTarRange = `132-${ 131 + cocntrolTarSize }`; - const controlTar = await requestRange(debUrl, controlTarRange); - - const whereExtract = path.join(this.dists, channel.channel, 'main', `binary-${ deb.arch }`, path.basename(debUrl, '.deb')); - - createDir(whereExtract); - - await new Promise((resolve) => { - controlTar - .pipe(tar.extract({ cwd: whereExtract, strip: 1 }, ['./control'])) - .on('finish', () => { - const targetMetaPath = path.join(this.dists, channel.channel, 'main', `binary-${ deb.arch }`, `${ this.debName(deb) }.meta`); - fs.renameSync(path.join(whereExtract, 'control'), targetMetaPath); + for (const deb of channel.debs) { + const debUrl = deb.url; + const controlTarSizeRange = '120-129'; + + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + const cocntrolTarSize = Number((await requestRange(debUrl, controlTarSizeRange)).read().toString().trim()); + const controlTarRange = `132-${ 131 + cocntrolTarSize }`; + const controlTar = await requestRange(debUrl, controlTarRange); + + const whereExtract = path.join(os.tmpdir(), `control-${ crypto.randomBytes(4).toString('hex')}`); + + createDir(whereExtract); + + await new Promise((resolve) => { + controlTar + .pipe(tar.extract({ cwd: whereExtract, strip: 1 }, ['./control'])) + .on('finish', () => { + const controlMetaContent = fs.readFileSync(path.join(whereExtract, 'control'), 'utf-8').replaceAll(':', '='); + const controlMeta = ini.parse(controlMetaContent); + + const targetMetaPath = path.join(this.dists, channel.channel, this.config.debBuilder.component, `binary-${ controlMeta['Architecture'] }`, `${ this.debName(deb.version, controlMeta['Architecture']) }.meta`); + createDir(path.dirname(targetMetaPath)); + fs.renameSync(path.join(whereExtract, 'control'), targetMetaPath); removeDir(whereExtract); - const fileName = path.relative(`${ this.config.base.out }/repo/${ this.config.debBuilder.repoName }/deb`, path.join(this.pool, 'main', `t/tradingviewdesktop-${ channel.channel }`, this.debName(deb))); - const debSize = controlTar.headers['content-range']?.split('/')[1]; - const sha1 = controlTar.headers['x-checksum-sha1']; - const sha256 = controlTar.headers['x-checksum-sha256']; - const md5 = controlTar.headers['x-checksum-md5']; + const fileName = path.relative(`${ this.config.base.out }/repo/${ this.config.debBuilder.applicationName }/deb`, path.join(this.pool, this.config.debBuilder.component, `${ this.config.debBuilder.applicationName[0]}/${ this.config.debBuilder.applicationName}-${ channel.channel }`, this.debName(deb.version, controlMeta['Architecture']))); + const debSize = controlTar.headers['content-range']?.split('/')[1]; + const sha1 = controlTar.headers['x-checksum-sha1']; + const sha256 = controlTar.headers['x-checksum-sha256']; + const md5 = controlTar.headers['x-checksum-md5']; - if (typeof sha1 !== 'string' || typeof sha256 !== 'string' || typeof md5 !== 'string' || typeof debSize !== 'string') { - throw new Error('No checksum was found in headers'); - } + if (typeof sha1 !== 'string' || typeof sha256 !== 'string' || typeof md5 !== 'string' || typeof debSize !== 'string') { + throw new Error('No checksum was found in headers'); + } - const dataToAppend = `Filename: ${ fileName }\nSize: ${ debSize }\nSHA1: ${ sha1 }\nSHA256: ${ sha256 }\nMD5Sum: ${ md5 }\n`; + const dataToAppend = `Filename: ${ fileName }\nSize: ${ debSize }\nSHA1: ${ sha1 }\nSHA256: ${ sha256 }\nMD5Sum: ${ md5 }\n`; - fs.appendFile(targetMetaPath, dataToAppend, (err) => { - if (err) { - throw err; - } + fs.appendFile(targetMetaPath, dataToAppend, (err) => { + if (err) { + throw err; + } - resolve(); - }); - }); - }); - } - } + resolve(); + }); + }); + }); + } + } + + const compressFile = async (input: string): Promise => { + return new Promise((resolve) => { + const inp = fs.createReadStream(input); + const out = fs.createWriteStream(`${ input }.gz`); + + const gzip = createGzip({ level: 9 }); + + inp.pipe(gzip).pipe(out).on('finish', () => { + resolve(); + }); + }); + } + + for (const chan of this.debRepo) { + const distsRoot = path.join(this.dists, chan.channel, this.config.debBuilder.component); + const distsByArch = fs.readdirSync(distsRoot).map(dist => path.join(distsRoot, dist)); + + for (const dist of distsByArch) { + const targetPackagesFile = path.join(dist, 'Packages'); + const metaFiles = fs.readdirSync(dist) + .filter(fileName => fileName.endsWith('.meta')) + .map(metaFile => path.join(dist, metaFile)); + + let packagesContent = ''; + + for (const metaFile of metaFiles) { + packagesContent += fs.readFileSync(metaFile); + packagesContent += '\n'; + fs.unlinkSync(metaFile); + } + + fs.writeFileSync(targetPackagesFile, packagesContent); + await compressFile(targetPackagesFile); + } + } } public apply(): void { } - private debName(deb: { version: string, arch: string }): string { - return `${ this.config.debBuilder.repoName }-${ deb.version }_${ deb.arch }.deb`; + private debName(version: string, arch: string): string { + return `${ this.config.debBuilder.applicationName }-${ version }_${ arch }.deb`; } + + private async makeRelease(): Promise { + console.log('DebBuilder: makeRelease'); + + const publicKeyPath = path.join(this.keys, 'desktop.asc'); + await fs.promises.copyFile(this.config.debBuilder.gpgPublicKeyPath, publicKeyPath); + + for (const chanDebs of this.debRepo) { + const releaseContent = ReleaseFileTemplate + .replace('$CHANNEL', chanDebs.channel) + .replace('$ARCH', this.arch) + .replace('$COMPONENT', this.config.debBuilder.component); + + const releasePath = path.join(this.dists, chanDebs.channel, 'main', `binary-${ this.arch }`, 'Release'); + const releaseFilePath = path.join(this.dists, chanDebs.channel, 'Release'); + const releaseGpgFilePath = path.join(this.dists, chanDebs.channel, 'Release.gpg'); + const inReleaseFilePath = path.join(this.dists, chanDebs.channel, 'InRelease'); + + await fs.promises.writeFile(releasePath, releaseContent); + await fs.promises.copyFile(releasePath, releaseFilePath); + + await this.execToolToFile('apt-ftparchive', ['release', `${ this.dists }/${ chanDebs.channel }`], releaseFilePath, true); + await this.execToolToFile('gpg', ['--default-key', this.config.debBuilder.gpgKeyName, '-abs', '-o', releaseGpgFilePath, releaseFilePath]); + await this.execToolToFile('gpg', ['--default-key', this.config.debBuilder.gpgKeyName, '--clearsign', '-o', inReleaseFilePath, releaseFilePath]); + } + } + + private async execToolToFile(tool: string, args: string[], outputPath?: string, append?: boolean): Promise { + if (!append && outputPath && fs.existsSync(outputPath)) { + await fs.promises.unlink(outputPath); + } + + const toolProcessResult = spawnSync(tool, args, {stdio: 'pipe', encoding: 'utf-8'}); + const toolOutput = toolProcessResult.stdout; + + const dumpToolOutput = (): void => { + const toolErrOutput = toolProcessResult.stderr; + if (toolOutput && toolOutput.length > 0) { + console.log(toolOutput); + } + if (toolErrOutput && toolErrOutput.length > 0) { + console.warn(toolErrOutput); + } + }; + + if (outputPath) { + console.log(`Execute ${tool} ${args.join(' ')} => ${outputPath}`); + dumpToolOutput(); + if (append) { + return fs.promises.appendFile(outputPath, toolOutput); + } + + return fs.promises.writeFile(outputPath, toolOutput); + } + else { + console.log(`Execute ${tool} ${args.join(' ')}`); + dumpToolOutput(); + } + } } diff --git a/src/http.mts b/src/http.mts index e52e9e5..66eab04 100644 --- a/src/http.mts +++ b/src/http.mts @@ -1,5 +1,6 @@ import { Readable } from 'stream'; -import { IncomingMessage, request as httpRequest } from 'http'; +import { request as httpRequest } from 'https'; +import type { IncomingMessage } from 'http'; export interface RequestBody { content: string | Buffer; @@ -19,6 +20,12 @@ export async function requestStream(url: string, method: string, requestData?: R req .on('response', (incomingMessage: IncomingMessage) => { + if (incomingMessage.statusCode === 301) { + if (incomingMessage.headers.location) { + return requestStream(incomingMessage.headers.location, method, requestData); + } + } + if (incomingMessage.statusCode !== 200) { const stCode = incomingMessage.statusCode ?? 'NO_CODE'; const stMessage = incomingMessage.statusMessage ?? 'NO_MESSAGE'; @@ -28,6 +35,7 @@ export async function requestStream(url: string, method: string, requestData?: R } resolve(incomingMessage); + return; }) .on('error', (err: Error) => { const errno = (err as {errno?: string}).errno ?? ''; diff --git a/src/jfrog/jfrog-artifacts-provider.mts b/src/jfrog/jfrog-artifacts-provider.mts index 52b8c19..5023f3d 100644 --- a/src/jfrog/jfrog-artifacts-provider.mts +++ b/src/jfrog/jfrog-artifacts-provider.mts @@ -1,4 +1,4 @@ -import { type ArtifactoryClient, createArtifactoryClient } from 's3-groundskeeper'; +import { type ArtifactoryClient, createArtifactoryClient, type ArtifactoryItemMeta } from 's3-groundskeeper'; import { get } from '../http.mjs'; import type { Artifact, ArtifactsProvider } from '../artifacts-provider.mjs'; @@ -48,10 +48,24 @@ export class JfrogArtifactsProvider implements ArtifactsProvider { return result; } - public artifactUrl(artifact: Artifact): string { - const baseUrl = `${ this.config.artifactsProvider.protocol }://${ this.config.artifactsProvider.host }/artifactory`; + public async artifactUrl(artifact: Artifact): Promise { + const aqlItemField = 'actual_md5'; + + const artQueryResult = await this.artifactoryClient.query(`items.find({"${aqlItemField}": "${artifact.md5}"}).include("*")`); + if (artQueryResult.results.length === 0) { + throw new Error(`No artifactory item found for ("${aqlItemField}": "${artifact.md5}"}`); + } + else if (artQueryResult.results.length > 1) { + throw new Error(`Expected single artifactory item for ("${aqlItemField}": "${artifact.md5}"}`); + } + + const item = artQueryResult.results[0]; + + if (!item) { + throw new Error(`No artifactory item found for ("${aqlItemField}": "${artifact.md5}"}`); + } - return `${ baseUrl }/${ artifact.path }`; + return this.artifactoryClient.resolveUri(item); } private async buildInfosByNumber(buildNumber: string): Promise { From 6b15b16df2778492afd9969a40f591444b32f181 Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Tue, 16 May 2023 12:51:43 +0300 Subject: [PATCH 33/58] make release file and sign it --- src/deb/deb-builder-config.mts | 1 + src/deb/deb-builder.mts | 38 ++++++++++++++++++---------------- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/deb/deb-builder-config.mts b/src/deb/deb-builder-config.mts index 059ce4a..62a9d13 100644 --- a/src/deb/deb-builder-config.mts +++ b/src/deb/deb-builder-config.mts @@ -4,5 +4,6 @@ export interface DebBuilderConfig { gpgKeyName: string; applicationName: string; component: string; + origin: string; } } diff --git a/src/deb/deb-builder.mts b/src/deb/deb-builder.mts index 5035308..e61b5a7 100644 --- a/src/deb/deb-builder.mts +++ b/src/deb/deb-builder.mts @@ -156,6 +156,8 @@ export class DebBuilder implements IBuilder { await compressFile(targetPackagesFile); } + + await this.makeRelease(chan.channel, 'amd64'); } } @@ -167,30 +169,30 @@ export class DebBuilder implements IBuilder { return `${ this.config.debBuilder.applicationName }-${ version }_${ arch }.deb`; } - private async makeRelease(): Promise { + private async makeRelease(channel: string, arch: string): Promise { console.log('DebBuilder: makeRelease'); - const publicKeyPath = path.join(this.keys, 'desktop.asc'); - await fs.promises.copyFile(this.config.debBuilder.gpgPublicKeyPath, publicKeyPath); + const publicKeyPath = path.join(this.keys, 'desktop.asc'); + createDir(this.keys); + await fs.promises.copyFile(this.config.debBuilder.gpgPublicKeyPath, publicKeyPath); - for (const chanDebs of this.debRepo) { - const releaseContent = ReleaseFileTemplate - .replace('$CHANNEL', chanDebs.channel) - .replace('$ARCH', this.arch) - .replace('$COMPONENT', this.config.debBuilder.component); + const releaseContent = ReleaseFileTemplate + .replace('$ORIGIN', this.config.debBuilder.origin) + .replace('$CHANNEL', channel) + .replace('$ARCH', arch) + .replace('$COMPONENT', this.config.debBuilder.component); - const releasePath = path.join(this.dists, chanDebs.channel, 'main', `binary-${ this.arch }`, 'Release'); - const releaseFilePath = path.join(this.dists, chanDebs.channel, 'Release'); - const releaseGpgFilePath = path.join(this.dists, chanDebs.channel, 'Release.gpg'); - const inReleaseFilePath = path.join(this.dists, chanDebs.channel, 'InRelease'); + const releasePath = path.join(this.dists, channel, 'main', `binary-${ arch }`, 'Release'); + const releaseFilePath = path.join(this.dists, channel, 'Release'); + const releaseGpgFilePath = path.join(this.dists, channel, 'Release.gpg'); + const inReleaseFilePath = path.join(this.dists, channel, 'InRelease'); - await fs.promises.writeFile(releasePath, releaseContent); - await fs.promises.copyFile(releasePath, releaseFilePath); + await fs.promises.writeFile(releasePath, releaseContent); + await fs.promises.copyFile(releasePath, releaseFilePath); - await this.execToolToFile('apt-ftparchive', ['release', `${ this.dists }/${ chanDebs.channel }`], releaseFilePath, true); - await this.execToolToFile('gpg', ['--default-key', this.config.debBuilder.gpgKeyName, '-abs', '-o', releaseGpgFilePath, releaseFilePath]); - await this.execToolToFile('gpg', ['--default-key', this.config.debBuilder.gpgKeyName, '--clearsign', '-o', inReleaseFilePath, releaseFilePath]); - } + await this.execToolToFile('apt-ftparchive', ['release', `${ this.dists }/${ channel }`], releaseFilePath, true); + await this.execToolToFile('gpg', ['--default-key', this.config.debBuilder.gpgKeyName, '-abs', '-o', releaseGpgFilePath, releaseFilePath]); + await this.execToolToFile('gpg', ['--default-key', this.config.debBuilder.gpgKeyName, '--clearsign', '-o', inReleaseFilePath, releaseFilePath]); } private async execToolToFile(tool: string, args: string[], outputPath?: string, append?: boolean): Promise { From 445e2c755206b480f6470ac1c6123b694a1c03a3 Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Wed, 17 May 2023 16:14:18 +0300 Subject: [PATCH 34/58] lots of linter issues fixed --- .gitignore | 2 + src/artifacts-provider-config.mts | 2 +- src/artifacts-provider.mts | 1 + src/config.mts | 2 +- src/deb/deb-builder-config.mts | 18 ++-- src/deb/deb-builder.mts | 118 +++++++++++++------------ src/fs.mts | 51 +++++------ src/http.mts | 81 +++++++---------- src/ibuilder.mts | 8 +- src/index.mts | 11 ++- src/jfrog/jfrog-artifacts-provider.mts | 40 +++++---- src/repo.mts | 12 +-- 12 files changed, 174 insertions(+), 172 deletions(-) diff --git a/.gitignore b/.gitignore index af489f5..37044d1 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ out/ # coverage report directory /coverage/ + +jewel-case.config.mjs diff --git a/src/artifacts-provider-config.mts b/src/artifacts-provider-config.mts index 50edcf1..e0284c4 100644 --- a/src/artifacts-provider-config.mts +++ b/src/artifacts-provider-config.mts @@ -9,4 +9,4 @@ export interface ArtifactsProviderConfig { apiKey: string, user: string } -} \ No newline at end of file +} diff --git a/src/artifacts-provider.mts b/src/artifacts-provider.mts index 295f449..4905c98 100644 --- a/src/artifacts-provider.mts +++ b/src/artifacts-provider.mts @@ -10,4 +10,5 @@ export interface Artifact { export interface ArtifactsProvider { artifactsByBuildNumber(buildNumber: string): Promise; artifactUrl(artifact: Artifact): Promise; + createMetapointerFile(artifact: Artifact, fileName: string): void; } diff --git a/src/config.mts b/src/config.mts index 6354ace..306ece1 100644 --- a/src/config.mts +++ b/src/config.mts @@ -1,8 +1,8 @@ import path from 'path'; import { pathToFileURL } from 'url'; -import type { DebBuilderConfig } from './deb/deb-builder-config.mjs'; import type { ArtifactsProviderConfig } from './artifacts-provider-config.mjs'; +import type { DebBuilderConfig } from './deb/deb-builder-config.mjs'; import type { Repo } from './repo.mjs'; interface BaseConfig { diff --git a/src/deb/deb-builder-config.mts b/src/deb/deb-builder-config.mts index 62a9d13..05369b7 100644 --- a/src/deb/deb-builder-config.mts +++ b/src/deb/deb-builder-config.mts @@ -1,9 +1,9 @@ -export interface DebBuilderConfig { - debBuilder: { - gpgPublicKeyPath: string; - gpgKeyName: string; - applicationName: string; - component: string; - origin: string; - } -} +export interface DebBuilderConfig { + debBuilder: { + gpgPublicKeyPath: string; + gpgKeyName: string; + applicationName: string; + component: string; + origin: string; + } +} diff --git a/src/deb/deb-builder.mts b/src/deb/deb-builder.mts index e61b5a7..44cb30b 100644 --- a/src/deb/deb-builder.mts +++ b/src/deb/deb-builder.mts @@ -1,18 +1,20 @@ +import { createGzip } from 'zlib'; +import { spawnSync } from 'child_process'; + +import * as crypto from 'crypto'; +import * as fs from 'fs'; +import * as ini from 'ini'; +import * as os from 'os'; +import * as path from 'path'; +import * as tar from 'tar'; + import type { Artifact, ArtifactsProvider } from '../artifacts-provider.mjs'; import { createDir, removeDir } from '../fs.mjs'; +import type { Config } from '../config.mjs'; import type { IBuilder } from '../ibuilder.mjs'; import { requestRange } from '../http.mjs'; -import type { Config } from '../config.mjs'; -import * as path from 'path'; -import * as fs from 'fs'; -import * as tar from 'tar'; -import * as ini from 'ini'; -import * as crypto from 'crypto'; -import * as os from 'os'; -import { createGzip } from 'zlib'; -import { spawnSync } from 'child_process'; -const ReleaseFileTemplate = +const ReleaseFileTemplate = `Origin: $ORIGIN Label: Ubuntu/Debian Architecture: $ARCH @@ -25,8 +27,8 @@ export class DebBuilder implements IBuilder { private readonly artifactsProvider: ArtifactsProvider; private readonly pool: string; - private readonly dists: string; - private readonly keys: string; + private readonly dists: string; + private readonly keys: string; private debRepo: { channel: string, @@ -39,16 +41,15 @@ export class DebBuilder implements IBuilder { constructor(artifactsProvider: ArtifactsProvider, config: Config) { this.config = config; - this.pool = `${ this.config.base.out }/repo/${ this.config.debBuilder.applicationName }/deb/pool`; - this.dists = `${ this.config.base.out }/repo/${ this.config.debBuilder.applicationName }/deb/dists`; - this.keys = `${ this.config.base.out }/repo/${ this.config.debBuilder.applicationName }/deb/keys`; - this.keys; + this.pool = `${this.config.base.out}/repo/${this.config.debBuilder.applicationName}/deb/pool`; + this.dists = `${this.config.base.out}/repo/${this.config.debBuilder.applicationName}/deb/dists`; + this.keys = `${this.config.base.out}/repo/${this.config.debBuilder.applicationName}/deb/keys`; this.artifactsProvider = artifactsProvider; } public async plan(): Promise { for (const entry of this.config.base.repo) { - let debs: { + const debs: { version: string, url: string, artifact: Artifact @@ -61,7 +62,7 @@ export class DebBuilder implements IBuilder { debs.push({ version: pack.version, url: await this.artifactsProvider.artifactUrl(artifact), - artifact: artifact + artifact, }); } } @@ -69,35 +70,39 @@ export class DebBuilder implements IBuilder { this.debRepo.push({ channel: entry.channel, debs }); } - + for (const channel of this.debRepo) { for (const deb of channel.debs) { const debUrl = deb.url; const controlTarSizeRange = '120-129'; // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call - const cocntrolTarSize = Number((await requestRange(debUrl, controlTarSizeRange)).read().toString().trim()); - const controlTarRange = `132-${ 131 + cocntrolTarSize }`; + const cocntrolTarSize = Number((await requestRange(debUrl, controlTarSizeRange)).read().toString() + .trim()); + const controlTarRange = `132-${131 + cocntrolTarSize}`; const controlTar = await requestRange(debUrl, controlTarRange); - const whereExtract = path.join(os.tmpdir(), `control-${ crypto.randomBytes(4).toString('hex')}`); + const whereExtract = path.join(os.tmpdir(), `control-${crypto.randomBytes(4).toString('hex')}`); createDir(whereExtract); - await new Promise((resolve) => { + await new Promise(resolve => { controlTar .pipe(tar.extract({ cwd: whereExtract, strip: 1 }, ['./control'])) .on('finish', () => { const controlMetaContent = fs.readFileSync(path.join(whereExtract, 'control'), 'utf-8').replaceAll(':', '='); const controlMeta = ini.parse(controlMetaContent); - const targetMetaPath = path.join(this.dists, channel.channel, this.config.debBuilder.component, `binary-${ controlMeta['Architecture'] }`, `${ this.debName(deb.version, controlMeta['Architecture']) }.meta`); + const targetMetaPath = path.join(this.dists, channel.channel, this.config.debBuilder.component, `binary-${controlMeta['Architecture']}`, `${this.debName(deb.version, controlMeta['Architecture'])}.meta`); createDir(path.dirname(targetMetaPath)); fs.renameSync(path.join(whereExtract, 'control'), targetMetaPath); removeDir(whereExtract); - const fileName = path.relative(`${ this.config.base.out }/repo/${ this.config.debBuilder.applicationName }/deb`, path.join(this.pool, this.config.debBuilder.component, `${ this.config.debBuilder.applicationName[0]}/${ this.config.debBuilder.applicationName}-${ channel.channel }`, this.debName(deb.version, controlMeta['Architecture']))); + const debPath = path.join(this.pool, this.config.debBuilder.component, `${this.config.debBuilder.applicationName[0]}`, this.config.debBuilder.applicationName, channel.channel, this.debName(deb.version, controlMeta['Architecture'])); + const repoRoot = path.join(this.config.base.out, 'repo', this.config.debBuilder.applicationName, 'deb'); + const relativeDebPath = path.relative(repoRoot, debPath); + this.artifactsProvider.createMetapointerFile(deb.artifact, debPath); const debSize = controlTar.headers['content-range']?.split('/')[1]; const sha1 = controlTar.headers['x-checksum-sha1']; const sha256 = controlTar.headers['x-checksum-sha256']; @@ -107,32 +112,31 @@ export class DebBuilder implements IBuilder { throw new Error('No checksum was found in headers'); } - const dataToAppend = `Filename: ${ fileName }\nSize: ${ debSize }\nSHA1: ${ sha1 }\nSHA256: ${ sha256 }\nMD5Sum: ${ md5 }\n`; + const dataToAppend = `Filename: ${relativeDebPath}\nSize: ${debSize}\nSHA1: ${sha1}\nSHA256: ${sha256}\nMD5Sum: ${md5}\n`; - fs.appendFile(targetMetaPath, dataToAppend, (err) => { - if (err) { + fs.appendFile(targetMetaPath, dataToAppend, err => { + if (err) { throw err; } resolve(); }); - }); + }); }); } } - const compressFile = async (input: string): Promise => { - return new Promise((resolve) => { - const inp = fs.createReadStream(input); - const out = fs.createWriteStream(`${ input }.gz`); - - const gzip = createGzip({ level: 9 }); - - inp.pipe(gzip).pipe(out).on('finish', () => { + const compressFile = (input: string): Promise => new Promise(resolve => { + const inp = fs.createReadStream(input); + const out = fs.createWriteStream(`${input}.gz`); + + const gzip = createGzip({ level: 9 }); + + inp.pipe(gzip).pipe(out) + .on('finish', () => { resolve(); }); - }); - } + }); for (const chan of this.debRepo) { const distsRoot = path.join(this.dists, chan.channel, this.config.debBuilder.component); @@ -143,7 +147,7 @@ export class DebBuilder implements IBuilder { const metaFiles = fs.readdirSync(dist) .filter(fileName => fileName.endsWith('.meta')) .map(metaFile => path.join(dist, metaFile)); - + let packagesContent = ''; for (const metaFile of metaFiles) { @@ -162,15 +166,15 @@ export class DebBuilder implements IBuilder { } public apply(): void { - + console.log(this); } private debName(version: string, arch: string): string { - return `${ this.config.debBuilder.applicationName }-${ version }_${ arch }.deb`; + return `${this.config.debBuilder.applicationName}-${version}_${arch}.deb`; } private async makeRelease(channel: string, arch: string): Promise { - console.log('DebBuilder: makeRelease'); + console.log('DebBuilder: makeRelease'); const publicKeyPath = path.join(this.keys, 'desktop.asc'); createDir(this.keys); @@ -182,7 +186,7 @@ export class DebBuilder implements IBuilder { .replace('$ARCH', arch) .replace('$COMPONENT', this.config.debBuilder.component); - const releasePath = path.join(this.dists, channel, 'main', `binary-${ arch }`, 'Release'); + const releasePath = path.join(this.dists, channel, 'main', `binary-${arch}`, 'Release'); const releaseFilePath = path.join(this.dists, channel, 'Release'); const releaseGpgFilePath = path.join(this.dists, channel, 'Release.gpg'); const inReleaseFilePath = path.join(this.dists, channel, 'InRelease'); @@ -190,41 +194,41 @@ export class DebBuilder implements IBuilder { await fs.promises.writeFile(releasePath, releaseContent); await fs.promises.copyFile(releasePath, releaseFilePath); - await this.execToolToFile('apt-ftparchive', ['release', `${ this.dists }/${ channel }`], releaseFilePath, true); + await this.execToolToFile('apt-ftparchive', ['release', `${this.dists}/${channel}`], releaseFilePath, true); await this.execToolToFile('gpg', ['--default-key', this.config.debBuilder.gpgKeyName, '-abs', '-o', releaseGpgFilePath, releaseFilePath]); await this.execToolToFile('gpg', ['--default-key', this.config.debBuilder.gpgKeyName, '--clearsign', '-o', inReleaseFilePath, releaseFilePath]); - } + } private async execToolToFile(tool: string, args: string[], outputPath?: string, append?: boolean): Promise { if (!append && outputPath && fs.existsSync(outputPath)) { await fs.promises.unlink(outputPath); } - - const toolProcessResult = spawnSync(tool, args, {stdio: 'pipe', encoding: 'utf-8'}); + + const toolProcessResult = spawnSync(tool, args, { stdio: 'pipe', encoding: 'utf-8' }); const toolOutput = toolProcessResult.stdout; - + const dumpToolOutput = (): void => { const toolErrOutput = toolProcessResult.stderr; if (toolOutput && toolOutput.length > 0) { console.log(toolOutput); } + if (toolErrOutput && toolErrOutput.length > 0) { console.warn(toolErrOutput); } }; - + if (outputPath) { console.log(`Execute ${tool} ${args.join(' ')} => ${outputPath}`); dumpToolOutput(); if (append) { return fs.promises.appendFile(outputPath, toolOutput); } - - return fs.promises.writeFile(outputPath, toolOutput); - } - else { - console.log(`Execute ${tool} ${args.join(' ')}`); - dumpToolOutput(); + + return fs.promises.writeFile(outputPath, toolOutput); } - } + + console.log(`Execute ${tool} ${args.join(' ')}`); + dumpToolOutput(); + } } diff --git a/src/fs.mts b/src/fs.mts index 615639c..23949b9 100644 --- a/src/fs.mts +++ b/src/fs.mts @@ -1,25 +1,26 @@ -import { writeFileSync, mkdirSync, existsSync, rmdirSync } from 'fs'; - -export function createFile(path: string, content: string): void { - const dirPath = path.split('/').slice(0, -1).join('/'); - - createDir(dirPath); - - writeFileSync(path, content); -} - -export function createDir(dirName: string): void { - if (!existsSync(dirName)) { - mkdirSync(dirName, { recursive: true }); - } -} - -export function removeDir(dirName: string): void { - if (existsSync(dirName)) { - rmdirSync(dirName, {recursive: true}); - } -} - -export function createMetapointerContent(fileMd5Hash: string): string { - return `#metapointer jfrogart\noid md5:${fileMd5Hash}`; -} \ No newline at end of file +import * as path from 'path'; +import { existsSync, mkdirSync, rmdirSync, writeFileSync } from 'fs'; + +export function createFile(filePath: string, content: string): void { + const dirPath = path.dirname(filePath); + + createDir(dirPath); + + writeFileSync(filePath, content); +} + +export function createDir(dirName: string): void { + if (!existsSync(dirName)) { + mkdirSync(dirName, { recursive: true }); + } +} + +export function removeDir(dirName: string): void { + if (existsSync(dirName)) { + rmdirSync(dirName, { recursive: true }); + } +} + +export function createMetapointerContent(fileMd5Hash: string): string { + return `#metapointer jfrogart\noid md5:${fileMd5Hash}`; +} diff --git a/src/http.mts b/src/http.mts index 66eab04..6db22ab 100644 --- a/src/http.mts +++ b/src/http.mts @@ -1,6 +1,6 @@ -import { Readable } from 'stream'; import { request as httpRequest } from 'https'; import type { IncomingMessage } from 'http'; +import { Readable } from 'stream'; export interface RequestBody { content: string | Buffer; @@ -13,82 +13,69 @@ export interface RequestData { redirectHandler?: (url: string) => string | undefined; } -export async function requestStream(url: string, method: string, requestData?: RequestData): Promise { +export function requestStream(url: string, method: string, requestData?: RequestData): Promise { return new Promise((resolve, reject) => { try { const req = httpRequest(url, { method }); - + req .on('response', (incomingMessage: IncomingMessage) => { - if (incomingMessage.statusCode === 301) { - if (incomingMessage.headers.location) { - return requestStream(incomingMessage.headers.location, method, requestData); - } - } - if (incomingMessage.statusCode !== 200) { const stCode = incomingMessage.statusCode ?? 'NO_CODE'; const stMessage = incomingMessage.statusMessage ?? 'NO_MESSAGE'; const message = `[${method} ${url}]:${stCode}/${stMessage}`; reject(new Error(message)); - return; } resolve(incomingMessage); - return; }) .on('error', (err: Error) => { const errno = (err as {errno?: string}).errno ?? ''; if (errno === 'ETIMEDOUT') { reject(new Error(`Request (${url}) timeout.`)); - } - else { + } else { reject(err); } }); - if (requestData) { - if (requestData.headers) { - for (const key of Object.getOwnPropertyNames(requestData.headers)) { - const value = requestData.headers[key]; + if (requestData?.headers) { + for (const key of Object.getOwnPropertyNames(requestData.headers)) { + const value = requestData.headers[key]; - if (value) { - req.setHeader(key, value); - } + if (value) { + req.setHeader(key, value); } } + } - if (requestData.body) { - if (requestData.body.contentType) { - req.setHeader('Content-Type', requestData.body.contentType); - } - req.write(requestData.body.content); + if (requestData?.body) { + if (requestData.body.contentType) { + req.setHeader('Content-Type', requestData.body.contentType); } + req.write(requestData.body.content); } req.end(); - } - catch (err) { + } catch (err) { reject(err); } }); } export async function request(url: string, method: string, requestData?: RequestData): Promise { - const responseStream = await requestStream(url, method, requestData); - let buffer: Buffer | undefined; + let buffer: Buffer | undefined = undefined; for await (const item of responseStream) { const chunk = item as Buffer; - buffer = (typeof buffer === 'undefined') ? chunk : Buffer.concat([buffer, chunk ]); + buffer = (typeof buffer === 'undefined') ? chunk : Buffer.concat([buffer, chunk]); } return buffer ? buffer : Buffer.from(''); } -export async function requestRange(url: string, range: string): Promise { +export function requestRange(url: string, range: string): Promise { return new Promise((resolve, reject) => { try { const req = httpRequest(url, { method: 'GET' }); @@ -109,34 +96,32 @@ export async function requestRange(url: string, range: string): Promise { - const errno = (err as {errno?: string}).errno ?? ''; - if (errno === 'ETIMEDOUT') { - reject(new Error(`Request (${url}) timeout.`)); - } - else { - reject(err); - } - }); + .on('error', (err: Error) => { + const errno = (err as {errno?: string}).errno ?? ''; + if (errno === 'ETIMEDOUT') { + reject(new Error(`Request (${url}) timeout.`)); + } else { + reject(err); + } + }); - req.setHeader('Range', `bytes=${ range }`); + req.setHeader('Range', `bytes=${range}`); req.end(); - } - catch (err) { + } catch (err) { reject(err); } }); } -export function get(url: string, opt?: {stream: false} ): Promise; -export function get(url: string, opt?: {stream: true} ): Promise; +export function get(url: string, opt?: {stream: false}): Promise; +export function get(url: string, opt?: {stream: true}): Promise; -export async function get(url: string, opt: {stream: boolean} = {stream: false}): Promise { - return opt.stream ? requestStream(url, 'GET', undefined ) : request(url, 'GET', undefined ); +export function get(url: string, opt: {stream: boolean} = { stream: false }): Promise { + return opt.stream ? requestStream(url, 'GET', undefined) : request(url, 'GET', undefined); } export function post(url: string, requestData?: RequestData): Promise { - return request(url, 'POST', requestData ); + return request(url, 'POST', requestData); } diff --git a/src/ibuilder.mts b/src/ibuilder.mts index 3e1a283..3437aa5 100644 --- a/src/ibuilder.mts +++ b/src/ibuilder.mts @@ -1,4 +1,4 @@ -export interface IBuilder { - plan(): Promise; - apply(): void; -} +export interface IBuilder { + plan(): Promise; + apply(): void; +} diff --git a/src/index.mts b/src/index.mts index 2a43588..4814120 100644 --- a/src/index.mts +++ b/src/index.mts @@ -1,15 +1,15 @@ import type { Config } from './config.mjs'; +import { DebBuilder } from './deb/deb-builder.mjs'; import type { IBuilder } from './ibuilder.mjs'; import { JfrogArtifactsProvider } from './jfrog/jfrog-artifacts-provider.mjs'; -import { DebBuilder } from './deb/deb-builder.mjs'; -export { type Config, createConfigProvider } from './config.mjs'; +export { type Config, createConfigProvider } from './config.mjs'; export async function plan(config: Config): Promise { const artifactsProvider = new JfrogArtifactsProvider(config); - let builders: IBuilder[] = []; - + const builders: IBuilder[] = []; + if (config.debBuilder) { builders.push(new DebBuilder(artifactsProvider, config)); } @@ -21,7 +21,6 @@ export async function plan(config: Config): Promise { console.log('plan()'); } -export function apply(config: Config): void { - config; +export function apply(): void { console.log('apply()'); } diff --git a/src/jfrog/jfrog-artifacts-provider.mts b/src/jfrog/jfrog-artifacts-provider.mts index 5023f3d..a4daf08 100644 --- a/src/jfrog/jfrog-artifacts-provider.mts +++ b/src/jfrog/jfrog-artifacts-provider.mts @@ -1,6 +1,8 @@ -import { type ArtifactoryClient, createArtifactoryClient, type ArtifactoryItemMeta } from 's3-groundskeeper'; +import { type ArtifactoryClient, type ArtifactoryItemMeta, createArtifactoryClient } from 's3-groundskeeper'; +import { createFile } from '../fs.mjs'; import { get } from '../http.mjs'; + import type { Artifact, ArtifactsProvider } from '../artifacts-provider.mjs'; import type { ArtifactsProviderConfig } from '../artifacts-provider-config.mjs'; @@ -19,6 +21,10 @@ export interface BuildInfo { } } +function metapointerContent(fileMd5Hash: string): string { + return `#metapointer jfrogart\noid md5:${fileMd5Hash}`; +} + export class JfrogArtifactsProvider implements ArtifactsProvider { private artifactoryClient: ArtifactoryClient; private buildsList?: BuildsList; @@ -26,12 +32,12 @@ export class JfrogArtifactsProvider implements ArtifactsProvider { private readonly config: ArtifactsProviderConfig; constructor(config: ArtifactsProviderConfig) { - this.config = config; + this.config = config; this.artifactoryClient = createArtifactoryClient({ protocol: this.config.artifactsProvider.protocol, host: this.config.artifactsProvider.host, - apiKey: this.config.artifactsProvider.apiKey, - user: this.config.artifactsProvider.user + apiKey: this.config.artifactsProvider.apiKey, + user: this.config.artifactsProvider.user, }); } @@ -50,24 +56,28 @@ export class JfrogArtifactsProvider implements ArtifactsProvider { public async artifactUrl(artifact: Artifact): Promise { const aqlItemField = 'actual_md5'; - + const artQueryResult = await this.artifactoryClient.query(`items.find({"${aqlItemField}": "${artifact.md5}"}).include("*")`); if (artQueryResult.results.length === 0) { throw new Error(`No artifactory item found for ("${aqlItemField}": "${artifact.md5}"}`); - } - else if (artQueryResult.results.length > 1) { + } else if (artQueryResult.results.length > 1) { throw new Error(`Expected single artifactory item for ("${aqlItemField}": "${artifact.md5}"}`); } - + const item = artQueryResult.results[0]; - + if (!item) { throw new Error(`No artifactory item found for ("${aqlItemField}": "${artifact.md5}"}`); } - + return this.artifactoryClient.resolveUri(item); } + // eslint-disable-next-line class-methods-use-this + public createMetapointerFile(artifact: Artifact, fileName: string): void { + createFile(fileName, metapointerContent(artifact.md5)); + } + private async buildInfosByNumber(buildNumber: string): Promise { if (!this.artifactoryClient) { throw new Error('Artifactory client does not exists'); @@ -75,7 +85,7 @@ export class JfrogArtifactsProvider implements ArtifactsProvider { const result: BuildInfo[] = []; - const buildsEndpoint = this.artifactoryClient.resolveUri(`api/build/${ this.config.artifactsProvider.project }`);; + const buildsEndpoint = this.artifactoryClient.resolveUri(`api/build/${this.config.artifactsProvider.project}`); if (!this.buildsList) { const allBuilds = await get(buildsEndpoint); @@ -84,18 +94,18 @@ export class JfrogArtifactsProvider implements ArtifactsProvider { const buildTimes = (buildUri: string): Date[] => { const times: Date[] = []; - + this.buildsList?.buildsNumbers.forEach(build => { - if (build.uri === `/${ buildUri}`) { + if (build.uri === `/${buildUri}`) { times.push(new Date(build.started)); } }); - + return times; }; for (const value of buildTimes(buildNumber)) { - const buildInfoEndpoint = `${ buildsEndpoint }/${ buildNumber }?started=${ value.toISOString() }`; + const buildInfoEndpoint = `${buildsEndpoint}/${buildNumber}?started=${value.toISOString()}`; const info = (await get(buildInfoEndpoint)).toString(); const buildInfo = JSON.parse(info) as BuildInfo; diff --git a/src/repo.mts b/src/repo.mts index 6fca0fb..74225a6 100644 --- a/src/repo.mts +++ b/src/repo.mts @@ -1,15 +1,15 @@ export interface Package { - version: string, - buildNumber: string + version: string, + buildNumber: string } export interface Packages { - packages: Package[], - highest: Package, + packages: Package[], + highest: Package, } export type Channel = string; export type Repo = { - channel: Channel, - packages: Packages + channel: Channel, + packages: Packages }[] From ceabe0cbcf7dbf62f61e11bd53048ba6c36b8194 Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Fri, 19 May 2023 15:34:29 +0300 Subject: [PATCH 35/58] refactoring: removing awaits from loops --- src/cli.mts | 2 +- src/deb/deb-builder.mts | 208 +++++++++++++++---------- src/index.mts | 8 +- src/jfrog/jfrog-artifacts-provider.mts | 12 +- 4 files changed, 141 insertions(+), 89 deletions(-) diff --git a/src/cli.mts b/src/cli.mts index e63a4b0..1952798 100644 --- a/src/cli.mts +++ b/src/cli.mts @@ -22,7 +22,7 @@ async function main(): Promise { } if (command === 'apply') { - apply(configProvider.config); + apply(); } return 0; diff --git a/src/deb/deb-builder.mts b/src/deb/deb-builder.mts index 44cb30b..42376fe 100644 --- a/src/deb/deb-builder.mts +++ b/src/deb/deb-builder.mts @@ -13,6 +13,7 @@ import { createDir, removeDir } from '../fs.mjs'; import type { Config } from '../config.mjs'; import type { IBuilder } from '../ibuilder.mjs'; import { requestRange } from '../http.mjs'; +import type { Packages } from '../repo.mjs'; const ReleaseFileTemplate = `Origin: $ORIGIN @@ -21,6 +22,11 @@ Architecture: $ARCH Component: $COMPONENT Codename: $CHANNEL\n`; +interface DebDescriptor { + version: string, + url: string, + artifact: Artifact +} export class DebBuilder implements IBuilder { private readonly config: Config; @@ -32,11 +38,8 @@ export class DebBuilder implements IBuilder { private debRepo: { channel: string, - debs: { - version: string, - url: string, - artifact: Artifact - }[]}[] = []; + debs: DebDescriptor[] + }[] = []; constructor(artifactsProvider: ArtifactsProvider, config: Config) { this.config = config; @@ -48,83 +51,8 @@ export class DebBuilder implements IBuilder { } public async plan(): Promise { - for (const entry of this.config.base.repo) { - const debs: { - version: string, - url: string, - artifact: Artifact - }[] = []; - - for (const pack of entry.packages.packages) { - const debArtifactItems = (await this.artifactsProvider.artifactsByBuildNumber(pack.buildNumber)).filter(artifact => artifact.type === 'deb'); - - for (const artifact of debArtifactItems) { - debs.push({ - version: pack.version, - url: await this.artifactsProvider.artifactUrl(artifact), - artifact, - }); - } - } - - this.debRepo.push({ channel: entry.channel, debs }); - } - - - for (const channel of this.debRepo) { - for (const deb of channel.debs) { - const debUrl = deb.url; - const controlTarSizeRange = '120-129'; - - // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call - const cocntrolTarSize = Number((await requestRange(debUrl, controlTarSizeRange)).read().toString() - .trim()); - const controlTarRange = `132-${131 + cocntrolTarSize}`; - const controlTar = await requestRange(debUrl, controlTarRange); - - const whereExtract = path.join(os.tmpdir(), `control-${crypto.randomBytes(4).toString('hex')}`); - - createDir(whereExtract); - - await new Promise(resolve => { - controlTar - .pipe(tar.extract({ cwd: whereExtract, strip: 1 }, ['./control'])) - .on('finish', () => { - const controlMetaContent = fs.readFileSync(path.join(whereExtract, 'control'), 'utf-8').replaceAll(':', '='); - const controlMeta = ini.parse(controlMetaContent); - - const targetMetaPath = path.join(this.dists, channel.channel, this.config.debBuilder.component, `binary-${controlMeta['Architecture']}`, `${this.debName(deb.version, controlMeta['Architecture'])}.meta`); - createDir(path.dirname(targetMetaPath)); - fs.renameSync(path.join(whereExtract, 'control'), targetMetaPath); - - removeDir(whereExtract); - - const debPath = path.join(this.pool, this.config.debBuilder.component, `${this.config.debBuilder.applicationName[0]}`, this.config.debBuilder.applicationName, channel.channel, this.debName(deb.version, controlMeta['Architecture'])); - const repoRoot = path.join(this.config.base.out, 'repo', this.config.debBuilder.applicationName, 'deb'); - const relativeDebPath = path.relative(repoRoot, debPath); - this.artifactsProvider.createMetapointerFile(deb.artifact, debPath); - const debSize = controlTar.headers['content-range']?.split('/')[1]; - const sha1 = controlTar.headers['x-checksum-sha1']; - const sha256 = controlTar.headers['x-checksum-sha256']; - const md5 = controlTar.headers['x-checksum-md5']; - - if (typeof sha1 !== 'string' || typeof sha256 !== 'string' || typeof md5 !== 'string' || typeof debSize !== 'string') { - throw new Error('No checksum was found in headers'); - } - - const dataToAppend = `Filename: ${relativeDebPath}\nSize: ${debSize}\nSHA1: ${sha1}\nSHA256: ${sha256}\nMD5Sum: ${md5}\n`; - - fs.appendFile(targetMetaPath, dataToAppend, err => { - if (err) { - throw err; - } - - resolve(); - }); - }); - }); - } - } + await this.prepareMetaRepository(); + await this.dpkgScanpackages(); const compressFile = (input: string): Promise => new Promise(resolve => { const inp = fs.createReadStream(input); @@ -199,6 +127,122 @@ export class DebBuilder implements IBuilder { await this.execToolToFile('gpg', ['--default-key', this.config.debBuilder.gpgKeyName, '--clearsign', '-o', inReleaseFilePath, releaseFilePath]); } + private async prepareMetaRepository(): Promise { + const debsPromises: Promise<{channel: string, debs: DebDescriptor[]}>[] = []; + + this.config.base.repo.forEach(channelEntry => { + const a = (async (): Promise<{ channel: string, debs: DebDescriptor[] }> => { + return { + channel: channelEntry.channel, + debs: await this.debsByPackages(channelEntry.packages) + }; + })(); + + debsPromises.push(a); + }); + + const b = await Promise.all(debsPromises); + + b.forEach(entry => { + this.debRepo.push(entry); + }); + } + + private async debsByPackages(packs: Packages): Promise { + const debsPromises: Promise[] = []; + const artsByBuildNumbersPromises: Promise<{version: string, artifacts: Artifact[]}>[] = []; + + packs.packages.forEach(pack => { + artsByBuildNumbersPromises.push((async (): Promise<{ version: string, artifacts: Artifact[] }> => { + return { + version: pack.version, + artifacts: await this.artifactsProvider.artifactsByBuildNumber(pack.buildNumber), + }; + })()); + }); + + const artsByBuildNumbers = await Promise.all(artsByBuildNumbersPromises); + + artsByBuildNumbers.forEach(value => { + value.artifacts.filter(artifact => artifact.type === 'deb').forEach(artifact => { + debsPromises.push((async (): Promise => { + return { + version: value.version, + artifact: artifact, + url: await this.artifactsProvider.artifactUrl(artifact) + }; + })()); + }) + }); + + return Promise.all(debsPromises); + } + + private async dpkgScanpackages(): Promise { + const promises: Promise[] = []; + + this.debRepo.forEach(channel => { + channel.debs.forEach(deb => { + promises.push(this.handleDeb(channel.channel, deb)); + }); + }); + + await Promise.all(promises); + } + + private async handleDeb(channel: string, deb: DebDescriptor): Promise { + const debUrl = deb.url; + const controlTarSizeRange = '120-129'; + + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + const cocntrolTarSize = Number((await requestRange(debUrl, controlTarSizeRange)).read().toString() + .trim()); + const controlTarRange = `132-${131 + cocntrolTarSize}`; + const controlTar = await requestRange(debUrl, controlTarRange); + + const whereExtract = path.join(os.tmpdir(), `control-${crypto.randomBytes(4).toString('hex')}`); + + createDir(whereExtract); + + await new Promise(resolve => { + controlTar + .pipe(tar.extract({ cwd: whereExtract, strip: 1 }, ['./control'])) + .on('finish', () => { + const controlMetaContent = fs.readFileSync(path.join(whereExtract, 'control'), 'utf-8').replaceAll(':', '='); + const controlMeta = ini.parse(controlMetaContent); + + const targetMetaPath = path.join(this.dists, channel, this.config.debBuilder.component, `binary-${controlMeta['Architecture']}`, `${this.debName(deb.version, controlMeta['Architecture'])}.meta`); + createDir(path.dirname(targetMetaPath)); + fs.renameSync(path.join(whereExtract, 'control'), targetMetaPath); + + removeDir(whereExtract); + + const debPath = path.join(this.pool, this.config.debBuilder.component, `${this.config.debBuilder.applicationName[0]}`, this.config.debBuilder.applicationName, channel, this.debName(deb.version, controlMeta['Architecture'])); + const repoRoot = path.join(this.config.base.out, 'repo', this.config.debBuilder.applicationName, 'deb'); + const relativeDebPath = path.relative(repoRoot, debPath); + this.artifactsProvider.createMetapointerFile(deb.artifact, debPath); + const debSize = controlTar.headers['content-range']?.split('/')[1]; + const sha1 = controlTar.headers['x-checksum-sha1']; + const sha256 = controlTar.headers['x-checksum-sha256']; + const md5 = controlTar.headers['x-checksum-md5']; + + if (typeof sha1 !== 'string' || typeof sha256 !== 'string' || typeof md5 !== 'string' || typeof debSize !== 'string') { + throw new Error('No checksum was found in headers'); + } + + const dataToAppend = `Filename: ${relativeDebPath}\nSize: ${debSize}\nSHA1: ${sha1}\nSHA256: ${sha256}\nMD5Sum: ${md5}\n`; + + fs.appendFile(targetMetaPath, dataToAppend, err => { + if (err) { + throw err; + } + + resolve(); + }); + }); + }); + } + private async execToolToFile(tool: string, args: string[], outputPath?: string, append?: boolean): Promise { if (!append && outputPath && fs.existsSync(outputPath)) { await fs.promises.unlink(outputPath); diff --git a/src/index.mts b/src/index.mts index 4814120..89b9d13 100644 --- a/src/index.mts +++ b/src/index.mts @@ -5,7 +5,7 @@ import { JfrogArtifactsProvider } from './jfrog/jfrog-artifacts-provider.mjs'; export { type Config, createConfigProvider } from './config.mjs'; -export async function plan(config: Config): Promise { +export function plan(config: Config): Promise { const artifactsProvider = new JfrogArtifactsProvider(config); const builders: IBuilder[] = []; @@ -14,11 +14,13 @@ export async function plan(config: Config): Promise { builders.push(new DebBuilder(artifactsProvider, config)); } + const planPromises: Promise[] = []; + for (const builder of builders) { - await builder.plan(); + planPromises.push(builder.plan()); } - console.log('plan()'); + return Promise.all(planPromises); } export function apply(): void { diff --git a/src/jfrog/jfrog-artifacts-provider.mts b/src/jfrog/jfrog-artifacts-provider.mts index a4daf08..91dd65b 100644 --- a/src/jfrog/jfrog-artifacts-provider.mts +++ b/src/jfrog/jfrog-artifacts-provider.mts @@ -104,13 +104,19 @@ export class JfrogArtifactsProvider implements ArtifactsProvider { return times; }; + const infoPromises: Promise[] = []; + for (const value of buildTimes(buildNumber)) { const buildInfoEndpoint = `${buildsEndpoint}/${buildNumber}?started=${value.toISOString()}`; - const info = (await get(buildInfoEndpoint)).toString(); - const buildInfo = JSON.parse(info) as BuildInfo; + infoPromises.push(get(buildInfoEndpoint)); + } + + const infos = await Promise.all(infoPromises); + infos.forEach(info => { + const buildInfo = JSON.parse(info.toString()) as BuildInfo; result.push(buildInfo); - } + }); return result; } From 67c678cc530fc4d7c488fcb9e47c0032a57abb84 Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Fri, 19 May 2023 17:18:42 +0300 Subject: [PATCH 36/58] refactor: linter fix --- src/deb/deb-builder.mts | 194 +++++++++++++++++++--------------------- src/fs.mts | 39 +++++++- src/http.mts | 2 + 3 files changed, 134 insertions(+), 101 deletions(-) diff --git a/src/deb/deb-builder.mts b/src/deb/deb-builder.mts index 42376fe..db6fa56 100644 --- a/src/deb/deb-builder.mts +++ b/src/deb/deb-builder.mts @@ -1,5 +1,4 @@ import { createGzip } from 'zlib'; -import { spawnSync } from 'child_process'; import * as crypto from 'crypto'; import * as fs from 'fs'; @@ -9,11 +8,11 @@ import * as path from 'path'; import * as tar from 'tar'; import type { Artifact, ArtifactsProvider } from '../artifacts-provider.mjs'; -import { createDir, removeDir } from '../fs.mjs'; +import { createDir, execToolToFile, removeDir } from '../fs.mjs'; import type { Config } from '../config.mjs'; import type { IBuilder } from '../ibuilder.mjs'; -import { requestRange } from '../http.mjs'; import type { Packages } from '../repo.mjs'; +import { requestRange } from '../http.mjs'; const ReleaseFileTemplate = `Origin: $ORIGIN @@ -41,6 +40,8 @@ export class DebBuilder implements IBuilder { debs: DebDescriptor[] }[] = []; + private archesByChannel: Map> = new Map(); + constructor(artifactsProvider: ArtifactsProvider, config: Config) { this.config = config; @@ -53,44 +54,7 @@ export class DebBuilder implements IBuilder { public async plan(): Promise { await this.prepareMetaRepository(); await this.dpkgScanpackages(); - - const compressFile = (input: string): Promise => new Promise(resolve => { - const inp = fs.createReadStream(input); - const out = fs.createWriteStream(`${input}.gz`); - - const gzip = createGzip({ level: 9 }); - - inp.pipe(gzip).pipe(out) - .on('finish', () => { - resolve(); - }); - }); - - for (const chan of this.debRepo) { - const distsRoot = path.join(this.dists, chan.channel, this.config.debBuilder.component); - const distsByArch = fs.readdirSync(distsRoot).map(dist => path.join(distsRoot, dist)); - - for (const dist of distsByArch) { - const targetPackagesFile = path.join(dist, 'Packages'); - const metaFiles = fs.readdirSync(dist) - .filter(fileName => fileName.endsWith('.meta')) - .map(metaFile => path.join(dist, metaFile)); - - let packagesContent = ''; - - for (const metaFile of metaFiles) { - packagesContent += fs.readFileSync(metaFile); - packagesContent += '\n'; - fs.unlinkSync(metaFile); - } - - fs.writeFileSync(targetPackagesFile, packagesContent); - - await compressFile(targetPackagesFile); - } - - await this.makeRelease(chan.channel, 'amd64'); - } + await this.makeRelease(); } public apply(): void { @@ -101,9 +65,7 @@ export class DebBuilder implements IBuilder { return `${this.config.debBuilder.applicationName}-${version}_${arch}.deb`; } - private async makeRelease(channel: string, arch: string): Promise { - console.log('DebBuilder: makeRelease'); - + private async makeReleaseFileAndSign(channel: string, arch: string): Promise { const publicKeyPath = path.join(this.keys, 'desktop.asc'); createDir(this.keys); await fs.promises.copyFile(this.config.debBuilder.gpgPublicKeyPath, publicKeyPath); @@ -114,36 +76,31 @@ export class DebBuilder implements IBuilder { .replace('$ARCH', arch) .replace('$COMPONENT', this.config.debBuilder.component); - const releasePath = path.join(this.dists, channel, 'main', `binary-${arch}`, 'Release'); const releaseFilePath = path.join(this.dists, channel, 'Release'); const releaseGpgFilePath = path.join(this.dists, channel, 'Release.gpg'); const inReleaseFilePath = path.join(this.dists, channel, 'InRelease'); - await fs.promises.writeFile(releasePath, releaseContent); - await fs.promises.copyFile(releasePath, releaseFilePath); + await fs.promises.writeFile(releaseFilePath, releaseContent); + await fs.promises.copyFile(releaseFilePath, inReleaseFilePath); - await this.execToolToFile('apt-ftparchive', ['release', `${this.dists}/${channel}`], releaseFilePath, true); - await this.execToolToFile('gpg', ['--default-key', this.config.debBuilder.gpgKeyName, '-abs', '-o', releaseGpgFilePath, releaseFilePath]); - await this.execToolToFile('gpg', ['--default-key', this.config.debBuilder.gpgKeyName, '--clearsign', '-o', inReleaseFilePath, releaseFilePath]); + await execToolToFile('apt-ftparchive', ['release', `${this.dists}/${channel}`], releaseFilePath, true); + await execToolToFile('gpg', ['--default-key', this.config.debBuilder.gpgKeyName, '-abs', '-o', releaseGpgFilePath, releaseFilePath]); + await execToolToFile('gpg', ['--default-key', this.config.debBuilder.gpgKeyName, '--clearsign', '-o', inReleaseFilePath, releaseFilePath]); } private async prepareMetaRepository(): Promise { const debsPromises: Promise<{channel: string, debs: DebDescriptor[]}>[] = []; this.config.base.repo.forEach(channelEntry => { - const a = (async (): Promise<{ channel: string, debs: DebDescriptor[] }> => { - return { - channel: channelEntry.channel, - debs: await this.debsByPackages(channelEntry.packages) - }; - })(); - - debsPromises.push(a); + debsPromises.push((async(): Promise<{ channel: string, debs: DebDescriptor[] }> => ({ + channel: channelEntry.channel, + debs: await this.debsByPackages(channelEntry.packages), + }))()); }); - const b = await Promise.all(debsPromises); + const debs = await Promise.all(debsPromises); - b.forEach(entry => { + debs.forEach(entry => { this.debRepo.push(entry); }); } @@ -153,26 +110,22 @@ export class DebBuilder implements IBuilder { const artsByBuildNumbersPromises: Promise<{version: string, artifacts: Artifact[]}>[] = []; packs.packages.forEach(pack => { - artsByBuildNumbersPromises.push((async (): Promise<{ version: string, artifacts: Artifact[] }> => { - return { - version: pack.version, - artifacts: await this.artifactsProvider.artifactsByBuildNumber(pack.buildNumber), - }; - })()); + artsByBuildNumbersPromises.push((async(): Promise<{ version: string, artifacts: Artifact[] }> => ({ + version: pack.version, + artifacts: await this.artifactsProvider.artifactsByBuildNumber(pack.buildNumber), + }))()); }); const artsByBuildNumbers = await Promise.all(artsByBuildNumbersPromises); artsByBuildNumbers.forEach(value => { value.artifacts.filter(artifact => artifact.type === 'deb').forEach(artifact => { - debsPromises.push((async (): Promise => { - return { - version: value.version, - artifact: artifact, - url: await this.artifactsProvider.artifactUrl(artifact) - }; - })()); - }) + debsPromises.push((async(): Promise => ({ + version: value.version, + artifact, + url: await this.artifactsProvider.artifactUrl(artifact), + }))()); + }); }); return Promise.all(debsPromises); @@ -207,17 +160,36 @@ export class DebBuilder implements IBuilder { await new Promise(resolve => { controlTar .pipe(tar.extract({ cwd: whereExtract, strip: 1 }, ['./control'])) + // eslint-disable-next-line max-statements .on('finish', () => { const controlMetaContent = fs.readFileSync(path.join(whereExtract, 'control'), 'utf-8').replaceAll(':', '='); const controlMeta = ini.parse(controlMetaContent); + const arch = controlMeta['Architecture']; - const targetMetaPath = path.join(this.dists, channel, this.config.debBuilder.component, `binary-${controlMeta['Architecture']}`, `${this.debName(deb.version, controlMeta['Architecture'])}.meta`); + const archesSet = this.archesByChannel.get(channel); + + if (archesSet) { + archesSet.add(arch); + } else { + this.archesByChannel.set(channel, new Set([arch])); + } + + const targetMetaPath = path.join(this.dists, + channel, + this.config.debBuilder.component, + `binary-${arch}`, + `${this.debName(deb.version, arch)}.meta`); createDir(path.dirname(targetMetaPath)); fs.renameSync(path.join(whereExtract, 'control'), targetMetaPath); removeDir(whereExtract); - const debPath = path.join(this.pool, this.config.debBuilder.component, `${this.config.debBuilder.applicationName[0]}`, this.config.debBuilder.applicationName, channel, this.debName(deb.version, controlMeta['Architecture'])); + const debPath = path.join(this.pool, + this.config.debBuilder.component, + `${this.config.debBuilder.applicationName[0]}`, + this.config.debBuilder.applicationName, + channel, + this.debName(deb.version, arch)); const repoRoot = path.join(this.config.base.out, 'repo', this.config.debBuilder.applicationName, 'deb'); const relativeDebPath = path.relative(repoRoot, debPath); this.artifactsProvider.createMetapointerFile(deb.artifact, debPath); @@ -243,36 +215,58 @@ export class DebBuilder implements IBuilder { }); } - private async execToolToFile(tool: string, args: string[], outputPath?: string, append?: boolean): Promise { - if (!append && outputPath && fs.existsSync(outputPath)) { - await fs.promises.unlink(outputPath); - } + private async makeRelease(): Promise<{}> { + const compressFile = (filePath: string): Promise => new Promise(resolve => { + const inp = fs.createReadStream(filePath); + const out = fs.createWriteStream(`${filePath}.gz`); - const toolProcessResult = spawnSync(tool, args, { stdio: 'pipe', encoding: 'utf-8' }); - const toolOutput = toolProcessResult.stdout; + const gzip = createGzip({ level: 9 }); - const dumpToolOutput = (): void => { - const toolErrOutput = toolProcessResult.stderr; - if (toolOutput && toolOutput.length > 0) { - console.log(toolOutput); - } + inp.pipe(gzip).pipe(out) + .on('finish', () => { + resolve(); + }); + }); - if (toolErrOutput && toolErrOutput.length > 0) { - console.warn(toolErrOutput); - } - }; + const compressPromises: Promise[] = []; + + this.debRepo.forEach(channelEntry => { + const distsRoot = path.join(this.dists, channelEntry.channel, this.config.debBuilder.component); + const distsByArch = fs.readdirSync(distsRoot).map(dist => path.join(distsRoot, dist)); + + distsByArch.forEach(dist => { + const targetPackagesFile = path.join(dist, 'Packages'); + const metaFiles = fs.readdirSync(dist) + .filter(fileName => fileName.endsWith('.meta')) + .map(metaFile => path.join(dist, metaFile)); + + let packagesContent = ''; + + for (const metaFile of metaFiles) { + packagesContent += fs.readFileSync(metaFile); + packagesContent += '\n'; + fs.unlinkSync(metaFile); + } - if (outputPath) { - console.log(`Execute ${tool} ${args.join(' ')} => ${outputPath}`); - dumpToolOutput(); - if (append) { - return fs.promises.appendFile(outputPath, toolOutput); + fs.writeFileSync(targetPackagesFile, packagesContent); + + compressPromises.push(compressFile(targetPackagesFile)); + }); + }); + + await Promise.all(compressPromises); + + const releasesPromises: Promise[] = []; + + this.debRepo.forEach(chan => { + const archesSet = this.archesByChannel.get(chan.channel); + if (!archesSet) { + throw new Error('No arch was found for channel'); } - return fs.promises.writeFile(outputPath, toolOutput); - } + releasesPromises.push(this.makeReleaseFileAndSign(chan.channel, [...archesSet.values()].join(' '))); + }); - console.log(`Execute ${tool} ${args.join(' ')}`); - dumpToolOutput(); + return Promise.all(releasesPromises); } } diff --git a/src/fs.mts b/src/fs.mts index 23949b9..a2363b4 100644 --- a/src/fs.mts +++ b/src/fs.mts @@ -1,5 +1,6 @@ import * as path from 'path'; -import { existsSync, mkdirSync, rmdirSync, writeFileSync } from 'fs'; +import { existsSync, promises as fsPromises, mkdirSync, rmdirSync, writeFileSync } from 'fs'; +import { spawnSync } from 'child_process'; export function createFile(filePath: string, content: string): void { const dirPath = path.dirname(filePath); @@ -24,3 +25,39 @@ export function removeDir(dirName: string): void { export function createMetapointerContent(fileMd5Hash: string): string { return `#metapointer jfrogart\noid md5:${fileMd5Hash}`; } + +// eslint-disable-next-line max-params +export async function execToolToFile(tool: string, args: string[], outputPath?: string, append?: boolean): Promise { + if (!append && outputPath && existsSync(outputPath)) { + await fsPromises.unlink(outputPath); + } + + const toolProcessResult = spawnSync(tool, args, { stdio: 'pipe', encoding: 'utf-8' }); + const toolOutput = toolProcessResult.stdout; + + const dumpToolOutput = (): void => { + const toolErrOutput = toolProcessResult.stderr; + if (toolOutput && toolOutput.length > 0) { + console.log(toolOutput); + } + + if (toolErrOutput && toolErrOutput.length > 0) { + console.warn(toolErrOutput); + } + }; + + if (outputPath) { + console.log(`Execute ${tool} ${args.join(' ')} => ${outputPath}`); + dumpToolOutput(); + if (append) { + return fsPromises.appendFile(outputPath, toolOutput); + } + + return fsPromises.writeFile(outputPath, toolOutput); + } + + console.log(`Execute ${tool} ${args.join(' ')}`); + dumpToolOutput(); + + return Promise.resolve(); +} diff --git a/src/http.mts b/src/http.mts index 6db22ab..db51764 100644 --- a/src/http.mts +++ b/src/http.mts @@ -116,8 +116,10 @@ export function requestRange(url: string, range: string): Promise; +// eslint-disable-next-line no-redeclare export function get(url: string, opt?: {stream: true}): Promise; +// eslint-disable-next-line no-redeclare export function get(url: string, opt: {stream: boolean} = { stream: false }): Promise { return opt.stream ? requestStream(url, 'GET', undefined) : request(url, 'GET', undefined); } From 459cb9c0326be0cc433278a939d9efc0e137c13b Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Fri, 19 May 2023 17:52:33 +0300 Subject: [PATCH 37/58] use --no-tty for gpg --- src/deb/deb-builder.mts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/deb/deb-builder.mts b/src/deb/deb-builder.mts index db6fa56..38f7b20 100644 --- a/src/deb/deb-builder.mts +++ b/src/deb/deb-builder.mts @@ -81,11 +81,10 @@ export class DebBuilder implements IBuilder { const inReleaseFilePath = path.join(this.dists, channel, 'InRelease'); await fs.promises.writeFile(releaseFilePath, releaseContent); - await fs.promises.copyFile(releaseFilePath, inReleaseFilePath); await execToolToFile('apt-ftparchive', ['release', `${this.dists}/${channel}`], releaseFilePath, true); - await execToolToFile('gpg', ['--default-key', this.config.debBuilder.gpgKeyName, '-abs', '-o', releaseGpgFilePath, releaseFilePath]); - await execToolToFile('gpg', ['--default-key', this.config.debBuilder.gpgKeyName, '--clearsign', '-o', inReleaseFilePath, releaseFilePath]); + await execToolToFile('gpg', ['--no-tty', '--default-key', this.config.debBuilder.gpgKeyName, '-abs', '-o', releaseGpgFilePath, releaseFilePath]); + await execToolToFile('gpg', ['--no-tty', '--default-key', this.config.debBuilder.gpgKeyName, '--clearsign', '-o', inReleaseFilePath, releaseFilePath]); } private async prepareMetaRepository(): Promise { From 624f2466f58b1d5327e2fbc64c6e4a273651ef22 Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Wed, 5 Jul 2023 12:27:18 +0300 Subject: [PATCH 38/58] review notes fix --- src/deb/deb-builder.mts | 20 ++++++++++--------- src/{ibuilder.mts => deployer.mts} | 2 +- src/http.mts | 10 ++-------- src/index.mts | 6 +++--- ...ts-provider.mts => artifacts-provider.mts} | 16 +++++++-------- src/s3-metapointer.mts | 3 +++ 6 files changed, 27 insertions(+), 30 deletions(-) rename src/{ibuilder.mts => deployer.mts} (60%) rename src/jfrog/{jfrog-artifacts-provider.mts => artifacts-provider.mts} (89%) create mode 100644 src/s3-metapointer.mts diff --git a/src/deb/deb-builder.mts b/src/deb/deb-builder.mts index 38f7b20..715b50a 100644 --- a/src/deb/deb-builder.mts +++ b/src/deb/deb-builder.mts @@ -10,7 +10,7 @@ import * as tar from 'tar'; import type { Artifact, ArtifactsProvider } from '../artifacts-provider.mjs'; import { createDir, execToolToFile, removeDir } from '../fs.mjs'; import type { Config } from '../config.mjs'; -import type { IBuilder } from '../ibuilder.mjs'; +import type { Deployer } from '../deployer.mjs'; import type { Packages } from '../repo.mjs'; import { requestRange } from '../http.mjs'; @@ -27,7 +27,12 @@ interface DebDescriptor { artifact: Artifact } -export class DebBuilder implements IBuilder { +interface ChannelItem { + channel: string; + debs: DebDescriptor[] +} + +export class DebBuilder implements Deployer { private readonly config: Config; private readonly artifactsProvider: ArtifactsProvider; @@ -35,19 +40,16 @@ export class DebBuilder implements IBuilder { private readonly dists: string; private readonly keys: string; - private debRepo: { - channel: string, - debs: DebDescriptor[] - }[] = []; + private debRepo: ChannelItem[] = []; private archesByChannel: Map> = new Map(); constructor(artifactsProvider: ArtifactsProvider, config: Config) { this.config = config; - this.pool = `${this.config.base.out}/repo/${this.config.debBuilder.applicationName}/deb/pool`; - this.dists = `${this.config.base.out}/repo/${this.config.debBuilder.applicationName}/deb/dists`; - this.keys = `${this.config.base.out}/repo/${this.config.debBuilder.applicationName}/deb/keys`; + this.pool = path.join(this.config.base.out, 'repo', this.config.debBuilder.applicationName, 'deb', 'pool'); + this.dists = path.join(this.config.base.out, 'repo', this.config.debBuilder.applicationName, 'deb', 'dists'); + this.keys = path.join(this.config.base.out, 'repo', this.config.debBuilder.applicationName, 'deb', 'keys'); this.artifactsProvider = artifactsProvider; } diff --git a/src/ibuilder.mts b/src/deployer.mts similarity index 60% rename from src/ibuilder.mts rename to src/deployer.mts index 3437aa5..b98939a 100644 --- a/src/ibuilder.mts +++ b/src/deployer.mts @@ -1,4 +1,4 @@ -export interface IBuilder { +export interface Deployer { plan(): Promise; apply(): void; } diff --git a/src/http.mts b/src/http.mts index db51764..ba35c16 100644 --- a/src/http.mts +++ b/src/http.mts @@ -1,6 +1,5 @@ import { request as httpRequest } from 'https'; import type { IncomingMessage } from 'http'; -import { Readable } from 'stream'; export interface RequestBody { content: string | Buffer; @@ -115,13 +114,8 @@ export function requestRange(url: string, range: string): Promise; -// eslint-disable-next-line no-redeclare -export function get(url: string, opt?: {stream: true}): Promise; - -// eslint-disable-next-line no-redeclare -export function get(url: string, opt: {stream: boolean} = { stream: false }): Promise { - return opt.stream ? requestStream(url, 'GET', undefined) : request(url, 'GET', undefined); +export function get(url: string): Promise { + return request(url, 'GET', undefined); } export function post(url: string, requestData?: RequestData): Promise { diff --git a/src/index.mts b/src/index.mts index 89b9d13..5a40180 100644 --- a/src/index.mts +++ b/src/index.mts @@ -1,14 +1,14 @@ import type { Config } from './config.mjs'; import { DebBuilder } from './deb/deb-builder.mjs'; -import type { IBuilder } from './ibuilder.mjs'; -import { JfrogArtifactsProvider } from './jfrog/jfrog-artifacts-provider.mjs'; +import type { Deployer } from './deployer.mjs'; +import JfrogArtifactsProvider from './jfrog/artifacts-provider.mjs'; export { type Config, createConfigProvider } from './config.mjs'; export function plan(config: Config): Promise { const artifactsProvider = new JfrogArtifactsProvider(config); - const builders: IBuilder[] = []; + const builders: Deployer[] = []; if (config.debBuilder) { builders.push(new DebBuilder(artifactsProvider, config)); diff --git a/src/jfrog/jfrog-artifacts-provider.mts b/src/jfrog/artifacts-provider.mts similarity index 89% rename from src/jfrog/jfrog-artifacts-provider.mts rename to src/jfrog/artifacts-provider.mts index 91dd65b..97df7e5 100644 --- a/src/jfrog/jfrog-artifacts-provider.mts +++ b/src/jfrog/artifacts-provider.mts @@ -5,15 +5,16 @@ import { get } from '../http.mjs'; import type { Artifact, ArtifactsProvider } from '../artifacts-provider.mjs'; import type { ArtifactsProviderConfig } from '../artifacts-provider-config.mjs'; +import metapointerContent from '../s3-metapointer.mjs'; -export interface BuildsList { +interface BuildsList { buildsNumbers: { uri: string, started: string }[] } -export interface BuildInfo { +interface BuildInfo { buildInfo: { modules: { artifacts: Artifact[] @@ -21,11 +22,7 @@ export interface BuildInfo { } } -function metapointerContent(fileMd5Hash: string): string { - return `#metapointer jfrogart\noid md5:${fileMd5Hash}`; -} - -export class JfrogArtifactsProvider implements ArtifactsProvider { +export default class JfrogArtifactsProvider implements ArtifactsProvider { private artifactoryClient: ArtifactoryClient; private buildsList?: BuildsList; @@ -107,8 +104,9 @@ export class JfrogArtifactsProvider implements ArtifactsProvider { const infoPromises: Promise[] = []; for (const value of buildTimes(buildNumber)) { - const buildInfoEndpoint = `${buildsEndpoint}/${buildNumber}?started=${value.toISOString()}`; - infoPromises.push(get(buildInfoEndpoint)); + const buildInfoEndpointUrl = new URL(buildNumber, buildsEndpoint); + buildInfoEndpointUrl.searchParams.set('started', value.toISOString()); + infoPromises.push(get(buildInfoEndpointUrl.toString())); } const infos = await Promise.all(infoPromises); diff --git a/src/s3-metapointer.mts b/src/s3-metapointer.mts new file mode 100644 index 0000000..ce93b26 --- /dev/null +++ b/src/s3-metapointer.mts @@ -0,0 +1,3 @@ +export default function metapointerContent(fileMd5Hash: string): string { + return `#metapointer jfrogart\noid md5:${fileMd5Hash}`; +} From 0e47e628e021bf60d6f6a452bfdbda7ce260ffad Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Wed, 7 Feb 2024 13:30:13 +0300 Subject: [PATCH 39/58] renamed to artifact-provider --- ...der-config.mts => artifact-provider-config.mts} | 2 +- ...rtifacts-provider.mts => artifact-provider.mts} | 2 +- src/config.mts | 4 ++-- src/deb/deb-builder.mts | 14 +++++++------- src/index.mts | 4 ++-- ...rtifacts-provider.mts => artifact-provider.mts} | 10 +++++----- 6 files changed, 18 insertions(+), 18 deletions(-) rename src/{artifacts-provider-config.mts => artifact-provider-config.mts} (80%) rename src/{artifacts-provider.mts => artifact-provider.mts} (89%) rename src/jfrog/{artifacts-provider.mts => artifact-provider.mts} (90%) diff --git a/src/artifacts-provider-config.mts b/src/artifact-provider-config.mts similarity index 80% rename from src/artifacts-provider-config.mts rename to src/artifact-provider-config.mts index e0284c4..52a6212 100644 --- a/src/artifacts-provider-config.mts +++ b/src/artifact-provider-config.mts @@ -1,6 +1,6 @@ export type ProviderType = 'jfrog'; -export interface ArtifactsProviderConfig { +export interface ArtifactProviderConfig { artifactsProvider: { type: ProviderType, protocol: string, diff --git a/src/artifacts-provider.mts b/src/artifact-provider.mts similarity index 89% rename from src/artifacts-provider.mts rename to src/artifact-provider.mts index 4905c98..0babc5b 100644 --- a/src/artifacts-provider.mts +++ b/src/artifact-provider.mts @@ -7,7 +7,7 @@ export interface Artifact { md5: string } -export interface ArtifactsProvider { +export interface ArtifactProvider { artifactsByBuildNumber(buildNumber: string): Promise; artifactUrl(artifact: Artifact): Promise; createMetapointerFile(artifact: Artifact, fileName: string): void; diff --git a/src/config.mts b/src/config.mts index 306ece1..ac68ee9 100644 --- a/src/config.mts +++ b/src/config.mts @@ -1,7 +1,7 @@ import path from 'path'; import { pathToFileURL } from 'url'; -import type { ArtifactsProviderConfig } from './artifacts-provider-config.mjs'; +import type { ArtifactProviderConfig } from './artifact-provider-config.mjs'; import type { DebBuilderConfig } from './deb/deb-builder-config.mjs'; import type { Repo } from './repo.mjs'; @@ -12,7 +12,7 @@ interface BaseConfig { } } -export type Config = BaseConfig & DebBuilderConfig & ArtifactsProviderConfig; +export type Config = BaseConfig & DebBuilderConfig & ArtifactProviderConfig; export class ConfigProvider { private path: string; diff --git a/src/deb/deb-builder.mts b/src/deb/deb-builder.mts index 715b50a..e3a87a0 100644 --- a/src/deb/deb-builder.mts +++ b/src/deb/deb-builder.mts @@ -7,7 +7,7 @@ import * as os from 'os'; import * as path from 'path'; import * as tar from 'tar'; -import type { Artifact, ArtifactsProvider } from '../artifacts-provider.mjs'; +import type { Artifact, ArtifactProvider } from '../artifact-provider.mjs'; import { createDir, execToolToFile, removeDir } from '../fs.mjs'; import type { Config } from '../config.mjs'; import type { Deployer } from '../deployer.mjs'; @@ -34,7 +34,7 @@ interface ChannelItem { export class DebBuilder implements Deployer { private readonly config: Config; - private readonly artifactsProvider: ArtifactsProvider; + private readonly artifactProvider: ArtifactProvider; private readonly pool: string; private readonly dists: string; @@ -44,13 +44,13 @@ export class DebBuilder implements Deployer { private archesByChannel: Map> = new Map(); - constructor(artifactsProvider: ArtifactsProvider, config: Config) { + constructor(artifactProvider: ArtifactProvider, config: Config) { this.config = config; this.pool = path.join(this.config.base.out, 'repo', this.config.debBuilder.applicationName, 'deb', 'pool'); this.dists = path.join(this.config.base.out, 'repo', this.config.debBuilder.applicationName, 'deb', 'dists'); this.keys = path.join(this.config.base.out, 'repo', this.config.debBuilder.applicationName, 'deb', 'keys'); - this.artifactsProvider = artifactsProvider; + this.artifactProvider = artifactProvider; } public async plan(): Promise { @@ -113,7 +113,7 @@ export class DebBuilder implements Deployer { packs.packages.forEach(pack => { artsByBuildNumbersPromises.push((async(): Promise<{ version: string, artifacts: Artifact[] }> => ({ version: pack.version, - artifacts: await this.artifactsProvider.artifactsByBuildNumber(pack.buildNumber), + artifacts: await this.artifactProvider.artifactsByBuildNumber(pack.buildNumber), }))()); }); @@ -124,7 +124,7 @@ export class DebBuilder implements Deployer { debsPromises.push((async(): Promise => ({ version: value.version, artifact, - url: await this.artifactsProvider.artifactUrl(artifact), + url: await this.artifactProvider.artifactUrl(artifact), }))()); }); }); @@ -193,7 +193,7 @@ export class DebBuilder implements Deployer { this.debName(deb.version, arch)); const repoRoot = path.join(this.config.base.out, 'repo', this.config.debBuilder.applicationName, 'deb'); const relativeDebPath = path.relative(repoRoot, debPath); - this.artifactsProvider.createMetapointerFile(deb.artifact, debPath); + this.artifactProvider.createMetapointerFile(deb.artifact, debPath); const debSize = controlTar.headers['content-range']?.split('/')[1]; const sha1 = controlTar.headers['x-checksum-sha1']; const sha256 = controlTar.headers['x-checksum-sha256']; diff --git a/src/index.mts b/src/index.mts index 5a40180..65d676c 100644 --- a/src/index.mts +++ b/src/index.mts @@ -1,12 +1,12 @@ import type { Config } from './config.mjs'; import { DebBuilder } from './deb/deb-builder.mjs'; import type { Deployer } from './deployer.mjs'; -import JfrogArtifactsProvider from './jfrog/artifacts-provider.mjs'; +import JfrogArtifactProvider from './jfrog/artifact-provider.mjs'; export { type Config, createConfigProvider } from './config.mjs'; export function plan(config: Config): Promise { - const artifactsProvider = new JfrogArtifactsProvider(config); + const artifactsProvider = new JfrogArtifactProvider(config); const builders: Deployer[] = []; diff --git a/src/jfrog/artifacts-provider.mts b/src/jfrog/artifact-provider.mts similarity index 90% rename from src/jfrog/artifacts-provider.mts rename to src/jfrog/artifact-provider.mts index 97df7e5..d4c57ba 100644 --- a/src/jfrog/artifacts-provider.mts +++ b/src/jfrog/artifact-provider.mts @@ -3,8 +3,8 @@ import { type ArtifactoryClient, type ArtifactoryItemMeta, createArtifactoryClie import { createFile } from '../fs.mjs'; import { get } from '../http.mjs'; -import type { Artifact, ArtifactsProvider } from '../artifacts-provider.mjs'; -import type { ArtifactsProviderConfig } from '../artifacts-provider-config.mjs'; +import type { Artifact, ArtifactProvider } from '../artifact-provider.mjs'; +import type { ArtifactProviderConfig } from '../artifact-provider-config.mjs'; import metapointerContent from '../s3-metapointer.mjs'; interface BuildsList { @@ -22,13 +22,13 @@ interface BuildInfo { } } -export default class JfrogArtifactsProvider implements ArtifactsProvider { +export default class JfrogArtifactProvider implements ArtifactProvider { private artifactoryClient: ArtifactoryClient; private buildsList?: BuildsList; - private readonly config: ArtifactsProviderConfig; + private readonly config: ArtifactProviderConfig; - constructor(config: ArtifactsProviderConfig) { + constructor(config: ArtifactProviderConfig) { this.config = config; this.artifactoryClient = createArtifactoryClient({ protocol: this.config.artifactsProvider.protocol, From fe35c0044940bf964f20a0b0d7651290573da169 Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Wed, 7 Feb 2024 13:35:55 +0300 Subject: [PATCH 40/58] s3-gk moved from dev deps to runtime deps --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0698b01..f13c02c 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,6 @@ "husky": "^8.0.0", "jest": "^29.3.1", "lint-staged": "^13.0.4", - "s3-groundskeeper": "0.2.2", "ts-jest": "^29.1.0", "ts-node": "^10.9.1", "typescript": "^5.0.4" @@ -42,6 +41,7 @@ }, "dependencies": { "ini": "^4.1.0", + "s3-groundskeeper": "0.2.2", "tar": "^6.1.13", "yargs": "^17.6.2" } From 6c3717929d19ee456d8a3fd2476e286143e86259 Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Wed, 7 Feb 2024 14:54:17 +0300 Subject: [PATCH 41/58] discard mixin in config and remade using nested objects --- src/artifact-provider-config.mts | 14 ++++++-------- src/config.mts | 12 +++++++----- src/deb/deb-builder-config.mts | 12 +++++------- src/index.mts | 2 +- src/jfrog/artifact-provider.mts | 10 +++++----- 5 files changed, 24 insertions(+), 26 deletions(-) diff --git a/src/artifact-provider-config.mts b/src/artifact-provider-config.mts index 52a6212..aff021e 100644 --- a/src/artifact-provider-config.mts +++ b/src/artifact-provider-config.mts @@ -1,12 +1,10 @@ export type ProviderType = 'jfrog'; export interface ArtifactProviderConfig { - artifactsProvider: { - type: ProviderType, - protocol: string, - host: string, - project: string, - apiKey: string, - user: string - } + type: ProviderType, + protocol: string, + host: string, + project: string, + apiKey: string, + user: string } diff --git a/src/config.mts b/src/config.mts index ac68ee9..8e86587 100644 --- a/src/config.mts +++ b/src/config.mts @@ -6,13 +6,15 @@ import type { DebBuilderConfig } from './deb/deb-builder-config.mjs'; import type { Repo } from './repo.mjs'; interface BaseConfig { - base: { - out: string; - repo: Repo; - } + out: string; + repo: Repo; } -export type Config = BaseConfig & DebBuilderConfig & ArtifactProviderConfig; +export interface Config { + base: BaseConfig; + artifactsProvider: ArtifactProviderConfig; + debBuilder: DebBuilderConfig; +} export class ConfigProvider { private path: string; diff --git a/src/deb/deb-builder-config.mts b/src/deb/deb-builder-config.mts index 05369b7..07e02b3 100644 --- a/src/deb/deb-builder-config.mts +++ b/src/deb/deb-builder-config.mts @@ -1,9 +1,7 @@ export interface DebBuilderConfig { - debBuilder: { - gpgPublicKeyPath: string; - gpgKeyName: string; - applicationName: string; - component: string; - origin: string; - } + gpgPublicKeyPath: string; + gpgKeyName: string; + applicationName: string; + component: string; + origin: string; } diff --git a/src/index.mts b/src/index.mts index 65d676c..4087883 100644 --- a/src/index.mts +++ b/src/index.mts @@ -6,7 +6,7 @@ import JfrogArtifactProvider from './jfrog/artifact-provider.mjs'; export { type Config, createConfigProvider } from './config.mjs'; export function plan(config: Config): Promise { - const artifactsProvider = new JfrogArtifactProvider(config); + const artifactsProvider = new JfrogArtifactProvider(config.artifactsProvider); const builders: Deployer[] = []; diff --git a/src/jfrog/artifact-provider.mts b/src/jfrog/artifact-provider.mts index d4c57ba..ce55cd9 100644 --- a/src/jfrog/artifact-provider.mts +++ b/src/jfrog/artifact-provider.mts @@ -31,10 +31,10 @@ export default class JfrogArtifactProvider implements ArtifactProvider { constructor(config: ArtifactProviderConfig) { this.config = config; this.artifactoryClient = createArtifactoryClient({ - protocol: this.config.artifactsProvider.protocol, - host: this.config.artifactsProvider.host, - apiKey: this.config.artifactsProvider.apiKey, - user: this.config.artifactsProvider.user, + protocol: this.config.protocol, + host: this.config.host, + apiKey: this.config.apiKey, + user: this.config.user, }); } @@ -82,7 +82,7 @@ export default class JfrogArtifactProvider implements ArtifactProvider { const result: BuildInfo[] = []; - const buildsEndpoint = this.artifactoryClient.resolveUri(`api/build/${this.config.artifactsProvider.project}`); + const buildsEndpoint = this.artifactoryClient.resolveUri(`api/build/${this.config.project}`); if (!this.buildsList) { const allBuilds = await get(buildsEndpoint); From 6db3ea11ef30d2cfba5c71a10aaf935f7eda7fb0 Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Wed, 7 Feb 2024 15:04:46 +0300 Subject: [PATCH 42/58] store prepeared repository root path for reuse --- src/deb/deb-builder.mts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/deb/deb-builder.mts b/src/deb/deb-builder.mts index e3a87a0..0139185 100644 --- a/src/deb/deb-builder.mts +++ b/src/deb/deb-builder.mts @@ -36,6 +36,7 @@ export class DebBuilder implements Deployer { private readonly config: Config; private readonly artifactProvider: ArtifactProvider; + private readonly root: string; private readonly pool: string; private readonly dists: string; private readonly keys: string; @@ -47,9 +48,10 @@ export class DebBuilder implements Deployer { constructor(artifactProvider: ArtifactProvider, config: Config) { this.config = config; - this.pool = path.join(this.config.base.out, 'repo', this.config.debBuilder.applicationName, 'deb', 'pool'); - this.dists = path.join(this.config.base.out, 'repo', this.config.debBuilder.applicationName, 'deb', 'dists'); - this.keys = path.join(this.config.base.out, 'repo', this.config.debBuilder.applicationName, 'deb', 'keys'); + this.root = path.join(this.config.base.out, 'repo', this.config.debBuilder.applicationName, 'deb'); + this.pool = path.join(this.root, 'pool'); + this.dists = path.join(this.root, 'dists'); + this.keys = path.join(this.root, 'keys'); this.artifactProvider = artifactProvider; } @@ -191,8 +193,7 @@ export class DebBuilder implements Deployer { this.config.debBuilder.applicationName, channel, this.debName(deb.version, arch)); - const repoRoot = path.join(this.config.base.out, 'repo', this.config.debBuilder.applicationName, 'deb'); - const relativeDebPath = path.relative(repoRoot, debPath); + const relativeDebPath = path.relative(this.root, debPath); this.artifactProvider.createMetapointerFile(deb.artifact, debPath); const debSize = controlTar.headers['content-range']?.split('/')[1]; const sha1 = controlTar.headers['x-checksum-sha1']; From 4a32567699f9fedc75d75a23b43edcca879cff07 Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Fri, 16 Feb 2024 16:51:39 +0300 Subject: [PATCH 43/58] adjust builder and artifact proviver to new s3gk api --- package.json | 2 +- pnpm-lock.yaml | 213 +++++++++++++++---------------- src/artifact-provider-config.mts | 1 - src/artifact-provider.mts | 6 +- src/deb/deb-builder.mts | 21 ++- src/jfrog/artifact-provider.mts | 40 ++++-- 6 files changed, 145 insertions(+), 138 deletions(-) diff --git a/package.json b/package.json index f13c02c..49e94bf 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ }, "dependencies": { "ini": "^4.1.0", - "s3-groundskeeper": "0.2.2", + "s3-groundskeeper": "0.3.1", "tar": "^6.1.13", "yargs": "^17.6.2" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 54918c6..a56962f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,6 +7,9 @@ importers: ini: specifier: ^4.1.0 version: 4.1.0 + s3-groundskeeper: + specifier: 0.3.1 + version: 0.3.1 tar: specifier: ^6.1.13 version: 6.1.13 @@ -59,9 +62,6 @@ importers: lint-staged: specifier: ^13.0.4 version: 13.0.4 - s3-groundskeeper: - specifier: 0.2.2 - version: 0.2.2 ts-jest: specifier: ^29.1.0 version: 29.1.0(@babel/core@7.20.5)(jest@29.3.1)(typescript@5.0.4) @@ -94,7 +94,7 @@ packages: '@aws-crypto/util': 3.0.0 '@aws-sdk/types': 3.310.0 tslib: 1.14.1 - dev: true + dev: false /@aws-crypto/crc32c@3.0.0: resolution: {integrity: sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==} @@ -102,13 +102,13 @@ packages: '@aws-crypto/util': 3.0.0 '@aws-sdk/types': 3.310.0 tslib: 1.14.1 - dev: true + dev: false /@aws-crypto/ie11-detection@3.0.0: resolution: {integrity: sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==} dependencies: tslib: 1.14.1 - dev: true + dev: false /@aws-crypto/sha1-browser@3.0.0: resolution: {integrity: sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw==} @@ -120,7 +120,7 @@ packages: '@aws-sdk/util-locate-window': 3.310.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 - dev: true + dev: false /@aws-crypto/sha256-browser@3.0.0: resolution: {integrity: sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==} @@ -133,7 +133,7 @@ packages: '@aws-sdk/util-locate-window': 3.310.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 - dev: true + dev: false /@aws-crypto/sha256-js@3.0.0: resolution: {integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==} @@ -141,13 +141,13 @@ packages: '@aws-crypto/util': 3.0.0 '@aws-sdk/types': 3.310.0 tslib: 1.14.1 - dev: true + dev: false /@aws-crypto/supports-web-crypto@3.0.0: resolution: {integrity: sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==} dependencies: tslib: 1.14.1 - dev: true + dev: false /@aws-crypto/util@3.0.0: resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==} @@ -155,7 +155,7 @@ packages: '@aws-sdk/types': 3.310.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 - dev: true + dev: false /@aws-sdk/abort-controller@3.310.0: resolution: {integrity: sha512-v1zrRQxDLA1MdPim159Vx/CPHqsB4uybSxRi1CnfHO5ZjHryx3a5htW2gdGAykVCul40+yJXvfpufMrELVxH+g==} @@ -163,13 +163,13 @@ packages: dependencies: '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/chunked-blob-reader@3.310.0: resolution: {integrity: sha512-CrJS3exo4mWaLnWxfCH+w88Ou0IcAZSIkk4QbmxiHl/5Dq705OLoxf4385MVyExpqpeVJYOYQ2WaD8i/pQZ2fg==} dependencies: tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/client-s3@3.315.0: resolution: {integrity: sha512-sE2pCFNrhkn1XdqkHx1GEd4eKg/kITk2zHETpkQCUMAVZ1MDuY/uUZzRjbAn9sm9EsJ03Z/vOuK4DkxlLFY+8g==} @@ -232,7 +232,7 @@ packages: transitivePeerDependencies: - '@aws-sdk/signature-v4-crt' - aws-crt - dev: true + dev: false /@aws-sdk/client-sso-oidc@3.315.0: resolution: {integrity: sha512-OJgtmx6SpCWHBDCxBBi36Ro44uCqZBufGkThP/PVYrgVnRVnJ4V18d2wNGKmS37zKmCHHJPnhMPlGOgE2qyVPQ==} @@ -272,7 +272,7 @@ packages: tslib: 2.5.0 transitivePeerDependencies: - aws-crt - dev: true + dev: false /@aws-sdk/client-sso@3.315.0: resolution: {integrity: sha512-P3QOOyHQER7EDVCzXOsAaJE2p/qfdsSFsYv8k2S8LqEKGH0fViQ4Ph540uKlmaOt1kEhwH1wI6cLRMJJX9XV4Q==} @@ -312,7 +312,7 @@ packages: tslib: 2.5.0 transitivePeerDependencies: - aws-crt - dev: true + dev: false /@aws-sdk/client-sts@3.315.0: resolution: {integrity: sha512-e34plg6m0hScADIPiu5kCKoiJVXRLRiAuens+iwMse0oPUmrv41hdjgufwWGA/pcNkEGzMdVS88Z4khxB3LHBw==} @@ -356,7 +356,7 @@ packages: tslib: 2.5.0 transitivePeerDependencies: - aws-crt - dev: true + dev: false /@aws-sdk/config-resolver@3.310.0: resolution: {integrity: sha512-8vsT+/50lOqfDxka9m/rRt6oxv1WuGZoP8oPMk0Dt+TxXMbAzf4+rejBgiB96wshI1k3gLokYRjSQZn+dDtT8g==} @@ -366,7 +366,7 @@ packages: '@aws-sdk/util-config-provider': 3.310.0 '@aws-sdk/util-middleware': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/credential-provider-env@3.310.0: resolution: {integrity: sha512-vvIPQpI16fj95xwS7M3D48F7QhZJBnnCgB5lR+b7So+vsG9ibm1mZRVGzVpdxCvgyOhHFbvrby9aalNJmmIP1A==} @@ -375,7 +375,7 @@ packages: '@aws-sdk/property-provider': 3.310.0 '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/credential-provider-imds@3.310.0: resolution: {integrity: sha512-baxK7Zp6dai5AGW01FIW27xS2KAaPUmKLIXv5SvFYsUgXXvNW55im4uG3b+2gA0F7V+hXvVBH08OEqmwW6we5w==} @@ -386,7 +386,7 @@ packages: '@aws-sdk/types': 3.310.0 '@aws-sdk/url-parser': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/credential-provider-ini@3.315.0: resolution: {integrity: sha512-TZbYNbQkNgANx3KsWmJEyBsnfUBq/XKqYYc/VQf1L4eI+GMUw2eKpNV0MTsyviViy2st7W4SiSgtsvXyeVp9xg==} @@ -403,7 +403,7 @@ packages: tslib: 2.5.0 transitivePeerDependencies: - aws-crt - dev: true + dev: false /@aws-sdk/credential-provider-node@3.315.0: resolution: {integrity: sha512-OuzKAIg+xPAzBrb/Big5VKDpJmBhVR+N0Hfflrjj2BunQGWO7zxtkKFCz921MtP9ZunDV+UxzTpar8U5TAPtzA==} @@ -421,7 +421,7 @@ packages: tslib: 2.5.0 transitivePeerDependencies: - aws-crt - dev: true + dev: false /@aws-sdk/credential-provider-process@3.310.0: resolution: {integrity: sha512-h73sg6GPMUWC+3zMCbA1nZ2O03nNJt7G96JdmnantiXBwHpRKWW8nBTLzx5uhXn6hTuTaoQRP/P+oxQJKYdMmA==} @@ -431,7 +431,7 @@ packages: '@aws-sdk/shared-ini-file-loader': 3.310.0 '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/credential-provider-sso@3.315.0: resolution: {integrity: sha512-oMDGwT67cLgLiLEj5UwAiOVo7mb0l4vi2nk+5pgPMpC3cBlAfA0y1IJe4FHp+Vz52F0nvURZZbdWhX6RgMMaqQ==} @@ -445,7 +445,7 @@ packages: tslib: 2.5.0 transitivePeerDependencies: - aws-crt - dev: true + dev: false /@aws-sdk/credential-provider-web-identity@3.310.0: resolution: {integrity: sha512-H4SzuZXILNhK6/IR1uVvsUDZvzc051hem7GLyYghBCu8mU+tq28YhKE8MfSroi6eL2e5Vujloij1OM2EQQkPkw==} @@ -454,7 +454,7 @@ packages: '@aws-sdk/property-provider': 3.310.0 '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/eventstream-codec@3.310.0: resolution: {integrity: sha512-clIeSgWbZbxwtsxZ/yoedNM0/kJFSIjjHPikuDGhxhqc+vP6TN3oYyVMFrYwFaTFhk2+S5wZcWYMw8Op1pWo+A==} @@ -463,7 +463,7 @@ packages: '@aws-sdk/types': 3.310.0 '@aws-sdk/util-hex-encoding': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/eventstream-serde-browser@3.310.0: resolution: {integrity: sha512-3S6ziuQVALgEyz0TANGtYDVeG8ArK4Y05mcgrs8qUTmsvlDIXX37cR/DvmVbNB76M4IrsZeSAIajL9644CywkA==} @@ -472,7 +472,7 @@ packages: '@aws-sdk/eventstream-serde-universal': 3.310.0 '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/eventstream-serde-config-resolver@3.310.0: resolution: {integrity: sha512-8s1Qdn9STj+sV75nUp9yt0W6fHS4BZ2jTm4Z/1Pcbvh2Gqs0WjH5n2StS+pDW5Y9J/HSGBl0ogmUr5lC5bXFHg==} @@ -480,7 +480,7 @@ packages: dependencies: '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/eventstream-serde-node@3.310.0: resolution: {integrity: sha512-kSnRomCgW43K9TmQYuwN9+AoYPnhyOKroanUMyZEzJk7rpCPMj4OzaUpXfDYOvznFNYn7NLaH6nHLJAr0VPlJA==} @@ -489,7 +489,7 @@ packages: '@aws-sdk/eventstream-serde-universal': 3.310.0 '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/eventstream-serde-universal@3.310.0: resolution: {integrity: sha512-Qyjt5k/waV5cDukpgT824ISZAz5U0pwzLz5ztR409u85AGNkF/9n7MS+LSyBUBSb0WJ5pUeSD47WBk+nLq9Nhw==} @@ -498,7 +498,7 @@ packages: '@aws-sdk/eventstream-codec': 3.310.0 '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/fetch-http-handler@3.310.0: resolution: {integrity: sha512-Bi9vIwzdkw1zMcvi/zGzlWS9KfIEnAq4NNhsnCxbQ4OoIRU9wvU+WGZdBBhxg0ZxZmpp1j1aZhU53lLjA07MHw==} @@ -508,7 +508,7 @@ packages: '@aws-sdk/types': 3.310.0 '@aws-sdk/util-base64': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/hash-blob-browser@3.310.0: resolution: {integrity: sha512-OoR8p0cbypToysLT0v3o2oyjy6+DKrY7GNCAzHOHJK9xmqXCt+DsjKoPeiY7o1sWX2aN6Plmvubj/zWxMKEn/A==} @@ -516,7 +516,7 @@ packages: '@aws-sdk/chunked-blob-reader': 3.310.0 '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/hash-node@3.310.0: resolution: {integrity: sha512-NvE2fhRc8GRwCXBfDehxVAWCmVwVMILliAKVPAEr4yz2CkYs0tqU51S48x23dtna07H4qHtgpeNqVTthcIQOEQ==} @@ -526,7 +526,7 @@ packages: '@aws-sdk/util-buffer-from': 3.310.0 '@aws-sdk/util-utf8': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/hash-stream-node@3.310.0: resolution: {integrity: sha512-ZoXdybNgvMz1Hl6k/e32xVL3jmG5p2IEk5mTtLfFEuskTJ74Z+VMYKkkF1whyy7KQfH83H+TQGnsGtlRCchQKw==} @@ -535,21 +535,21 @@ packages: '@aws-sdk/types': 3.310.0 '@aws-sdk/util-utf8': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/invalid-dependency@3.310.0: resolution: {integrity: sha512-1s5RG5rSPXoa/aZ/Kqr5U/7lqpx+Ry81GprQ2bxWqJvWQIJ0IRUwo5pk8XFxbKVr/2a+4lZT/c3OGoBOM1yRRA==} dependencies: '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/is-array-buffer@3.310.0: resolution: {integrity: sha512-urnbcCR+h9NWUnmOtet/s4ghvzsidFmspfhYaHAmSRdy9yDjdjBJMFjjsn85A1ODUktztm+cVncXjQ38WCMjMQ==} engines: {node: '>=14.0.0'} dependencies: tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/md5-js@3.310.0: resolution: {integrity: sha512-x5sRBUrEfLWAS1EhwbbDQ7cXq6uvBxh3qR2XAsnGvFFceTeAadk7cVogWxlk3PC+OCeeym7c3/6Bv2HQ2f1YyQ==} @@ -557,7 +557,7 @@ packages: '@aws-sdk/types': 3.310.0 '@aws-sdk/util-utf8': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/middleware-bucket-endpoint@3.310.0: resolution: {integrity: sha512-uJJfHI7v4AgbJZRLtyI8ap2QRWkBokGc3iyUoQ+dVNT3/CE2ZCu694A6W+H0dRqg79dIE+f9CRNdtLGa/Ehhvg==} @@ -568,7 +568,7 @@ packages: '@aws-sdk/util-arn-parser': 3.310.0 '@aws-sdk/util-config-provider': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/middleware-content-length@3.310.0: resolution: {integrity: sha512-P8tQZxgDt6CAh1wd/W6WPzjc+uWPJwQkm+F7rAwRlM+k9q17HrhnksGDKcpuuLyIhPQYdmOMIkpKVgXGa4avhQ==} @@ -577,7 +577,7 @@ packages: '@aws-sdk/protocol-http': 3.310.0 '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/middleware-endpoint@3.310.0: resolution: {integrity: sha512-Z+N2vOL8K354/lstkClxLLsr6hCpVRh+0tCMXrVj66/NtKysCEZ/0b9LmqOwD9pWHNiI2mJqXwY0gxNlKAroUg==} @@ -588,7 +588,7 @@ packages: '@aws-sdk/url-parser': 3.310.0 '@aws-sdk/util-middleware': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/middleware-expect-continue@3.310.0: resolution: {integrity: sha512-l3d1z2gt+gINJDnPSyu84IxfzjzPfCQrqC1sunw2cZGo/sXtEiq698Q3SiTcO2PGP4LBQAy2RHb5wVBJP708CQ==} @@ -597,7 +597,7 @@ packages: '@aws-sdk/protocol-http': 3.310.0 '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/middleware-flexible-checksums@3.310.0: resolution: {integrity: sha512-5ndnLgzgGVpWkmHBAiYkagHqiSuow8q62J4J6E2PzaQ77+fm8W3nfdy7hK5trHokEyouCZdxT/XK/IRhgj/4PA==} @@ -610,7 +610,7 @@ packages: '@aws-sdk/types': 3.310.0 '@aws-sdk/util-utf8': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/middleware-host-header@3.310.0: resolution: {integrity: sha512-QWSA+46/hXorXyWa61ic2K7qZzwHTiwfk2e9mRRjeIRepUgI3qxFjsYqrWtrOGBjmFmq0pYIY8Bb/DCJuQqcoA==} @@ -619,7 +619,7 @@ packages: '@aws-sdk/protocol-http': 3.310.0 '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/middleware-location-constraint@3.310.0: resolution: {integrity: sha512-LFm0JTQWwTPWL/tZU2wsQTl8J5PpDEkXjEhaXVKamtyH0xhysRqd+0n92n65dc8oztAuQkb9xUbErGn5b6gsew==} @@ -627,7 +627,7 @@ packages: dependencies: '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/middleware-logger@3.310.0: resolution: {integrity: sha512-Lurm8XofrASBRnAVtiSNuDSRsRqPNg27RIFLLsLp/pqog9nFJ0vz0kgdb9S5Z+zw83Mm+UlqOe6D8NTUNp4fVg==} @@ -635,7 +635,7 @@ packages: dependencies: '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/middleware-recursion-detection@3.310.0: resolution: {integrity: sha512-SuB75/xk/gyue24gkriTwO2jFd7YcUGZDClQYuRejgbXSa3CO0lWyawQtfLcSSEBp9izrEVXuFH24K1eAft5nQ==} @@ -644,7 +644,7 @@ packages: '@aws-sdk/protocol-http': 3.310.0 '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/middleware-retry@3.310.0: resolution: {integrity: sha512-oTPsRy2W4s+dfxbJPW7Km+hHtv/OMsNsVfThAq8DDYKC13qlr1aAyOqGLD+dpBy2aKe7ss517Sy2HcHtHqm7/g==} @@ -657,7 +657,7 @@ packages: '@aws-sdk/util-retry': 3.310.0 tslib: 2.5.0 uuid: 8.3.2 - dev: true + dev: false /@aws-sdk/middleware-sdk-s3@3.310.0: resolution: {integrity: sha512-QK9x9g2ksg0hOjjYgqddeFcn5ctUEGdxJVu4OumPXceulefMcSO2jyH2qTybYSA93nqNQFdFmg5wQfvIRUWFCQ==} @@ -667,7 +667,7 @@ packages: '@aws-sdk/types': 3.310.0 '@aws-sdk/util-arn-parser': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/middleware-sdk-sts@3.310.0: resolution: {integrity: sha512-+5PFwlYNLvLLIfw0ASAoWV/iIF8Zv6R6QGtyP0CclhRSvNjgbQDVnV0g95MC5qvh+GB/Yjlkt8qAjLSPjHfsrQ==} @@ -676,7 +676,7 @@ packages: '@aws-sdk/middleware-signing': 3.310.0 '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/middleware-serde@3.310.0: resolution: {integrity: sha512-RNeeTVWSLTaentUeCgQKZhAl+C6hxtwD78cQWS10UymWpQFwbaxztzKUu4UQS5xA2j6PxwPRRUjqa4jcFjfLsg==} @@ -684,7 +684,7 @@ packages: dependencies: '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/middleware-signing@3.310.0: resolution: {integrity: sha512-f9mKq+XMdW207Af3hKjdTnpNhdtwqWuvFs/ZyXoOkp/g1MY1O6L23Jy6i52m29LxbT4AuNRG1oKODfXM0vYVjQ==} @@ -696,7 +696,7 @@ packages: '@aws-sdk/types': 3.310.0 '@aws-sdk/util-middleware': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/middleware-ssec@3.310.0: resolution: {integrity: sha512-CnEwNKVpd5bXnrCKPaePF8mWTA9ET21OMBb54y9b0fd8K02zoOcdBz4DWfh1SjFD4HkgCdja4egd8l2ivyvqmw==} @@ -704,14 +704,14 @@ packages: dependencies: '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/middleware-stack@3.310.0: resolution: {integrity: sha512-010O1PD+UAcZVKRvqEusE1KJqN96wwrf6QsqbRM0ywsKQ21NDweaHvEDlds2VHpgmofxkRLRu/IDrlPkKRQrRg==} engines: {node: '>=14.0.0'} dependencies: tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/middleware-user-agent@3.310.0: resolution: {integrity: sha512-x3IOwSwSbwKidlxRk3CNVHVUb06SRuaELxggCaR++QVI8NU6qD/l4VHXKVRvbTHiC/cYxXE/GaBDgQVpDR7V/g==} @@ -721,7 +721,7 @@ packages: '@aws-sdk/types': 3.310.0 '@aws-sdk/util-endpoints': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/node-config-provider@3.310.0: resolution: {integrity: sha512-T/Pp6htc6hq/Cq+MLNDSyiwWCMVF6GqbBbXKVlO5L8rdHx4sq9xPdoPveZhGWrxvkanjA6eCwUp6E0riBOSVng==} @@ -731,7 +731,7 @@ packages: '@aws-sdk/shared-ini-file-loader': 3.310.0 '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/node-http-handler@3.310.0: resolution: {integrity: sha512-irv9mbcM9xC2xYjArQF5SYmHBMu4ciMWtGsoHII1nRuFOl9FoT4ffTvEPuLlfC6pznzvKt9zvnm6xXj7gDChKg==} @@ -742,7 +742,7 @@ packages: '@aws-sdk/querystring-builder': 3.310.0 '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/property-provider@3.310.0: resolution: {integrity: sha512-3lxDb0akV6BBzmFe4nLPaoliQbAifyWJhuvuDOu7e8NzouvpQXs0275w9LePhhcgjKAEVXUIse05ZW2DLbxo/g==} @@ -750,7 +750,7 @@ packages: dependencies: '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/protocol-http@3.310.0: resolution: {integrity: sha512-fgZ1aw/irQtnrsR58pS8ThKOWo57Py3xX6giRvwSgZDEcxHfVzuQjy9yPuV++v04fdmdtgpbGf8WfvAAJ11yXQ==} @@ -758,7 +758,7 @@ packages: dependencies: '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/querystring-builder@3.310.0: resolution: {integrity: sha512-ZHH8GV/80+pWGo7DzsvwvXR5xVxUHXUvPJPFAkhr6nCf78igdoF8gR10ScFoEKbtEapoNTaZlKHPXxpD8aPG7A==} @@ -767,7 +767,7 @@ packages: '@aws-sdk/types': 3.310.0 '@aws-sdk/util-uri-escape': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/querystring-parser@3.310.0: resolution: {integrity: sha512-YkIznoP6lsiIUHinx++/lbb3tlMURGGqMpo0Pnn32zYzGrJXA6eC3D0as2EcMjo55onTfuLcIiX4qzXes2MYOA==} @@ -775,12 +775,12 @@ packages: dependencies: '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/service-error-classification@3.310.0: resolution: {integrity: sha512-PuyC7k3qfIKeH2LCnDwbttMOKq3qAx4buvg0yfnJtQOz6t1AR8gsnAq0CjKXXyfkXwNKWTqCpE6lVNUIkXgsMw==} engines: {node: '>=14.0.0'} - dev: true + dev: false /@aws-sdk/shared-ini-file-loader@3.310.0: resolution: {integrity: sha512-N0q9pG0xSjQwc690YQND5bofm+4nfUviQ/Ppgan2kU6aU0WUq8KwgHJBto/YEEI+VlrME30jZJnxtOvcZJc2XA==} @@ -788,7 +788,7 @@ packages: dependencies: '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/signature-v4-multi-region@3.310.0: resolution: {integrity: sha512-q8W+RIomTS/q85Ntgks/CoDElwqkC9+4OCicee5YznNHjQ4gtNWhUkYIyIRWRmXa/qx/AUreW9DM8FAecCOdng==} @@ -803,7 +803,7 @@ packages: '@aws-sdk/signature-v4': 3.310.0 '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/signature-v4@3.310.0: resolution: {integrity: sha512-1M60P1ZBNAjCFv9sYW29OF6okktaeibWyW3lMXqzoHF70lHBZh+838iUchznXUA5FLabfn4jBFWMRxlAXJUY2Q==} @@ -816,7 +816,7 @@ packages: '@aws-sdk/util-uri-escape': 3.310.0 '@aws-sdk/util-utf8': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/smithy-client@3.315.0: resolution: {integrity: sha512-qTm0lwTh6IZMiWs3U9k2veoF6gV9yE0B9Z34yMxagOfQFQgxMih0aiH25MD25eRigjJ3sfUeZ+B0mRycmJZdkQ==} @@ -825,7 +825,7 @@ packages: '@aws-sdk/middleware-stack': 3.310.0 '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/token-providers@3.315.0: resolution: {integrity: sha512-EjLUQ9JLqU3eJfJyzpcVjFnuJ1MCCodZaVJmuX/a/as4TK41bKMvkVojjsU7pDSYzl+tuXE+ceivcWK4H0HQdQ==} @@ -838,14 +838,14 @@ packages: tslib: 2.5.0 transitivePeerDependencies: - aws-crt - dev: true + dev: false /@aws-sdk/types@3.310.0: resolution: {integrity: sha512-j8eamQJ7YcIhw7fneUfs8LYl3t01k4uHi4ZDmNRgtbmbmTTG3FZc2MotStZnp3nZB6vLiPF1o5aoJxWVvkzS6A==} engines: {node: '>=14.0.0'} dependencies: tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/url-parser@3.310.0: resolution: {integrity: sha512-mCLnCaSB9rQvAgx33u0DujLvr4d5yEm/W5r789GblwwQnlNXedVu50QRizMLTpltYWyAUoXjJgQnJHmJMaKXhw==} @@ -853,14 +853,14 @@ packages: '@aws-sdk/querystring-parser': 3.310.0 '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/util-arn-parser@3.310.0: resolution: {integrity: sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA==} engines: {node: '>=14.0.0'} dependencies: tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/util-base64@3.310.0: resolution: {integrity: sha512-v3+HBKQvqgdzcbL+pFswlx5HQsd9L6ZTlyPVL2LS9nNXnCcR3XgGz9jRskikRUuUvUXtkSG1J88GAOnJ/apTPg==} @@ -868,20 +868,20 @@ packages: dependencies: '@aws-sdk/util-buffer-from': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/util-body-length-browser@3.310.0: resolution: {integrity: sha512-sxsC3lPBGfpHtNTUoGXMQXLwjmR0zVpx0rSvzTPAuoVILVsp5AU/w5FphNPxD5OVIjNbZv9KsKTuvNTiZjDp9g==} dependencies: tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/util-body-length-node@3.310.0: resolution: {integrity: sha512-2tqGXdyKhyA6w4zz7UPoS8Ip+7sayOg9BwHNidiGm2ikbDxm1YrCfYXvCBdwaJxa4hJfRVz+aL9e+d3GqPI9pQ==} engines: {node: '>=14.0.0'} dependencies: tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/util-buffer-from@3.310.0: resolution: {integrity: sha512-i6LVeXFtGih5Zs8enLrt+ExXY92QV25jtEnTKHsmlFqFAuL3VBeod6boeMXkN2p9lbSVVQ1sAOOYZOHYbYkntw==} @@ -889,14 +889,14 @@ packages: dependencies: '@aws-sdk/is-array-buffer': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/util-config-provider@3.310.0: resolution: {integrity: sha512-xIBaYo8dwiojCw8vnUcIL4Z5tyfb1v3yjqyJKJWV/dqKUFOOS0U591plmXbM+M/QkXyML3ypon1f8+BoaDExrg==} engines: {node: '>=14.0.0'} dependencies: tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/util-defaults-mode-browser@3.315.0: resolution: {integrity: sha512-5cqNvfGos3FB/MHNl+g2fr+tPY7s3k3+96V3wOPWLOksdACth10OxPpHfboXXZDHHkR0hmyJwJcfgA4uQrUcGg==} @@ -906,7 +906,7 @@ packages: '@aws-sdk/types': 3.310.0 bowser: 2.11.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/util-defaults-mode-node@3.315.0: resolution: {integrity: sha512-vSPIGpzh6NJIMLoh31p7CczSatN46kJdJBrHfODHaIGe4t156x+LfkkcxGQhtifqxglhL7l+fmn5D1fM5exHuA==} @@ -918,7 +918,7 @@ packages: '@aws-sdk/property-provider': 3.310.0 '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/util-endpoints@3.310.0: resolution: {integrity: sha512-zG+/d/O5KPmAaeOMPd6bW1abifdT0H03f42keLjYEoRZzYtHPC5DuPE0UayiWGckI6BCDgy0sRKXCYS49UNFaQ==} @@ -926,28 +926,28 @@ packages: dependencies: '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/util-hex-encoding@3.310.0: resolution: {integrity: sha512-sVN7mcCCDSJ67pI1ZMtk84SKGqyix6/0A1Ab163YKn+lFBQRMKexleZzpYzNGxYzmQS6VanP/cfU7NiLQOaSfA==} engines: {node: '>=14.0.0'} dependencies: tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/util-locate-window@3.310.0: resolution: {integrity: sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==} engines: {node: '>=14.0.0'} dependencies: tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/util-middleware@3.310.0: resolution: {integrity: sha512-FTSUKL/eRb9X6uEZClrTe27QFXUNNp7fxYrPndZwk1hlaOP5ix+MIHBcI7pIiiY/JPfOUmPyZOu+HetlFXjWog==} engines: {node: '>=14.0.0'} dependencies: tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/util-retry@3.310.0: resolution: {integrity: sha512-FwWGhCBLfoivTMUHu1LIn4NjrN9JLJ/aX5aZmbcPIOhZVFJj638j0qDgZXyfvVqBuBZh7M8kGq0Oahy3dp69OA==} @@ -955,7 +955,7 @@ packages: dependencies: '@aws-sdk/service-error-classification': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/util-stream-browser@3.310.0: resolution: {integrity: sha512-bysXZHwFwvbqOTCScCdCnoLk1K3GCo0HRIYEZuL7O7MHrQmfaYRXcaft/p22+GUv9VeFXS/eJJZ5r4u32az94w==} @@ -966,7 +966,7 @@ packages: '@aws-sdk/util-hex-encoding': 3.310.0 '@aws-sdk/util-utf8': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/util-stream-node@3.310.0: resolution: {integrity: sha512-hueAXFK0GVvnfYFgqbF7587xZfMZff5jlIFZOHqx7XVU7bl7qrRUCnphHk8H6yZ7RoQbDPcfmHJgtEoAJg1T1Q==} @@ -976,14 +976,14 @@ packages: '@aws-sdk/types': 3.310.0 '@aws-sdk/util-buffer-from': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/util-uri-escape@3.310.0: resolution: {integrity: sha512-drzt+aB2qo2LgtDoiy/3sVG8w63cgLkqFIa2NFlGpUgHFWTXkqtbgf4L5QdjRGKWhmZsnqkbtL7vkSWEcYDJ4Q==} engines: {node: '>=14.0.0'} dependencies: tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/util-user-agent-browser@3.310.0: resolution: {integrity: sha512-yU/4QnHHuQ5z3vsUqMQVfYLbZGYwpYblPiuZx4Zo9+x0PBkNjYMqctdDcrpoH9Z2xZiDN16AmQGK1tix117ZKw==} @@ -991,7 +991,7 @@ packages: '@aws-sdk/types': 3.310.0 bowser: 2.11.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/util-user-agent-node@3.310.0: resolution: {integrity: sha512-Ra3pEl+Gn2BpeE7KiDGpi4zj7WJXZA5GXnGo3mjbi9+Y3zrbuhJAbdZO3mO/o7xDgMC6ph4xCTbaSGzU6b6EDg==} @@ -1005,13 +1005,13 @@ packages: '@aws-sdk/node-config-provider': 3.310.0 '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/util-utf8-browser@3.259.0: resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} dependencies: tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/util-utf8@3.310.0: resolution: {integrity: sha512-DnLfFT8uCO22uOJc0pt0DsSNau1GTisngBCDw8jQuWT5CqogMJu4b/uXmwEqfj8B3GX6Xsz8zOd6JpRlPftQoA==} @@ -1019,7 +1019,7 @@ packages: dependencies: '@aws-sdk/util-buffer-from': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/util-waiter@3.310.0: resolution: {integrity: sha512-AV5j3guH/Y4REu+Qh3eXQU9igljHuU4XjX2sADAgf54C0kkhcCCkkiuzk3IsX089nyJCqIcj5idbjdvpnH88Vw==} @@ -1028,14 +1028,14 @@ packages: '@aws-sdk/abort-controller': 3.310.0 '@aws-sdk/types': 3.310.0 tslib: 2.5.0 - dev: true + dev: false /@aws-sdk/xml-builder@3.310.0: resolution: {integrity: sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw==} engines: {node: '>=14.0.0'} dependencies: tslib: 2.5.0 - dev: true + dev: false /@babel/code-frame@7.18.6: resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} @@ -2162,18 +2162,16 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true /bowser@2.11.0: resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} - dev: true + dev: false /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - dev: true /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} @@ -2298,7 +2296,7 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: true + dev: false /cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} @@ -2347,7 +2345,6 @@ packages: /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} @@ -2683,7 +2680,7 @@ packages: hasBin: true dependencies: strnum: 1.0.5 - dev: true + dev: false /fastq@1.14.0: resolution: {integrity: sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==} @@ -3651,7 +3648,7 @@ packages: resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} dependencies: brace-expansion: 1.1.11 - dev: true + dev: false /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -3989,11 +3986,11 @@ packages: /rxjs@7.5.7: resolution: {integrity: sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==} dependencies: - tslib: 2.4.1 + tslib: 2.5.0 dev: true - /s3-groundskeeper@0.2.2: - resolution: {integrity: sha512-62ntqZMhd7v85yWM+YXKsVLJdf6us6Lc+L52Ia91kRpZMgb/E9hjeXKsIoydgN9XoALoUEL+/Rp37LUrKOOl4Q==} + /s3-groundskeeper@0.3.1: + resolution: {integrity: sha512-NOATkeUjia83Dks5rTafwRauqRP3/UYXe/7psX6EXs320fKmJHKfzRNcBsVdeRJwQvE3Vc+0xJX0KkyZ5qpJpg==} hasBin: true dependencies: '@aws-sdk/client-s3': 3.315.0 @@ -4002,7 +3999,7 @@ packages: transitivePeerDependencies: - '@aws-sdk/signature-v4-crt' - aws-crt - dev: true + dev: false /semver@6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} @@ -4156,7 +4153,7 @@ packages: /strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} - dev: true + dev: false /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} @@ -4299,15 +4296,9 @@ packages: /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true - - /tslib@2.4.1: - resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} - dev: true /tslib@2.5.0: resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} - dev: true /tsutils@3.21.0(typescript@5.0.4): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} @@ -4367,7 +4358,7 @@ packages: /uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true - dev: true + dev: false /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} @@ -4456,7 +4447,7 @@ packages: /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} - dev: true + dev: false /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} @@ -4473,7 +4464,7 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 - dev: true + dev: false /yargs@17.6.2: resolution: {integrity: sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==} diff --git a/src/artifact-provider-config.mts b/src/artifact-provider-config.mts index aff021e..5ba7f6b 100644 --- a/src/artifact-provider-config.mts +++ b/src/artifact-provider-config.mts @@ -2,7 +2,6 @@ export type ProviderType = 'jfrog'; export interface ArtifactProviderConfig { type: ProviderType, - protocol: string, host: string, project: string, apiKey: string, diff --git a/src/artifact-provider.mts b/src/artifact-provider.mts index 0babc5b..8f17db7 100644 --- a/src/artifact-provider.mts +++ b/src/artifact-provider.mts @@ -1,3 +1,6 @@ +import type { ByteRange } from 's3-groundskeeper'; +import type { IncomingMessage } from 'http'; + export interface Artifact { name: string, type: string, @@ -9,6 +12,7 @@ export interface Artifact { export interface ArtifactProvider { artifactsByBuildNumber(buildNumber: string): Promise; - artifactUrl(artifact: Artifact): Promise; + artifactUrl(artifact: Artifact): Promise; + getArtifactContent(artifact: Artifact, range?: ByteRange): Promise; createMetapointerFile(artifact: Artifact, fileName: string): void; } diff --git a/src/deb/deb-builder.mts b/src/deb/deb-builder.mts index 0139185..4f1f4e7 100644 --- a/src/deb/deb-builder.mts +++ b/src/deb/deb-builder.mts @@ -12,7 +12,6 @@ import { createDir, execToolToFile, removeDir } from '../fs.mjs'; import type { Config } from '../config.mjs'; import type { Deployer } from '../deployer.mjs'; import type { Packages } from '../repo.mjs'; -import { requestRange } from '../http.mjs'; const ReleaseFileTemplate = `Origin: $ORIGIN @@ -23,7 +22,6 @@ Codename: $CHANNEL\n`; interface DebDescriptor { version: string, - url: string, artifact: Artifact } @@ -109,7 +107,7 @@ export class DebBuilder implements Deployer { } private async debsByPackages(packs: Packages): Promise { - const debsPromises: Promise[] = []; + const debs: DebDescriptor[] = []; const artsByBuildNumbersPromises: Promise<{version: string, artifacts: Artifact[]}>[] = []; packs.packages.forEach(pack => { @@ -123,15 +121,14 @@ export class DebBuilder implements Deployer { artsByBuildNumbers.forEach(value => { value.artifacts.filter(artifact => artifact.type === 'deb').forEach(artifact => { - debsPromises.push((async(): Promise => ({ + debs.push({ version: value.version, artifact, - url: await this.artifactProvider.artifactUrl(artifact), - }))()); + }); }); }); - return Promise.all(debsPromises); + return debs; } private async dpkgScanpackages(): Promise { @@ -147,14 +144,14 @@ export class DebBuilder implements Deployer { } private async handleDeb(channel: string, deb: DebDescriptor): Promise { - const debUrl = deb.url; - const controlTarSizeRange = '120-129'; + const controlTarSizeRange = { start: 120, end: 129 }; // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call - const cocntrolTarSize = Number((await requestRange(debUrl, controlTarSizeRange)).read().toString() + const controlTarSize = Number((await this.artifactProvider.getArtifactContent(deb.artifact, controlTarSizeRange)).read().toString() .trim()); - const controlTarRange = `132-${131 + cocntrolTarSize}`; - const controlTar = await requestRange(debUrl, controlTarRange); + const controlTarRange = { start: 132, end: 131 + controlTarSize }; + + const controlTar = await this.artifactProvider.getArtifactContent(deb.artifact, controlTarRange); const whereExtract = path.join(os.tmpdir(), `control-${crypto.randomBytes(4).toString('hex')}`); diff --git a/src/jfrog/artifact-provider.mts b/src/jfrog/artifact-provider.mts index ce55cd9..5ad1585 100644 --- a/src/jfrog/artifact-provider.mts +++ b/src/jfrog/artifact-provider.mts @@ -1,10 +1,11 @@ -import { type ArtifactoryClient, type ArtifactoryItemMeta, createArtifactoryClient } from 's3-groundskeeper'; +import { type ArtifactoryClient, type ArtifactoryItemMeta, type ByteRange, createArtifactoryClient } from 's3-groundskeeper'; import { createFile } from '../fs.mjs'; import { get } from '../http.mjs'; import type { Artifact, ArtifactProvider } from '../artifact-provider.mjs'; import type { ArtifactProviderConfig } from '../artifact-provider-config.mjs'; +import type { IncomingMessage } from 'http'; import metapointerContent from '../s3-metapointer.mjs'; interface BuildsList { @@ -31,8 +32,7 @@ export default class JfrogArtifactProvider implements ArtifactProvider { constructor(config: ArtifactProviderConfig) { this.config = config; this.artifactoryClient = createArtifactoryClient({ - protocol: this.config.protocol, - host: this.config.host, + baseUrl: new URL(this.config.host), apiKey: this.config.apiKey, user: this.config.user, }); @@ -51,7 +51,26 @@ export default class JfrogArtifactProvider implements ArtifactProvider { return result; } - public async artifactUrl(artifact: Artifact): Promise { + public async artifactUrl(artifact: Artifact): Promise { + return this.artifactoryClient.getItemUrl(await this.getArtifactoryItemMeta(artifact)); + } + + public getArtifactContent(artifact: Artifact, range?: ByteRange): Promise { + return new Promise((resolve, reject) => { + this.getArtifactoryItemMeta(artifact).then(meta => { + this.artifactoryClient.getContentStream(meta, range) + .then(value => resolve(value)) + .catch(err => reject(err)); + }); + }); + } + + // eslint-disable-next-line class-methods-use-this + public createMetapointerFile(artifact: Artifact, fileName: string): void { + createFile(fileName, metapointerContent(artifact.md5)); + } + + private async getArtifactoryItemMeta(artifact: Artifact): Promise { const aqlItemField = 'actual_md5'; const artQueryResult = await this.artifactoryClient.query(`items.find({"${aqlItemField}": "${artifact.md5}"}).include("*")`); @@ -67,12 +86,7 @@ export default class JfrogArtifactProvider implements ArtifactProvider { throw new Error(`No artifactory item found for ("${aqlItemField}": "${artifact.md5}"}`); } - return this.artifactoryClient.resolveUri(item); - } - - // eslint-disable-next-line class-methods-use-this - public createMetapointerFile(artifact: Artifact, fileName: string): void { - createFile(fileName, metapointerContent(artifact.md5)); + return item; } private async buildInfosByNumber(buildNumber: string): Promise { @@ -82,10 +96,10 @@ export default class JfrogArtifactProvider implements ArtifactProvider { const result: BuildInfo[] = []; - const buildsEndpoint = this.artifactoryClient.resolveUri(`api/build/${this.config.project}`); + const buildsEndpoint = this.artifactoryClient.resolveUrl(`api/build/${this.config.project}`); if (!this.buildsList) { - const allBuilds = await get(buildsEndpoint); + const allBuilds = await get(buildsEndpoint.toString()); this.buildsList = JSON.parse(allBuilds.toString()) as BuildsList; } @@ -103,6 +117,8 @@ export default class JfrogArtifactProvider implements ArtifactProvider { const infoPromises: Promise[] = []; + buildsEndpoint.pathname += '/'; + for (const value of buildTimes(buildNumber)) { const buildInfoEndpointUrl = new URL(buildNumber, buildsEndpoint); buildInfoEndpointUrl.searchParams.set('started', value.toISOString()); From 048b09267add42e05f888351b86b08e1d9389213 Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Fri, 16 Feb 2024 17:05:20 +0300 Subject: [PATCH 44/58] use fs.promises --- src/deb/deb-builder.mts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/deb/deb-builder.mts b/src/deb/deb-builder.mts index 4f1f4e7..02e07e8 100644 --- a/src/deb/deb-builder.mts +++ b/src/deb/deb-builder.mts @@ -203,13 +203,7 @@ export class DebBuilder implements Deployer { const dataToAppend = `Filename: ${relativeDebPath}\nSize: ${debSize}\nSHA1: ${sha1}\nSHA256: ${sha256}\nMD5Sum: ${md5}\n`; - fs.appendFile(targetMetaPath, dataToAppend, err => { - if (err) { - throw err; - } - - resolve(); - }); + fs.promises.appendFile(targetMetaPath, dataToAppend).then(() => resolve()); }); }); } From 2e67c3b6c696d9c762f546ca86c8869bb1b65aff Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Fri, 16 Feb 2024 18:35:07 +0300 Subject: [PATCH 45/58] use temp dir in cwd --- src/deb/deb-builder.mts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/deb/deb-builder.mts b/src/deb/deb-builder.mts index 02e07e8..cc63a5b 100644 --- a/src/deb/deb-builder.mts +++ b/src/deb/deb-builder.mts @@ -1,9 +1,7 @@ import { createGzip } from 'zlib'; -import * as crypto from 'crypto'; import * as fs from 'fs'; import * as ini from 'ini'; -import * as os from 'os'; import * as path from 'path'; import * as tar from 'tar'; @@ -35,6 +33,7 @@ export class DebBuilder implements Deployer { private readonly artifactProvider: ArtifactProvider; private readonly root: string; + private readonly temp: string; private readonly pool: string; private readonly dists: string; private readonly keys: string; @@ -47,6 +46,7 @@ export class DebBuilder implements Deployer { this.config = config; this.root = path.join(this.config.base.out, 'repo', this.config.debBuilder.applicationName, 'deb'); + this.temp = path.join(this.config.base.out, 'temp'); this.pool = path.join(this.root, 'pool'); this.dists = path.join(this.root, 'dists'); this.keys = path.join(this.root, 'keys'); @@ -54,9 +54,13 @@ export class DebBuilder implements Deployer { } public async plan(): Promise { - await this.prepareMetaRepository(); - await this.dpkgScanpackages(); - await this.makeRelease(); + try { + await this.prepareMetaRepository(); + await this.dpkgScanpackages(); + await this.makeRelease(); + } finally { + removeDir(this.temp); + } } public apply(): void { @@ -153,7 +157,7 @@ export class DebBuilder implements Deployer { const controlTar = await this.artifactProvider.getArtifactContent(deb.artifact, controlTarRange); - const whereExtract = path.join(os.tmpdir(), `control-${crypto.randomBytes(4).toString('hex')}`); + const whereExtract = path.join(this.temp, `control-${deb.artifact.md5}`); createDir(whereExtract); From 4a80c1d054b5829d81bdde940fad96e8a8d756bc Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Fri, 16 Feb 2024 19:21:43 +0300 Subject: [PATCH 46/58] rename channel to distribution --- src/deb/deb-builder.mts | 58 ++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/src/deb/deb-builder.mts b/src/deb/deb-builder.mts index cc63a5b..a104ef9 100644 --- a/src/deb/deb-builder.mts +++ b/src/deb/deb-builder.mts @@ -16,15 +16,15 @@ const ReleaseFileTemplate = Label: Ubuntu/Debian Architecture: $ARCH Component: $COMPONENT -Codename: $CHANNEL\n`; +Codename: $DISTRIBUTION\n`; interface DebDescriptor { version: string, artifact: Artifact } -interface ChannelItem { - channel: string; +interface DistributionItem { + distribution: string; debs: DebDescriptor[] } @@ -38,9 +38,9 @@ export class DebBuilder implements Deployer { private readonly dists: string; private readonly keys: string; - private debRepo: ChannelItem[] = []; + private debRepo: DistributionItem[] = []; - private archesByChannel: Map> = new Map(); + private archesByDistribution: Map> = new Map(); constructor(artifactProvider: ArtifactProvider, config: Config) { this.config = config; @@ -71,35 +71,35 @@ export class DebBuilder implements Deployer { return `${this.config.debBuilder.applicationName}-${version}_${arch}.deb`; } - private async makeReleaseFileAndSign(channel: string, arch: string): Promise { + private async makeReleaseFileAndSign(distribution: string, arch: string): Promise { const publicKeyPath = path.join(this.keys, 'desktop.asc'); createDir(this.keys); await fs.promises.copyFile(this.config.debBuilder.gpgPublicKeyPath, publicKeyPath); const releaseContent = ReleaseFileTemplate .replace('$ORIGIN', this.config.debBuilder.origin) - .replace('$CHANNEL', channel) + .replace('$DISTRIBUTION', distribution) .replace('$ARCH', arch) .replace('$COMPONENT', this.config.debBuilder.component); - const releaseFilePath = path.join(this.dists, channel, 'Release'); - const releaseGpgFilePath = path.join(this.dists, channel, 'Release.gpg'); - const inReleaseFilePath = path.join(this.dists, channel, 'InRelease'); + const releaseFilePath = path.join(this.dists, distribution, 'Release'); + const releaseGpgFilePath = path.join(this.dists, distribution, 'Release.gpg'); + const inReleaseFilePath = path.join(this.dists, distribution, 'InRelease'); await fs.promises.writeFile(releaseFilePath, releaseContent); - await execToolToFile('apt-ftparchive', ['release', `${this.dists}/${channel}`], releaseFilePath, true); + await execToolToFile('apt-ftparchive', ['release', `${this.dists}/${distribution}`], releaseFilePath, true); await execToolToFile('gpg', ['--no-tty', '--default-key', this.config.debBuilder.gpgKeyName, '-abs', '-o', releaseGpgFilePath, releaseFilePath]); await execToolToFile('gpg', ['--no-tty', '--default-key', this.config.debBuilder.gpgKeyName, '--clearsign', '-o', inReleaseFilePath, releaseFilePath]); } private async prepareMetaRepository(): Promise { - const debsPromises: Promise<{channel: string, debs: DebDescriptor[]}>[] = []; + const debsPromises: Promise<{distribution: string, debs: DebDescriptor[]}>[] = []; - this.config.base.repo.forEach(channelEntry => { - debsPromises.push((async(): Promise<{ channel: string, debs: DebDescriptor[] }> => ({ - channel: channelEntry.channel, - debs: await this.debsByPackages(channelEntry.packages), + this.config.base.repo.forEach(distributionEntry => { + debsPromises.push((async(): Promise<{ distribution: string, debs: DebDescriptor[] }> => ({ + distribution: distributionEntry.channel, + debs: await this.debsByPackages(distributionEntry.packages), }))()); }); @@ -138,16 +138,16 @@ export class DebBuilder implements Deployer { private async dpkgScanpackages(): Promise { const promises: Promise[] = []; - this.debRepo.forEach(channel => { - channel.debs.forEach(deb => { - promises.push(this.handleDeb(channel.channel, deb)); + this.debRepo.forEach(distribution => { + distribution.debs.forEach(deb => { + promises.push(this.handleDeb(distribution.distribution, deb)); }); }); await Promise.all(promises); } - private async handleDeb(channel: string, deb: DebDescriptor): Promise { + private async handleDeb(distribution: string, deb: DebDescriptor): Promise { const controlTarSizeRange = { start: 120, end: 129 }; // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call @@ -170,16 +170,16 @@ export class DebBuilder implements Deployer { const controlMeta = ini.parse(controlMetaContent); const arch = controlMeta['Architecture']; - const archesSet = this.archesByChannel.get(channel); + const archesSet = this.archesByDistribution.get(distribution); if (archesSet) { archesSet.add(arch); } else { - this.archesByChannel.set(channel, new Set([arch])); + this.archesByDistribution.set(distribution, new Set([arch])); } const targetMetaPath = path.join(this.dists, - channel, + distribution, this.config.debBuilder.component, `binary-${arch}`, `${this.debName(deb.version, arch)}.meta`); @@ -192,7 +192,7 @@ export class DebBuilder implements Deployer { this.config.debBuilder.component, `${this.config.debBuilder.applicationName[0]}`, this.config.debBuilder.applicationName, - channel, + distribution, this.debName(deb.version, arch)); const relativeDebPath = path.relative(this.root, debPath); this.artifactProvider.createMetapointerFile(deb.artifact, debPath); @@ -227,8 +227,8 @@ export class DebBuilder implements Deployer { const compressPromises: Promise[] = []; - this.debRepo.forEach(channelEntry => { - const distsRoot = path.join(this.dists, channelEntry.channel, this.config.debBuilder.component); + this.debRepo.forEach(distributionEntry => { + const distsRoot = path.join(this.dists, distributionEntry.distribution, this.config.debBuilder.component); const distsByArch = fs.readdirSync(distsRoot).map(dist => path.join(distsRoot, dist)); distsByArch.forEach(dist => { @@ -256,12 +256,12 @@ export class DebBuilder implements Deployer { const releasesPromises: Promise[] = []; this.debRepo.forEach(chan => { - const archesSet = this.archesByChannel.get(chan.channel); + const archesSet = this.archesByDistribution.get(chan.distribution); if (!archesSet) { - throw new Error('No arch was found for channel'); + throw new Error('No arch was found for distribution'); } - releasesPromises.push(this.makeReleaseFileAndSign(chan.channel, [...archesSet.values()].join(' '))); + releasesPromises.push(this.makeReleaseFileAndSign(chan.distribution, [...archesSet.values()].join(' '))); }); return Promise.all(releasesPromises); From 0f0c7b41aa5d88386969251df1451eaa8a01db13 Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Fri, 15 Mar 2024 16:26:47 +0300 Subject: [PATCH 47/58] review notes fix --- src/artifact-provider.mts | 1 - src/deb/deb-builder.mts | 3 ++- src/fs.mts | 4 ---- src/http.mts | 18 +++++++++--------- src/jfrog/artifact-provider.mts | 11 ++--------- src/s3-metapointer.mts | 9 ++++++++- 6 files changed, 21 insertions(+), 25 deletions(-) diff --git a/src/artifact-provider.mts b/src/artifact-provider.mts index 8f17db7..efe3c90 100644 --- a/src/artifact-provider.mts +++ b/src/artifact-provider.mts @@ -14,5 +14,4 @@ export interface ArtifactProvider { artifactsByBuildNumber(buildNumber: string): Promise; artifactUrl(artifact: Artifact): Promise; getArtifactContent(artifact: Artifact, range?: ByteRange): Promise; - createMetapointerFile(artifact: Artifact, fileName: string): void; } diff --git a/src/deb/deb-builder.mts b/src/deb/deb-builder.mts index a104ef9..8b0c207 100644 --- a/src/deb/deb-builder.mts +++ b/src/deb/deb-builder.mts @@ -8,6 +8,7 @@ import * as tar from 'tar'; import type { Artifact, ArtifactProvider } from '../artifact-provider.mjs'; import { createDir, execToolToFile, removeDir } from '../fs.mjs'; import type { Config } from '../config.mjs'; +import { createMetapointerFile } from '../s3-metapointer.mjs'; import type { Deployer } from '../deployer.mjs'; import type { Packages } from '../repo.mjs'; @@ -195,7 +196,7 @@ export class DebBuilder implements Deployer { distribution, this.debName(deb.version, arch)); const relativeDebPath = path.relative(this.root, debPath); - this.artifactProvider.createMetapointerFile(deb.artifact, debPath); + createMetapointerFile(deb.artifact.md5, debPath); const debSize = controlTar.headers['content-range']?.split('/')[1]; const sha1 = controlTar.headers['x-checksum-sha1']; const sha256 = controlTar.headers['x-checksum-sha256']; diff --git a/src/fs.mts b/src/fs.mts index a2363b4..f3d619c 100644 --- a/src/fs.mts +++ b/src/fs.mts @@ -22,10 +22,6 @@ export function removeDir(dirName: string): void { } } -export function createMetapointerContent(fileMd5Hash: string): string { - return `#metapointer jfrogart\noid md5:${fileMd5Hash}`; -} - // eslint-disable-next-line max-params export async function execToolToFile(tool: string, args: string[], outputPath?: string, append?: boolean): Promise { if (!append && outputPath && existsSync(outputPath)) { diff --git a/src/http.mts b/src/http.mts index ba35c16..6047514 100644 --- a/src/http.mts +++ b/src/http.mts @@ -12,7 +12,7 @@ export interface RequestData { redirectHandler?: (url: string) => string | undefined; } -export function requestStream(url: string, method: string, requestData?: RequestData): Promise { +export function requestStream(url: URL, method: string, requestData?: RequestData): Promise { return new Promise((resolve, reject) => { try { const req = httpRequest(url, { method }); @@ -22,7 +22,7 @@ export function requestStream(url: string, method: string, requestData?: Request if (incomingMessage.statusCode !== 200) { const stCode = incomingMessage.statusCode ?? 'NO_CODE'; const stMessage = incomingMessage.statusMessage ?? 'NO_MESSAGE'; - const message = `[${method} ${url}]:${stCode}/${stMessage}`; + const message = `[${method} ${url.toString()}]:${stCode}/${stMessage}`; reject(new Error(message)); } @@ -31,7 +31,7 @@ export function requestStream(url: string, method: string, requestData?: Request .on('error', (err: Error) => { const errno = (err as {errno?: string}).errno ?? ''; if (errno === 'ETIMEDOUT') { - reject(new Error(`Request (${url}) timeout.`)); + reject(new Error(`Request (${url.toString()}) timeout.`)); } else { reject(err); } @@ -61,7 +61,7 @@ export function requestStream(url: string, method: string, requestData?: Request }); } -export async function request(url: string, method: string, requestData?: RequestData): Promise { +export async function request(url: URL, method: string, requestData?: RequestData): Promise { const responseStream = await requestStream(url, method, requestData); let buffer: Buffer | undefined = undefined; @@ -74,7 +74,7 @@ export async function request(url: string, method: string, requestData?: Request return buffer ? buffer : Buffer.from(''); } -export function requestRange(url: string, range: string): Promise { +export function requestRange(url: URL, range: string): Promise { return new Promise((resolve, reject) => { try { const req = httpRequest(url, { method: 'GET' }); @@ -88,7 +88,7 @@ export function requestRange(url: string, range: string): Promise { const errno = (err as {errno?: string}).errno ?? ''; if (errno === 'ETIMEDOUT') { - reject(new Error(`Request (${url}) timeout.`)); + reject(new Error(`Request (${url.toString()}) timeout.`)); } else { reject(err); } @@ -114,10 +114,10 @@ export function requestRange(url: string, range: string): Promise { +export function get(url: URL): Promise { return request(url, 'GET', undefined); } -export function post(url: string, requestData?: RequestData): Promise { +export function post(url: URL, requestData?: RequestData): Promise { return request(url, 'POST', requestData); } diff --git a/src/jfrog/artifact-provider.mts b/src/jfrog/artifact-provider.mts index 5ad1585..91b4ff9 100644 --- a/src/jfrog/artifact-provider.mts +++ b/src/jfrog/artifact-provider.mts @@ -1,12 +1,10 @@ import { type ArtifactoryClient, type ArtifactoryItemMeta, type ByteRange, createArtifactoryClient } from 's3-groundskeeper'; -import { createFile } from '../fs.mjs'; import { get } from '../http.mjs'; import type { Artifact, ArtifactProvider } from '../artifact-provider.mjs'; import type { ArtifactProviderConfig } from '../artifact-provider-config.mjs'; import type { IncomingMessage } from 'http'; -import metapointerContent from '../s3-metapointer.mjs'; interface BuildsList { buildsNumbers: { @@ -65,11 +63,6 @@ export default class JfrogArtifactProvider implements ArtifactProvider { }); } - // eslint-disable-next-line class-methods-use-this - public createMetapointerFile(artifact: Artifact, fileName: string): void { - createFile(fileName, metapointerContent(artifact.md5)); - } - private async getArtifactoryItemMeta(artifact: Artifact): Promise { const aqlItemField = 'actual_md5'; @@ -99,7 +92,7 @@ export default class JfrogArtifactProvider implements ArtifactProvider { const buildsEndpoint = this.artifactoryClient.resolveUrl(`api/build/${this.config.project}`); if (!this.buildsList) { - const allBuilds = await get(buildsEndpoint.toString()); + const allBuilds = await get(buildsEndpoint); this.buildsList = JSON.parse(allBuilds.toString()) as BuildsList; } @@ -122,7 +115,7 @@ export default class JfrogArtifactProvider implements ArtifactProvider { for (const value of buildTimes(buildNumber)) { const buildInfoEndpointUrl = new URL(buildNumber, buildsEndpoint); buildInfoEndpointUrl.searchParams.set('started', value.toISOString()); - infoPromises.push(get(buildInfoEndpointUrl.toString())); + infoPromises.push(get(buildInfoEndpointUrl)); } const infos = await Promise.all(infoPromises); diff --git a/src/s3-metapointer.mts b/src/s3-metapointer.mts index ce93b26..5241d47 100644 --- a/src/s3-metapointer.mts +++ b/src/s3-metapointer.mts @@ -1,3 +1,10 @@ -export default function metapointerContent(fileMd5Hash: string): string { +import { createFile } from './fs.mjs'; + +export function content(fileMd5Hash: string): string { return `#metapointer jfrogart\noid md5:${fileMd5Hash}`; } + +// eslint-disable-next-line class-methods-use-this +export function createMetapointerFile(md5: string, fileName: string): void { + createFile(fileName, content(md5)); +} From 69d541f3d3a6af25c026c71ded5d839bb8bd2871 Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Mon, 18 Mar 2024 16:56:35 +0300 Subject: [PATCH 48/58] move artifactory related logic from deb builder to config --- src/config.mts | 13 +-- src/deb/deb-builder-config.mts | 23 +++++- src/deb/deb-builder.mts | 145 +++++++++++++-------------------- src/index.mts | 19 +---- src/index.spec.mts | 4 +- tests/index.spec.mts | 4 +- 6 files changed, 87 insertions(+), 121 deletions(-) diff --git a/src/config.mts b/src/config.mts index 8e86587..788996f 100644 --- a/src/config.mts +++ b/src/config.mts @@ -1,19 +1,10 @@ import path from 'path'; import { pathToFileURL } from 'url'; -import type { ArtifactProviderConfig } from './artifact-provider-config.mjs'; -import type { DebBuilderConfig } from './deb/deb-builder-config.mjs'; -import type { Repo } from './repo.mjs'; - -interface BaseConfig { - out: string; - repo: Repo; -} +import type { Deployer } from './deployer.mjs'; export interface Config { - base: BaseConfig; - artifactsProvider: ArtifactProviderConfig; - debBuilder: DebBuilderConfig; + deployers: Deployer[]; } export class ConfigProvider { diff --git a/src/deb/deb-builder-config.mts b/src/deb/deb-builder-config.mts index 07e02b3..9977e7e 100644 --- a/src/deb/deb-builder-config.mts +++ b/src/deb/deb-builder-config.mts @@ -1,7 +1,28 @@ +import type { Artifact } from '../artifact-provider.mjs'; + export interface DebBuilderConfig { + out: string, gpgPublicKeyPath: string; gpgKeyName: string; applicationName: string; - component: string; origin: string; + repo: DebRepo; +} + +type Distribution = string; +type UbuntuComponentsEnum = 'main' | 'universe' | 'restricted' | 'multiverse'; + +export type UbuntuComponent = { + [key in UbuntuComponentsEnum]: string; +}; + +export interface DebDescriptor { + version: string, + artifact: Artifact +} + +export interface DebRepo { + [key: Distribution]: { + [key in keyof UbuntuComponent]?: DebDescriptor[] + } } diff --git a/src/deb/deb-builder.mts b/src/deb/deb-builder.mts index 8b0c207..45d6332 100644 --- a/src/deb/deb-builder.mts +++ b/src/deb/deb-builder.mts @@ -5,12 +5,10 @@ import * as ini from 'ini'; import * as path from 'path'; import * as tar from 'tar'; -import type { Artifact, ArtifactProvider } from '../artifact-provider.mjs'; import { createDir, execToolToFile, removeDir } from '../fs.mjs'; -import type { Config } from '../config.mjs'; -import { createMetapointerFile } from '../s3-metapointer.mjs'; +import type { DebBuilderConfig, DebDescriptor, DebRepo } from './deb-builder-config.mjs'; +import type { ArtifactProvider } from '../artifact-provider.mjs'; import type { Deployer } from '../deployer.mjs'; -import type { Packages } from '../repo.mjs'; const ReleaseFileTemplate = `Origin: $ORIGIN @@ -19,19 +17,32 @@ Architecture: $ARCH Component: $COMPONENT Codename: $DISTRIBUTION\n`; -interface DebDescriptor { - version: string, - artifact: Artifact +function iterateComponents(repo: DebRepo, callback: (distribution: string, component: string, deb: DebDescriptor[]) => void): void { + const distributions = Object.keys(repo); + + distributions.forEach(distribution => { + const componentsFordistribution = repo[distribution]; + if (componentsFordistribution) { + Object.entries(componentsFordistribution).forEach(entry => { + const [component, debs] = entry; + callback(distribution, component, debs); + }); + } + }); } -interface DistributionItem { - distribution: string; - debs: DebDescriptor[] +function iterateDebs(repo: DebRepo, callback: (distribution: string, component: string, deb: DebDescriptor) => void): void { + iterateComponents(repo, (distribution: string, component: string, debs: DebDescriptor[]) => { + debs.forEach(deb => { + callback(distribution, component, deb); + }); + }); } export class DebBuilder implements Deployer { - private readonly config: Config; + private readonly config: DebBuilderConfig; private readonly artifactProvider: ArtifactProvider; + private readonly metapointerCreator: (md5: string, path: string) => void; private readonly root: string; private readonly temp: string; @@ -39,24 +50,22 @@ export class DebBuilder implements Deployer { private readonly dists: string; private readonly keys: string; - private debRepo: DistributionItem[] = []; + private archesByDistComp: Map> = new Map(); - private archesByDistribution: Map> = new Map(); - - constructor(artifactProvider: ArtifactProvider, config: Config) { + constructor(config: DebBuilderConfig, artifactProvider: ArtifactProvider, metapointerCreator: (md5: string, path: string) => void) { this.config = config; + this.artifactProvider = artifactProvider; + this.metapointerCreator = metapointerCreator; - this.root = path.join(this.config.base.out, 'repo', this.config.debBuilder.applicationName, 'deb'); - this.temp = path.join(this.config.base.out, 'temp'); + this.root = path.join(this.config.out); + this.temp = path.join(this.config.out, 'temp'); this.pool = path.join(this.root, 'pool'); this.dists = path.join(this.root, 'dists'); this.keys = path.join(this.root, 'keys'); - this.artifactProvider = artifactProvider; } public async plan(): Promise { try { - await this.prepareMetaRepository(); await this.dpkgScanpackages(); await this.makeRelease(); } finally { @@ -69,86 +78,42 @@ export class DebBuilder implements Deployer { } private debName(version: string, arch: string): string { - return `${this.config.debBuilder.applicationName}-${version}_${arch}.deb`; + return `${this.config.applicationName}-${version}_${arch}.deb`; } - private async makeReleaseFileAndSign(distribution: string, arch: string): Promise { + private async makeReleaseFileAndSign(distribution: string, component: string, arch: string): Promise { const publicKeyPath = path.join(this.keys, 'desktop.asc'); createDir(this.keys); - await fs.promises.copyFile(this.config.debBuilder.gpgPublicKeyPath, publicKeyPath); + await fs.promises.copyFile(this.config.gpgPublicKeyPath, publicKeyPath); const releaseContent = ReleaseFileTemplate - .replace('$ORIGIN', this.config.debBuilder.origin) + .replace('$ORIGIN', this.config.origin) .replace('$DISTRIBUTION', distribution) .replace('$ARCH', arch) - .replace('$COMPONENT', this.config.debBuilder.component); + .replace('$COMPONENT', component); - const releaseFilePath = path.join(this.dists, distribution, 'Release'); - const releaseGpgFilePath = path.join(this.dists, distribution, 'Release.gpg'); - const inReleaseFilePath = path.join(this.dists, distribution, 'InRelease'); + const releaseFilePath = path.join(this.dists, distribution, component, 'Release'); + const releaseGpgFilePath = path.join(this.dists, distribution, component, 'Release.gpg'); + const inReleaseFilePath = path.join(this.dists, distribution, component, 'InRelease'); await fs.promises.writeFile(releaseFilePath, releaseContent); await execToolToFile('apt-ftparchive', ['release', `${this.dists}/${distribution}`], releaseFilePath, true); - await execToolToFile('gpg', ['--no-tty', '--default-key', this.config.debBuilder.gpgKeyName, '-abs', '-o', releaseGpgFilePath, releaseFilePath]); - await execToolToFile('gpg', ['--no-tty', '--default-key', this.config.debBuilder.gpgKeyName, '--clearsign', '-o', inReleaseFilePath, releaseFilePath]); - } - - private async prepareMetaRepository(): Promise { - const debsPromises: Promise<{distribution: string, debs: DebDescriptor[]}>[] = []; - - this.config.base.repo.forEach(distributionEntry => { - debsPromises.push((async(): Promise<{ distribution: string, debs: DebDescriptor[] }> => ({ - distribution: distributionEntry.channel, - debs: await this.debsByPackages(distributionEntry.packages), - }))()); - }); - - const debs = await Promise.all(debsPromises); - - debs.forEach(entry => { - this.debRepo.push(entry); - }); - } - - private async debsByPackages(packs: Packages): Promise { - const debs: DebDescriptor[] = []; - const artsByBuildNumbersPromises: Promise<{version: string, artifacts: Artifact[]}>[] = []; - - packs.packages.forEach(pack => { - artsByBuildNumbersPromises.push((async(): Promise<{ version: string, artifacts: Artifact[] }> => ({ - version: pack.version, - artifacts: await this.artifactProvider.artifactsByBuildNumber(pack.buildNumber), - }))()); - }); - - const artsByBuildNumbers = await Promise.all(artsByBuildNumbersPromises); - - artsByBuildNumbers.forEach(value => { - value.artifacts.filter(artifact => artifact.type === 'deb').forEach(artifact => { - debs.push({ - version: value.version, - artifact, - }); - }); - }); - - return debs; + await execToolToFile('gpg', ['--no-tty', '--default-key', this.config.gpgKeyName, '-abs', '-o', releaseGpgFilePath, releaseFilePath]); + await execToolToFile('gpg', ['--no-tty', '--default-key', this.config.gpgKeyName, '--clearsign', '-o', inReleaseFilePath, releaseFilePath]); } private async dpkgScanpackages(): Promise { const promises: Promise[] = []; - this.debRepo.forEach(distribution => { - distribution.debs.forEach(deb => { - promises.push(this.handleDeb(distribution.distribution, deb)); - }); + iterateDebs(this.config.repo, (distribution, component, deb) => { + promises.push(this.handleDeb(distribution, component, deb)); }); await Promise.all(promises); } - private async handleDeb(distribution: string, deb: DebDescriptor): Promise { + private async handleDeb(distribution: string, component: string, deb: DebDescriptor): Promise { const controlTarSizeRange = { start: 120, end: 129 }; // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call @@ -171,17 +136,17 @@ export class DebBuilder implements Deployer { const controlMeta = ini.parse(controlMetaContent); const arch = controlMeta['Architecture']; - const archesSet = this.archesByDistribution.get(distribution); + const archesSet = this.archesByDistComp.get(`${distribution}/${component}`); if (archesSet) { archesSet.add(arch); } else { - this.archesByDistribution.set(distribution, new Set([arch])); + this.archesByDistComp.set(`${distribution}/${component}`, new Set([arch])); } const targetMetaPath = path.join(this.dists, distribution, - this.config.debBuilder.component, + component, `binary-${arch}`, `${this.debName(deb.version, arch)}.meta`); createDir(path.dirname(targetMetaPath)); @@ -190,13 +155,13 @@ export class DebBuilder implements Deployer { removeDir(whereExtract); const debPath = path.join(this.pool, - this.config.debBuilder.component, - `${this.config.debBuilder.applicationName[0]}`, - this.config.debBuilder.applicationName, + component, + `${this.config.applicationName[0]}`, + this.config.applicationName, distribution, this.debName(deb.version, arch)); const relativeDebPath = path.relative(this.root, debPath); - createMetapointerFile(deb.artifact.md5, debPath); + this.metapointerCreator(deb.artifact.md5, debPath); const debSize = controlTar.headers['content-range']?.split('/')[1]; const sha1 = controlTar.headers['x-checksum-sha1']; const sha256 = controlTar.headers['x-checksum-sha256']; @@ -228,11 +193,11 @@ export class DebBuilder implements Deployer { const compressPromises: Promise[] = []; - this.debRepo.forEach(distributionEntry => { - const distsRoot = path.join(this.dists, distributionEntry.distribution, this.config.debBuilder.component); - const distsByArch = fs.readdirSync(distsRoot).map(dist => path.join(distsRoot, dist)); + iterateComponents(this.config.repo, (distribution, component) => { + const componentssRoot = path.join(this.dists, distribution, component); + const componentsByArch = fs.readdirSync(componentssRoot).map(dist => path.join(componentssRoot, dist)); - distsByArch.forEach(dist => { + componentsByArch.forEach(dist => { const targetPackagesFile = path.join(dist, 'Packages'); const metaFiles = fs.readdirSync(dist) .filter(fileName => fileName.endsWith('.meta')) @@ -256,13 +221,13 @@ export class DebBuilder implements Deployer { const releasesPromises: Promise[] = []; - this.debRepo.forEach(chan => { - const archesSet = this.archesByDistribution.get(chan.distribution); + iterateComponents(this.config.repo, (distribution, component) => { + const archesSet = this.archesByDistComp.get(`${distribution}/${component}`); if (!archesSet) { throw new Error('No arch was found for distribution'); } - releasesPromises.push(this.makeReleaseFileAndSign(chan.distribution, [...archesSet.values()].join(' '))); + releasesPromises.push(this.makeReleaseFileAndSign(distribution, component, [...archesSet.values()].join(' '))); }); return Promise.all(releasesPromises); diff --git a/src/index.mts b/src/index.mts index 4087883..8dc8aa7 100644 --- a/src/index.mts +++ b/src/index.mts @@ -1,26 +1,15 @@ import type { Config } from './config.mjs'; -import { DebBuilder } from './deb/deb-builder.mjs'; -import type { Deployer } from './deployer.mjs'; -import JfrogArtifactProvider from './jfrog/artifact-provider.mjs'; export { type Config, createConfigProvider } from './config.mjs'; -export function plan(config: Config): Promise { - const artifactsProvider = new JfrogArtifactProvider(config.artifactsProvider); - - const builders: Deployer[] = []; - - if (config.debBuilder) { - builders.push(new DebBuilder(artifactsProvider, config)); - } - +export async function plan(config: Config): Promise { const planPromises: Promise[] = []; - for (const builder of builders) { - planPromises.push(builder.plan()); + for (const deployer of config.deployers) { + planPromises.push(deployer.plan()); } - return Promise.all(planPromises); + await Promise.all(planPromises); } export function apply(): void { diff --git a/src/index.spec.mts b/src/index.spec.mts index 0d4f8d9..c52d111 100644 --- a/src/index.spec.mts +++ b/src/index.spec.mts @@ -9,7 +9,7 @@ describe('apply', () => { }); describe('plan', () => { - it('should return undefined', () => { - expect(plan()).toBe(undefined); + it('should return undefined', async() => { + expect(await plan({ deployers: [] })).toBe(undefined); }); }); diff --git a/tests/index.spec.mts b/tests/index.spec.mts index 01c72ce..4fd906e 100644 --- a/tests/index.spec.mts +++ b/tests/index.spec.mts @@ -9,7 +9,7 @@ describe('apply', () => { }); describe('plan', () => { - it('should return undefined', () => { - expect(plan()).toBe(undefined); + it('should return undefined', async() => { + expect(await plan({ deployers: [] })).toBe(undefined); }); }); From debc292b5b06c6decff65f7432794235e7966b30 Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Wed, 20 Mar 2024 14:28:57 +0300 Subject: [PATCH 49/58] fix releases path, configure deb builder with package creator function --- src/deb/deb-builder.mts | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/deb/deb-builder.mts b/src/deb/deb-builder.mts index 45d6332..f18bc6b 100644 --- a/src/deb/deb-builder.mts +++ b/src/deb/deb-builder.mts @@ -42,7 +42,7 @@ function iterateDebs(repo: DebRepo, callback: (distribution: string, component: export class DebBuilder implements Deployer { private readonly config: DebBuilderConfig; private readonly artifactProvider: ArtifactProvider; - private readonly metapointerCreator: (md5: string, path: string) => void; + private readonly packageCreator: (md5: string, path: string) => (Promise | void); private readonly root: string; private readonly temp: string; @@ -52,10 +52,10 @@ export class DebBuilder implements Deployer { private archesByDistComp: Map> = new Map(); - constructor(config: DebBuilderConfig, artifactProvider: ArtifactProvider, metapointerCreator: (md5: string, path: string) => void) { + constructor(config: DebBuilderConfig, artifactProvider: ArtifactProvider, packageCreator: (md5: string, path: string) => (Promise | void)) { this.config = config; this.artifactProvider = artifactProvider; - this.metapointerCreator = metapointerCreator; + this.packageCreator = packageCreator; this.root = path.join(this.config.out); this.temp = path.join(this.config.out, 'temp'); @@ -92,9 +92,9 @@ export class DebBuilder implements Deployer { .replace('$ARCH', arch) .replace('$COMPONENT', component); - const releaseFilePath = path.join(this.dists, distribution, component, 'Release'); - const releaseGpgFilePath = path.join(this.dists, distribution, component, 'Release.gpg'); - const inReleaseFilePath = path.join(this.dists, distribution, component, 'InRelease'); + const releaseFilePath = path.join(this.dists, distribution, 'Release'); + const releaseGpgFilePath = path.join(this.dists, distribution, 'Release.gpg'); + const inReleaseFilePath = path.join(this.dists, distribution, 'InRelease'); await fs.promises.writeFile(releaseFilePath, releaseContent); @@ -127,6 +127,8 @@ export class DebBuilder implements Deployer { createDir(whereExtract); + let createFilePromise: Promise | undefined = undefined; + await new Promise(resolve => { controlTar .pipe(tar.extract({ cwd: whereExtract, strip: 1 }, ['./control'])) @@ -161,7 +163,6 @@ export class DebBuilder implements Deployer { distribution, this.debName(deb.version, arch)); const relativeDebPath = path.relative(this.root, debPath); - this.metapointerCreator(deb.artifact.md5, debPath); const debSize = controlTar.headers['content-range']?.split('/')[1]; const sha1 = controlTar.headers['x-checksum-sha1']; const sha256 = controlTar.headers['x-checksum-sha256']; @@ -174,8 +175,18 @@ export class DebBuilder implements Deployer { const dataToAppend = `Filename: ${relativeDebPath}\nSize: ${debSize}\nSHA1: ${sha1}\nSHA256: ${sha256}\nMD5Sum: ${md5}\n`; fs.promises.appendFile(targetMetaPath, dataToAppend).then(() => resolve()); + + const createFileOperation = this.packageCreator(deb.artifact.md5, debPath); + + if(createFileOperation instanceof Promise) { + createFilePromise = createFileOperation + } }); }); + + if (createFilePromise) { + await createFilePromise; + } } private async makeRelease(): Promise<{}> { From e1d71d5871e13df6e4c1b879ccb5b8b517b3927d Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Wed, 20 Mar 2024 14:58:40 +0300 Subject: [PATCH 50/58] don't deploy pub key --- src/deb/deb-builder-config.mts | 1 - src/deb/deb-builder.mts | 7 ------- 2 files changed, 8 deletions(-) diff --git a/src/deb/deb-builder-config.mts b/src/deb/deb-builder-config.mts index 9977e7e..8969f9f 100644 --- a/src/deb/deb-builder-config.mts +++ b/src/deb/deb-builder-config.mts @@ -2,7 +2,6 @@ import type { Artifact } from '../artifact-provider.mjs'; export interface DebBuilderConfig { out: string, - gpgPublicKeyPath: string; gpgKeyName: string; applicationName: string; origin: string; diff --git a/src/deb/deb-builder.mts b/src/deb/deb-builder.mts index f18bc6b..ebb40ee 100644 --- a/src/deb/deb-builder.mts +++ b/src/deb/deb-builder.mts @@ -48,8 +48,6 @@ export class DebBuilder implements Deployer { private readonly temp: string; private readonly pool: string; private readonly dists: string; - private readonly keys: string; - private archesByDistComp: Map> = new Map(); constructor(config: DebBuilderConfig, artifactProvider: ArtifactProvider, packageCreator: (md5: string, path: string) => (Promise | void)) { @@ -61,7 +59,6 @@ export class DebBuilder implements Deployer { this.temp = path.join(this.config.out, 'temp'); this.pool = path.join(this.root, 'pool'); this.dists = path.join(this.root, 'dists'); - this.keys = path.join(this.root, 'keys'); } public async plan(): Promise { @@ -82,10 +79,6 @@ export class DebBuilder implements Deployer { } private async makeReleaseFileAndSign(distribution: string, component: string, arch: string): Promise { - const publicKeyPath = path.join(this.keys, 'desktop.asc'); - createDir(this.keys); - await fs.promises.copyFile(this.config.gpgPublicKeyPath, publicKeyPath); - const releaseContent = ReleaseFileTemplate .replace('$ORIGIN', this.config.origin) .replace('$DISTRIBUTION', distribution) From f664580706570451b9feafd94d7919e6c73613b4 Mon Sep 17 00:00:00 2001 From: Stanislav Makarov Date: Thu, 21 Mar 2024 04:49:28 +0300 Subject: [PATCH 51/58] reexport public entities from index --- src/cli.mts | 3 ++- src/index.mts | 9 +++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/cli.mts b/src/cli.mts index 1952798..d263d13 100644 --- a/src/cli.mts +++ b/src/cli.mts @@ -1,7 +1,8 @@ import { exit } from 'process'; import yargs from 'yargs'; -import { apply, createConfigProvider, plan } from './index.mjs'; +import { apply, plan } from './index.mjs'; +import { createConfigProvider } from './config.mjs'; import { getMessageOfError } from './utils.mjs'; type CommandLineArgs = Awaited>; diff --git a/src/index.mts b/src/index.mts index 8dc8aa7..a14dce5 100644 --- a/src/index.mts +++ b/src/index.mts @@ -1,6 +1,11 @@ import type { Config } from './config.mjs'; - -export { type Config, createConfigProvider } from './config.mjs'; +export type { Config }; +export type { Artifact, ArtifactProvider } from './artifact-provider.mjs'; +export type { ProviderType, ArtifactProviderConfig } from './artifact-provider-config.mjs'; +export type { DebBuilderConfig, DebDescriptor, DebRepo } from './deb/deb-builder-config.mjs'; +export { DebBuilder } from './deb/deb-builder.mjs'; +export { default as JfrogArtifactProvider } from './jfrog/artifact-provider.mjs'; +export { createMetapointerFile as createS3MetapointerFile } from './s3-metapointer.mjs'; export async function plan(config: Config): Promise { const planPromises: Promise[] = []; From b058bdc4670ca14377a2991f353f9846be6c7f69 Mon Sep 17 00:00:00 2001 From: Stanislav Makarov Date: Thu, 21 Mar 2024 05:16:17 +0300 Subject: [PATCH 52/58] use .gitignore as ignore list for ESLint --- eslint.config.mjs | 8 ++----- package.json | 1 + pnpm-lock.yaml | 60 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 6 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index d2b39ad..db1f803 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,15 +1,11 @@ +import gitIgnore from 'eslint-config-flat-gitignore'; import tsParser from '@typescript-eslint/parser'; import tsPlugin from '@typescript-eslint/eslint-plugin'; export default [ 'eslint:all', // 'plugin:@typescript-eslint/recommended', - { - ignores: [ - 'coverage/**', - 'dist/**', - ], - }, + gitIgnore(), { rules: { 'array-element-newline': ['error', 'consistent'], diff --git a/package.json b/package.json index 49e94bf..6253d73 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "@typescript-eslint/parser": "^5.45.1", "editorconfig-checker": "^4.0.2", "eslint": "^8.29.0", + "eslint-config-flat-gitignore": "^0.1.3", "husky": "^8.0.0", "jest": "^29.3.1", "lint-staged": "^13.0.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a56962f..5029eac 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,6 +53,9 @@ importers: eslint: specifier: ^8.29.0 version: 8.29.0 + eslint-config-flat-gitignore: + specifier: ^0.1.3 + version: 0.1.3 husky: specifier: ^8.0.0 version: 8.0.2 @@ -2478,6 +2481,13 @@ packages: engines: {node: '>=10'} dev: true + /eslint-config-flat-gitignore@0.1.3: + resolution: {integrity: sha512-oQD+dEZv3RThN60tFqGFt+NJcO1DmssUcP+T/nlX+ZzEoEvVUYH0GU9X/VlmDXsbMsS9mONI1HrlxLgtKojw7w==} + dependencies: + find-up: 7.0.0 + parse-gitignore: 2.0.0 + dev: true + /eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} @@ -2724,6 +2734,15 @@ packages: path-exists: 4.0.0 dev: true + /find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + unicorn-magic: 0.1.0 + dev: true + /flat-cache@3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -3575,6 +3594,13 @@ packages: p-locate: 5.0.0 dev: true + /locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-locate: 6.0.0 + dev: true + /lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} dev: true @@ -3779,6 +3805,13 @@ packages: yocto-queue: 0.1.0 dev: true + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -3793,6 +3826,13 @@ packages: p-limit: 3.1.0 dev: true + /p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-limit: 4.0.0 + dev: true + /p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} @@ -3812,6 +3852,11 @@ packages: callsites: 3.1.0 dev: true + /parse-gitignore@2.0.0: + resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==} + engines: {node: '>=14'} + dev: true + /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -3827,6 +3872,11 @@ packages: engines: {node: '>=8'} dev: true + /path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -4338,6 +4388,11 @@ packages: hasBin: true dev: true + /unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + dev: true + /update-browserslist-db@1.0.10(browserslist@4.21.4): resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} hasBin: true @@ -4487,3 +4542,8 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true From efc9f17486d4fc609ddba0fb517bdb9b9b450991 Mon Sep 17 00:00:00 2001 From: Stanislav Makarov Date: Thu, 21 Mar 2024 05:19:20 +0300 Subject: [PATCH 53/58] fix some linting errors --- src/deb/deb-builder.mts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/deb/deb-builder.mts b/src/deb/deb-builder.mts index ebb40ee..784e96c 100644 --- a/src/deb/deb-builder.mts +++ b/src/deb/deb-builder.mts @@ -171,8 +171,8 @@ export class DebBuilder implements Deployer { const createFileOperation = this.packageCreator(deb.artifact.md5, debPath); - if(createFileOperation instanceof Promise) { - createFilePromise = createFileOperation + if (createFileOperation instanceof Promise) { + createFilePromise = createFileOperation; } }); }); From 9278fdacddc65e87d67b1426d077b3d6417945ad Mon Sep 17 00:00:00 2001 From: Stanislav Makarov Date: Thu, 21 Mar 2024 13:10:03 +0300 Subject: [PATCH 54/58] move DebBuilderConfig to deb-builder.mts --- src/deb/deb-builder-config.mts | 27 --------------------------- src/deb/deb-builder.mts | 29 +++++++++++++++++++++++++---- src/index.mts | 8 ++++++-- 3 files changed, 31 insertions(+), 33 deletions(-) delete mode 100644 src/deb/deb-builder-config.mts diff --git a/src/deb/deb-builder-config.mts b/src/deb/deb-builder-config.mts deleted file mode 100644 index 8969f9f..0000000 --- a/src/deb/deb-builder-config.mts +++ /dev/null @@ -1,27 +0,0 @@ -import type { Artifact } from '../artifact-provider.mjs'; - -export interface DebBuilderConfig { - out: string, - gpgKeyName: string; - applicationName: string; - origin: string; - repo: DebRepo; -} - -type Distribution = string; -type UbuntuComponentsEnum = 'main' | 'universe' | 'restricted' | 'multiverse'; - -export type UbuntuComponent = { - [key in UbuntuComponentsEnum]: string; -}; - -export interface DebDescriptor { - version: string, - artifact: Artifact -} - -export interface DebRepo { - [key: Distribution]: { - [key in keyof UbuntuComponent]?: DebDescriptor[] - } -} diff --git a/src/deb/deb-builder.mts b/src/deb/deb-builder.mts index 784e96c..480b857 100644 --- a/src/deb/deb-builder.mts +++ b/src/deb/deb-builder.mts @@ -5,11 +5,24 @@ import * as ini from 'ini'; import * as path from 'path'; import * as tar from 'tar'; +import type { Artifact, ArtifactProvider } from '../artifact-provider.mjs'; import { createDir, execToolToFile, removeDir } from '../fs.mjs'; -import type { DebBuilderConfig, DebDescriptor, DebRepo } from './deb-builder-config.mjs'; -import type { ArtifactProvider } from '../artifact-provider.mjs'; import type { Deployer } from '../deployer.mjs'; +type DebRepoDistribution = string; +type DebRepoComponent = string; + +export interface DebDescriptor { + version: string, + artifact: Artifact +} + +export interface DebRepo { + [key: DebRepoDistribution]: { + [key: DebRepoComponent]: DebDescriptor[] + } +} + const ReleaseFileTemplate = `Origin: $ORIGIN Label: Ubuntu/Debian @@ -39,8 +52,16 @@ function iterateDebs(repo: DebRepo, callback: (distribution: string, component: }); } +export interface Config { + out: string, + gpgKeyName: string; + applicationName: string; + origin: string; + repo: DebRepo; +} + export class DebBuilder implements Deployer { - private readonly config: DebBuilderConfig; + private readonly config: Config; private readonly artifactProvider: ArtifactProvider; private readonly packageCreator: (md5: string, path: string) => (Promise | void); @@ -50,7 +71,7 @@ export class DebBuilder implements Deployer { private readonly dists: string; private archesByDistComp: Map> = new Map(); - constructor(config: DebBuilderConfig, artifactProvider: ArtifactProvider, packageCreator: (md5: string, path: string) => (Promise | void)) { + constructor(config: Config, artifactProvider: ArtifactProvider, packageCreator: (md5: string, path: string) => (Promise | void)) { this.config = config; this.artifactProvider = artifactProvider; this.packageCreator = packageCreator; diff --git a/src/index.mts b/src/index.mts index a14dce5..e2929f8 100644 --- a/src/index.mts +++ b/src/index.mts @@ -2,8 +2,12 @@ import type { Config } from './config.mjs'; export type { Config }; export type { Artifact, ArtifactProvider } from './artifact-provider.mjs'; export type { ProviderType, ArtifactProviderConfig } from './artifact-provider-config.mjs'; -export type { DebBuilderConfig, DebDescriptor, DebRepo } from './deb/deb-builder-config.mjs'; -export { DebBuilder } from './deb/deb-builder.mjs'; +export { + type DebDescriptor, + type DebRepo, + type Config as DebBuilderConfig, + DebBuilder, +} from './deb/deb-builder.mjs'; export { default as JfrogArtifactProvider } from './jfrog/artifact-provider.mjs'; export { createMetapointerFile as createS3MetapointerFile } from './s3-metapointer.mjs'; From 01fa12bf1850a1bb48a1f9d79b4bf13c784f14bb Mon Sep 17 00:00:00 2001 From: Stanislav Makarov Date: Thu, 21 Mar 2024 13:24:40 +0300 Subject: [PATCH 55/58] rename path-containing properties in DebBuilder --- src/deb/deb-builder.mts | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/src/deb/deb-builder.mts b/src/deb/deb-builder.mts index 480b857..cdb4433 100644 --- a/src/deb/deb-builder.mts +++ b/src/deb/deb-builder.mts @@ -65,10 +65,10 @@ export class DebBuilder implements Deployer { private readonly artifactProvider: ArtifactProvider; private readonly packageCreator: (md5: string, path: string) => (Promise | void); - private readonly root: string; - private readonly temp: string; - private readonly pool: string; - private readonly dists: string; + private readonly rootPath: string; + private readonly tempPath: string; + private readonly poolPath: string; + private readonly distsPath: string; private archesByDistComp: Map> = new Map(); constructor(config: Config, artifactProvider: ArtifactProvider, packageCreator: (md5: string, path: string) => (Promise | void)) { @@ -76,10 +76,10 @@ export class DebBuilder implements Deployer { this.artifactProvider = artifactProvider; this.packageCreator = packageCreator; - this.root = path.join(this.config.out); - this.temp = path.join(this.config.out, 'temp'); - this.pool = path.join(this.root, 'pool'); - this.dists = path.join(this.root, 'dists'); + this.rootPath = path.join(this.config.out); + this.tempPath = path.join(this.config.out, 'temp'); + this.poolPath = path.join(this.rootPath, 'pool'); + this.distsPath = path.join(this.rootPath, 'dists'); } public async plan(): Promise { @@ -87,7 +87,7 @@ export class DebBuilder implements Deployer { await this.dpkgScanpackages(); await this.makeRelease(); } finally { - removeDir(this.temp); + removeDir(this.tempPath); } } @@ -106,13 +106,14 @@ export class DebBuilder implements Deployer { .replace('$ARCH', arch) .replace('$COMPONENT', component); - const releaseFilePath = path.join(this.dists, distribution, 'Release'); - const releaseGpgFilePath = path.join(this.dists, distribution, 'Release.gpg'); - const inReleaseFilePath = path.join(this.dists, distribution, 'InRelease'); + const distributionPath = path.join(this.distsPath, distribution); + const releaseFilePath = path.join(distributionPath, 'Release'); + const releaseGpgFilePath = path.join(distributionPath, 'Release.gpg'); + const inReleaseFilePath = path.join(distributionPath, 'InRelease'); await fs.promises.writeFile(releaseFilePath, releaseContent); - await execToolToFile('apt-ftparchive', ['release', `${this.dists}/${distribution}`], releaseFilePath, true); + await execToolToFile('apt-ftparchive', ['release', distributionPath], releaseFilePath, true); await execToolToFile('gpg', ['--no-tty', '--default-key', this.config.gpgKeyName, '-abs', '-o', releaseGpgFilePath, releaseFilePath]); await execToolToFile('gpg', ['--no-tty', '--default-key', this.config.gpgKeyName, '--clearsign', '-o', inReleaseFilePath, releaseFilePath]); } @@ -137,7 +138,7 @@ export class DebBuilder implements Deployer { const controlTar = await this.artifactProvider.getArtifactContent(deb.artifact, controlTarRange); - const whereExtract = path.join(this.temp, `control-${deb.artifact.md5}`); + const whereExtract = path.join(this.tempPath, `control-${deb.artifact.md5}`); createDir(whereExtract); @@ -160,7 +161,7 @@ export class DebBuilder implements Deployer { this.archesByDistComp.set(`${distribution}/${component}`, new Set([arch])); } - const targetMetaPath = path.join(this.dists, + const targetMetaPath = path.join(this.distsPath, distribution, component, `binary-${arch}`, @@ -170,13 +171,13 @@ export class DebBuilder implements Deployer { removeDir(whereExtract); - const debPath = path.join(this.pool, + const debPath = path.join(this.poolPath, component, `${this.config.applicationName[0]}`, this.config.applicationName, distribution, this.debName(deb.version, arch)); - const relativeDebPath = path.relative(this.root, debPath); + const relativeDebPath = path.relative(this.rootPath, debPath); const debSize = controlTar.headers['content-range']?.split('/')[1]; const sha1 = controlTar.headers['x-checksum-sha1']; const sha256 = controlTar.headers['x-checksum-sha256']; @@ -219,8 +220,8 @@ export class DebBuilder implements Deployer { const compressPromises: Promise[] = []; iterateComponents(this.config.repo, (distribution, component) => { - const componentssRoot = path.join(this.dists, distribution, component); - const componentsByArch = fs.readdirSync(componentssRoot).map(dist => path.join(componentssRoot, dist)); + const componentRoot = path.join(this.distsPath, distribution, component); + const componentsByArch = fs.readdirSync(componentRoot).map(dist => path.join(componentRoot, dist)); componentsByArch.forEach(dist => { const targetPackagesFile = path.join(dist, 'Packages'); From 435e0121c11d2368508c132bdec0ca2d2897ffe1 Mon Sep 17 00:00:00 2001 From: Stanislav Makarov Date: Thu, 21 Mar 2024 13:35:02 +0300 Subject: [PATCH 56/58] use parseInt instead of Number constructor --- src/deb/deb-builder.mts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/deb/deb-builder.mts b/src/deb/deb-builder.mts index cdb4433..e48b02e 100644 --- a/src/deb/deb-builder.mts +++ b/src/deb/deb-builder.mts @@ -130,16 +130,16 @@ export class DebBuilder implements Deployer { private async handleDeb(distribution: string, component: string, deb: DebDescriptor): Promise { const controlTarSizeRange = { start: 120, end: 129 }; - - // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call - const controlTarSize = Number((await this.artifactProvider.getArtifactContent(deb.artifact, controlTarSizeRange)).read().toString() - .trim()); + const controlTarSizeString = + (await this.artifactProvider.getArtifactContent(deb.artifact, controlTarSizeRange)) + .read() + .toString() + .trim(); + const controlTarSize = parseInt(controlTarSizeString, 10); const controlTarRange = { start: 132, end: 131 + controlTarSize }; - const controlTar = await this.artifactProvider.getArtifactContent(deb.artifact, controlTarRange); const whereExtract = path.join(this.tempPath, `control-${deb.artifact.md5}`); - createDir(whereExtract); let createFilePromise: Promise | undefined = undefined; From 1f62ea9bb99d1a80216b0e8f3ed5b8954df095b1 Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Fri, 22 Mar 2024 20:51:34 +0300 Subject: [PATCH 57/58] initial mac repo builder commit --- src/mac/mac-builder.mts | 162 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 src/mac/mac-builder.mts diff --git a/src/mac/mac-builder.mts b/src/mac/mac-builder.mts new file mode 100644 index 0000000..a365bd4 --- /dev/null +++ b/src/mac/mac-builder.mts @@ -0,0 +1,162 @@ +import * as fs from 'fs'; +import * as path from 'path'; + +import type { Artifact, ArtifactProvider } from '../artifact-provider.mjs'; +import type { Deployer } from '../deployer.mjs'; + +type Channel = string; + +export interface PackageDescriptor { + version: string, + dmg: Artifact, + zip: Artifact, + sha512: Artifact +} + +export interface MacRepo { + [key: Channel]: { + latest: string, + additionalFiles?: string[], + packages: PackageDescriptor[] + } +} + +export interface Config { + out: string, + repo: MacRepo +} + +function interateChannels(repo: MacRepo, callback: (channel: string, channelObj: { + latest: string, + additionalFiles?: string[], + packages: PackageDescriptor[]}) => void): void { + const channels = Object.keys(repo); + + channels.forEach(channel => { + const channelObject = repo[channel]; + if (channelObject) { + callback(channel, channelObject); + } + }); +} + +const YmlContentTemplate = +`version: $VERSION +path: $PATH +sha512: $SHA512 +releaseDate: '$DATE'`; + +function iteratePackages(repo: MacRepo, callback: (channel: string, pack: PackageDescriptor) => void): void { + const channels = Object.keys(repo); + + channels.forEach(channel => { + const channelObject = repo[channel]; + if (channelObject) { + const packs = channelObject.packages; + packs.forEach(pack => { + callback(channel, pack); + }); + } + }); +} + +export class MacBuilder implements Deployer { + private readonly config: Config; + private readonly artifactProvider: ArtifactProvider; + private readonly packageCreator: (md5: string, path: string) => (Promise | void); + private readonly releaseDate: string; + + constructor(config: Config, artifactProvider: ArtifactProvider, packageCreator: (md5: string, path: string) => (Promise | void)) { + this.config = config; + this.artifactProvider = artifactProvider; + this.packageCreator = packageCreator; + + this.releaseDate = new Date().toISOString(); + } + + public async plan(): Promise { + await this.makePackages(); + await this.makeRelease(); + } + + public apply(): void { + console.log(this); + } + + private async makePackages(): Promise { + const promises: Promise[] = []; + + iteratePackages(this.config.repo, (channel: string, packs: PackageDescriptor) => { + promises.push(this.handlePackage(channel, packs)); + }); + + await Promise.all(promises); + } + + private async makeRelease(): Promise { + const promises: Promise[] = []; + + interateChannels(this.config.repo, (channel: string, channelObj: { latest: string, packages: PackageDescriptor[]}) => { + promises.push(this.handleLatest(channel, channelObj)); + }); + + await Promise.all(promises); + } + + private async handlePackage(channel: string, pack: PackageDescriptor): Promise { + const promises: Promise[] = []; + + const dmgPath = path.join(this.config.out, channel, pack.version, 'darwin', 'TradingView.dmg'); + const zipPath = path.join(this.config.out, channel, pack.version, 'darwin', 'TradingView.zip'); + + const dmgCreation = this.packageCreator(pack.dmg.md5, dmgPath); + const zipCreation = this.packageCreator(pack.zip.md5, zipPath); + + if (dmgCreation instanceof Promise) { + promises.push(dmgCreation); + } + + if (zipCreation instanceof Promise) { + promises.push(zipCreation); + } + + await Promise.all(promises); + } + + private async handleLatest(channel: string, channelObj: {latest: string, additionalFiles?: string[], packages: PackageDescriptor[]}): Promise { + const latestPath = path.join(this.config.out, channel, 'latest', 'darwin'); + const ymlPath = path.join(latestPath, `${channel}-mac.yml`); + const dmgPath = path.join(latestPath, 'TradingView.dmg'); + const latestPackage = channelObj.packages.find(pack => pack.version === channelObj.latest); + const promises: Promise[] = []; + + if (!latestPackage) { + throw new Error('latest must be specified'); + } + + const dmgCreation = this.packageCreator(latestPackage.dmg.md5, dmgPath); + + if (dmgCreation instanceof Promise) { + promises.push(dmgCreation); + } + + const relativeZipPath = path.posix.join('..', '..', latestPackage.version, 'darwin', 'TradingView.zip'); + const sha512 = (await this.artifactProvider.getArtifactContent(latestPackage.sha512)).read().toString(); + + const ymlContent = YmlContentTemplate + .replace('$VERSION', latestPackage.version) + .replace('$PATH', relativeZipPath) + .replace('$SHA512', sha512) + .replace('$DATE', this.releaseDate); + + promises.push(fs.promises.writeFile(ymlPath, ymlContent)); + + channelObj.additionalFiles?.forEach(filePath => { + const resolvedFilePath = path.resolve(filePath); + const targetPath = path.join(latestPath, path.basename(resolvedFilePath)); + promises.push(fs.promises.copyFile(resolvedFilePath, targetPath)); + }); + + await Promise.all(promises); + } +} From de0e5dcb123107e914cd813a1a2e67236c27d909 Mon Sep 17 00:00:00 2001 From: Egor Kushnarev Date: Sat, 23 Mar 2024 00:21:29 +0300 Subject: [PATCH 58/58] windows repo maker remake --- pnpm-lock.yaml | 978 +------------------------------- src/artifactory-utils.ts | 168 ------ src/cli.ts | 42 -- src/config.ts | 78 --- src/http.ts | 87 --- src/index.mts | 6 - src/jewel-case.ts | 33 -- src/mac/mac-builder.mts | 12 +- src/repo-builder.ts | 94 --- src/repo.mts | 15 - src/utils.ts | 85 --- src/windows-repo-builder.ts | 149 ----- src/windows/windows-builder.mts | 186 ++++++ 13 files changed, 194 insertions(+), 1739 deletions(-) delete mode 100644 src/artifactory-utils.ts delete mode 100644 src/cli.ts delete mode 100644 src/config.ts delete mode 100644 src/http.ts delete mode 100644 src/jewel-case.ts delete mode 100644 src/repo-builder.ts delete mode 100644 src/repo.mts delete mode 100644 src/utils.ts delete mode 100644 src/windows-repo-builder.ts create mode 100644 src/windows/windows-builder.mts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1645339..5029eac 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -152,95 +152,6 @@ packages: tslib: 1.14.1 dev: false -<<<<<<< HEAD - /@aws-crypto/util/2.0.2: - resolution: {integrity: sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==} - dependencies: - '@aws-sdk/types': 3.226.0 - '@aws-sdk/util-utf8-browser': 3.188.0 - tslib: 1.14.1 - dev: false - - /@aws-sdk/abort-controller/3.226.0: - resolution: {integrity: sha512-cJVzr1xxPBd08voknXvR0RLgtZKGKt6WyDpH/BaPCu3rfSqWCDZKzwqe940eqosjmKrxC6pUZNKASIqHOQ8xxQ==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/chunked-blob-reader-native/3.208.0: - resolution: {integrity: sha512-JeOZ95PW+fJ6bbuqPySYqLqHk1n4+4ueEEraJsiUrPBV0S1ZtyvOGHcnGztKUjr2PYNaiexmpWuvUve9K12HRA==} - dependencies: - '@aws-sdk/util-base64': 3.208.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/chunked-blob-reader/3.188.0: - resolution: {integrity: sha512-zkPRFZZPL3eH+kH86LDYYXImiClA1/sW60zYOjse9Pgka+eDJlvBN6hcYxwDEKjcwATYiSRR1aVQHcfCinlGXg==} - dependencies: - tslib: 2.4.1 - dev: false - - /@aws-sdk/client-s3/3.226.0: - resolution: {integrity: sha512-N8S0i5txBqlTY30IHaWgi15HUPzdWpQVX01zfYoHU80HmxKBRhqrefIrmCbn/121br0B+MysgpgdfiSfhyHkLw==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-crypto/sha1-browser': 2.0.0 - '@aws-crypto/sha256-browser': 2.0.0 - '@aws-crypto/sha256-js': 2.0.0 - '@aws-sdk/client-sts': 3.226.0 - '@aws-sdk/config-resolver': 3.226.0 - '@aws-sdk/credential-provider-node': 3.226.0 - '@aws-sdk/eventstream-serde-browser': 3.226.0 - '@aws-sdk/eventstream-serde-config-resolver': 3.226.0 - '@aws-sdk/eventstream-serde-node': 3.226.0 - '@aws-sdk/fetch-http-handler': 3.226.0 - '@aws-sdk/hash-blob-browser': 3.226.0 - '@aws-sdk/hash-node': 3.226.0 - '@aws-sdk/hash-stream-node': 3.226.0 - '@aws-sdk/invalid-dependency': 3.226.0 - '@aws-sdk/md5-js': 3.226.0 - '@aws-sdk/middleware-bucket-endpoint': 3.226.0 - '@aws-sdk/middleware-content-length': 3.226.0 - '@aws-sdk/middleware-endpoint': 3.226.0 - '@aws-sdk/middleware-expect-continue': 3.226.0 - '@aws-sdk/middleware-flexible-checksums': 3.226.0 - '@aws-sdk/middleware-host-header': 3.226.0 - '@aws-sdk/middleware-location-constraint': 3.226.0 - '@aws-sdk/middleware-logger': 3.226.0 - '@aws-sdk/middleware-recursion-detection': 3.226.0 - '@aws-sdk/middleware-retry': 3.226.0 - '@aws-sdk/middleware-sdk-s3': 3.226.0 - '@aws-sdk/middleware-serde': 3.226.0 - '@aws-sdk/middleware-signing': 3.226.0 - '@aws-sdk/middleware-ssec': 3.226.0 - '@aws-sdk/middleware-stack': 3.226.0 - '@aws-sdk/middleware-user-agent': 3.226.0 - '@aws-sdk/node-config-provider': 3.226.0 - '@aws-sdk/node-http-handler': 3.226.0 - '@aws-sdk/protocol-http': 3.226.0 - '@aws-sdk/signature-v4-multi-region': 3.226.0 - '@aws-sdk/smithy-client': 3.226.0 - '@aws-sdk/types': 3.226.0 - '@aws-sdk/url-parser': 3.226.0 - '@aws-sdk/util-base64': 3.208.0 - '@aws-sdk/util-body-length-browser': 3.188.0 - '@aws-sdk/util-body-length-node': 3.208.0 - '@aws-sdk/util-defaults-mode-browser': 3.226.0 - '@aws-sdk/util-defaults-mode-node': 3.226.0 - '@aws-sdk/util-endpoints': 3.226.0 - '@aws-sdk/util-stream-browser': 3.226.0 - '@aws-sdk/util-stream-node': 3.226.0 - '@aws-sdk/util-user-agent-browser': 3.226.0 - '@aws-sdk/util-user-agent-node': 3.226.0 - '@aws-sdk/util-utf8-browser': 3.188.0 - '@aws-sdk/util-utf8-node': 3.208.0 - '@aws-sdk/util-waiter': 3.226.0 - '@aws-sdk/xml-builder': 3.201.0 - fast-xml-parser: 4.0.11 - tslib: 2.4.1 -======= /@aws-crypto/util@3.0.0: resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==} dependencies: @@ -321,50 +232,11 @@ packages: '@aws-sdk/xml-builder': 3.310.0 fast-xml-parser: 4.1.2 tslib: 2.5.0 ->>>>>>> origin/mac-repo-maker transitivePeerDependencies: - '@aws-sdk/signature-v4-crt' - aws-crt dev: false -<<<<<<< HEAD - /@aws-sdk/client-sso-oidc/3.226.0: - resolution: {integrity: sha512-IKzAhL6RoPs7IZ/rJvekjedQ4oesazCO+Aqh9l2Xct+XY0MFBdh4amgg4t/8fjksfIzmJH48BZoNv5gVak6yRw==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-crypto/sha256-browser': 2.0.0 - '@aws-crypto/sha256-js': 2.0.0 - '@aws-sdk/config-resolver': 3.226.0 - '@aws-sdk/fetch-http-handler': 3.226.0 - '@aws-sdk/hash-node': 3.226.0 - '@aws-sdk/invalid-dependency': 3.226.0 - '@aws-sdk/middleware-content-length': 3.226.0 - '@aws-sdk/middleware-endpoint': 3.226.0 - '@aws-sdk/middleware-host-header': 3.226.0 - '@aws-sdk/middleware-logger': 3.226.0 - '@aws-sdk/middleware-recursion-detection': 3.226.0 - '@aws-sdk/middleware-retry': 3.226.0 - '@aws-sdk/middleware-serde': 3.226.0 - '@aws-sdk/middleware-stack': 3.226.0 - '@aws-sdk/middleware-user-agent': 3.226.0 - '@aws-sdk/node-config-provider': 3.226.0 - '@aws-sdk/node-http-handler': 3.226.0 - '@aws-sdk/protocol-http': 3.226.0 - '@aws-sdk/smithy-client': 3.226.0 - '@aws-sdk/types': 3.226.0 - '@aws-sdk/url-parser': 3.226.0 - '@aws-sdk/util-base64': 3.208.0 - '@aws-sdk/util-body-length-browser': 3.188.0 - '@aws-sdk/util-body-length-node': 3.208.0 - '@aws-sdk/util-defaults-mode-browser': 3.226.0 - '@aws-sdk/util-defaults-mode-node': 3.226.0 - '@aws-sdk/util-endpoints': 3.226.0 - '@aws-sdk/util-user-agent-browser': 3.226.0 - '@aws-sdk/util-user-agent-node': 3.226.0 - '@aws-sdk/util-utf8-browser': 3.188.0 - '@aws-sdk/util-utf8-node': 3.208.0 - tslib: 2.4.1 -======= /@aws-sdk/client-sso-oidc@3.315.0: resolution: {integrity: sha512-OJgtmx6SpCWHBDCxBBi36Ro44uCqZBufGkThP/PVYrgVnRVnJ4V18d2wNGKmS37zKmCHHJPnhMPlGOgE2qyVPQ==} engines: {node: '>=14.0.0'} @@ -401,49 +273,10 @@ packages: '@aws-sdk/util-user-agent-node': 3.310.0 '@aws-sdk/util-utf8': 3.310.0 tslib: 2.5.0 ->>>>>>> origin/mac-repo-maker transitivePeerDependencies: - aws-crt dev: false -<<<<<<< HEAD - /@aws-sdk/client-sso/3.226.0: - resolution: {integrity: sha512-+Hl1YSLKrxPnQLijhWryI6uV8eKZIsUhvWlzFKx75kjxzjsC/jyk5zV59jnCu0SCCepXB8DKyLVa2WpH7iAHew==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-crypto/sha256-browser': 2.0.0 - '@aws-crypto/sha256-js': 2.0.0 - '@aws-sdk/config-resolver': 3.226.0 - '@aws-sdk/fetch-http-handler': 3.226.0 - '@aws-sdk/hash-node': 3.226.0 - '@aws-sdk/invalid-dependency': 3.226.0 - '@aws-sdk/middleware-content-length': 3.226.0 - '@aws-sdk/middleware-endpoint': 3.226.0 - '@aws-sdk/middleware-host-header': 3.226.0 - '@aws-sdk/middleware-logger': 3.226.0 - '@aws-sdk/middleware-recursion-detection': 3.226.0 - '@aws-sdk/middleware-retry': 3.226.0 - '@aws-sdk/middleware-serde': 3.226.0 - '@aws-sdk/middleware-stack': 3.226.0 - '@aws-sdk/middleware-user-agent': 3.226.0 - '@aws-sdk/node-config-provider': 3.226.0 - '@aws-sdk/node-http-handler': 3.226.0 - '@aws-sdk/protocol-http': 3.226.0 - '@aws-sdk/smithy-client': 3.226.0 - '@aws-sdk/types': 3.226.0 - '@aws-sdk/url-parser': 3.226.0 - '@aws-sdk/util-base64': 3.208.0 - '@aws-sdk/util-body-length-browser': 3.188.0 - '@aws-sdk/util-body-length-node': 3.208.0 - '@aws-sdk/util-defaults-mode-browser': 3.226.0 - '@aws-sdk/util-defaults-mode-node': 3.226.0 - '@aws-sdk/util-endpoints': 3.226.0 - '@aws-sdk/util-user-agent-browser': 3.226.0 - '@aws-sdk/util-user-agent-node': 3.226.0 - '@aws-sdk/util-utf8-browser': 3.188.0 - '@aws-sdk/util-utf8-node': 3.208.0 - tslib: 2.4.1 -======= /@aws-sdk/client-sso@3.315.0: resolution: {integrity: sha512-P3QOOyHQER7EDVCzXOsAaJE2p/qfdsSFsYv8k2S8LqEKGH0fViQ4Ph540uKlmaOt1kEhwH1wI6cLRMJJX9XV4Q==} engines: {node: '>=14.0.0'} @@ -480,53 +313,10 @@ packages: '@aws-sdk/util-user-agent-node': 3.310.0 '@aws-sdk/util-utf8': 3.310.0 tslib: 2.5.0 ->>>>>>> origin/mac-repo-maker transitivePeerDependencies: - aws-crt dev: false -<<<<<<< HEAD - /@aws-sdk/client-sts/3.226.0: - resolution: {integrity: sha512-ZBlqRVbnHvvbkN5g56+mXltNybHNzgV69+2ARubQ8ge9U2qF/LweCmGqZnZLWqdGXwaB9IOvz5ZW2npyJh1X/A==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-crypto/sha256-browser': 2.0.0 - '@aws-crypto/sha256-js': 2.0.0 - '@aws-sdk/config-resolver': 3.226.0 - '@aws-sdk/credential-provider-node': 3.226.0 - '@aws-sdk/fetch-http-handler': 3.226.0 - '@aws-sdk/hash-node': 3.226.0 - '@aws-sdk/invalid-dependency': 3.226.0 - '@aws-sdk/middleware-content-length': 3.226.0 - '@aws-sdk/middleware-endpoint': 3.226.0 - '@aws-sdk/middleware-host-header': 3.226.0 - '@aws-sdk/middleware-logger': 3.226.0 - '@aws-sdk/middleware-recursion-detection': 3.226.0 - '@aws-sdk/middleware-retry': 3.226.0 - '@aws-sdk/middleware-sdk-sts': 3.226.0 - '@aws-sdk/middleware-serde': 3.226.0 - '@aws-sdk/middleware-signing': 3.226.0 - '@aws-sdk/middleware-stack': 3.226.0 - '@aws-sdk/middleware-user-agent': 3.226.0 - '@aws-sdk/node-config-provider': 3.226.0 - '@aws-sdk/node-http-handler': 3.226.0 - '@aws-sdk/protocol-http': 3.226.0 - '@aws-sdk/smithy-client': 3.226.0 - '@aws-sdk/types': 3.226.0 - '@aws-sdk/url-parser': 3.226.0 - '@aws-sdk/util-base64': 3.208.0 - '@aws-sdk/util-body-length-browser': 3.188.0 - '@aws-sdk/util-body-length-node': 3.208.0 - '@aws-sdk/util-defaults-mode-browser': 3.226.0 - '@aws-sdk/util-defaults-mode-node': 3.226.0 - '@aws-sdk/util-endpoints': 3.226.0 - '@aws-sdk/util-user-agent-browser': 3.226.0 - '@aws-sdk/util-user-agent-node': 3.226.0 - '@aws-sdk/util-utf8-browser': 3.188.0 - '@aws-sdk/util-utf8-node': 3.208.0 - fast-xml-parser: 4.0.11 - tslib: 2.4.1 -======= /@aws-sdk/client-sts@3.315.0: resolution: {integrity: sha512-e34plg6m0hScADIPiu5kCKoiJVXRLRiAuens+iwMse0oPUmrv41hdjgufwWGA/pcNkEGzMdVS88Z4khxB3LHBw==} engines: {node: '>=14.0.0'} @@ -567,56 +357,10 @@ packages: '@aws-sdk/util-utf8': 3.310.0 fast-xml-parser: 4.1.2 tslib: 2.5.0 ->>>>>>> origin/mac-repo-maker transitivePeerDependencies: - aws-crt dev: false -<<<<<<< HEAD - /@aws-sdk/config-resolver/3.226.0: - resolution: {integrity: sha512-0UWXtfnTT0OtnRP8jJodc8V7xAnWSqsh4RCRyV5uu3Z2Tv+xyW91GKxO+gOXoUP0hHu0lvBM9lYiMJcJWZYLYw==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/signature-v4': 3.226.0 - '@aws-sdk/types': 3.226.0 - '@aws-sdk/util-config-provider': 3.208.0 - '@aws-sdk/util-middleware': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/credential-provider-env/3.226.0: - resolution: {integrity: sha512-sd8uK1ojbXxaZXlthzw/VXZwCPUtU3PjObOfr3Evj7MPIM2IH8h29foOlggx939MdLQGboJf9gKvLlvKDWtJRA==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/property-provider': 3.226.0 - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/credential-provider-imds/3.226.0: - resolution: {integrity: sha512-//z/COQm2AjYFI1Lb0wKHTQSrvLFTyuKLFQGPJsKS7DPoxGOCKB7hmYerlbl01IDoCxTdyL//TyyPxbZEOQD5Q==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/node-config-provider': 3.226.0 - '@aws-sdk/property-provider': 3.226.0 - '@aws-sdk/types': 3.226.0 - '@aws-sdk/url-parser': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/credential-provider-ini/3.226.0: - resolution: {integrity: sha512-Sj7SGl53qmKkD7wvgU0MSTyj8ho6A3tKVbadTHljVz60jiauTEM97Z1DIai6U3oPFVteaKqx7npc8ozeK6mKNg==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/credential-provider-env': 3.226.0 - '@aws-sdk/credential-provider-imds': 3.226.0 - '@aws-sdk/credential-provider-sso': 3.226.0 - '@aws-sdk/credential-provider-web-identity': 3.226.0 - '@aws-sdk/property-provider': 3.226.0 - '@aws-sdk/shared-ini-file-loader': 3.226.0 - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 -======= /@aws-sdk/config-resolver@3.310.0: resolution: {integrity: sha512-8vsT+/50lOqfDxka9m/rRt6oxv1WuGZoP8oPMk0Dt+TxXMbAzf4+rejBgiB96wshI1k3gLokYRjSQZn+dDtT8g==} engines: {node: '>=14.0.0'} @@ -660,27 +404,10 @@ packages: '@aws-sdk/shared-ini-file-loader': 3.310.0 '@aws-sdk/types': 3.310.0 tslib: 2.5.0 ->>>>>>> origin/mac-repo-maker transitivePeerDependencies: - aws-crt dev: false -<<<<<<< HEAD - /@aws-sdk/credential-provider-node/3.226.0: - resolution: {integrity: sha512-kuOeiVmlhSyMC1Eix0pqHmb4EmpbMHrTw+9ObZbQ2bRXy05Q9fLA6SVBcI01bI1KVh7Qqz9i8ojOY3A2zscjyA==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/credential-provider-env': 3.226.0 - '@aws-sdk/credential-provider-imds': 3.226.0 - '@aws-sdk/credential-provider-ini': 3.226.0 - '@aws-sdk/credential-provider-process': 3.226.0 - '@aws-sdk/credential-provider-sso': 3.226.0 - '@aws-sdk/credential-provider-web-identity': 3.226.0 - '@aws-sdk/property-provider': 3.226.0 - '@aws-sdk/shared-ini-file-loader': 3.226.0 - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 -======= /@aws-sdk/credential-provider-node@3.315.0: resolution: {integrity: sha512-OuzKAIg+xPAzBrb/Big5VKDpJmBhVR+N0Hfflrjj2BunQGWO7zxtkKFCz921MtP9ZunDV+UxzTpar8U5TAPtzA==} engines: {node: '>=14.0.0'} @@ -695,33 +422,10 @@ packages: '@aws-sdk/shared-ini-file-loader': 3.310.0 '@aws-sdk/types': 3.310.0 tslib: 2.5.0 ->>>>>>> origin/mac-repo-maker transitivePeerDependencies: - aws-crt dev: false -<<<<<<< HEAD - /@aws-sdk/credential-provider-process/3.226.0: - resolution: {integrity: sha512-iUDMdnrTvbvaCFhWwqyXrhvQ9+ojPqPqXhwZtY1X/Qaz+73S9gXBPJHZaZb2Ke0yKE1Ql3bJbKvmmxC/qLQMng==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/property-provider': 3.226.0 - '@aws-sdk/shared-ini-file-loader': 3.226.0 - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/credential-provider-sso/3.226.0: - resolution: {integrity: sha512-QSBeyOIAus4/8u/DeAstE8w/zw+F7PQohdB8JFP/BPaCfc8uKue4UkqqvQWRfm4VSEnHeXt037MDopmCpd98Iw==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/client-sso': 3.226.0 - '@aws-sdk/property-provider': 3.226.0 - '@aws-sdk/shared-ini-file-loader': 3.226.0 - '@aws-sdk/token-providers': 3.226.0 - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 -======= /@aws-sdk/credential-provider-process@3.310.0: resolution: {integrity: sha512-h73sg6GPMUWC+3zMCbA1nZ2O03nNJt7G96JdmnantiXBwHpRKWW8nBTLzx5uhXn6hTuTaoQRP/P+oxQJKYdMmA==} engines: {node: '>=14.0.0'} @@ -742,362 +446,10 @@ packages: '@aws-sdk/token-providers': 3.315.0 '@aws-sdk/types': 3.310.0 tslib: 2.5.0 ->>>>>>> origin/mac-repo-maker transitivePeerDependencies: - aws-crt dev: false -<<<<<<< HEAD - /@aws-sdk/credential-provider-web-identity/3.226.0: - resolution: {integrity: sha512-CCpv847rLB0SFOHz2igvUMFAzeT2fD3YnY4C8jltuJoEkn0ITn1Hlgt13nTJ5BUuvyti2mvyXZHmNzhMIMrIlw==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/property-provider': 3.226.0 - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/eventstream-codec/3.226.0: - resolution: {integrity: sha512-6uPtR8vSwz3fqoZk9hrb6qBYdp3PJ22+JxV5Wimdesvow4kJXSgDQXIxEkxbv6SxB9tNRB4uJHD84RetHEi15Q==} - dependencies: - '@aws-crypto/crc32': 2.0.0 - '@aws-sdk/types': 3.226.0 - '@aws-sdk/util-hex-encoding': 3.201.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/eventstream-serde-browser/3.226.0: - resolution: {integrity: sha512-otYC5aZE9eJUqAlKpy8w0rPDQ1eKGvZPtgxWXmFYSO2lDVGfI1nBBNmdZ4MdHqNuQ7ucsKMQYF8BFJ65K2tYPA==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/eventstream-serde-universal': 3.226.0 - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/eventstream-serde-config-resolver/3.226.0: - resolution: {integrity: sha512-A56Gypg+lyEfA5cna+EUH9XTrj0SvRG1gwNW7lrUzviN36SeA/LFTUIOEjxVML3Lowy+EPAcrSZ67h6aepoAig==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/eventstream-serde-node/3.226.0: - resolution: {integrity: sha512-KWLnKkKDzI9RNkiK6OiSYpG/XjZfue6Bsp/vRG+H5z3fbXdHv4X2+iW+Efu2Kvn7jsUyUv82TCl57DyJ/HKYhQ==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/eventstream-serde-universal': 3.226.0 - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/eventstream-serde-universal/3.226.0: - resolution: {integrity: sha512-Q8viYM1Sv90/yIUqyWNeG1GEvyVlAI3GIrInQcCMC+xT59jS+IKGy2y7ojCvSWXnhf5/HMXKcmG092QsqeKy0Q==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/eventstream-codec': 3.226.0 - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/fetch-http-handler/3.226.0: - resolution: {integrity: sha512-JewZPMNEBXfi1xVnRa7pVtK/zgZD8/lQ/YnD8pq79WuMa2cwyhDtr8oqCoqsPW+WJT5ScXoMtuHxN78l8eKWgg==} - dependencies: - '@aws-sdk/protocol-http': 3.226.0 - '@aws-sdk/querystring-builder': 3.226.0 - '@aws-sdk/types': 3.226.0 - '@aws-sdk/util-base64': 3.208.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/hash-blob-browser/3.226.0: - resolution: {integrity: sha512-5DCvWE6L4xGoViEHyjcPFuUe1G2EtNx8TqswWaoaKgyasP/yuRm4H99Ra7rqIrjCcSTAGD9NVsUQvVVw1bGt9w==} - dependencies: - '@aws-sdk/chunked-blob-reader': 3.188.0 - '@aws-sdk/chunked-blob-reader-native': 3.208.0 - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/hash-node/3.226.0: - resolution: {integrity: sha512-MdlJhJ9/Espwd0+gUXdZRsHuostB2WxEVAszWxobP0FTT9PnicqnfK7ExmW+DUAc0ywxtEbR3e0UND65rlSTVw==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.226.0 - '@aws-sdk/util-buffer-from': 3.208.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/hash-stream-node/3.226.0: - resolution: {integrity: sha512-cgNTGlF8SdHaQXtjEmuLXz2U8SLM2JDKtIVPku/lHTMsUsEn+fuv2C+h1f/hvd4aNw5t1zggym7sO1/h/rv56Q==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/invalid-dependency/3.226.0: - resolution: {integrity: sha512-QXOYFmap8g9QzRjumcRCIo2GEZkdCwd7ePQW0OABWPhKHzlJ74vvBxywjU3s39EEBEluWXtZ7Iufg6GxZM4ifw==} - dependencies: - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/is-array-buffer/3.201.0: - resolution: {integrity: sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==} - engines: {node: '>=14.0.0'} - dependencies: - tslib: 2.4.1 - dev: false - - /@aws-sdk/md5-js/3.226.0: - resolution: {integrity: sha512-ENigJRNudqyh6xsch166SZ4gggHd3XzZJ8gkCU4CWPne04HcR3BkWSO774IuWooCHt8zkaEHKecPurRz6qR+Vw==} - dependencies: - '@aws-sdk/types': 3.226.0 - '@aws-sdk/util-utf8-browser': 3.188.0 - '@aws-sdk/util-utf8-node': 3.208.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/middleware-bucket-endpoint/3.226.0: - resolution: {integrity: sha512-A1Vq5W2X7jgTfjqcKPmjoHohF0poP+9fxwL97fQMvzcwmjhtoCV3bLEpo6CGYx0pKPiSlRJXZkRwRPj2hDHDmA==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/protocol-http': 3.226.0 - '@aws-sdk/types': 3.226.0 - '@aws-sdk/util-arn-parser': 3.208.0 - '@aws-sdk/util-config-provider': 3.208.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/middleware-content-length/3.226.0: - resolution: {integrity: sha512-ksUzlHJN2JMuyavjA46a4sctvnrnITqt2tbGGWWrAuXY1mel2j+VbgnmJUiwHKUO6bTFBBeft5Vd1TSOb4JmiA==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/protocol-http': 3.226.0 - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/middleware-endpoint/3.226.0: - resolution: {integrity: sha512-EvLFafjtUxTT0AC9p3aBQu1/fjhWdIeK58jIXaNFONfZ3F8QbEYUPuF/SqZvJM6cWfOO9qwYKkRDbCSTYhprIg==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/middleware-serde': 3.226.0 - '@aws-sdk/protocol-http': 3.226.0 - '@aws-sdk/signature-v4': 3.226.0 - '@aws-sdk/types': 3.226.0 - '@aws-sdk/url-parser': 3.226.0 - '@aws-sdk/util-config-provider': 3.208.0 - '@aws-sdk/util-middleware': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/middleware-expect-continue/3.226.0: - resolution: {integrity: sha512-YxvQKTV/eA9P8AgW0hXOgj5Qa+TSnNFfyOkfeP089aP3f6p92b1cESf33TEOKsddive2mHT5LRCN6MuPcgWWrA==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/protocol-http': 3.226.0 - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/middleware-flexible-checksums/3.226.0: - resolution: {integrity: sha512-8A9Ot9A7794UP5tMGl2MnfTW/UM/jYy1wRWF9YkR/hPIcPb7OmE0hmlwIQGzb/7grxpYw66ETKf0WeH/41YfeQ==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-crypto/crc32': 2.0.0 - '@aws-crypto/crc32c': 2.0.0 - '@aws-sdk/is-array-buffer': 3.201.0 - '@aws-sdk/protocol-http': 3.226.0 - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/middleware-host-header/3.226.0: - resolution: {integrity: sha512-haVkWVh6BUPwKgWwkL6sDvTkcZWvJjv8AgC8jiQuSl8GLZdzHTB8Qhi3IsfFta9HAuoLjxheWBE5Z/L0UrfhLA==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/protocol-http': 3.226.0 - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/middleware-location-constraint/3.226.0: - resolution: {integrity: sha512-qHiYaBYPc2R37KxG2uqsUUwh4usrQMHfGkrpTUnx5d4rGzM3mC+muPsTpSHnAL63K2/yJOHQJFjss3GGwV4SSA==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/middleware-logger/3.226.0: - resolution: {integrity: sha512-m9gtLrrYnpN6yckcQ09rV7ExWOLMuq8mMPF/K3DbL/YL0TuILu9i2T1W+JuxSX+K9FMG2HrLAKivE/kMLr55xA==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/middleware-recursion-detection/3.226.0: - resolution: {integrity: sha512-mwRbdKEUeuNH5TEkyZ5FWxp6bL2UC1WbY+LDv6YjHxmSMKpAoOueEdtU34PqDOLrpXXxIGHDFmjeGeMfktyEcA==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/protocol-http': 3.226.0 - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/middleware-retry/3.226.0: - resolution: {integrity: sha512-uMn4dSkv9Na2uvt6K3HgTnVrCRAlGv1MBAtUDLXONqUv1L/Z1fp3CkFkLKQHKylfBwBhe6dXfYEo87i8LZFoqg==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/protocol-http': 3.226.0 - '@aws-sdk/service-error-classification': 3.226.0 - '@aws-sdk/types': 3.226.0 - '@aws-sdk/util-middleware': 3.226.0 - tslib: 2.4.1 - uuid: 8.3.2 - dev: false - - /@aws-sdk/middleware-sdk-s3/3.226.0: - resolution: {integrity: sha512-sOFLFCnlN3kPgSI8C9mq/X3o6Oy4lIk4jz5kuB11zfvsm+YlIlxL4s06FkYqHsGDBH9hmh8dEuOxQ+YktyyeoA==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/middleware-bucket-endpoint': 3.226.0 - '@aws-sdk/protocol-http': 3.226.0 - '@aws-sdk/types': 3.226.0 - '@aws-sdk/util-arn-parser': 3.208.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/middleware-sdk-sts/3.226.0: - resolution: {integrity: sha512-NN9T/qoSD1kZvAT+VLny3NnlqgylYQcsgV3rvi/8lYzw/G/2s8VS6sm/VTWGGZhx08wZRv20MWzYu3bftcyqUg==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/middleware-signing': 3.226.0 - '@aws-sdk/property-provider': 3.226.0 - '@aws-sdk/protocol-http': 3.226.0 - '@aws-sdk/signature-v4': 3.226.0 - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/middleware-serde/3.226.0: - resolution: {integrity: sha512-nPuOOAkSfx9TxzdKFx0X2bDlinOxGrqD7iof926K/AEflxGD1DBdcaDdjlYlPDW2CVE8LV/rAgbYuLxh/E/1VA==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/middleware-signing/3.226.0: - resolution: {integrity: sha512-E6HmtPcl+IjYDDzi1xI2HpCbBq2avNWcjvCriMZWuTAtRVpnA6XDDGW5GY85IfS3A8G8vuWqEVPr8JcYUcjfew==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/property-provider': 3.226.0 - '@aws-sdk/protocol-http': 3.226.0 - '@aws-sdk/signature-v4': 3.226.0 - '@aws-sdk/types': 3.226.0 - '@aws-sdk/util-middleware': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/middleware-ssec/3.226.0: - resolution: {integrity: sha512-DR97oWoLHiMdaUP/wu99HtzG7/ijvCrjZGDH37WBO1rxFtEti6L7T09wgHzwxMN8gtL8FJA7dU8IrffGSC9VmA==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/middleware-stack/3.226.0: - resolution: {integrity: sha512-85wF29LvPvpoed60fZGDYLwv1Zpd/cM0C22WSSFPw1SSJeqO4gtFYyCg2squfT3KI6kF43IIkOCJ+L7GtryPug==} - engines: {node: '>=14.0.0'} - dependencies: - tslib: 2.4.1 - dev: false - - /@aws-sdk/middleware-user-agent/3.226.0: - resolution: {integrity: sha512-N1WnfzCW1Y5yWhVAphf8OPGTe8Df3vmV7/LdsoQfmpkCZgLZeK2o0xITkUQhRj1mbw7yp8tVFLFV3R2lMurdAQ==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/protocol-http': 3.226.0 - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/node-config-provider/3.226.0: - resolution: {integrity: sha512-B8lQDqiRk7X5izFEUMXmi8CZLOKCTWQJU9HQf3ako+sF0gexo4nHN3jhoRWyLtcgC5S3on/2jxpAcqtm7kuY3w==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/property-provider': 3.226.0 - '@aws-sdk/shared-ini-file-loader': 3.226.0 - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/node-http-handler/3.226.0: - resolution: {integrity: sha512-xQCddnZNMiPmjr3W7HYM+f5ir4VfxgJh37eqZwX6EZmyItFpNNeVzKUgA920ka1VPz/ZUYB+2OFGiX3LCLkkaA==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/abort-controller': 3.226.0 - '@aws-sdk/protocol-http': 3.226.0 - '@aws-sdk/querystring-builder': 3.226.0 - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/property-provider/3.226.0: - resolution: {integrity: sha512-TsljjG+Sg0LmdgfiAlWohluWKnxB/k8xenjeozZfzOr5bHmNHtdbWv6BtNvD/R83hw7SFXxbJHlD5H4u9p2NFg==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/protocol-http/3.226.0: - resolution: {integrity: sha512-zWkVqiTA9RXL6y0hhfZc9bcU4DX2NI6Hw9IhQmSPeM59mdbPjJlY4bLlMr5YxywqO3yQ/ylNoAfrEzrDjlOSRg==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/querystring-builder/3.226.0: - resolution: {integrity: sha512-LVurypuNeotO4lmirKXRC4NYrZRAyMJXuwO0f2a5ZAUJCjauwYrifKue6yCfU7bls7gut7nfcR6B99WBYpHs3g==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.226.0 - '@aws-sdk/util-uri-escape': 3.201.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/querystring-parser/3.226.0: - resolution: {integrity: sha512-FzB+VrQ47KAFxiPt2YXrKZ8AOLZQqGTLCKHzx4bjxGmwgsjV8yIbtJiJhZLMcUQV4LtGeIY9ixIqQhGvnZHE4A==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/service-error-classification/3.226.0: - resolution: {integrity: sha512-9R01dBpE8JILe2CTft7YN2tMufT2mMWMTqxmHwPSmOpsxHTj8hEII7GTfvpb95ThHwW7XMNhg7pbHLbrTJZCVA==} - engines: {node: '>=14.0.0'} - dev: false - - /@aws-sdk/shared-ini-file-loader/3.226.0: - resolution: {integrity: sha512-661VQefsARxVyyV2FX9V61V+nNgImk7aN2hYlFKla6BCwZfMng+dEtD0xVGyg1PfRw0qvEv5LQyxMVgHcUSevA==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/signature-v4-multi-region/3.226.0: - resolution: {integrity: sha512-QHxNuf9ynK208v7Y3imdsa3Cz8ynYV7ZOf3sBJdItuEtHN6uy/KxaOrtvpF8I5Hyn48Hc8z5miTSMujFKT7GEw==} -======= /@aws-sdk/credential-provider-web-identity@3.310.0: resolution: {integrity: sha512-H4SzuZXILNhK6/IR1uVvsUDZvzc051hem7GLyYghBCu8mU+tq28YhKE8MfSroi6eL2e5Vujloij1OM2EQQkPkw==} engines: {node: '>=14.0.0'} @@ -1443,7 +795,6 @@ packages: /@aws-sdk/signature-v4-multi-region@3.310.0: resolution: {integrity: sha512-q8W+RIomTS/q85Ntgks/CoDElwqkC9+4OCicee5YznNHjQ4gtNWhUkYIyIRWRmXa/qx/AUreW9DM8FAecCOdng==} ->>>>>>> origin/mac-repo-maker engines: {node: '>=14.0.0'} peerDependencies: '@aws-sdk/signature-v4-crt': ^3.118.0 @@ -1451,45 +802,6 @@ packages: '@aws-sdk/signature-v4-crt': optional: true dependencies: -<<<<<<< HEAD - '@aws-sdk/protocol-http': 3.226.0 - '@aws-sdk/signature-v4': 3.226.0 - '@aws-sdk/types': 3.226.0 - '@aws-sdk/util-arn-parser': 3.208.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/signature-v4/3.226.0: - resolution: {integrity: sha512-/R5q5agdPd7HJB68XMzpxrNPk158EHUvkFkuRu5Qf3kkkHebEzWEBlWoVpUe6ss4rP9Tqcue6xPuaftEmhjpYw==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/is-array-buffer': 3.201.0 - '@aws-sdk/types': 3.226.0 - '@aws-sdk/util-hex-encoding': 3.201.0 - '@aws-sdk/util-middleware': 3.226.0 - '@aws-sdk/util-uri-escape': 3.201.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/smithy-client/3.226.0: - resolution: {integrity: sha512-BWr1FhWSUhkSBp0TLzliD5AQBjA2Jmo9FlOOt+cBwd9BKkSGlGj+HgATYJ83Sjjg2+J6qvEZBxB78LKVHhorBw==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/middleware-stack': 3.226.0 - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/token-providers/3.226.0: - resolution: {integrity: sha512-3ouRt2i3ve8ivg54PxPhtOTcipzf6BoQsMw0EiO23yYKujhyeFH2IkxV4EYC687xFrUjheqJf8FWU/DD8EQ/ow==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/client-sso-oidc': 3.226.0 - '@aws-sdk/property-provider': 3.226.0 - '@aws-sdk/shared-ini-file-loader': 3.226.0 - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 -======= '@aws-sdk/protocol-http': 3.310.0 '@aws-sdk/signature-v4': 3.310.0 '@aws-sdk/types': 3.310.0 @@ -1527,160 +839,10 @@ packages: '@aws-sdk/shared-ini-file-loader': 3.310.0 '@aws-sdk/types': 3.310.0 tslib: 2.5.0 ->>>>>>> origin/mac-repo-maker transitivePeerDependencies: - aws-crt dev: false -<<<<<<< HEAD - /@aws-sdk/types/3.226.0: - resolution: {integrity: sha512-MmmNHrWeO4man7wpOwrAhXlevqtOV9ZLcH4RhnG5LmRce0RFOApx24HoKENfFCcOyCm5LQBlsXCqi0dZWDWU0A==} - engines: {node: '>=14.0.0'} - dependencies: - tslib: 2.4.1 - dev: false - - /@aws-sdk/url-parser/3.226.0: - resolution: {integrity: sha512-p5RLE0QWyP0OcTOLmFcLdVgUcUEzmEfmdrnOxyNzomcYb0p3vUagA5zfa1HVK2azsQJFBv28GfvMnba9bGhObg==} - dependencies: - '@aws-sdk/querystring-parser': 3.226.0 - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/util-arn-parser/3.208.0: - resolution: {integrity: sha512-QV4af+kscova9dv4VuHOgH8wEr/IIYHDGcnyVtkUEqahCejWr1Kuk+SBK0xMwnZY5LSycOtQ8aeqHOn9qOjZtA==} - engines: {node: '>=14.0.0'} - dependencies: - tslib: 2.4.1 - dev: false - - /@aws-sdk/util-base64/3.208.0: - resolution: {integrity: sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/util-buffer-from': 3.208.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/util-body-length-browser/3.188.0: - resolution: {integrity: sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==} - dependencies: - tslib: 2.4.1 - dev: false - - /@aws-sdk/util-body-length-node/3.208.0: - resolution: {integrity: sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==} - engines: {node: '>=14.0.0'} - dependencies: - tslib: 2.4.1 - dev: false - - /@aws-sdk/util-buffer-from/3.208.0: - resolution: {integrity: sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/is-array-buffer': 3.201.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/util-config-provider/3.208.0: - resolution: {integrity: sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==} - engines: {node: '>=14.0.0'} - dependencies: - tslib: 2.4.1 - dev: false - - /@aws-sdk/util-defaults-mode-browser/3.226.0: - resolution: {integrity: sha512-chLx+6AeMSjuPsCVbI1B4Pg3jftjjcsuTsJucjo0DKBb1VSWqPCitmOILQVvKiA2Km8TSs3VcbUuOCyDExkzAg==} - engines: {node: '>= 10.0.0'} - dependencies: - '@aws-sdk/property-provider': 3.226.0 - '@aws-sdk/types': 3.226.0 - bowser: 2.11.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/util-defaults-mode-node/3.226.0: - resolution: {integrity: sha512-Zr0AEj6g8gqiOhr31Pa2tdOFdPQciaAUCg3Uj/eH0znNBdVoptCj67oCW/I5v4pY4ZLZtGhr3uuoxDJH2MB3yg==} - engines: {node: '>= 10.0.0'} - dependencies: - '@aws-sdk/config-resolver': 3.226.0 - '@aws-sdk/credential-provider-imds': 3.226.0 - '@aws-sdk/node-config-provider': 3.226.0 - '@aws-sdk/property-provider': 3.226.0 - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/util-endpoints/3.226.0: - resolution: {integrity: sha512-iqOkac/zLmyPBUJd7SLN0PeZMkOmlGgD5PHmmekTClOkce2eUjK9SNX1PzL73aXPoPTyhg9QGLH8uEZEQ8YUzg==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/util-hex-encoding/3.201.0: - resolution: {integrity: sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==} - engines: {node: '>=14.0.0'} - dependencies: - tslib: 2.4.1 - dev: false - - /@aws-sdk/util-locate-window/3.208.0: - resolution: {integrity: sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==} - engines: {node: '>=14.0.0'} - dependencies: - tslib: 2.4.1 - dev: false - - /@aws-sdk/util-middleware/3.226.0: - resolution: {integrity: sha512-B96CQnwX4gRvQdaQkdUtqvDPkrptV5+va6FVeJOocU/DbSYMAScLxtR3peMS8cnlOT6nL1Eoa42OI9AfZz1VwQ==} - engines: {node: '>=14.0.0'} - dependencies: - tslib: 2.4.1 - dev: false - - /@aws-sdk/util-stream-browser/3.226.0: - resolution: {integrity: sha512-ZvjlA1ySaLd0DqUWTKmL7LsxfPhroAONpzsinaHmw9aZVL40s2cADU9eWgBdHTuAOeFklL7NP0cc6UiTFHKe8g==} - dependencies: - '@aws-sdk/fetch-http-handler': 3.226.0 - '@aws-sdk/types': 3.226.0 - '@aws-sdk/util-base64': 3.208.0 - '@aws-sdk/util-hex-encoding': 3.201.0 - '@aws-sdk/util-utf8-browser': 3.188.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/util-stream-node/3.226.0: - resolution: {integrity: sha512-HADXiIgDGoXcCLSKuPnjCLENf0iC0lzqqnymZu9H2FoACZhJB7DvJ9LnP51Pvw9lfCu+yvLzbMqSPdbXtMbRWg==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/node-http-handler': 3.226.0 - '@aws-sdk/types': 3.226.0 - '@aws-sdk/util-buffer-from': 3.208.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/util-uri-escape/3.201.0: - resolution: {integrity: sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==} - engines: {node: '>=14.0.0'} - dependencies: - tslib: 2.4.1 - dev: false - - /@aws-sdk/util-user-agent-browser/3.226.0: - resolution: {integrity: sha512-PhBIu2h6sPJPcv2I7ELfFizdl5pNiL4LfxrasMCYXQkJvVnoXztHA1x+CQbXIdtZOIlpjC+6BjDcE0uhnpvfcA==} - dependencies: - '@aws-sdk/types': 3.226.0 - bowser: 2.11.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/util-user-agent-node/3.226.0: - resolution: {integrity: sha512-othPc5Dz/pkYkxH+nZPhc1Al0HndQT8zHD4e9h+EZ+8lkd8n+IsnLfTS/mSJWrfiC6UlNRVw55cItstmJyMe/A==} -======= /@aws-sdk/types@3.310.0: resolution: {integrity: sha512-j8eamQJ7YcIhw7fneUfs8LYl3t01k4uHi4ZDmNRgtbmbmTTG3FZc2MotStZnp3nZB6vLiPF1o5aoJxWVvkzS6A==} engines: {node: '>=14.0.0'} @@ -1836,7 +998,6 @@ packages: /@aws-sdk/util-user-agent-node@3.310.0: resolution: {integrity: sha512-Ra3pEl+Gn2BpeE7KiDGpi4zj7WJXZA5GXnGo3mjbi9+Y3zrbuhJAbdZO3mO/o7xDgMC6ph4xCTbaSGzU6b6EDg==} ->>>>>>> origin/mac-repo-maker engines: {node: '>=14.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -1844,44 +1005,6 @@ packages: aws-crt: optional: true dependencies: -<<<<<<< HEAD - '@aws-sdk/node-config-provider': 3.226.0 - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/util-utf8-browser/3.188.0: - resolution: {integrity: sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==} - dependencies: - tslib: 2.4.1 - dev: false - - /@aws-sdk/util-utf8-node/3.208.0: - resolution: {integrity: sha512-jKY87Acv0yWBdFxx6bveagy5FYjz+dtV8IPT7ay1E2WPWH1czoIdMAkc8tSInK31T6CRnHWkLZ1qYwCbgRfERQ==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/util-buffer-from': 3.208.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/util-waiter/3.226.0: - resolution: {integrity: sha512-qYQMRxnu5k8qQihJXoIWMkBOj0+XkHHj/drLdbRnwL6ni6NcG8++cs9M3DSjIcxmxgF/7SLpDjn1H3sC7cYo4g==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/abort-controller': 3.226.0 - '@aws-sdk/types': 3.226.0 - tslib: 2.4.1 - dev: false - - /@aws-sdk/xml-builder/3.201.0: - resolution: {integrity: sha512-brRdB1wwMgjWEnOQsv7zSUhIQuh7DEicrfslAqHop4S4FtSI3GQAShpQqgOpMTNFYcpaWKmE/Y1MJmNY7xLCnw==} - engines: {node: '>=14.0.0'} - dependencies: - tslib: 2.4.1 - dev: false - - /@babel/code-frame/7.18.6: -======= '@aws-sdk/node-config-provider': 3.310.0 '@aws-sdk/types': 3.310.0 tslib: 2.5.0 @@ -1918,7 +1041,6 @@ packages: dev: false /@babel/code-frame@7.18.6: ->>>>>>> origin/mac-repo-maker resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} engines: {node: '>=6.9.0'} dependencies: @@ -2517,13 +1639,8 @@ packages: '@jest/schemas': 29.0.0 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 -<<<<<<< HEAD - '@types/node': 18.11.10 - '@types/yargs': 17.0.16 -======= '@types/node': 18.13.0 '@types/yargs': 17.0.20 ->>>>>>> origin/mac-repo-maker chalk: 4.1.2 dev: true @@ -2723,13 +1840,8 @@ packages: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} dev: true -<<<<<<< HEAD - /@types/yargs/17.0.16: - resolution: {integrity: sha512-Mh3OP0oh8X7O7F9m5AplC+XHYLBWuPKNkGVD3gIZFLFebBnuFI2Nz5Sf8WLvwGxECJ8YjifQvFdh79ubODkdug==} -======= /@types/yargs@17.0.20: resolution: {integrity: sha512-eknWrTHofQuPk2iuqDm1waA7V6xPlbgBoaaXEgYkClhLOnB0TtbW+srJaOToAgawPxPlHQzwypFA2bhZaUGP5A==} ->>>>>>> origin/mac-repo-maker dependencies: '@types/yargs-parser': 21.0.0 dev: true @@ -3053,13 +2165,6 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} -<<<<<<< HEAD - - /bowser/2.11.0: - resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} - dev: false -======= ->>>>>>> origin/mac-repo-maker /bowser@2.11.0: resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} @@ -3188,11 +2293,7 @@ packages: string-width: 5.1.2 dev: true -<<<<<<< HEAD - /cliui/7.0.4: -======= /cliui@7.0.4: ->>>>>>> origin/mac-repo-maker resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} dependencies: string-width: 4.2.3 @@ -3200,11 +2301,7 @@ packages: wrap-ansi: 7.0.0 dev: false -<<<<<<< HEAD - /cliui/8.0.1: -======= /cliui@8.0.1: ->>>>>>> origin/mac-repo-maker resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} dependencies: @@ -3588,23 +2685,14 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true -<<<<<<< HEAD - /fast-xml-parser/4.0.11: - resolution: {integrity: sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==} -======= /fast-xml-parser@4.1.2: resolution: {integrity: sha512-CDYeykkle1LiA/uqQyNwYpFbyF6Axec6YapmpUP+/RHWIoR1zKjocdvNaTsxCxZzQ6v9MLXaSYm9Qq0thv0DHg==} ->>>>>>> origin/mac-repo-maker hasBin: true dependencies: strnum: 1.0.5 dev: false -<<<<<<< HEAD - /fastq/1.14.0: -======= /fastq@1.14.0: ->>>>>>> origin/mac-repo-maker resolution: {integrity: sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==} dependencies: reusify: 1.0.4 @@ -4536,6 +3624,7 @@ packages: engines: {node: '>=10'} dependencies: yallist: 4.0.0 + dev: true /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} @@ -4581,21 +3670,13 @@ packages: engines: {node: '>=12'} dev: true -<<<<<<< HEAD - /minimatch/3.0.4: -======= /minimatch@3.0.4: ->>>>>>> origin/mac-repo-maker resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} dependencies: brace-expansion: 1.1.11 dev: false -<<<<<<< HEAD - /minimatch/3.1.2: -======= /minimatch@3.1.2: ->>>>>>> origin/mac-repo-maker resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 @@ -4958,19 +4039,11 @@ packages: tslib: 2.5.0 dev: true -<<<<<<< HEAD - /s3-groundskeeper/0.2.2: - resolution: {integrity: sha512-62ntqZMhd7v85yWM+YXKsVLJdf6us6Lc+L52Ia91kRpZMgb/E9hjeXKsIoydgN9XoALoUEL+/Rp37LUrKOOl4Q==} - hasBin: true - dependencies: - '@aws-sdk/client-s3': 3.226.0 -======= /s3-groundskeeper@0.3.1: resolution: {integrity: sha512-NOATkeUjia83Dks5rTafwRauqRP3/UYXe/7psX6EXs320fKmJHKfzRNcBsVdeRJwQvE3Vc+0xJX0KkyZ5qpJpg==} hasBin: true dependencies: '@aws-sdk/client-s3': 3.315.0 ->>>>>>> origin/mac-repo-maker minimatch: 3.0.4 yargs: 16.2.0 transitivePeerDependencies: @@ -4978,11 +4051,7 @@ packages: - aws-crt dev: false -<<<<<<< HEAD - /semver/6.3.0: -======= /semver@6.3.0: ->>>>>>> origin/mac-repo-maker resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true dev: true @@ -4993,6 +4062,7 @@ packages: hasBin: true dependencies: lru-cache: 6.0.0 + dev: true /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} @@ -5131,19 +4201,11 @@ packages: engines: {node: '>=8'} dev: true -<<<<<<< HEAD - /strnum/1.0.5: - resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} - dev: false - - /supports-color/5.5.0: -======= /strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} dev: false /supports-color@5.5.0: ->>>>>>> origin/mac-repo-maker resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} dependencies: @@ -5285,13 +4347,8 @@ packages: /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} -<<<<<<< HEAD - /tslib/2.4.1: - resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} -======= /tslib@2.5.0: resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} ->>>>>>> origin/mac-repo-maker /tsutils@3.21.0(typescript@5.0.4): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} @@ -5353,20 +4410,12 @@ packages: punycode: 2.1.1 dev: true -<<<<<<< HEAD - /uuid/8.3.2: -======= /uuid@8.3.2: ->>>>>>> origin/mac-repo-maker resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true dev: false -<<<<<<< HEAD - /v8-compile-cache-lib/3.0.1: -======= /v8-compile-cache-lib@3.0.1: ->>>>>>> origin/mac-repo-maker resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true @@ -5450,37 +4499,14 @@ packages: engines: {node: '>= 14'} dev: true -<<<<<<< HEAD - /yargs-parser/20.2.9: -======= /yargs-parser@20.2.9: ->>>>>>> origin/mac-repo-maker resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} dev: false -<<<<<<< HEAD - /yargs-parser/21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - /yargs/16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - dependencies: - cliui: 7.0.4 - escalade: 3.1.1 - 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-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} ->>>>>>> origin/mac-repo-maker /yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} diff --git a/src/artifactory-utils.ts b/src/artifactory-utils.ts deleted file mode 100644 index 5d58b81..0000000 --- a/src/artifactory-utils.ts +++ /dev/null @@ -1,168 +0,0 @@ -import * as http from './http.js'; - -import { ArtifactoryClient, createArtifactoryClient } from 's3-groundskeeper'; -import { configuration } from './config.js'; -import type stream from 'stream'; - -let artifactoryHelperInstance: ArtifactoryHelper | undefined = undefined; - -export interface BuildsList { - buildsNumbers: { - uri: string, - started: string - }[] -} - -export interface BuildInfo { - buildInfo: { - modules: { - artifacts: Artifact[] - }[], - properties: { - 'buildInfo.env.CI_RUNNER_TAGS': string, - 'buildInfo.env.VERSION': string - } - } -} - -export interface Artifact { - type : string, - sha1 : string, - sha256 : string, - md5 : string, - name : string -} - -export interface ArtifactoryHelperConfig { - host: string; - user: string; - apiKey: string; - project: string; -} - -export class ArtifactoryHelper { - private artifactoryClient?: ArtifactoryClient; - private buildsList?: BuildsList; - private project: string; - - constructor(config: ArtifactoryHelperConfig) { - this.project = config.project; - this.artifactoryClient = createArtifactoryClient({ protocol: 'https', host: config.host, apiKey: config.apiKey, user: config.user }); - } - - public async init(): Promise { - if (!this.artifactoryClient) { - throw new Error('Artifactory client does not exists'); - } - - const apiEndpoint = this.artifactoryClient.resolveUri('api/build'); - const buildsEndpoint = `${apiEndpoint}/${this.project}`; - - const allBuilds = await http.get(buildsEndpoint); - this.buildsList = JSON.parse(allBuilds.toString()) as BuildsList; - } - - public client(): ArtifactoryClient { - if (!this.artifactoryClient) { - throw new Error('Artifactory client does not exists'); - } - - return this.artifactoryClient; - } - - public macOsArtifactsByBuildNumber(buildNumber: string): Promise { - return this.artifactsByBuildNumber(buildNumber, 'mac-shell'); - } - - public async windowsArtifactsByBuildNumber(buildNumber: string): Promise { - return (await this.artifactsByBuildNumber(buildNumber, 'windows, code-signing')).filter(value => value.name.endsWith('.msix')); - } - - public async debArtifactsByBuildNumber(buildNumber: string): Promise { - return (await this.artifactsByBuildNumber(buildNumber, 'tvd-runner')).filter(value => value.name.endsWith('.deb')); - } - - private async artifactsByBuildNumber(buildNumber: string, osKey: string): Promise { - const buildInfo = await this.buildInfoByNumber(buildNumber, osKey); - - if (buildInfo.buildInfo.modules.length !== 1) { - throw new Error('Build must contain only one module'); - } - - const firstModule = buildInfo.buildInfo.modules[0]; - - if (!firstModule) { - throw new Error('Build must contain only one module'); - } - - return firstModule.artifacts; - } - - private async buildInfoByNumber(buildNumber: string, osKey: string): Promise { - if (!this.artifactoryClient) { - throw new Error('Artifactory client does not exists'); - } - - const apiEndpoint = this.artifactoryClient?.resolveUri('api/build'); - const buildsEndpoint = `${apiEndpoint}/${this.project}`; - - const buildTimes = (buildUri: string): Date[] => { - const times: Date[] = []; - - this.buildsList?.buildsNumbers.forEach(build => { - if (build.uri === `/${buildUri}`) { - times.push(new Date(build.started)); - } - }); - - return times; - }; - - const buildInfoResult: Promise[] = []; - - for (const value of buildTimes(buildNumber)) { - const buildInfoEndpoint = `${buildsEndpoint}/${buildNumber}?started=${value.toISOString()}`; - buildInfoResult.push(http.get(buildInfoEndpoint)); - } - - const result = (await Promise.all(buildInfoResult)); - - for (const buildInfo of result) { - const parsedInfo = JSON.parse(buildInfo.toString()) as BuildInfo; - if (parsedInfo.buildInfo.properties['buildInfo.env.CI_RUNNER_TAGS'] === osKey) { - return parsedInfo; - } - } - - throw new Error(`No build with build number: ${buildNumber} and osKey: ${osKey} found`); - } -} - -export function artifactoryHelper(): ArtifactoryHelper { - if (!artifactoryHelperInstance) { - const host = configuration().artifactoryHost; - const user = configuration().artifactoryUser; - const apiKey = configuration().artifactoryApiKey; - const project = configuration().artifactoryProjectKey; - - if (!host) { - throw new Error('Artifactory host must be specified'); - } - - if (!user) { - throw new Error('Artifactory user must be specified'); - } - - if (!apiKey) { - throw new Error('Artifactory API key must be specified'); - } - - if (!project) { - throw new Error('Artifactory project key must be specified'); - } - - artifactoryHelperInstance = new ArtifactoryHelper({ host, user, apiKey, project }); - } - - return artifactoryHelperInstance; -} diff --git a/src/cli.ts b/src/cli.ts deleted file mode 100644 index 1159829..0000000 --- a/src/cli.ts +++ /dev/null @@ -1,42 +0,0 @@ -import yargs from 'yargs'; - -type CliType = Awaited>; -let cliInstance: CliType | undefined = undefined; - -const yargsParsePromise = yargs(process.argv.slice(2)) - .option('artifactory-host', { description: 'JFrog Artifactory host. Alternale env:ARTIFACTORY_HOST', group: 'JFrog Artifactory:', string: true }) - .option('artifactory-user', { description: 'JFrog Artifactory username. Alternale env:ARTIFACTORY_USER', group: 'JFrog Artifactory:', string: true }) - .option('artifactory-api-key', { description: 'JFrog Artifactory ApiKey. Alternale env:ARTIFACTORY_API_KEY', group: 'JFrog Artifactory:', string: true }) - .option('artifactory-project-key', { description: 'JFrog Artifactory Project key.', group: 'JFrog Artifactory:', string: true }) - .option('s3-access-key-id', { description: 'Amazon S3 access key id. Alternale env:S3_ACCESS_KEY_ID', group: 'AWS S3:', string: true }) - .option('s3-secret-access-key', { description: 'Amazon S3 secret access key. Alternale env:S3_SECRET_ACCESS_KEY', group: 'AWS S3:', string: true }) - .option('s3-region', { description: 'Amazon S3 region. Alternale env:S3_REGION', group: 'AWS S3:', string: true }) - .option('s3-bucket', { description: 'Amazon S3 bucket. Alternale env:S3_BUCKET', group: 'AWS S3:', string: true }) - .option('gpg-key-name', { description: 'Signing GPG key name. Alternale env:GPG_KEY_NAME', group: 'Linux specific:', string: true }) - .command('plan [source-dir]', 'Prepare repositories for deploy', yargs => { - yargs.positional('repo-out', { describe: 'Outup dir wich will contain prepeared repository', type: 'string', default: 'out' }) - .positional('source-dir', { describe: 'Source dir wich contains releases description', type: 'string' }); - }) - .command('apply ', 'Deploy repositories', yargs => { - yargs.positional('repo-dir', { describe: 'Source dir wich contains repository prepeared before. Only for S3 deploying', type: 'string' }); - }); - -export async function initCli(): Promise { - if (cliInstance) { - throw new Error('CLI already initialized'); - } - - const tmp = await yargsParsePromise.parse(); - - if (!cliInstance) { - cliInstance = tmp; - } -} - -export function cli(): CliType { - if (!cliInstance) { - throw new Error('CLI must be initialized before use'); - } - - return cliInstance; -} diff --git a/src/config.ts b/src/config.ts deleted file mode 100644 index 631682f..0000000 --- a/src/config.ts +++ /dev/null @@ -1,78 +0,0 @@ -import fs from 'fs'; -import path from 'path'; -import { pathToFileURL } from 'url'; - -import { cli } from './cli.js'; -import type { MsixS3Config } from './windows-repo-builder.js'; - -let configurationInstance: Config | undefined = undefined; - -type ExhaustConfig = MsixS3Config; - -class Config { - artifactoryHost: string | undefined; - artifactoryUser: string | undefined; - artifactoryApiKey: string | undefined; - artifactoryProjectKey: string | undefined; - s3AccessKeyId: string | undefined; - s3SecretAccessKey: string | undefined; - s3Region: string | undefined; - s3Bucket: string | undefined; - gpgKeyName: string | undefined; - exhaust: ExhaustConfig | undefined; - - constructor() { - const ARTIFACTORY_HOST = 'ARTIFACTORY_HOST'; - const ARTIFACTORY_USER = 'ARTIFACTORY_USER'; - const ARTIFACTORY_API_KEY = 'ARTIFACTORY_API_KEY'; - const S3_ACCESS_KEY_ID = 'S3_ACCESS_KEY_ID'; - const S3_SECRET_ACCESS_KEY = 'S3_SECRET_ACCESS_KEY'; - const S3_REGION = 'S3_REGION'; - const S3_BUCKET = 'S3_BUCKET'; - const GPG_KEY_NAME = 'GPG_KEY_NAME'; - - this.artifactoryHost = envToString(ARTIFACTORY_HOST) ?? cli().artifactoryHost; - this.artifactoryUser = envToString(ARTIFACTORY_USER) ?? cli().artifactoryUser; - this.artifactoryApiKey = envToString(ARTIFACTORY_API_KEY) ?? cli().artifactoryApiKey; - this.artifactoryProjectKey = cli().artifactoryProjectKey; - this.s3AccessKeyId = envToString(S3_ACCESS_KEY_ID) ?? cli().s3AccessKeyId; - this.s3SecretAccessKey = envToString(S3_SECRET_ACCESS_KEY) ?? cli().s3SecretAccessKey; - this.s3Region = envToString(S3_REGION) ?? cli().s3Region; - this.s3Bucket = envToString(S3_BUCKET) ?? cli().s3Bucket; - this.gpgKeyName = envToString(GPG_KEY_NAME) ?? cli().gpgKeyName; - } - - async init(): Promise { - const resolvedPath = path.resolve(process.cwd(), 'jewel-case.config.mjs'); - if (resolvedPath && fs.existsSync(resolvedPath)) { - this.exhaust = (await import(pathToFileURL(resolvedPath).toString())).default as ExhaustConfig; - - return; - } - - throw new Error('jewel-case.config.mjs not found'); - } -} - -function envToString(envName: string): string | undefined { - const value = process.env[envName]; - - return value; -} - -export function initConfiguration(): Promise { - if (configurationInstance) { - throw new Error('Configuration already initialized'); - } - - configurationInstance = new Config(); - return configurationInstance.init(); -} - -export function configuration(): Config { - if (!configurationInstance) { - throw new Error('Configuration must be initialized before use'); - } - - return configurationInstance; -} diff --git a/src/http.ts b/src/http.ts deleted file mode 100644 index 762b8ac..0000000 --- a/src/http.ts +++ /dev/null @@ -1,87 +0,0 @@ -import * as https from 'https'; - -import type * as stream from 'stream'; -import type { IncomingMessage } from 'http'; - -export interface RequestBody { - content: string | Buffer; - contentType?: string; -} - -export interface RequestData { - headers?: Record; - body?: RequestBody; - redirectHandler?: (url: string) => string | undefined; -} - -export function requestStream(url: string, method: string, requestData?: RequestData): Promise { - return new Promise((resolve, reject) => { - try { - const req = https.request(url, { method }); - - req - .on('response', (incomingMessage: IncomingMessage) => { - if (incomingMessage.statusCode !== 200) { - const stCode = incomingMessage.statusCode ?? 'NO_CODE'; - const stMessage = incomingMessage.statusMessage ?? 'NO_MESSAGE'; - const message = `[${method} ${url}]:${stCode}/${stMessage}`; - reject(new Error(message)); - return; - } - - resolve(incomingMessage); - }) - .on('error', (err: Error) => { - const errno = (err as {errno?: string}).errno ?? ''; - if (errno === 'ETIMEDOUT') { - reject(new Error(`Request (${url}) timeout.`)); - } else { - reject(err); - } - }); - - if (requestData?.headers) { - for (const key of Object.getOwnPropertyNames(requestData.headers)) { - const value = requestData.headers[key]; - - if (value) { - req.setHeader(key, value); - } - } - } - - if (requestData?.body) { - if (requestData.body.contentType) { - req.setHeader('Content-Type', requestData.body.contentType); - } - req.write(requestData.body.content); - } - - req.end(); - } catch (err) { - reject(err); - } - }); -} - - -export async function request(url: string, method: string, requestData?: RequestData): Promise { - const responseStream = await requestStream(url, method, requestData); - - let buffer: Buffer | undefined = undefined; - - for await (const item of responseStream) { - const chunk = item as Buffer; - buffer = (typeof buffer === 'undefined') ? chunk : Buffer.concat([buffer, chunk]); - } - - return buffer ? buffer : Buffer.from(''); -} - -export function get(url: string, opt: {stream: boolean} = { stream: false }): Promise { - return opt.stream ? requestStream(url, 'GET', undefined) : request(url, 'GET', undefined); -} - -export function post(url: string, requestData?: RequestData): Promise { - return request(url, 'POST', requestData); -} diff --git a/src/index.mts b/src/index.mts index e2929f8..0673664 100644 --- a/src/index.mts +++ b/src/index.mts @@ -2,12 +2,6 @@ import type { Config } from './config.mjs'; export type { Config }; export type { Artifact, ArtifactProvider } from './artifact-provider.mjs'; export type { ProviderType, ArtifactProviderConfig } from './artifact-provider-config.mjs'; -export { - type DebDescriptor, - type DebRepo, - type Config as DebBuilderConfig, - DebBuilder, -} from './deb/deb-builder.mjs'; export { default as JfrogArtifactProvider } from './jfrog/artifact-provider.mjs'; export { createMetapointerFile as createS3MetapointerFile } from './s3-metapointer.mjs'; diff --git a/src/jewel-case.ts b/src/jewel-case.ts deleted file mode 100644 index b8e75fd..0000000 --- a/src/jewel-case.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Repo, RepoBuilder, scanSourceDir } from './repo-builder.js'; - -import { artifactoryHelper } from './artifactory-utils.js'; -import { configuration } from './config.js'; -import { WindowsRepoBuilder } from './windows-repo-builder.js'; - -export async function plan(outDir: string, sourceDir: string): Promise { - await artifactoryHelper().init(); - const repo = await scanSourceDir(sourceDir); - const builders = createBuilders(repo, outDir); - - const repoBuildResilts: Promise[] = []; - builders.forEach(builder => { - repoBuildResilts.push(builder.build()); - }); - - await Promise.all(repoBuildResilts); -} - -export function apply(repoDir?: string): void { - console.log(repoDir); -} - -function createBuilders(repo: Repo, outDir: string): RepoBuilder[] { - const builders: RepoBuilder[] = []; - const hasMsixS3 = Boolean(configuration().exhaust?.msixS3); - - if (hasMsixS3) { - builders.push(new WindowsRepoBuilder(artifactoryHelper(), repo, outDir)); - } - - return builders; -} diff --git a/src/mac/mac-builder.mts b/src/mac/mac-builder.mts index a365bd4..d1e8c8b 100644 --- a/src/mac/mac-builder.mts +++ b/src/mac/mac-builder.mts @@ -40,12 +40,6 @@ function interateChannels(repo: MacRepo, callback: (channel: string, channelObj: }); } -const YmlContentTemplate = -`version: $VERSION -path: $PATH -sha512: $SHA512 -releaseDate: '$DATE'`; - function iteratePackages(repo: MacRepo, callback: (channel: string, pack: PackageDescriptor) => void): void { const channels = Object.keys(repo); @@ -60,6 +54,12 @@ function iteratePackages(repo: MacRepo, callback: (channel: string, pack: Packag }); } +const YmlContentTemplate = +`version: $VERSION +path: $PATH +sha512: $SHA512 +releaseDate: '$DATE'`; + export class MacBuilder implements Deployer { private readonly config: Config; private readonly artifactProvider: ArtifactProvider; diff --git a/src/repo-builder.ts b/src/repo-builder.ts deleted file mode 100644 index 9ea53a4..0000000 --- a/src/repo-builder.ts +++ /dev/null @@ -1,94 +0,0 @@ -import * as fs from 'fs'; -import * as path from 'path'; -import * as semver from 'semver'; - -export interface Package { - version: string, - buildNumber: string, -} - -interface Release { - packages: Package[], - highest: Package, -} - -type Channel = string; -export type Repo = Map; - -export interface RepoBuilder { - build(): Promise; -} - -export async function scanSourceDir(sourceDir: string): Promise { - console.log(`Prepearing meta repo from "${sourceDir}"`); - const repo: Repo = new Map(); - - const processChannelDirectory = async(srcPath: string, channel: string): Promise => { - const fullChannelPath = path.resolve(srcPath, channel); - const list: string[] = await fs.promises.readdir(fullChannelPath); - const packages: Package[] = []; - - const findHighestVersion = (packs: Package[]): Package => { - let highest: Package = { - version: '0.0.0', - buildNumber: '', - }; - - for (const pack of packs) { - if (semver.compare(pack.version, highest.version) > 0) { - highest = pack; - } - } - - if (highest.version === '0.0.0') { - throw new Error('Could not find highest version'); - } - - return highest; - }; - - if (list.length === 0) { - throw new Error(`Channel directory "${fullChannelPath}" is empty`); - } - - for (const releasePath of list) { - const fullReleasePath = path.resolve(fullChannelPath, releasePath); - const key = path.relative(sourceDir, fullReleasePath); - const stats = fs.lstatSync(fullReleasePath); - - console.log(`${key} found`); - - const version = path.basename(releasePath, '.txt'); - - if (stats.isDirectory()) { - console.log(`Skipping directory - ${fullReleasePath}`); - } else if (stats.isFile()) { - const buildNumber = fs.readFileSync(fullReleasePath).toString(); - packages.push({ version, buildNumber }); - } - } - - repo.set(channel, { packages, highest: findHighestVersion(packages) }); - }; - - const iterateDirectory = async(dirPath: string): Promise => { - const list: string[] = await fs.promises.readdir(dirPath); - - if (list.length === 0) { - throw new Error(`Source directory "${dirPath}" is empty`); - } - - const processResults: Promise[] = []; - for (const channel of list) { - processResults.push(processChannelDirectory(dirPath, channel)); - } - - await Promise.all(processResults); - }; - - await iterateDirectory(sourceDir); - - return repo; -} - - diff --git a/src/repo.mts b/src/repo.mts deleted file mode 100644 index 74225a6..0000000 --- a/src/repo.mts +++ /dev/null @@ -1,15 +0,0 @@ -export interface Package { - version: string, - buildNumber: string -} - -export interface Packages { - packages: Package[], - highest: Package, -} - -export type Channel = string; -export type Repo = { - channel: Channel, - packages: Packages -}[] diff --git a/src/utils.ts b/src/utils.ts deleted file mode 100644 index 4c53760..0000000 --- a/src/utils.ts +++ /dev/null @@ -1,85 +0,0 @@ -import * as fs from 'fs'; - -import { spawnSync } from 'child_process'; - -export function createMetapointerContent(fileMd5Hash: string): string { - return `#metapointer jfrogart\noid md5:${fileMd5Hash}`; -} - -export function createFile(path: string, content: string): void { - const dirPath = path.split('/').slice(0, -1) - .join('/'); - - createDir(dirPath); - - fs.writeFileSync(path, content); -} - -export function createDir(dirName: string): void { - if (!fs.existsSync(dirName)) { - fs.mkdirSync(dirName, { recursive: true }); - } -} - -export function ignorePromise(promise: Promise): void { - promise.catch((error: unknown) => { - const err = error as Error; - console.warn(`Ignoring promise, but error: ${err.message}`); - console.warn(err.stack); - }); -} - -// eslint-disable-next-line max-params -export async function execToolToFile(tool: string, args: string[], outputPath?: string, append?: boolean): Promise { - if (!append && outputPath && fs.existsSync(outputPath)) { - await fs.promises.unlink(outputPath); - } - - const toolProcessResult = spawnSync(tool, args, { stdio: 'pipe', encoding: 'utf-8' }); - const toolOutput = toolProcessResult.stdout; - - const dumpToolOutput = (): void => { - const toolErrOutput = toolProcessResult.stderr; - if (toolOutput && toolOutput.length > 0) { - console.log(toolOutput); - } - if (toolErrOutput && toolErrOutput.length > 0) { - console.warn(toolErrOutput); - } - }; - - if (outputPath) { - console.log(`Execute ${tool} ${args.join(' ')} => ${outputPath}`); - dumpToolOutput(); - if (append) { - return fs.promises.appendFile(outputPath, toolOutput); - } - - return fs.promises.writeFile(outputPath, toolOutput); - } - - console.log(`Execute ${tool} ${args.join(' ')}`); - dumpToolOutput(); - - return Promise.resolve(); -} - -export function getMessageOfError(error: unknown): string { - if (error === null || typeof error === 'undefined') { - return ''; - } - - if (error instanceof Error) { - return error.message; - } - - if (typeof error === 'string') { - return error; - } - - if (typeof error === 'object') { - return (error as { message?: string; }).message ?? 'unknown error'; - } - - return 'unknown error'; -} diff --git a/src/windows-repo-builder.ts b/src/windows-repo-builder.ts deleted file mode 100644 index 2ae6fdd..0000000 --- a/src/windows-repo-builder.ts +++ /dev/null @@ -1,149 +0,0 @@ -import * as fs from 'fs'; -import * as path from 'path'; - -import { TextEncoder } from 'util'; - -import type { Artifact, ArtifactoryHelper } from './artifactory-utils.js'; -import type { Package, Repo, RepoBuilder } from './repo-builder.js'; - -import { createDir, createFile, createMetapointerContent } from './utils.js'; -import { configuration } from './config.js'; - -export interface MsixS3Config { - msixS3: { - msixName: string, - appInstaller: { - name: string, - host: string, - hoursBetweenUpdateChecks: number, - packageName: string, - publisher: string - } - } -} - -export class WindowsRepoBuilder implements RepoBuilder { - private readonly artifactory: ArtifactoryHelper; - private readonly repo: Repo; - private readonly out: string; - private readonly config: MsixS3Config; - private readonly arch: string = 'x64'; - - constructor(artifactory: ArtifactoryHelper, repo: Repo, out: string) { - this.artifactory = artifactory; - this.repo = repo; - this.out = out; - - const msixConfig = configuration().exhaust?.msixS3; - - if (msixConfig) { - this.config = { msixS3: msixConfig }; - } else { - throw new Error('MsixS3Config must be specified'); - } - } - - public build(): Promise { - return this.prepareJfrogMetaFiles(); - } - - private async prepareJfrogMetaFiles(): Promise { - console.log('WindowsBuilder: prepareJfrogMetaFiles'); - - const channelResult: Promise[] = []; - const latestResult: Promise[] = []; - - for (const [channel, release] of this.repo) { - channelResult.push(this.makeChannel(channel, release.packages)); - } - - await Promise.all(channelResult); - - for (const [channel, release] of this.repo) { - latestResult.push(this.makeLatest(channel, release.highest)); - } - - // eslint-disable-next-line no-empty-function - return Promise.all(latestResult).then(() => {}); - } - - private async artifactsWithVersion(version: string, buildNumber: string): Promise<{ version: string, artifacts: Artifact[] }> { - return { version, artifacts: await this.artifactory.windowsArtifactsByBuildNumber(buildNumber) }; - } - - private async makeChannel(channel: string, packs: Package[]): Promise { - const artifactsResult: Promise<{ version: string, artifacts: Artifact[] }>[] = []; - - packs.forEach(pack => { - artifactsResult.push(this.artifactsWithVersion(pack.version, pack.buildNumber)); - }); - - const artifacts = await Promise.all(artifactsResult); - - artifacts.forEach(value => { - console.log(`WindowsBuilder: Processing ${value.version}`); - value.artifacts.forEach(artifact => { - const msixDir = path.join(this.out, channel, value.version, 'win32', this.arch); - createDir(msixDir); - this.createMsix(msixDir, artifact.md5); - }); - }); - } - - private async makeLatest(channel: string, highest: Package): Promise { - console.log('WindowsBuilder: makeRelease'); - - const latestDir = path.join(this.out, channel, 'latest', 'win32', this.arch); - createDir(latestDir); - - this.createAppInstallerFile(latestDir, `${highest.version}.${highest.buildNumber}`, channel); - await fs.promises.copyFile(path.join(this.out, channel, highest.version, 'win32', this.arch, `${this.config.msixS3.msixName}.msix`), - path.join(latestDir, `${this.config.msixS3.msixName}.msix`)); - } - - private createAppInstallerFile(out: string, version: string, channel: string): void { - const appInstallerContent = this.appInstallerFileContent(version, channel); - const adjustedAppInstallerContent = adjustAppinstallerSize(appInstallerContent); - - createFile(`${out}/${this.config.msixS3.appInstaller.name}.appinstaller`, adjustedAppInstallerContent); - } - - private appInstallerFileContent(version: string, channel: string): string { - return ` - - - - - - \n`; - } - - private createMsix(out: string, md5: string): void { - createFile(`${out}/${this.config.msixS3.msixName}.msix`, createMetapointerContent(md5)); - } -} - -function adjustAppinstallerSize(appInstallerContent: string): string { - const encoder = new TextEncoder(); - const appInstallerRequiredSize = 4096; - - const createFillComment = (fillComment: string): string => ``; - - const appInstallerContentSize = encoder.encode(appInstallerContent).length; - const fillCommentSize = appInstallerRequiredSize - appInstallerContentSize - encoder.encode(createFillComment('')).length; - - if (fillCommentSize >= 0) { - const commentStr = new Array(fillCommentSize + 1).join('X'); - return `${appInstallerContent}${createFillComment(commentStr)}`; - } - - throw new Error('Appinstaller file is too big'); -} diff --git a/src/windows/windows-builder.mts b/src/windows/windows-builder.mts new file mode 100644 index 0000000..8b82fe2 --- /dev/null +++ b/src/windows/windows-builder.mts @@ -0,0 +1,186 @@ +import * as fs from 'fs'; +import * as path from 'path'; + +import { TextEncoder } from 'util'; + +import type { Artifact } from '../artifact-provider.mjs'; +import type { Deployer } from '../deployer.mjs'; + +type Channel = string; + +export interface PackageDescriptor { + version: string, + buildNumber: string, + msix: Artifact +} + +export interface WindowsRepo { + [key: Channel]: { + latest: string, + additionalFiles?: string[], + packages: PackageDescriptor[] + } +} + +export interface Config { + host: string, + out: string, + repo: WindowsRepo +} + +function interateChannels(repo: WindowsRepo, callback: (channel: string, channelObj: { + latest: string, + additionalFiles?: string[], + packages: PackageDescriptor[]}) => void): void { + const channels = Object.keys(repo); + + channels.forEach(channel => { + const channelObject = repo[channel]; + if (channelObject) { + callback(channel, channelObject); + } + }); +} + +function iteratePackages(repo: WindowsRepo, callback: (channel: string, pack: PackageDescriptor) => void): void { + const channels = Object.keys(repo); + + channels.forEach(channel => { + const channelObject = repo[channel]; + if (channelObject) { + const packs = channelObject.packages; + packs.forEach(pack => { + callback(channel, pack); + }); + } + }); +} + +const AppInstallerContentTemplate = +` + + + + + +\n`; + +export class WindowsBuilder implements Deployer { + private readonly config: Config; + private readonly packageCreator: (md5: string, path: string) => (Promise | void); + + constructor(config: Config, packageCreator: (md5: string, path: string) => (Promise | void)) { + this.config = config; + this.packageCreator = packageCreator; + } + + public async plan(): Promise { + await this.makePackages(); + await this.makeRelease(); + } + + public apply(): void { + console.log(this); + } + + private async makePackages(): Promise { + const promises: Promise[] = []; + + iteratePackages(this.config.repo, (channel: string, packs: PackageDescriptor) => { + promises.push(this.handlePackage(channel, packs)); + }); + + await Promise.all(promises); + } + + private async makeRelease(): Promise { + const promises: Promise[] = []; + + interateChannels(this.config.repo, (channel: string, channelObj: { latest: string, packages: PackageDescriptor[]}) => { + promises.push(this.handleLatest(channel, channelObj)); + }); + + await Promise.all(promises); + } + + private async handlePackage(channel: string, pack: PackageDescriptor): Promise { + const msixPath = path.join(this.config.out, channel, pack.version, 'win32', 'TradingView.msix'); + + const msixCreation = this.packageCreator(pack.msix.md5, msixPath); + + if (msixCreation instanceof Promise) { + await msixCreation; + } + } + + private async handleLatest(channel: string, channelObj: {latest: string, additionalFiles?: string[], packages: PackageDescriptor[]}): Promise { + const latestPath = path.posix.join(channel, 'latest', 'win32'); + const appinstallerPath = path.posix.join(latestPath, 'Tradingview.appinstaller'); + const msixPath = path.join(latestPath, 'TradingView.msix'); + const latestPackage = channelObj.packages.find(pack => pack.version === channelObj.latest); + const promises: Promise[] = []; + + if (!latestPackage) { + throw new Error('latest must be specified'); + } + + const msixCreation = this.packageCreator(latestPackage.msix.md5, path.posix.join(this.config.out, msixPath)); + + if (msixCreation instanceof Promise) { + promises.push(msixCreation); + } + + const appinstallerUri = new URL(path.posix.join(this.config.host, appinstallerPath)).toString(); + const appinstallerVersion = `${latestPackage.version}.${latestPackage.buildNumber}`; + const packageName = 'TradingView.Desktop'; + const packageVersion = appinstallerVersion; + const publisher = 'CN="TradingView, Inc.", O="TradingView, Inc.", S=Ohio, C=US'; + const msixUri = new URL(path.posix.join(this.config.host, channel, latestPackage.version, 'win32', 'x64', 'TradingView.msix')).toString(); + + const appinstallerContent = AppInstallerContentTemplate + .replace('$APPINSTALLER_URI', appinstallerUri) + .replace('$APPINSTALLER_VERSION', appinstallerVersion) + .replace('$PACKAGE_NAME', packageName) + .replace('$PACKAGE_VERSION', packageVersion) + .replace('$PUBLISHER', publisher) + .replace('$ARCH', 'x64') + .replace('$MSIX_URI', msixUri) + .replace('$UPDATES_INTERVAL', '1'); + + promises.push(fs.promises.writeFile(path.posix.join(this.config.out, appinstallerPath), adjustAppinstallerSize(appinstallerContent))); + + channelObj.additionalFiles?.forEach(filePath => { + const resolvedFilePath = path.resolve(filePath); + const targetPath = path.join(this.config.out, latestPath, path.basename(resolvedFilePath)); + promises.push(fs.promises.copyFile(resolvedFilePath, targetPath)); + }); + + await Promise.all(promises); + } +} + +function adjustAppinstallerSize(appInstallerContent: string): string { + const encoder = new TextEncoder(); + const appInstallerRequiredSize = 4096; + + const createFillComment = (fillComment: string): string => ``; + + const appInstallerContentSize = encoder.encode(appInstallerContent).length; + const fillCommentSize = appInstallerRequiredSize - appInstallerContentSize - encoder.encode(createFillComment('')).length; + + if (fillCommentSize >= 0) { + const commentStr = new Array(fillCommentSize + 1).join('X'); + return `${appInstallerContent}${createFillComment(commentStr)}`; + } + + throw new Error('Appinstaller file is too big'); +}