diff --git a/.github/workflows/benckmark.yml b/.github/workflows/benckmark.yml new file mode 100644 index 000000000..29c6e42e3 --- /dev/null +++ b/.github/workflows/benckmark.yml @@ -0,0 +1,168 @@ +--- +name: ci - benchmark + +on: + schedule: + # 3 times day + # collecting enough data to draw some graphics + - cron: '0 0/8 * * *' + # push: + # branches: + # - master +jobs: + prepare: + name: Prepare build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: 14.x + - name: install pnpm + run: sudo npm i pnpm@6.6.1 -g + - name: set store + run: | + mkdir ~/.pnpm-store + pnpm config set store-dir ~/.pnpm-store + - name: setup pnpm config registry + run: pnpm config set registry https://registry.verdaccio.org + - name: install dependencies + run: pnpm install + - name: Cache .pnpm-store + uses: actions/cache@v2 + with: + path: ~/.pnpm-store + key: pnpm-${{ hashFiles('pnpm-lock.yaml') }} + restore-keys: | + pnpm- + - name: build + run: pnpm build + - name: tar packages + run: | + tar -czvf ${{ github.workspace }}/pkg.tar.gz -C ${{ github.workspace }}/packages . + - uses: actions/upload-artifact@v2 + with: + name: verdaccio-artifact + path: pkg.tar.gz + benchmark-autocannon: + needs: prepare + strategy: + fail-fast: false + matrix: + benchmark: + - info + - tarball + verdaccioVersion: + # - local + - 3.13.1 + - 4.12.1 + - 5.1.0 + name: Benchmark autocannon + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: 14.x + - uses: actions/download-artifact@v2 + with: + name: verdaccio-artifact + - name: untar packages + run: tar -xzvf pkg.tar.gz -C ${{ github.workspace }}/packages + - name: install pnpm + # require fixed version + run: sudo npm i pnpm@6.6.1 -g + - uses: actions/cache@v2 + with: + path: ~/.pnpm-store + key: pnpm-${{ hashFiles('pnpm-lock.yaml') }} + - name: install dependencies + run: pnpm install + - name: start registry + run: ./scripts/benchmark-prepare.sh ${{matrix.verdaccioVersion}} + - name: benchmark + run: pnpm benchmark:api -- -v ${{matrix.verdaccioVersion}} -f ${{matrix.benchmark}} + shell: bash + env: + DEBUG: metrics* + - uses: actions/upload-artifact@v2 + with: + name: verdaccio-metrics + path: ./api-results-${{matrix.verdaccioVersion}}-${{matrix.benchmark}}.json + if-no-files-found: error + retention-days: 10 + - name: submit metrics + run: pnpm benchmarka:submit + env: + DEBUG: metrics + METRICS_SOURCE: autocannon + METRICS_URL: ${{ secrets.METRICS_URL }} + METRICS_TOKEN: ${{ secrets.METRICS_TOKEN }} + METRICS_BENCHMARK: ${{matrix.benchmark}} + METRICS_VERSION: ${{matrix.verdaccioVersion}} + METRICS_COMMIT_HASH: ${{ github.sha }} + METRICS_FILE_NAME: 'api-results' + benchmark: + needs: prepare + strategy: + fail-fast: false + matrix: + benchmark: + - info + - tarball + verdaccioVersion: + # future 6.x (wip) + # - local (master branch) + # old versions to compare same test along previous releases + - 3.13.1 + - 4.12.1 + - 5.1.0 + name: Benchmark hyperfine + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: 14.x + - uses: actions/download-artifact@v2 + with: + name: verdaccio-artifact + - name: untar packages + run: tar -xzvf pkg.tar.gz -C ${{ github.workspace }}/packages + - name: install pnpm + # require fixed version + run: sudo npm i pnpm@6.6.1 -g + - uses: actions/cache@v2 + with: + path: ~/.pnpm-store + key: pnpm-${{ hashFiles('pnpm-lock.yaml') }} + - name: install dependencies + run: pnpm install + - name: install hyperfine + run: | + wget https://github.com/sharkdp/hyperfine/releases/download/v1.11.0/hyperfine_1.11.0_amd64.deb + sudo dpkg -i hyperfine_1.11.0_amd64.deb + - name: start registry + run: ./scripts/benchmark-prepare.sh ${{matrix.verdaccioVersion}} + - name: benchmark + run: ./scripts/benchmark-run.sh ${{matrix.benchmark}} + # https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#using-a-specific-shell + shell: bash + - name: rename + run: mv ./hyper-results.json ./hyper-results-${{matrix.verdaccioVersion}}-${{matrix.benchmark}}.json + - uses: actions/upload-artifact@v2 + with: + name: verdaccio-metrics + path: ./hyper-results-${{matrix.verdaccioVersion}}-${{matrix.benchmark}}.json + if-no-files-found: error + retention-days: 10 + - name: submit metrics + run: pnpm benchmarka:submit + env: + DEBUG: metrics + METRICS_SOURCE: hyperfine + METRICS_URL: ${{ secrets.METRICS_URL }} + METRICS_TOKEN: ${{ secrets.METRICS_TOKEN }} + METRICS_BENCHMARK: ${{matrix.benchmark}} + METRICS_VERSION: ${{matrix.verdaccioVersion}} + METRICS_COMMIT_HASH: ${{ github.sha }} diff --git a/.gitignore b/.gitignore index 555388d63..30e1aee5c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,22 +2,17 @@ verdaccio-*.tgz .DS_Store build/ +dist/ .eslintcache -./dist - -### Test +node_modules +### database .verdaccio-db.json .sinopia-db.json -### +### test test-storage* .verdaccio_test_env -node_modules -package-lock.json -yarn-error.log -yarn.lock - # docker examples docker-examples/v5/reverse_proxy/nginx/relative_path/storage/* @@ -36,12 +31,15 @@ tsconfig.tsbuildinfo ## bundle files packages/standalone/dist/ + ## ui packages/plugins/ui-theme/static -# website -website/public -website/.cache - # CI Pnpm cache .pnpm-store/ + +# benchmark +api-results.json +hyper-results.json +hyper-results*.json +api-results*.json diff --git a/package.json b/package.json index cb63f0a9e..15fc8d16b 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "@types/lodash": "4.14.167", "@types/lowdb": "^1.0.9", "@types/mime": "2.0.2", + "@types/autocannon": "4.1.0", "@types/minimatch": "3.0.3", "@types/node": "^14.14.7", "@types/react": "16.14.2", @@ -71,6 +72,7 @@ "@typescript-eslint/parser": "4.13.0", "@verdaccio/types": "workspace:*", "@verdaccio/ui-theme": "workspace:*", + "@verdaccio/benchmark": "workspace:*", "@verdaccio/eslint-config": "workspace:*", "babel-core": "7.0.0-bridge.0", "babel-eslint": "10.1.0", @@ -82,6 +84,7 @@ "core-js": "^3.12.1", "cross-env": "7.0.3", "detect-secrets": "1.0.6", + "autocannon": "7.3.0", "eslint": "7.26.0", "eslint-config-google": "0.14.0", "eslint-config-prettier": "8.3.0", @@ -95,6 +98,7 @@ "eslint-plugin-verdaccio": "10.0.0", "eslint-plugin-prettier": "3.4.0", "fs-extra": "9.1.0", + "debug": "4.3.1", "get-stdin": "7.0.0", "husky": "2.7.0", "in-publish": "2.0.1", @@ -108,6 +112,7 @@ "lint-staged": "8.2.1", "nock": "12.0.3", "nodemon": "^2.0.7", + "node-fetch": "2.6.1", "npm-run-all": "4.1.5", "prettier": "2.3.0", "rimraf": "3.0.2", @@ -116,7 +121,7 @@ "ts-node": "^9.1.1", "typescript": "^4.2.4", "update-ts-references": "2.3.0", - "verdaccio": "^5.0.4", + "verdaccio": "5.1.0", "verdaccio-audit": "workspace:*", "verdaccio-auth-memory": "workspace:*", "verdaccio-htpasswd": "workspace:*", @@ -133,6 +138,9 @@ "test:e2e:cli": "pnpm test --filter ...@verdaccio/e2e-cli", "test:e2e:ui": "pnpm test --filter ...@verdaccio/e2e-ui", "start": "concurrently --kill-others \"pnpm _start:server\" \"pnpm _start:web\"", + "benchmark:hyper": "verdaccio-benchmark hyper -r ./hyper-results.json", + "benchmark:api": "verdaccio-benchmark api", + "benchmarka:submit": "pnpm ts-node ./scripts/submit-metrics.ts", "start:watch": "concurrently --kill-others \"pnpm _build:watch\" \"pnpm _start:server\" \"pnpm _debug:reload\"", "_build:watch": "pnpm run --parallel watch --filter ./packages", "_start:server": "node packages/verdaccio/debug/bootstrap.js --listen 8000", diff --git a/packages/tools/benchmark/.babelrc b/packages/tools/benchmark/.babelrc new file mode 100644 index 000000000..851856e59 --- /dev/null +++ b/packages/tools/benchmark/.babelrc @@ -0,0 +1,3 @@ +{ + "extends": "../../../.babelrc" +} diff --git a/packages/tools/benchmark/index.js b/packages/tools/benchmark/index.js new file mode 100755 index 000000000..1e0215748 --- /dev/null +++ b/packages/tools/benchmark/index.js @@ -0,0 +1 @@ +require('./build/index.js'); diff --git a/packages/tools/benchmark/package.json b/packages/tools/benchmark/package.json new file mode 100644 index 000000000..d03e1f51c --- /dev/null +++ b/packages/tools/benchmark/package.json @@ -0,0 +1,28 @@ +{ + "name": "@verdaccio/benchmark", + "version": "1.0.0", + "bin": { + "verdaccio-benchmark": "./index.js" + }, + "private": "true", + "description": "benchmark", + "main": "./build/index.js", + "scripts": { + "build": "babel src/ --out-dir build/ --copy-files --extensions \".ts,.tsx\" --source-maps", + "run": "ts-node src/init.ts" + }, + "keywords": [], + "author": "Juan Picado ", + "license": "MIT", + "dependencies": { + "clipanion": "3.0.0-rc.12", + "temp-dir": "2.0.0", + "get-port": "5.1.1", + "semver": "7.3.5" + }, + "devDependencies": { + "autocannon": "7.3.0", + "node-fetch": "2.6.1", + "ts-node": "10.0.0" + } +} diff --git a/packages/tools/benchmark/src/api/index.ts b/packages/tools/benchmark/src/api/index.ts new file mode 100644 index 000000000..8964bf677 --- /dev/null +++ b/packages/tools/benchmark/src/api/index.ts @@ -0,0 +1,26 @@ +/* eslint-disable no-console */ +import { Command, Option } from 'clipanion'; +import runApi from './run'; + +export class ApiCommand extends Command { + public static paths = [['api']]; + + private benchmark = Option.String('-f', { + description: 'benchmark to run', + required: true, + }); + + private version = Option.String('-v', { + description: 'version is running', + required: true, + }); + + public async execute() { + try { + await runApi(this.benchmark, this.version); + } catch (err) { + console.error(err); + process.exit(1); + } + } +} diff --git a/packages/tools/benchmark/src/api/run.ts b/packages/tools/benchmark/src/api/run.ts new file mode 100644 index 000000000..d50993c59 --- /dev/null +++ b/packages/tools/benchmark/src/api/run.ts @@ -0,0 +1,40 @@ +import { writeFileSync } from 'fs'; + +const path = require('path'); +const debug = require('debug')('metrics:autocannon'); +const autocannon = require('autocannon'); + +function getURL(benchmark) { + switch (benchmark) { + case 'info': + return 'http://localhost:4873/jquery'; + case 'tarball': + return 'http://localhost:4873/jquery/-/jquery-3.6.0.tgz'; + default: + throw new TypeError('no benckmark supported'); + } +} + +export default async function run(benchmark, version) { + try { + debug('api report start'); + debug('url', getURL(benchmark)); + const result = await autocannon({ + url: getURL(benchmark), + connections: 10, + pipelining: 1, + duration: 10, + }); + const wrapResults = { + results: [result], + }; + const reportPath = path.join(process.cwd(), `./api-results-${version}-${benchmark}.json`); + debug('report path %o', reportPath); + writeFileSync(reportPath, JSON.stringify(wrapResults, null, 2), 'utf-8'); + debug('report ends'); + } catch (err) { + // eslint-disable-next-line no-console + console.error(`error on process autocannon run`, err); + process.exit(1); + } +} diff --git a/packages/tools/benchmark/src/index.ts b/packages/tools/benchmark/src/index.ts new file mode 100644 index 000000000..546280d3a --- /dev/null +++ b/packages/tools/benchmark/src/index.ts @@ -0,0 +1,25 @@ +import { Cli } from 'clipanion'; +import { ApiCommand } from './api'; + +const [node, app, ...args] = process.argv; + +// eslint-disable-next-line no-console +console.log('--args', args); + +const cli = new Cli({ + binaryLabel: `benckmark`, + binaryName: `${node} ${app}`, + binaryVersion: require('../package.json').version, +}); + +cli.register(ApiCommand); +cli.runExit(args, Cli.defaultContext); + +process.on('uncaughtException', function (err) { + // eslint-disable-next-line no-console + console.error( + // eslint-disable-next-line max-len + `uncaught exception, please report (https://github.com/verdaccio/verdaccio/issues) this: \n${err.stack}` + ); + process.exit(1); +}); diff --git a/packages/tools/benchmark/tsconfig.build.json b/packages/tools/benchmark/tsconfig.build.json new file mode 100644 index 000000000..db054aa8c --- /dev/null +++ b/packages/tools/benchmark/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./build" + }, + "include": ["src/**/*"], + "exclude": ["src/**/*.test.ts"] +} diff --git a/packages/tools/benchmark/tsconfig.json b/packages/tools/benchmark/tsconfig.json new file mode 100644 index 000000000..12d3aae27 --- /dev/null +++ b/packages/tools/benchmark/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.reference.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./build" + }, + "include": ["src/**/*"], + "exclude": ["src/**/*.test.ts"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 68cfda9a7..7867930a9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,6 +35,7 @@ importers: '@commitlint/config-conventional': 8.2.0 '@octokit/rest': 17.0.0 '@types/async': 3.2.5 + '@types/autocannon': 4.1.0 '@types/autosuggest-highlight': 3.1.1 '@types/express': 4.17.6 '@types/http-errors': 1.8.0 @@ -59,9 +60,11 @@ importers: '@types/webpack-env': 1.16.0 '@typescript-eslint/eslint-plugin': 4.13.0 '@typescript-eslint/parser': 4.13.0 + '@verdaccio/benchmark': workspace:* '@verdaccio/eslint-config': workspace:* '@verdaccio/types': workspace:* '@verdaccio/ui-theme': workspace:* + autocannon: 7.3.0 babel-core: 7.0.0-bridge.0 babel-eslint: 10.1.0 babel-jest: 26.6.3 @@ -71,6 +74,7 @@ importers: concurrently: ^5.3.0 core-js: ^3.12.1 cross-env: 7.0.3 + debug: 4.3.1 detect-secrets: 1.0.6 eslint: 7.26.0 eslint-config-google: 0.14.0 @@ -97,6 +101,7 @@ importers: kleur: 4.1.4 lint-staged: 8.2.1 nock: 12.0.3 + node-fetch: 2.6.1 nodemon: ^2.0.7 npm-run-all: 4.1.5 prettier: 2.3.0 @@ -106,7 +111,7 @@ importers: ts-node: ^9.1.1 typescript: ^4.2.4 update-ts-references: 2.3.0 - verdaccio: ^5.0.4 + verdaccio: 5.1.0 verdaccio-audit: workspace:* verdaccio-auth-memory: workspace:* verdaccio-htpasswd: workspace:* @@ -143,6 +148,7 @@ importers: '@commitlint/config-conventional': 8.2.0 '@octokit/rest': 17.0.0 '@types/async': 3.2.5 + '@types/autocannon': 4.1.0 '@types/autosuggest-highlight': 3.1.1 '@types/express': 4.17.6 '@types/http-errors': 1.8.0 @@ -167,9 +173,11 @@ importers: '@types/webpack-env': 1.16.0 '@typescript-eslint/eslint-plugin': 4.13.0_82a146d320a394c7e8b76cadf227b197 '@typescript-eslint/parser': 4.13.0_eslint@7.26.0+typescript@4.2.4 + '@verdaccio/benchmark': link:packages/tools/benchmark '@verdaccio/eslint-config': link:packages/tools/eslint '@verdaccio/types': link:packages/core/types '@verdaccio/ui-theme': link:packages/plugins/ui-theme + autocannon: 7.3.0 babel-core: 7.0.0-bridge.0_@babel+core@7.13.15 babel-eslint: 10.1.0_eslint@7.26.0 babel-jest: 26.6.3_@babel+core@7.13.15 @@ -179,6 +187,7 @@ importers: concurrently: 5.3.0 core-js: 3.12.1 cross-env: 7.0.3 + debug: 4.3.1 detect-secrets: 1.0.6 eslint: 7.26.0 eslint-config-google: 0.14.0_eslint@7.26.0 @@ -205,6 +214,7 @@ importers: kleur: 4.1.4 lint-staged: 8.2.1 nock: 12.0.3 + node-fetch: 2.6.1 nodemon: 2.0.7 npm-run-all: 4.1.5 prettier: 2.3.0 @@ -214,7 +224,7 @@ importers: ts-node: 9.1.1_typescript@4.2.4 typescript: 4.2.4 update-ts-references: 2.3.0_typescript@4.2.4 - verdaccio: 5.0.4 + verdaccio: 5.1.0 verdaccio-audit: link:packages/plugins/audit verdaccio-auth-memory: link:packages/plugins/auth-memory verdaccio-htpasswd: link:packages/core/htpasswd @@ -1021,6 +1031,25 @@ importers: '@verdaccio/mock': link:../mock '@verdaccio/types': link:../core/types + packages/tools/benchmark: + specifiers: + autocannon: 7.3.0 + clipanion: 3.0.0-rc.12 + get-port: 5.1.1 + node-fetch: 2.6.1 + semver: 7.3.5 + temp-dir: 2.0.0 + ts-node: 10.0.0 + dependencies: + clipanion: 3.0.0-rc.12 + get-port: 5.1.1 + semver: 7.3.5 + temp-dir: 2.0.0 + devDependencies: + autocannon: 7.3.0 + node-fetch: 2.6.1 + ts-node: 10.0.0 + packages/tools/eslint: specifiers: {} @@ -1162,6 +1191,10 @@ importers: packages: + /@assemblyscript/loader/0.10.1: + resolution: {integrity: sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==} + dev: true + /@babel/cli/7.13.14_@babel+core@7.13.15: resolution: {integrity: sha512-zmEFV8WBRsW+mPQumO1/4b34QNALBVReaiHJOkxhUsdo/AvYM62c+SKSuLi2aZ42t3ocK6OI0uwUXRvrIbREZw==} hasBin: true @@ -4225,6 +4258,22 @@ packages: resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} engines: {node: '>= 6'} + /@tsconfig/node10/1.0.7: + resolution: {integrity: sha512-aBvUmXLQbayM4w3A8TrjwrXs4DZ8iduJnuJLLRGdkWlyakCf1q6uHZJBzXoRA/huAEknG5tcUyQxN3A+In5euQ==} + dev: true + + /@tsconfig/node12/1.0.7: + resolution: {integrity: sha512-dgasobK/Y0wVMswcipr3k0HpevxFJLijN03A8mYfEPvWvOs14v0ZlYTR4kIgMx8g4+fTyTFv8/jLCIfRqLDJ4A==} + dev: true + + /@tsconfig/node14/1.0.0: + resolution: {integrity: sha512-RKkL8eTdPv6t5EHgFKIVQgsDapugbuOptNd9OOunN/HAkzmmTnZELx1kNCK0rSdUYGmiFMM3rRQMAWiyp023LQ==} + dev: true + + /@tsconfig/node16/1.0.1: + resolution: {integrity: sha512-FTgBI767POY/lKNDNbIzgAX6miIDBs6NTCbdlDb8TrWovHsSvaVIZDlTqym29C6UqhzwcJx4CYr+AlrMywA0cA==} + dev: true + /@types/activedirectory2/1.2.2: resolution: {integrity: sha512-YVvlqf7hemxSS7D+sG8FZO1ClrSScniOtwLoyA+sR8193U9PCBTlpo1JUZEcgHNA+rrIHMrsBHP3rbH3gtV0pg==} dependencies: @@ -4243,6 +4292,12 @@ packages: resolution: {integrity: sha512-fdtHUdfIxSfU6crUgUOEb6vxdquAOa75bh1sQVL/ePkmQDNo8Aj1056eGGI9cPls5tLRhnAyfoXljEk+hmhbxg==} dev: true + /@types/autocannon/4.1.0: + resolution: {integrity: sha512-SrG28f0RENabY2jCrz/xfkKqpaxorBSi8EcVxiFrGtvzlWNqOFAw35ASqEclLqkQXwyldmJLXqxebeFa1479vA==} + dependencies: + '@types/node': 14.14.41 + dev: true + /@types/autosuggest-highlight/3.1.1: resolution: {integrity: sha512-onPUHT+32TyI7ctiG7G/JtWlVkEBH2bw1onOWaea0L0dZmKNhP+KIOcrh7gnr2LTzD9/cjQlC7zJdv259dg0lg==} dev: true @@ -4921,8 +4976,8 @@ packages: lockfile: 1.0.4 dev: true - /@verdaccio/local-storage/10.0.1: - resolution: {integrity: sha512-dnrBZeuftSFjtQhp7Y+abbWPtM1luxEhP5+6152d8dMnNmomTMZWJcr/eUwKkw6o9d39d4NA4Pimm9bXEBGrdA==} + /@verdaccio/local-storage/10.0.6: + resolution: {integrity: sha512-YEImOMUL56lziS/N3o1YzoOcVGZXpyZclGSonw7XQ1lKQEvEhU06V2+tIdjPgtqIOuH9ZKdPeBsBuN7ILa2qzQ==} engines: {node: '>=8'} dependencies: '@verdaccio/commons-api': 10.0.0 @@ -4940,9 +4995,9 @@ packages: /@verdaccio/readme/10.0.0: resolution: {integrity: sha512-OD3dMnRC8SvhgytEzczMBleN+K/3lMqyWw/epeXvolCpCd7mW/Dl5zSR25GiHh/2h3eTKP/HMs4km8gS1MMLgA==} dependencies: - dompurify: 2.2.7 + dompurify: 2.2.9 jsdom: 15.2.1 - marked: 2.0.1 + marked: 2.0.5 transitivePeerDependencies: - bufferutil - canvas @@ -5830,6 +5885,33 @@ packages: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} + /autocannon/7.3.0: + resolution: {integrity: sha512-RuyTU8fQE1FC6BDgslofLCeI4y9y9RRnnZtvoQ+onwQl+B2rsiGpcCi84/Si0rq3VRkkMFnmPulY3z59zYhX9g==} + hasBin: true + dependencies: + chalk: 4.1.1 + char-spinner: 1.0.1 + cli-table3: 0.6.0 + clone: 2.1.2 + color-support: 1.1.3 + cross-argv: 1.0.0 + form-data: 4.0.0 + has-async-hooks: 1.0.0 + hdr-histogram-js: 2.0.1 + hdr-histogram-percentiles-obj: 3.0.0 + http-parser-js: 0.5.2 + hyperid: 2.1.0 + manage-path: 2.0.0 + on-net-listen: 1.1.2 + pretty-bytes: 5.6.0 + progress: 2.0.3 + reinterval: 1.1.0 + retimer: 3.0.0 + semver: 7.3.5 + subarg: 1.0.0 + timestring: 6.0.0 + dev: true + /autoprefixer/9.8.6: resolution: {integrity: sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==} hasBin: true @@ -5881,10 +5963,6 @@ packages: /aws4/1.10.1: resolution: {integrity: sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==} - /aws4/1.11.0: - resolution: {integrity: sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==} - dev: true - /axe-core/4.1.1: resolution: {integrity: sha512-5Kgy8Cz6LPC9DJcNb3yjAXTu3XihQgEdnIg50c//zOC/MyLP0Clg+Y8Sh9ZjjnvBrDZU4DgXS9C3T9r4/scGZQ==} engines: {node: '>=4'} @@ -6701,6 +6779,10 @@ packages: engines: {node: '>=10'} dev: true + /char-spinner/1.0.1: + resolution: {integrity: sha1-5upnvSR+EHESmDt6sEee02KAAIE=} + dev: true + /character-entities-legacy/1.1.4: resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} dev: true @@ -6828,6 +6910,16 @@ packages: engines: {node: '>=6'} dev: true + /cli-table3/0.6.0: + resolution: {integrity: sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==} + engines: {node: 10.* || >= 12.*} + dependencies: + object-assign: 4.1.1 + string-width: 4.2.2 + optionalDependencies: + colors: 1.4.0 + dev: true + /cli-truncate/0.2.1: resolution: {integrity: sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=} engines: {node: '>=0.10.0'} @@ -6840,6 +6932,12 @@ packages: resolution: {integrity: sha512-e0GyZXjprnxRuls/pHH0cqAgKtpiceQy8PztEZP9fdnkMxuo05D5en9fx60Iiqqjge8pmrMfsiglueS8SWmlgg==} dependencies: typanion: 3.3.0 + dev: false + + /clipanion/3.0.0-rc.12: + resolution: {integrity: sha512-eCixNguza61+8MXXTu6sYzpA8gPZHZzvay4lpFFpr4KSy+43wsugdiKMNejLS9PVcnSuGf0fy9kYs5R2c7Ejmw==} + dependencies: + typanion: 3.3.1 /cliui/5.0.0: resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} @@ -6883,6 +6981,11 @@ packages: engines: {node: '>=0.8'} dev: true + /clone/2.1.2: + resolution: {integrity: sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=} + engines: {node: '>=0.8'} + dev: true + /clsx/1.1.1: resolution: {integrity: sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==} engines: {node: '>=6'} @@ -6958,6 +7061,11 @@ packages: simple-swizzle: 0.2.2 dev: true + /color-support/1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: true + /color/3.1.2: resolution: {integrity: sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==} dependencies: @@ -6973,6 +7081,12 @@ packages: resolution: {integrity: sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==} dev: true + /colors/1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} + dev: true + optional: true + /combined-stream/1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -7409,6 +7523,10 @@ packages: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true + /cross-argv/1.0.0: + resolution: {integrity: sha512-uAVe/bgNHlPdP1VE4Sk08u9pAJ7o1x/tVQtX77T5zlhYhuwOWtVkPBEtHdvF5cq48VzeCG5i1zN4dQc8pwLYrw==} + dev: true + /cross-env/7.0.3: resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} @@ -8152,8 +8270,8 @@ packages: resolution: {integrity: sha512-vIOSyOXkMx81ghEalh4MLBtDHMx1bhKlaqHDMqM2yeitJ996SLOk5mGdDpI9ifJAgokred8Rmu219fX4OltqXw==} dev: false - /dompurify/2.2.7: - resolution: {integrity: sha512-jdtDffdGNY+C76jvodNTu9jt5yYj59vuTUyx+wXdzcSwAGTYZDAQkQ7Iwx9zcGrA4ixC1syU4H3RZROqRxokxg==} + /dompurify/2.2.9: + resolution: {integrity: sha512-+9MqacuigMIZ+1+EwoEltogyWGFTJZWU3258Rupxs+2CGs4H914G9er6pZbsme/bvb5L67o2rade9n21e4RW/w==} dev: true /domutils/1.5.1: @@ -8384,8 +8502,8 @@ packages: hasBin: true dev: true - /envinfo/7.7.4: - resolution: {integrity: sha512-TQXTYFVVwwluWSFis6K2XKxgrD22jEv0FTuLCQI+OjH7rn93+iY0fSSFM5lrSxFY+H1+B0/cvvlamr3UsBivdQ==} + /envinfo/7.8.1: + resolution: {integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==} engines: {node: '>=4'} hasBin: true dev: true @@ -9518,6 +9636,15 @@ packages: mime-types: 2.1.28 dev: true + /form-data/4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.30 + dev: true + /formidable/1.2.2: resolution: {integrity: sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==} @@ -9755,7 +9882,6 @@ packages: /get-port/5.1.1: resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} engines: {node: '>=8'} - dev: true /get-stdin/4.0.1: resolution: {integrity: sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=} @@ -10185,7 +10311,7 @@ packages: source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.13.3 + uglify-js: 3.12.4 dev: true /har-schema/2.0.0: @@ -10223,6 +10349,10 @@ packages: ansi-regex: 2.1.1 dev: true + /has-async-hooks/1.0.0: + resolution: {integrity: sha512-YF0VPGjkxr7AyyQQNykX8zK4PvtEDsUJAPqwu06UFz1lb6EvI53sPh5H1kWxg8NXI5LsfRCZ8uX9NkYDZBb/mw==} + dev: true + /has-bigints/1.0.1: resolution: {integrity: sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==} dev: true @@ -10307,6 +10437,18 @@ packages: resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} dev: true + /hdr-histogram-js/2.0.1: + resolution: {integrity: sha512-uPZxl1dAFnjUFHWLZmt93vUUvtHeaBay9nVNHu38SdOjMSF/4KqJUqa1Seuj08ptU1rEb6AHvB41X8n/zFZ74Q==} + dependencies: + '@assemblyscript/loader': 0.10.1 + base64-js: 1.5.1 + pako: 1.0.11 + dev: true + + /hdr-histogram-percentiles-obj/3.0.0: + resolution: {integrity: sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==} + dev: true + /he/1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true @@ -10591,6 +10733,13 @@ packages: slash: 3.0.0 dev: true + /hyperid/2.1.0: + resolution: {integrity: sha512-cSakhxbUsaIuqjfvvcUuvl/Fl342J65xgLLYrYxSSr9qmJ/EJK+S8crS6mIlQd/a7i+Pe4D0MgSrtZPLze+aCw==} + dependencies: + uuid: 3.4.0 + uuid-parse: 1.1.0 + dev: true + /hyphenate-style-name/1.0.4: resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==} dev: true @@ -11913,13 +12062,6 @@ packages: esprima: 4.0.1 dev: true - /js-yaml/4.0.0: - resolution: {integrity: sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==} - hasBin: true - dependencies: - argparse: 2.0.1 - dev: true - /js-yaml/4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -12862,6 +13004,10 @@ packages: tmpl: 1.0.4 dev: true + /manage-path/2.0.0: + resolution: {integrity: sha1-9M+EV7km7u4qg7FzUBQUvHbrlZc=} + dev: true + /map-cache/0.2.2: resolution: {integrity: sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=} engines: {node: '>=0.10.0'} @@ -12895,8 +13041,8 @@ packages: hasBin: true dev: false - /marked/2.0.1: - resolution: {integrity: sha512-5+/fKgMv2hARmMW7DOpykr2iLhl0NgjyELk5yn92iE7z8Se1IS9n3UsFm86hFXIkvMBmVxki8+ckcpjBeyo/hw==} + /marked/2.0.5: + resolution: {integrity: sha512-yfCEUXmKhBPLOzEC7c+tc4XZdIeTdGoRCZakFMkCxodr7wDXqoapIME4wjcpBPJLNyUnKJ3e8rb8wlAgnLnaDw==} engines: {node: '>= 8.16.2'} hasBin: true dev: true @@ -13982,6 +14128,11 @@ packages: resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} engines: {node: '>= 0.8'} + /on-net-listen/1.1.2: + resolution: {integrity: sha512-y1HRYy8s/RlcBvDUwKXSmkODMdx4KSuIvloCnQYJ2LdBBC1asY4HtfhXwe3UWknLakATZDnbzht2Ijw3M1EqFg==} + engines: {node: '>=9.4.0 || ^8.9.4'} + dev: true + /once/1.4.0: resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} dependencies: @@ -14212,6 +14363,10 @@ packages: semver: 6.3.0 dev: true + /pako/1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: true + /param-case/3.0.4: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} dependencies: @@ -14446,6 +14601,19 @@ packages: pino-std-serializers: 3.2.0 quick-format-unescaped: 4.0.1 sonic-boom: 1.4.1 + dev: false + + /pino/6.11.3: + resolution: {integrity: sha512-drPtqkkSf0ufx2gaea3TryFiBHdNIdXKf5LN0hTM82SXI4xVIve2wLwNg92e1MT6m3jASLu6VO7eGY6+mmGeyw==} + hasBin: true + dependencies: + fast-redact: 3.0.0 + fast-safe-stringify: 2.0.7 + flatstr: 1.0.12 + pino-std-serializers: 3.2.0 + quick-format-unescaped: 4.0.3 + sonic-boom: 1.4.1 + dev: true /pino/6.2.1: resolution: {integrity: sha512-5F5A+G25Ex2rMOBEe3XYGyLSF4dikQZsFvPojwsqnDBX+rfg7+kw9s5i7pHuVAJImekjwb+MR9jQyHWPLENlvQ==} @@ -15115,6 +15283,11 @@ packages: hasBin: true dev: true + /pretty-bytes/5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + dev: true + /pretty-error/2.1.1: resolution: {integrity: sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=} dependencies: @@ -15321,6 +15494,10 @@ packages: /quick-format-unescaped/4.0.1: resolution: {integrity: sha512-RyYpQ6Q5/drsJyOhrWHYMWTedvjTIat+FTwv0K4yoUxzvekw2aRHMQJLlnvt8UantkZg2++bEzD9EdxXqkWf4A==} + /quick-format-unescaped/4.0.3: + resolution: {integrity: sha512-MaL/oqh02mhEo5m5J2rwsVL23Iw2PEaGVHgT2vFt8AAsr0lfvQA5dpXo9TPu0rz7tSBdUPgkbam0j/fj5ZM8yg==} + dev: true + /quick-lru/1.1.0: resolution: {integrity: sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=} engines: {node: '>=4'} @@ -15777,6 +15954,10 @@ packages: jsesc: 0.5.0 dev: true + /reinterval/1.1.0: + resolution: {integrity: sha1-M2Hs+jymwYKDOA3Qu5VG85D17Oc=} + dev: true + /relateurl/0.2.7: resolution: {integrity: sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=} engines: {node: '>= 0.10'} @@ -15893,7 +16074,7 @@ packages: engines: {node: '>= 4'} dependencies: aws-sign2: 0.7.0 - aws4: 1.11.0 + aws4: 1.10.1 caseless: 0.12.0 combined-stream: 1.0.8 extend: 3.0.2 @@ -16082,6 +16263,10 @@ packages: engines: {node: '>=4'} dev: false + /retimer/3.0.0: + resolution: {integrity: sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA==} + dev: true + /retry-request/4.1.3: resolution: {integrity: sha512-QnRZUpuPNgX0+D1xVxul6DbJ9slvo4Rm6iV/dn63e048MvGbUZiKySVt6Tenp04JqmchxjiLltGerOJys7kJYQ==} engines: {node: '>=8.10.0'} @@ -16358,7 +16543,6 @@ packages: hasBin: true dependencies: lru-cache: 6.0.0 - dev: true /send/0.17.1: resolution: {integrity: sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==} @@ -17254,6 +17438,12 @@ packages: resolution: {integrity: sha512-1igcUEmYFBEO14uQHAJhCUelTR5jPztfdVKrYxRnDa5D5Dn3w0NxXupJNPr/VV/yRfZYEAco8sTIRZzH3sRYKg==} dev: true + /subarg/1.0.0: + resolution: {integrity: sha1-9izxdYHplrSPyWVpn1TAauJouNI=} + dependencies: + minimist: 1.2.5 + dev: true + /sugarss/2.0.0: resolution: {integrity: sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==} dependencies: @@ -17493,6 +17683,11 @@ packages: - supports-color dev: false + /temp-dir/2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + dev: false + /term-size/1.2.0: resolution: {integrity: sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=} engines: {node: '>=4'} @@ -17628,6 +17823,11 @@ packages: next-tick: 1.1.0 dev: true + /timestring/6.0.0: + resolution: {integrity: sha512-wMctrWD2HZZLuIlchlkE2dfXJh7J2KDI9Dwl+2abPYg0mswQHfOAyQW3jJg1pY5VfttSINZuKcXoB3FGypVklA==} + engines: {node: '>=8'} + dev: true + /timsort/0.3.0: resolution: {integrity: sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=} dev: true @@ -17786,6 +17986,33 @@ packages: resolution: {integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==} dev: true + /ts-node/10.0.0: + resolution: {integrity: sha512-ROWeOIUvfFbPZkoDis0L/55Fk+6gFQNZwwKPLinacRl6tsxstTF1DbAcLKkovwnpKMVvOMHP1TIbnwXwtLg1gg==} + engines: {node: '>=12.0.0'} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.45' + '@swc/wasm': '>=1.2.45' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@tsconfig/node10': 1.0.7 + '@tsconfig/node12': 1.0.7 + '@tsconfig/node14': 1.0.0 + '@tsconfig/node16': 1.0.1 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + source-map-support: 0.5.19 + yn: 3.1.1 + dev: true + /ts-node/9.1.1: resolution: {integrity: sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==} engines: {node: '>=10.0.0'} @@ -17889,6 +18116,10 @@ packages: /typanion/3.3.0: resolution: {integrity: sha512-e+54C4+ozFsTorFe50JNQlXlt4HVGQUvqul7VS0GbDfKlxh3aXbJY87Yu9IdtzvJWCyTgDX7q1PeMd3FH9zZqA==} + dev: false + + /typanion/3.3.1: + resolution: {integrity: sha512-VogBiMj3ZQuWaHkbhXwSgd9jXE4s7EMaaV7VSEiKTNYnKJs/bPjvcOGbD7rTM9aPqTABvgLVEZ+iFP6ab12HtQ==} /type-check/0.3.2: resolution: {integrity: sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=} @@ -17976,13 +18207,6 @@ packages: dev: true optional: true - /uglify-js/3.13.3: - resolution: {integrity: sha512-otIc7O9LyxpUcQoXzj2hL4LPWKklO6LJWoJUzNa8A17Xgi4fOeDC8FBDOLHnC/Slo1CQgsZMcM6as0M76BZaig==} - engines: {node: '>=0.8.0'} - hasBin: true - dev: true - optional: true - /unbox-primitive/1.0.1: resolution: {integrity: sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==} dependencies: @@ -18261,6 +18485,10 @@ packages: resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=} engines: {node: '>= 0.4.0'} + /uuid-parse/1.1.0: + resolution: {integrity: sha512-OdmXxA8rDsQ7YpNVbKSJkNzTw2I+S5WsbMDnCtIWSQaosNAcWtFuI/YK1TjzUI6nbkgiqEyh8gWngfcv8Asd9A==} + dev: true + /uuid/3.3.2: resolution: {integrity: sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==} hasBin: true @@ -18317,6 +18545,12 @@ packages: /validator/13.5.2: resolution: {integrity: sha512-mD45p0rvHVBlY2Zuy3F3ESIe1h5X58GPfAtslBjY7EtTqGquZTj+VX/J4RnHWN8FKq0C9WRVt1oWAcytWRuYLQ==} engines: {node: '>= 0.10'} + dev: false + + /validator/13.6.0: + resolution: {integrity: sha512-gVgKbdbHgtxpRyR8K0O6oFZPhhB5tT1jeEHZR0Znr9Svg03U0+r9DXWMrnRAB+HtCStDQKlaIZm42tVsVjqtjg==} + engines: {node: '>= 0.10'} + dev: true /value-equal/1.0.1: resolution: {integrity: sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==} @@ -18356,49 +18590,50 @@ packages: unix-crypt-td-js: 1.1.4 dev: true - /verdaccio/5.0.4: - resolution: {integrity: sha512-Bp3QXbpCLpIohVSQonPA7Dwejv/czt7HmE3fhKR/aSKxopX+4fAn1MPb8AQPElcBMrFOT9riwnOhwhxYh+sNRA==} + /verdaccio/5.1.0: + resolution: {integrity: sha512-NydMLcy4rjnrZdKWtlCspahCIKOUlTRwF484EeweVYAwyh/5K5ph8E8lteDPnOD1UxfRZ+tx/BkQfqHp1udgXg==} engines: {node: '>=12', npm: '>=6'} hasBin: true dependencies: '@verdaccio/commons-api': 10.0.0 - '@verdaccio/local-storage': 10.0.1 + '@verdaccio/local-storage': 10.0.6 '@verdaccio/readme': 10.0.0 '@verdaccio/streams': 10.0.0 '@verdaccio/ui-theme': 3.1.0 async: 3.2.0 body-parser: 1.19.0 - clipanion: 3.0.0-rc.11 + clipanion: 3.0.0-rc.12 compression: 1.7.4 cookies: 0.8.0 cors: 2.8.5 dayjs: 1.10.4 debug: 4.3.1 - envinfo: 7.7.4 + envinfo: 7.8.1 + eslint-import-resolver-node: 0.3.4 express: 4.17.1 fast-safe-stringify: 2.0.7 handlebars: 4.7.7 http-errors: 1.8.0 - js-yaml: 4.0.0 + js-yaml: 4.1.0 JSONStream: 1.3.5 jsonwebtoken: 8.5.1 kleur: 4.1.4 lodash: 4.17.21 lru-cache: 6.0.0 lunr-mutable-indexes: 2.3.2 - marked: 2.0.1 + marked: 2.0.5 memoizee: 0.4.15 mime: 2.5.2 minimatch: 3.0.4 mkdirp: 1.0.4 mv: 2.1.1 - pino: 6.11.2 + pino: 6.11.3 pkginfo: 0.4.1 prettier-bytes: 1.0.4 pretty-ms: 5.1.0 request: 2.88.0 - semver: 7.3.4 - validator: 13.5.2 + semver: 7.3.5 + validator: 13.6.0 verdaccio-audit: 10.0.0 verdaccio-htpasswd: 10.0.0 transitivePeerDependencies: diff --git a/scripts/benchmark-prepare.sh b/scripts/benchmark-prepare.sh new file mode 100755 index 000000000..12048f39f --- /dev/null +++ b/scripts/benchmark-prepare.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +set -e + +VERSION=$1 + +tmp_registry_log=`mktemp` + +npm i -g verdaccio@$VERSION +# start in the background the registry +nohup verdaccio &>$tmp_registry_log & +# wait until has started (using stdout) +grep -q 'http address' <(tail -f $tmp_registry_log) +npm set registry http://localhost:4873 diff --git a/scripts/benchmark-run.sh b/scripts/benchmark-run.sh new file mode 100755 index 000000000..10f9a9890 --- /dev/null +++ b/scripts/benchmark-run.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash + +set -e + +FIXTURE=$1 + +case $FIXTURE in + info) + FIXTURE='npm info jquery' + ;; + tarball) + FIXTURE='npm install jquery' + ;; + *) + echo "no command found" + return 1;; +esac + +hyperfine --ignore-failure --warmup 1 --min-runs=10 --show-output --export-json './hyper-results.json' "$FIXTURE" + diff --git a/scripts/e2e-setup-ci.sh b/scripts/e2e-setup-ci.sh index 5b23210a4..795ea78cb 100644 --- a/scripts/e2e-setup-ci.sh +++ b/scripts/e2e-setup-ci.sh @@ -1,7 +1,11 @@ #!/usr/bin/env bash +# this file is used by e2e-xx-cli-workflow.yml files + + set -e +# create a temporary folder HERE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" TEMP_DIR="$(mktemp -d)" @@ -10,5 +14,6 @@ cd "${TEMP_DIR}" echo $TEMP_DIR echo $HERE_DIR -git config --global user.email "you@example.com" -git config --global user.name "John Doe" +# set basic git config +git config --global user.email "jota@verdaccio.org" +git config --global user.name "Juan Picado" diff --git a/scripts/puppeteer-setup-ci.sh b/scripts/puppeteer-setup-ci.sh deleted file mode 100644 index fc74f3170..000000000 --- a/scripts/puppeteer-setup-ci.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -# Install latest chrome dev package and fonts to support major charsets (Chinese, Japanese, Arabic, Hebrew, Thai and a few others) -# Note: this installs the necessary libs to make the bundled version of Chromium that Puppeteer -# installs, work. https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md#running-puppeteer-in-docker - -wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \ - && sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \ - && apt-get update \ - && apt-get install -y google-chrome-unstable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst ttf-freefont \ - --no-install-recommends \ - && rm -rf /var/lib/apt/lists/* \ - && rm -rf /src/*.deb \ - && yarn run test:all \ No newline at end of file diff --git a/scripts/submit-metrics.ts b/scripts/submit-metrics.ts new file mode 100644 index 000000000..56089b834 --- /dev/null +++ b/scripts/submit-metrics.ts @@ -0,0 +1,49 @@ +/** + * CI - Script used on automation GitHub Actions to + * submit metrics to a third party database. + */ +const url = process.env.METRICS_URL; +const token = process.env.METRICS_TOKEN; +const version = process.env.METRICS_VERSION; +const benchmark = process.env.METRICS_BENCHMARK; +const source = process.env.METRICS_SOURCE; +const commit = process.env.METRICS_COMMIT_HASH; +const file = process.env.METRICS_FILE_NAME ?? 'hyper-results'; + +if (!url || !token || !version || !benchmark || !commit || !file) { + throw new TypeError('required missing params, check parameters are available'); +} + +const fs = require('fs'); +const path = require('path'); +const debug = require('debug')('metrics'); +const nodeFetch = require('node-fetch'); +const fileMetrics = `${file}-${version}-${benchmark}.json`; +// file should be avilable on the root of the project +const filePath = path.join(__dirname, '../', fileMetrics); +debug('file path %o', filePath); + +try { + const fileContent = JSON.parse(fs.readFileSync(filePath, 'utf-8')); + debug('body %o', fileContent.results[0]); + nodeFetch(url, { + method: 'POST', + body: JSON.stringify(fileContent.results[0]), + headers: { + Authorization: `Bearer ${token}`, + 'content-type': 'application/json', + 'x-metrics-version': version, + 'x-metrics-source': source, + 'x-metrics-benchmark': benchmark, + 'x-metrics-commit-hash': commit, + }, + }) + .then((res) => res.text()) // expecting a json response + .then((json) => { + debug('response %o', json); + }); +} catch (error) { + // eslint-disable-next-line no-console + console.error('error on process metrics', error); + process.exit(1); +} diff --git a/scripts/trigger-release.js b/scripts/trigger-release.js index 136bddeea..75923b1f8 100644 --- a/scripts/trigger-release.js +++ b/scripts/trigger-release.js @@ -1,9 +1,3 @@ -/** - * @prettier - */ - -'use strict'; - const [, , /* node */ /* file */ tag] = process.argv; const getStdin = require('get-stdin');