From 0900cb647c5cc57efc4da667e223130232378a70 Mon Sep 17 00:00:00 2001 From: Matt Paletta Date: Mon, 29 Jun 2026 09:25:18 +0100 Subject: [PATCH 1/6] chore: migrate to pnpm, bump Node matrix to 22/24/26, fix audit vulns - Migrate package manager from npm to pnpm 11.9.0: add packageManager field, replace package-lock.json with pnpm-lock.yaml, convert all workflows to pnpm/action-setup + `pnpm install --frozen-lockfile`, `pnpm publish --no-git-checks` (preserves OIDC trusted publishing), and update husky hook + CONTRIBUTING. - Add flake.nix/flake.lock providing a pinned Node.js + pnpm 11.9.0 dev shell (`nix develop`). - Update CI Node matrix from 18/20/22 to 22/24/26 (18/20/23/25 are EOL). - `pnpm audit --fix`: 0 vulnerabilities. Overrides for js-yaml, serialize-javascript and uuid consolidated into pnpm-workspace.yaml (the stale package.json js-yaml@4.1.1 pin was itself flagged). - Regenerate ssl-cert-snakeoil fixture as 2048-bit; the old 1024-bit key is rejected by modern OpenSSL (ERR_SSL_EE_KEY_TOO_SMALL), which had broken the HttpsProxyAgent suite on current Node (now 208 passing). Co-Authored-By: Claude Opus 4.8 --- .github/workflows/e2e.yml | 20 +- .github/workflows/release.yml | 14 +- .github/workflows/test.yml | 22 +- .husky/pre-commit | 2 +- CONTRIBUTING.md | 10 +- flake.lock | 27 + flake.nix | 27 + package.json | 9 +- pnpm-lock.yaml | 3499 +++++++++++++++++++++++++ pnpm-workspace.yaml | 12 + tests/utilities/ssl-cert-snakeoil.key | 43 +- tests/utilities/ssl-cert-snakeoil.pem | 32 +- 12 files changed, 3650 insertions(+), 67 deletions(-) create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index bc5b17f7..f17fc76f 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -15,24 +15,20 @@ jobs: strategy: fail-fast: false matrix: - node-version: [18, 20, 22] + node-version: [22, 24, 26] os: [ubuntu-latest] include: - perform-attestation: true steps: - - uses: actions/checkout@v3 - - uses: actions/cache@v4 - with: - path: ~/.npm - key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node- - - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - - run: npm install - - run: npm run lint - - run: npm run test:e2e + cache: 'pnpm' + - run: pnpm install --frozen-lockfile + - run: pnpm run lint + - run: pnpm run test:e2e env: EV_APP_UUID: ${{ secrets.EV_APP_UUID_V5 }} EV_API_KEY: ${{ secrets.EV_API_KEY_V5 }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a876463e..8664cf10 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,12 +14,15 @@ jobs: uses: actions/checkout@v4 - name: Get tags run: git fetch --tags origin + - name: Setup pnpm + uses: pnpm/action-setup@v4 - name: Setup Node.js environment uses: actions/setup-node@v4 with: node-version: '24' + cache: 'pnpm' - name: Install dependencies - run: npm ci + run: pnpm install --frozen-lockfile - name: Create Release Pull Request id: changesets uses: changesets/action@v1 @@ -32,7 +35,7 @@ jobs: id: check_release if: steps.changesets.outputs.hasChangesets == 'false' run: | - npx changeset tag && git push origin --tags + pnpm exec changeset tag && git push origin --tags COMMIT_TAG=$(git tag --points-at HEAD) if [ -n "$COMMIT_TAG" ]; then echo "A tag is attached to HEAD. Creating a new release..." @@ -66,12 +69,15 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 + - name: Setup pnpm + uses: pnpm/action-setup@v4 - name: Setup Node.js environment uses: actions/setup-node@v4 with: node-version: '24' registry-url: 'https://registry.npmjs.org' + cache: 'pnpm' - name: Install dependencies - run: npm ci + run: pnpm install --frozen-lockfile - name: Publish to npm - run: npm publish + run: pnpm publish --no-git-checks diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6d68eef0..e6bc1beb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,27 +12,23 @@ jobs: strategy: fail-fast: false matrix: - node-version: [18, 20, 22] + node-version: [22, 24, 26] os: [ubuntu-latest] include: - perform-attestation: true steps: - - uses: actions/checkout@v3 - - uses: actions/cache@v4 - with: - path: ~/.npm - key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node- - - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - - run: npm install - - run: npm run lint - - run: npm run test:coverage + cache: 'pnpm' + - run: pnpm install --frozen-lockfile + - run: pnpm run lint + - run: pnpm run test:coverage - run: | sudo apt-get update ; sudo apt-get install -y libfaketime - LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1 npm run test:filter attestGA + LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1 pnpm run test:filter attestGA env: FAKETIME: '2023-09-22 11:24:32' if: ${{ matrix.perform-attestation }} diff --git a/.husky/pre-commit b/.husky/pre-commit index 36af2198..5e592735 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1,4 @@ #!/bin/sh . "$(dirname "$0")/_/husky.sh" -npx lint-staged +pnpm exec lint-staged diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 62bd9a99..11ee3dbe 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,16 +8,18 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/everva To make life easier, this module features a code formatter/linter. +This repo uses [pnpm](https://pnpm.io/) as its package manager. If you have [Nix](https://nixos.org/) installed, `nix develop` will drop you into a shell with the correct Node.js and pnpm versions. Otherwise, install pnpm via [Corepack](https://pnpm.io/installation#using-corepack) (`corepack enable pnpm`), which will pick up the pinned version from the `packageManager` field in `package.json`. + You will first need to install all of the dependencies with ```shell -npm install +pnpm install ``` after that is done, there are git hooks which need to be installed using [husky](https://github.com/typicode/husky), which can be done through ```shell -npm run prepare +pnpm run prepare ``` We use one hook: `pre-commit`. @@ -28,13 +30,13 @@ The `pre-commit` hook ensures that code is formatted correctly. We use [prettier It should be possible to configure your editor to run prettier on save, which should make your life easier - have a look at [editor support](https://prettier.io/docs/en/editors.html). -There is a test that is run whenever a pull request is made (`npm run lint`), so please ensure that your code is formatted correctly before committing! +There is a test that is run whenever a pull request is made (`pnpm run lint`), so please ensure that your code is formatted correctly before committing! ## Commit Formatting & Releases We use [changesets](https://github.com/changesets/changesets) to version manage in this repo. -When creating a pr that needs to be rolled into a version release, do `npx changeset`, select the level of the version bump required and describe the changes for the change logs. DO NOT select major for releasing breaking changes without team approval. +When creating a pr that needs to be rolled into a version release, do `pnpm exec changeset`, select the level of the version bump required and describe the changes for the change logs. DO NOT select major for releasing breaking changes without team approval. To release: diff --git a/flake.lock b/flake.lock new file mode 100644 index 00000000..a94690dc --- /dev/null +++ b/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1782467914, + "narHash": "sha256-pGvFkM8N0xEkIIXDe5YYfbEAvHrk4IxBrjB/x8OomhE=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e73de5be04e0eff4190a1432b946d469c794e7b4", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 00000000..1d547f85 --- /dev/null +++ b/flake.nix @@ -0,0 +1,27 @@ +{ + description = "Development environment for the Evervault Node.js SDK"; + + inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + + outputs = + { self, nixpkgs }: + let + systems = [ + "x86_64-linux" + "aarch64-linux" + "x86_64-darwin" + "aarch64-darwin" + ]; + forAllSystems = f: nixpkgs.lib.genAttrs systems (system: f nixpkgs.legacyPackages.${system}); + in + { + devShells = forAllSystems (pkgs: { + default = pkgs.mkShell { + packages = [ + pkgs.nodejs_22 + pkgs.pnpm + ]; + }; + }); + }; +} diff --git a/package.json b/package.json index 7a1cb0dc..d535dd40 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "name": "@evervault/sdk", "version": "6.4.0", "description": "Node.js SDK for Evervault", + "packageManager": "pnpm@11.9.0", "main": "lib/index.js", "typings": "types/index.d.ts", "scripts": { @@ -11,8 +12,8 @@ "test:e2e": "mocha 'e2e/**/*.test.js' --timeout 5000 --exit", "test:filter": "mocha 'tests/**/*.test.js' --grep", "test:e2e:filter": "mocha 'e2e/**/*.test.js' --timeout 5000 --grep", - "test:coverage": "nyc --reporter=text npm run test", - "prepublishOnly": "npm run generate-types", + "test:coverage": "nyc --reporter=text pnpm run test", + "prepublishOnly": "pnpm run generate-types", "generate-types": "tsc lib/*.js lib/**/*.js --declaration --allowJs --emitDeclarationOnly --allowSyntheticDefaultImports --outDir types" }, "repository": { @@ -67,9 +68,5 @@ }, "lint-staged": { "**/*.js": "prettier --write --ignore-unknown \"./**/*.js\"" - }, - "overrides": { - "js-yaml": "4.1.1", - "lodash@>=4.0.0 <4.17.23": "^4.17.23" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..4f403a56 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3499 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +overrides: + js-yaml@<=4.1.1: ^4.1.2 + serialize-javascript@<=7.0.2: ^7.0.3 + serialize-javascript@>=5.0.0 <7.0.5: ^7.0.5 + uuid@<11.1.1: ^11.1.1 + lodash@>=4.0.0 <4.17.23: ^4.17.23 + +importers: + + .: + dependencies: + agent-base: + specifier: ^6.0.2 + version: 6.0.2(supports-color@8.1.1) + asn1js: + specifier: ^3.0.5 + version: 3.0.10 + async-retry: + specifier: ^1.3.3 + version: 1.3.3 + axios: + specifier: ^1.12.0 + version: 1.18.1(supports-color@8.1.1) + crc-32: + specifier: ^1.2.2 + version: 1.2.2 + devDependencies: + '@changesets/cli': + specifier: ^2.29.2 + version: 2.31.0 + chai: + specifier: ^4.2.0 + version: 4.5.0 + chai-as-promised: + specifier: ^7.1.1 + version: 7.1.2(chai@4.5.0) + husky: + specifier: ^7.0.2 + version: 7.0.4 + lint-staged: + specifier: ^11.1.2 + version: 11.2.6 + mocha: + specifier: ^10.0.0 + version: 10.8.2 + msgpackr: + specifier: ^1.9.9 + version: 1.12.1 + nock: + specifier: ^12.0.3 + version: 12.0.3(supports-color@8.1.1) + nyc: + specifier: ^17.0.0 + version: 17.1.0(supports-color@8.1.1) + prettier: + specifier: ^2.3.2 + version: 2.8.8 + proxy: + specifier: ^1.0.2 + version: 1.0.2(supports-color@8.1.1) + rewire: + specifier: ^7.0.0 + version: 7.0.0(supports-color@8.1.1) + sinon: + specifier: ^9.0.2 + version: 9.2.4 + sinon-chai: + specifier: ^3.5.0 + version: 3.7.0(chai@4.5.0)(sinon@9.2.4) + typescript: + specifier: ^5.3.3 + version: 5.9.3 + +packages: + + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.7': + resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.7': + resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} + + '@changesets/apply-release-plan@7.1.1': + resolution: {integrity: sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==} + + '@changesets/assemble-release-plan@6.0.10': + resolution: {integrity: sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A==} + + '@changesets/changelog-git@0.2.1': + resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} + + '@changesets/cli@2.31.0': + resolution: {integrity: sha512-AhI4enNTgHu2IZr6K4WZyf0EPch4XVMn1yOMFmCD9gsfBGqMYaHXls5HyDv6/CL5axVQABz68eG30eCtbr2wFg==} + hasBin: true + + '@changesets/config@3.1.4': + resolution: {integrity: sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q==} + + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + + '@changesets/get-dependents-graph@2.1.4': + resolution: {integrity: sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg==} + + '@changesets/get-release-plan@4.0.16': + resolution: {integrity: sha512-2K5Om6CrMPm45rtvckfzWo7e9jOVCKLCnXia5eUPaURH7/LWzri7pK1TycdzAuAtehLkW7VPbWLCSExTHmiI6g==} + + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} + + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + + '@changesets/parse@0.4.3': + resolution: {integrity: sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A==} + + '@changesets/pre@2.0.2': + resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} + + '@changesets/read@0.6.7': + resolution: {integrity: sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA==} + + '@changesets/should-skip-package@0.1.2': + resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} + + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + + '@changesets/types@6.1.0': + resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} + + '@changesets/write@0.4.0': + resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.6': + resolution: {integrity: sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==} + engines: {node: '>=8'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4': + resolution: {integrity: sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==} + cpu: [arm64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4': + resolution: {integrity: sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w==} + cpu: [x64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4': + resolution: {integrity: sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw==} + cpu: [arm64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4': + resolution: {integrity: sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw==} + cpu: [arm] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4': + resolution: {integrity: sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ==} + cpu: [x64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4': + resolution: {integrity: sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ==} + cpu: [x64] + os: [win32] + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@sinonjs/commons@1.8.6': + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + + '@sinonjs/fake-timers@6.0.1': + resolution: {integrity: sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==} + + '@sinonjs/samsam@5.3.1': + resolution: {integrity: sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==} + + '@sinonjs/text-encoding@0.7.3': + resolution: {integrity: sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==} + deprecated: |- + Deprecated: no longer maintained and no longer used by Sinon packages. See + https://github.com/sinonjs/nise/issues/243 for replacement details. + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@ungap/structured-clone@1.3.2': + resolution: {integrity: sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + append-transform@2.0.0: + resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} + engines: {node: '>=8'} + + archy@1.0.0: + resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + args@5.0.1: + resolution: {integrity: sha512-1kqmFCFsPffavQFGt8OxJdIcETti99kySRUPMpOhaGjL6mRJn8HFU1OxKY5bMqfZKUwTQc1mZkAjmGYaVOHFtQ==} + engines: {node: '>= 6.0.0'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + asn1js@3.0.10: + resolution: {integrity: sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==} + engines: {node: '>=12.0.0'} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + async-retry@1.3.3: + resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.18.1: + resolution: {integrity: sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + baseline-browser-mapping@2.10.38: + resolution: {integrity: sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw==} + engines: {node: '>=6.0.0'} + hasBin: true + + basic-auth-parser@0.0.2: + resolution: {integrity: sha512-Y7OBvWn+JnW45JWHLY6ybYub2k9cXCMrtCyO1Hds2s6eqClqWhPnOQpgXUPjAiMHj+A8TEPIQQ1dYENnJoBOHQ==} + + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + brace-expansion@1.1.15: + resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==} + + brace-expansion@2.1.1: + resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + + browserslist@4.28.4: + resolution: {integrity: sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + caching-transform@4.0.0: + resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@5.0.0: + resolution: {integrity: sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==} + engines: {node: '>=6'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001799: + resolution: {integrity: sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==} + + chai-as-promised@7.1.2: + resolution: {integrity: sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==} + peerDependencies: + chai: '>= 2.1.2 < 6' + + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chardet@2.2.0: + resolution: {integrity: sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colorette@1.4.0: + resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + default-require-extensions@3.0.1: + resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==} + engines: {node: '>=8'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + diff@4.0.4: + resolution: {integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==} + engines: {node: '>=0.3.1'} + + diff@5.2.2: + resolution: {integrity: sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + electron-to-chromium@1.5.378: + resolution: {integrity: sha512-VinvOAuuPmdD1guEgGv5f2Qp7/vlfqOrUOMYNnOD4wj3pit8kRsQHzfIf6teyUGWo15Tg5+bOJaRunvyltpVWQ==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + foreground-child@2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data@4.0.6: + resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} + engines: {node: '>= 6'} + + fromentries@1.3.2: + resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-own-enumerable-property-symbols@3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasha@5.2.2: + resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} + engines: {node: '>=8'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + human-id@4.2.0: + resolution: {integrity: sha512-K3GbkIWqyvvlpfhBPlbEvD97TtqBpAYA4kt+cn2lD2x2HuohzZCibcA2nOlnJT6exqvJLggoB5nv2dNf192nEA==} + hasBin: true + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + husky@7.0.4: + resolution: {integrity: sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==} + engines: {node: '>=12'} + hasBin: true + + iconv-lite@0.7.2: + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} + engines: {node: '>=0.10.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-hook@3.0.0: + resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + + istanbul-lib-processinfo@2.0.3: + resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.2.0: + resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + just-extend@4.2.1: + resolution: {integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + leven@2.1.0: + resolution: {integrity: sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==} + engines: {node: '>=0.10.0'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lint-staged@11.2.6: + resolution: {integrity: sha512-Vti55pUnpvPE0J9936lKl0ngVeTdSZpEdTNhASbkaWX7J5R9OEifo1INBGQuGW4zmy6OG+TcWPJ3m5yuy5Q8Tg==} + hasBin: true + + listr2@3.14.0: + resolution: {integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==} + engines: {node: '>=10.0.0'} + peerDependencies: + enquirer: '>= 2.3.0 < 3' + peerDependenciesMeta: + enquirer: + optional: true + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.flattendeep@4.4.0: + resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} + + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + log-update@4.0.0: + resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} + engines: {node: '>=10'} + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + + mocha@10.8.2: + resolution: {integrity: sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==} + engines: {node: '>= 14.0.0'} + hasBin: true + + mri@1.1.4: + resolution: {integrity: sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==} + engines: {node: '>=4'} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + msgpackr-extract@3.0.4: + resolution: {integrity: sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw==} + hasBin: true + + msgpackr@1.12.1: + resolution: {integrity: sha512-4EUH9tQHnMmEgzW/MdAP0KIfa1T9AF+htl0ffe2n5vb2EKn9y2co8ccpgWko6S52Jy1PQZKwRnx5/KkYjtd9MQ==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + nise@4.1.0: + resolution: {integrity: sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==} + + nock@12.0.3: + resolution: {integrity: sha512-QNb/j8kbFnKCiyqi9C5DD0jH/FubFGj5rt9NQFONXwQm3IPB0CULECg/eS3AU1KgZb/6SwUa4/DTRKhVxkGABw==} + engines: {node: '>= 10.13'} + + node-gyp-build-optional-packages@5.2.2: + resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} + hasBin: true + + node-preload@0.2.1: + resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} + engines: {node: '>=8'} + + node-releases@2.0.50: + resolution: {integrity: sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==} + engines: {node: '>=18'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + nyc@17.1.0: + resolution: {integrity: sha512-U42vQ4czpKa0QdI1hu950XuNhYqgoM+ZF1HT+VuUHL9hPfDPVvNQyltmMqdE9bUHMVa+8yNbc3QKTj8zQhlVxQ==} + engines: {node: '>=18'} + hasBin: true + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-map@3.0.0: + resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} + engines: {node: '>=8'} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-hash@4.0.0: + resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} + engines: {node: '>=8'} + + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-to-regexp@1.9.0: + resolution: {integrity: sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + please-upgrade-node@3.2.0: + resolution: {integrity: sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + process-on-spawn@1.1.0: + resolution: {integrity: sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==} + engines: {node: '>=8'} + + propagate@2.0.1: + resolution: {integrity: sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==} + engines: {node: '>= 8'} + + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} + + proxy@1.0.2: + resolution: {integrity: sha512-KNac2ueWRpjbUh77OAFPZuNdfEqNynm9DD4xHT14CccGpW8wKZwEkN0yjlb7X9G9Z9F55N0Q+1z+WfgAhwYdzQ==} + hasBin: true + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pvtsutils@1.3.6: + resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} + + pvutils@1.1.5: + resolution: {integrity: sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==} + engines: {node: '>=16.0.0'} + + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + release-zalgo@1.0.0: + resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} + engines: {node: '>=4'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rewire@7.0.0: + resolution: {integrity: sha512-DyyNyzwMtGYgu0Zl/ya0PR/oaunM+VuCuBxCuhYJHHaV0V+YvYa3bBGxb5OZ71vndgmp1pYY8F4YOwQo1siRGw==} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + + serialize-javascript@7.0.6: + resolution: {integrity: sha512-ATTK5Q4gFVg0YDp1my2vqygyvhcklD/UV5GIlYHooGTn/NogJqIzpetkD6E5kmuVULqz/S9inUL25XcAgDRJQg==} + engines: {node: '>=20.0.0'} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sinon-chai@3.7.0: + resolution: {integrity: sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==} + peerDependencies: + chai: ^4.0.0 + sinon: '>=4.0.0' + + sinon@9.2.4: + resolution: {integrity: sha512-zljcULZQsJxVra28qIAL6ow1Z9tpattkCTEJR4RBP3TGc00FcttsP5pK284Nas5WjMZU5Yzy3kAIp3B3KRf5Yg==} + deprecated: 16.1.1 + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spawn-wrap@2.0.0: + resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} + engines: {node: '>=8'} + + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + + string-argv@0.3.1: + resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} + engines: {node: '>=0.6.19'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + stringify-object@3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + uuid@11.1.1: + resolution: {integrity: sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==} + hasBin: true + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + workerpool@6.5.1: + resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@1.10.3: + resolution: {integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==} + engines: {node: '>= 6'} + + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + + yargs@16.2.2: + resolution: {integrity: sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==} + engines: {node: '>=10'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.7': {} + + '@babel/core@7.29.7(supports-color@8.1.1)': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/types': 7.29.7 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3(supports-color@8.1.1) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.7': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.29.7': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.4 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-module-imports@7.29.7': + dependencies: + '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/helper-validator-option@7.29.7': {} + + '@babel/helpers@7.29.7': + dependencies: + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/parser@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/runtime@7.29.7': {} + + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/traverse@7.29.7(supports-color@8.1.1)': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.7': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@changesets/apply-release-plan@7.1.1': + dependencies: + '@changesets/config': 3.1.4 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.8.5 + + '@changesets/assemble-release-plan@6.0.10': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.8.5 + + '@changesets/changelog-git@0.2.1': + dependencies: + '@changesets/types': 6.1.0 + + '@changesets/cli@2.31.0': + dependencies: + '@changesets/apply-release-plan': 7.1.1 + '@changesets/assemble-release-plan': 6.0.10 + '@changesets/changelog-git': 0.2.1 + '@changesets/config': 3.1.4 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.4 + '@changesets/get-release-plan': 4.0.16 + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.7 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@changesets/write': 0.4.0 + '@inquirer/external-editor': 1.0.3 + '@manypkg/get-packages': 1.1.3 + ansi-colors: 4.1.3 + enquirer: 2.4.1 + fs-extra: 7.0.1 + mri: 1.2.0 + package-manager-detector: 0.2.11 + picocolors: 1.1.1 + resolve-from: 5.0.0 + semver: 7.8.5 + spawndamnit: 3.0.1 + term-size: 2.2.1 + transitivePeerDependencies: + - '@types/node' + + '@changesets/config@3.1.4': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.4 + '@changesets/logger': 0.1.1 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.8 + + '@changesets/errors@0.2.0': + dependencies: + extendable-error: 0.1.7 + + '@changesets/get-dependents-graph@2.1.4': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.1 + semver: 7.8.5 + + '@changesets/get-release-plan@4.0.16': + dependencies: + '@changesets/assemble-release-plan': 6.0.10 + '@changesets/config': 3.1.4 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.7 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/get-version-range-type@0.4.0': {} + + '@changesets/git@3.0.4': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 + + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.1 + + '@changesets/parse@0.4.3': + dependencies: + '@changesets/types': 6.1.0 + js-yaml: 4.2.0 + + '@changesets/pre@2.0.2': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + + '@changesets/read@0.6.7': + dependencies: + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.3 + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.1 + + '@changesets/should-skip-package@0.1.2': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.1.0': {} + + '@changesets/write@0.4.0': + dependencies: + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + human-id: 4.2.0 + prettier: 2.8.8 + + '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1(supports-color@8.1.1))': + dependencies: + eslint: 8.57.1(supports-color@8.1.1) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/eslintrc@2.1.4(supports-color@8.1.1)': + dependencies: + ajv: 6.15.0 + debug: 4.4.3(supports-color@8.1.1) + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.2.0 + minimatch: 3.1.5 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + + '@humanwhocodes/config-array@0.13.0(supports-color@8.1.1)': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.3(supports-color@8.1.1) + minimatch: 3.1.5 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@inquirer/external-editor@1.0.3': + dependencies: + chardet: 2.2.0 + iconv-lite: 0.7.2 + + '@istanbuljs/load-nyc-config@1.1.0': + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 4.2.0 + resolve-from: 5.0.0 + + '@istanbuljs/schema@0.1.6': {} + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.29.7 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.29.7 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4': + optional: true + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4': + optional: true + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4': + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@sinonjs/commons@1.8.6': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@6.0.1': + dependencies: + '@sinonjs/commons': 1.8.6 + + '@sinonjs/samsam@5.3.1': + dependencies: + '@sinonjs/commons': 1.8.6 + lodash.get: 4.4.2 + type-detect: 4.1.0 + + '@sinonjs/text-encoding@0.7.3': {} + + '@types/node@12.20.55': {} + + '@types/parse-json@4.0.2': {} + + '@ungap/structured-clone@1.3.2': {} + + acorn-jsx@5.3.2(acorn@8.17.0): + dependencies: + acorn: 8.17.0 + + acorn@8.17.0: {} + + agent-base@6.0.2(supports-color@8.1.1): + dependencies: + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + ajv@6.15.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-colors@4.1.3: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 + + append-transform@2.0.0: + dependencies: + default-require-extensions: 3.0.1 + + archy@1.0.0: {} + + argparse@2.0.1: {} + + args@5.0.1: + dependencies: + camelcase: 5.0.0 + chalk: 2.4.2 + leven: 2.1.0 + mri: 1.1.4 + + array-union@2.1.0: {} + + asn1js@3.0.10: + dependencies: + pvtsutils: 1.3.6 + pvutils: 1.1.5 + tslib: 2.8.1 + + assertion-error@1.1.0: {} + + astral-regex@2.0.0: {} + + async-retry@1.3.3: + dependencies: + retry: 0.13.1 + + asynckit@0.4.0: {} + + axios@1.18.1(supports-color@8.1.1): + dependencies: + follow-redirects: 1.16.0 + form-data: 4.0.6 + https-proxy-agent: 5.0.1(supports-color@8.1.1) + proxy-from-env: 2.1.0 + transitivePeerDependencies: + - debug + - supports-color + + balanced-match@1.0.2: {} + + baseline-browser-mapping@2.10.38: {} + + basic-auth-parser@0.0.2: {} + + better-path-resolve@1.0.0: + dependencies: + is-windows: 1.0.2 + + binary-extensions@2.3.0: {} + + brace-expansion@1.1.15: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.1.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browser-stdout@1.3.1: {} + + browserslist@4.28.4: + dependencies: + baseline-browser-mapping: 2.10.38 + caniuse-lite: 1.0.30001799 + electron-to-chromium: 1.5.378 + node-releases: 2.0.50 + update-browserslist-db: 1.2.3(browserslist@4.28.4) + + caching-transform@4.0.0: + dependencies: + hasha: 5.2.2 + make-dir: 3.1.0 + package-hash: 4.0.0 + write-file-atomic: 3.0.3 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + callsites@3.1.0: {} + + camelcase@5.0.0: {} + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001799: {} + + chai-as-promised@7.1.2(chai@4.5.0): + dependencies: + chai: 4.5.0 + check-error: 1.0.3 + + chai@4.5.0: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chardet@2.2.0: {} + + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + clean-stack@2.2.0: {} + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-truncate@2.1.0: + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + colorette@1.4.0: {} + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@8.3.0: {} + + commondir@1.0.1: {} + + concat-map@0.0.1: {} + + convert-source-map@1.9.0: {} + + convert-source-map@2.0.0: {} + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.1 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.3 + + crc-32@1.2.2: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@4.4.3(supports-color@8.1.1): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 + + decamelize@1.2.0: {} + + decamelize@4.0.0: {} + + deep-eql@4.1.4: + dependencies: + type-detect: 4.1.0 + + deep-is@0.1.4: {} + + default-require-extensions@3.0.1: + dependencies: + strip-bom: 4.0.0 + + delayed-stream@1.0.0: {} + + detect-indent@6.1.0: {} + + detect-libc@2.1.2: + optional: true + + diff@4.0.4: {} + + diff@5.2.2: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + electron-to-chromium@1.5.378: {} + + emoji-regex@8.0.0: {} + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + es6-error@4.1.1: {} + + escalade@3.2.0: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.1(supports-color@8.1.1): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1(supports-color@8.1.1)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/eslintrc': 2.1.4(supports-color@8.1.1) + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0(supports-color@8.1.1) + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.2 + ajv: 6.15.0 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3(supports-color@8.1.1) + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.2.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.5 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) + eslint-visitor-keys: 3.4.3 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + extendable-error@0.1.7: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-cache-dir@3.3.2: + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.4.2 + keyv: 4.5.4 + rimraf: 3.0.2 + + flat@5.0.2: {} + + flatted@3.4.2: {} + + follow-redirects@1.16.0: {} + + foreground-child@2.0.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 3.0.7 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.6: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.4 + mime-types: 2.1.35 + + fromentries@1.3.2: {} + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-func-name@2.0.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-own-enumerable-property-symbols@3.0.2: {} + + get-package-type@0.1.0: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + get-stream@6.0.1: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.5 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@8.1.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.9 + once: 1.4.0 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasha@5.2.2: + dependencies: + is-stream: 2.0.1 + type-fest: 0.8.1 + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + html-escaper@2.0.2: {} + + https-proxy-agent@5.0.1(supports-color@8.1.1): + dependencies: + agent-base: 6.0.2(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + human-id@4.2.0: {} + + human-signals@2.1.0: {} + + husky@7.0.4: {} + + iconv-lite@0.7.2: + dependencies: + safer-buffer: 2.1.2 + + ignore@5.3.2: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + is-arrayish@0.2.1: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-obj@1.0.1: {} + + is-path-inside@3.0.3: {} + + is-plain-obj@2.1.0: {} + + is-regexp@1.0.0: {} + + is-stream@2.0.1: {} + + is-subdir@1.2.0: + dependencies: + better-path-resolve: 1.0.0 + + is-typedarray@1.0.0: {} + + is-unicode-supported@0.1.0: {} + + is-windows@1.0.2: {} + + isarray@0.0.1: {} + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-hook@3.0.0: + dependencies: + append-transform: 2.0.0 + + istanbul-lib-instrument@6.0.3(supports-color@8.1.1): + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/parser': 7.29.7 + '@istanbuljs/schema': 0.1.6 + istanbul-lib-coverage: 3.2.2 + semver: 7.8.5 + transitivePeerDependencies: + - supports-color + + istanbul-lib-processinfo@2.0.3: + dependencies: + archy: 1.0.0 + cross-spawn: 7.0.6 + istanbul-lib-coverage: 3.2.2 + p-map: 3.0.0 + rimraf: 3.0.2 + uuid: 11.1.1 + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@4.0.1(supports-color@8.1.1): + dependencies: + debug: 4.4.3(supports-color@8.1.1) + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + js-tokens@4.0.0: {} + + js-yaml@4.2.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json-stringify-safe@5.0.1: {} + + json5@2.2.3: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + just-extend@4.2.1: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + leven@2.1.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lines-and-columns@1.2.4: {} + + lint-staged@11.2.6: + dependencies: + cli-truncate: 2.1.0 + colorette: 1.4.0 + commander: 8.3.0 + cosmiconfig: 7.1.0 + debug: 4.4.3(supports-color@8.1.1) + enquirer: 2.4.1 + execa: 5.1.1 + listr2: 3.14.0(enquirer@2.4.1) + micromatch: 4.0.8 + normalize-path: 3.0.0 + please-upgrade-node: 3.2.0 + string-argv: 0.3.1 + stringify-object: 3.3.0 + supports-color: 8.1.1 + + listr2@3.14.0(enquirer@2.4.1): + dependencies: + cli-truncate: 2.1.0 + colorette: 2.0.20 + log-update: 4.0.0 + p-map: 4.0.0 + rfdc: 1.4.1 + rxjs: 7.8.2 + through: 2.3.8 + wrap-ansi: 7.0.0 + optionalDependencies: + enquirer: 2.4.1 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.flattendeep@4.4.0: {} + + lodash.get@4.4.2: {} + + lodash.merge@4.6.2: {} + + lodash.startcase@4.4.0: {} + + lodash@4.18.1: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + log-update@4.0.0: + dependencies: + ansi-escapes: 4.3.2 + cli-cursor: 3.1.0 + slice-ansi: 4.0.0 + wrap-ansi: 6.2.0 + + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + + make-dir@4.0.0: + dependencies: + semver: 7.8.5 + + math-intrinsics@1.1.0: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.2 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mimic-fn@2.1.0: {} + + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.15 + + minimatch@5.1.9: + dependencies: + brace-expansion: 2.1.1 + + mocha@10.8.2: + dependencies: + ansi-colors: 4.1.3 + browser-stdout: 1.3.1 + chokidar: 3.6.0 + debug: 4.4.3(supports-color@8.1.1) + diff: 5.2.2 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 8.1.0 + he: 1.2.0 + js-yaml: 4.2.0 + log-symbols: 4.1.0 + minimatch: 5.1.9 + ms: 2.1.3 + serialize-javascript: 7.0.6 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 6.5.1 + yargs: 16.2.2 + yargs-parser: 20.2.9 + yargs-unparser: 2.0.0 + + mri@1.1.4: {} + + mri@1.2.0: {} + + ms@2.1.3: {} + + msgpackr-extract@3.0.4: + dependencies: + node-gyp-build-optional-packages: 5.2.2 + optionalDependencies: + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.4 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.4 + '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.4 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.4 + '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.4 + '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.4 + optional: true + + msgpackr@1.12.1: + optionalDependencies: + msgpackr-extract: 3.0.4 + + natural-compare@1.4.0: {} + + nise@4.1.0: + dependencies: + '@sinonjs/commons': 1.8.6 + '@sinonjs/fake-timers': 6.0.1 + '@sinonjs/text-encoding': 0.7.3 + just-extend: 4.2.1 + path-to-regexp: 1.9.0 + + nock@12.0.3(supports-color@8.1.1): + dependencies: + debug: 4.4.3(supports-color@8.1.1) + json-stringify-safe: 5.0.1 + lodash: 4.18.1 + propagate: 2.0.1 + transitivePeerDependencies: + - supports-color + + node-gyp-build-optional-packages@5.2.2: + dependencies: + detect-libc: 2.1.2 + optional: true + + node-preload@0.2.1: + dependencies: + process-on-spawn: 1.1.0 + + node-releases@2.0.50: {} + + normalize-path@3.0.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + nyc@17.1.0(supports-color@8.1.1): + dependencies: + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.6 + caching-transform: 4.0.0 + convert-source-map: 1.9.0 + decamelize: 1.2.0 + find-cache-dir: 3.3.2 + find-up: 4.1.0 + foreground-child: 3.3.1 + get-package-type: 0.1.0 + glob: 7.2.3 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-hook: 3.0.0 + istanbul-lib-instrument: 6.0.3(supports-color@8.1.1) + istanbul-lib-processinfo: 2.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1(supports-color@8.1.1) + istanbul-reports: 3.2.0 + make-dir: 3.1.0 + node-preload: 0.2.1 + p-map: 3.0.0 + process-on-spawn: 1.1.0 + resolve-from: 5.0.0 + rimraf: 3.0.2 + signal-exit: 3.0.7 + spawn-wrap: 2.0.0 + test-exclude: 6.0.0 + yargs: 15.4.1 + transitivePeerDependencies: + - supports-color + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + outdent@0.5.0: {} + + p-filter@2.1.0: + dependencies: + p-map: 2.1.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-map@2.1.0: {} + + p-map@3.0.0: + dependencies: + aggregate-error: 3.1.0 + + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + + p-try@2.2.0: {} + + package-hash@4.0.0: + dependencies: + graceful-fs: 4.2.11 + hasha: 5.2.2 + lodash.flattendeep: 4.4.0 + release-zalgo: 1.0.0 + + package-manager-detector@0.2.11: + dependencies: + quansync: 0.2.11 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.29.7 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-to-regexp@1.9.0: + dependencies: + isarray: 0.0.1 + + path-type@4.0.0: {} + + pathval@1.1.1: {} + + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + pify@4.0.1: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + please-upgrade-node@3.2.0: + dependencies: + semver-compare: 1.0.0 + + prelude-ls@1.2.1: {} + + prettier@2.8.8: {} + + process-on-spawn@1.1.0: + dependencies: + fromentries: 1.3.2 + + propagate@2.0.1: {} + + proxy-from-env@2.1.0: {} + + proxy@1.0.2(supports-color@8.1.1): + dependencies: + args: 5.0.1 + basic-auth-parser: 0.0.2 + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + punycode@2.3.1: {} + + pvtsutils@1.3.6: + dependencies: + tslib: 2.8.1 + + pvutils@1.1.5: {} + + quansync@0.2.11: {} + + queue-microtask@1.2.3: {} + + read-yaml-file@1.1.0: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 4.2.0 + pify: 4.0.1 + strip-bom: 3.0.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.2 + + release-zalgo@1.0.0: + dependencies: + es6-error: 4.1.1 + + require-directory@2.1.1: {} + + require-main-filename@2.0.0: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + retry@0.13.1: {} + + reusify@1.1.0: {} + + rewire@7.0.0(supports-color@8.1.1): + dependencies: + eslint: 8.57.1(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + rfdc@1.4.1: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + safer-buffer@2.1.2: {} + + semver-compare@1.0.0: {} + + semver@6.3.1: {} + + semver@7.8.5: {} + + serialize-javascript@7.0.6: {} + + set-blocking@2.0.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + sinon-chai@3.7.0(chai@4.5.0)(sinon@9.2.4): + dependencies: + chai: 4.5.0 + sinon: 9.2.4 + + sinon@9.2.4: + dependencies: + '@sinonjs/commons': 1.8.6 + '@sinonjs/fake-timers': 6.0.1 + '@sinonjs/samsam': 5.3.1 + diff: 4.0.4 + nise: 4.1.0 + supports-color: 7.2.0 + + slash@3.0.0: {} + + slice-ansi@3.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + source-map@0.6.1: {} + + spawn-wrap@2.0.0: + dependencies: + foreground-child: 2.0.0 + is-windows: 1.0.2 + make-dir: 3.1.0 + rimraf: 3.0.2 + signal-exit: 3.0.7 + which: 2.0.2 + + spawndamnit@3.0.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + string-argv@0.3.1: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + stringify-object@3.3.0: + dependencies: + get-own-enumerable-property-symbols: 3.0.2 + is-obj: 1.0.1 + is-regexp: 1.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@3.0.0: {} + + strip-bom@4.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-json-comments@3.1.1: {} + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + term-size@2.2.1: {} + + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.6 + glob: 7.2.3 + minimatch: 3.1.5 + + text-table@0.2.0: {} + + through@2.3.8: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tslib@2.8.1: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-detect@4.0.8: {} + + type-detect@4.1.0: {} + + type-fest@0.20.2: {} + + type-fest@0.21.3: {} + + type-fest@0.8.1: {} + + typedarray-to-buffer@3.1.5: + dependencies: + is-typedarray: 1.0.0 + + typescript@5.9.3: {} + + universalify@0.1.2: {} + + update-browserslist-db@1.2.3(browserslist@4.28.4): + dependencies: + browserslist: 4.28.4 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + uuid@11.1.1: {} + + which-module@2.0.1: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + workerpool@6.5.1: {} + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + write-file-atomic@3.0.3: + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + + y18n@4.0.3: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yaml@1.10.3: {} + + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + yargs-parser@20.2.9: {} + + yargs-unparser@2.0.0: + dependencies: + camelcase: 6.3.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 + + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + + yargs@16.2.2: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + 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 + + yocto-queue@0.1.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 00000000..77dc0ac3 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,12 @@ +allowBuilds: + msgpackr-extract: false +minimumReleaseAgeExclude: + - serialize-javascript@7.0.3 || 7.0.5 + - uuid@11.1.1 + - js-yaml@4.1.2 +overrides: + js-yaml@<=4.1.1: ^4.1.2 + serialize-javascript@<=7.0.2: ^7.0.3 + serialize-javascript@>=5.0.0 <7.0.5: ^7.0.5 + uuid@<11.1.1: ^11.1.1 + lodash@>=4.0.0 <4.17.23: ^4.17.23 diff --git a/tests/utilities/ssl-cert-snakeoil.key b/tests/utilities/ssl-cert-snakeoil.key index c8a8d56c..57d7a6db 100644 --- a/tests/utilities/ssl-cert-snakeoil.key +++ b/tests/utilities/ssl-cert-snakeoil.key @@ -1,15 +1,28 @@ ------BEGIN RSA PRIVATE KEY----- -MIICWwIBAAKBgQCzURxIqzer0ACAbX/lHdsn4Gd9PLKrf7EeDYfIdV0HZKPD8WDr -bBx2/fBu0OW2sjnzv/SVZbJ0DAuPE/p0+eT0qb2qC10iz9iTD7ribd7gxhirVb8y -b3fBjXsxc8V8p4Ny1LcvNSqCjwUbJqdRogfoJeTiqPM58z5sNzuv5iq7iwIDAQAB -AoGAPMQy4olrP0UotlzlJ36bowLP70ffgHCwU+/f4NWs5fF78c3du0oSx1w820Dd -Z7E0JF8bgnlJJTxjumPZz0RUCugrEHBKJmzEz3cxF5E3+7NvteZcjKn9D67RrM5x -1/uSZ9cqKE9cYvY4fSuHx18diyZ4axR/wB1Pea2utjjDM+ECQQDb9ZbmmaWMiRpQ -5Up+loxP7BZNPsEVsm+DVJmEFbaFgGfncWBqSIqnPNjMwTwj0OigTwCAEGPkfRVW -T0pbYWCxAkEA0LK7SCTwzyDmhASUalk0x+3uCAA6ryFdwJf/wd8TRAvVOmkTEldX -uJ7ldLvfrONYO3v56uKTU/SoNdZYzKtO+wJAX2KM4ctXYy5BXztPpr2acz4qHa1N -Bh+vBAC34fOYhyQ76r3b1btHhWZ5jbFuZwm9F2erC94Ps5IaoqcX07DSwQJAPKGw -h2U0EPkd/3zVIZCJJQya+vgWFIs9EZcXVtvYXQyTBkVApTN66MhBIYjzkub5205J -bVQmOV37AKklY1DhwQJAA1wos0cYxro02edzatxd0DIR2r4qqOqLkw6BhYHhq6HJ -ZvIcQkHqdSXzdETFc01I1znDGGIrJHcnvKWgBPoEUg== ------END RSA PRIVATE KEY----- \ No newline at end of file +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC+eM2oE76X5wMh +iD+87P8aa+sn7Qklry+Ve3NoBXA6zsBBJZ9Hrp4S3Rqwlviw3Te4XGGtb1raVJFX +wOfP3+P543FnNK6igAEWpZ5TCaeSvjEk2hW3kx6iRAwSZTdwelfLPwK8KFKNVSm7 +69wkKPS02gpuJCRx/CUuc4crHE2BeTmdRHNLvFuxdge2+nvcROANMKvScl5VHUFo +BcaPDNcIxvpWEN4IhIf5yM2EEh/LHJcrkAY0dKendh0K8vYLBAgqXV/PYFRpg60T +MWIyDSOhxuYuMxaqJaogJnOWmkcQ4vRzhJJmvo88FLYXMx+wurLX3EfeHOEJ6xrC +9YggmoPbAgMBAAECggEAF8spzwdvEDUUsDbVK38kRliD3uVz9pKsrDeTN5kyUg5W +Iu1AY/59aFgu3NochU+P2zEjJzzECdvK75OSrGZIvtnO5qMZ9lps3beLuyN3clPd +pL+05c1JjuCsQgywgRWva52FScb0ZQu7SRU811bhwXPZc1/YHlXEDp+c8OGPZw8W +J4cfjEn618FnX5oXLhmsUW6vb0qGFcwBoc91X9sshTGzQyaMlEph9nXkBLD5Li2V +4CXmAtwtHlinlJPEu4hRvJhoDKSYHJ2uChAw8N4RmJ4uyKUTZ89bwViKZDYCaQeA +RJb+aH9dVIZfTc33r7cKPfAga+Wu7oAOGKJ2ySIguQKBgQD96KgRcB3AUOq/GSIM +VWFkL6o6k1im9YlNAo8qLNdUsCZCMP+DKA8dMttIjirjqT0yIscvhflDY9AIW9gD +ZRuQ2gs3eYLKEroYBV4pgdlVgeTpLKOdLCVwU5uFPRIvZCR5xHxI8cCLGeS8H/hE +aljTQFl6uxfAxxaPChMux4tj4wKBgQDACmVYXXSuOF7TEtJG8XneIeFzq64/AumY +IAgCYX5XGAiGlkJ49+7YWzVMuCqqtoPvK+L69kV7u0Hfwgnhag0Nu/UO0AQdMiaq +12XsV2gO2iyAfYCcBdK17Z3ng7+zrvThFtb0LKAmW0OSf8a7Q8D4n7qDQZE4P+bY +knD+WZaRqQKBgHJWepifrEYWKh+z6ak0KY88B6QpBhrpJtMO+/k6CB2S1SepeOZO ++79iT2z02Et8wpn5H0k/Q2gdYmjhMv0UYr1v8u0gQs1McZCvmh+G4Z+nxrVZ7LOy +VYmnnLj7L10381UCLhWLB/Gbz20H2Hy2hxlaOPETnzaocHgpSUofgZ2RAoGAawfg +QAWmOEt2nhFJXPzMvT8I1l0C+l93La/8hscrkQL2DXzFg4I7fh4ncKDcNtUOZ0iA +cvq68yEEr98HfriKmfL9u8m34UXIQ0NVrQlyF4UFdH9+JHciXv8WGKhXOZ/zH1iJ +aQFOKNKIsKfCbTBv5qGvY+QxObZzxJSpoTjxMDECgYEAmWVeSxrgxGNg6MT5UcpZ +6RGyvvzoFpU1i6AB992rbIl43ISWfQ3dEUSCyIxRoJ4cQro+lQZ/Sp9eobtHx8dO +EEAnFuUCfDV8zXA9OPpJHEIHZGr7pBcNG4vhfRL4HypeHD304V2pA9934axk7T2Y +/Xjjl4pBeKYRgFSb99OIUmQ= +-----END PRIVATE KEY----- diff --git a/tests/utilities/ssl-cert-snakeoil.pem b/tests/utilities/ssl-cert-snakeoil.pem index e7c2f2b2..17a541d0 100644 --- a/tests/utilities/ssl-cert-snakeoil.pem +++ b/tests/utilities/ssl-cert-snakeoil.pem @@ -1,13 +1,21 @@ - -----BEGIN CERTIFICATE----- -MIIB1TCCAT4CCQDV5mPlzm9+izANBgkqhkiG9w0BAQUFADAvMS0wKwYDVQQDEyQ3 -NTI3YmQ3Ny1hYjNlLTQ3NGItYWNlNy1lZWQ2MDUzOTMxZTcwHhcNMTUwNzA2MjI0 -NTA3WhcNMjUwNzAzMjI0NTA3WjAvMS0wKwYDVQQDEyQ3NTI3YmQ3Ny1hYjNlLTQ3 -NGItYWNlNy1lZWQ2MDUzOTMxZTcwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGB -ALNRHEirN6vQAIBtf+Ud2yfgZ308sqt/sR4Nh8h1XQdko8PxYOtsHHb98G7Q5bay -OfO/9JVlsnQMC48T+nT55PSpvaoLXSLP2JMPuuJt3uDGGKtVvzJvd8GNezFzxXyn -g3LUty81KoKPBRsmp1GiB+gl5OKo8znzPmw3O6/mKruLAgMBAAEwDQYJKoZIhvcN -AQEFBQADgYEACzoHUF8UV2Z6541Q2wKEA0UFUzmUjf/E1XwBO+1P15ZZ64uw34B4 -1RwMPtAo9RY/PmICTWtNxWGxkzwb2JtDWtnxVER/lF8k2XcXPE76fxTHJF/BKk9J -QU8OTD1dd9gHCBviQB9TqntRZ5X7axjtuWjb2umY+owBYzAHZkp1HKI= ------END CERTIFICATE----- \ No newline at end of file +MIIDXTCCAkWgAwIBAgIUbVzbJbTe5FrzLDaDiKh00pewHtswDQYJKoZIhvcNAQEL +BQAwLzEtMCsGA1UEAwwkNzUyN2JkNzctYWIzZS00NzRiLWFjZTctZWVkNjA1Mzkz +MWU3MCAXDTI2MDYyNjE1MTUzNVoYDzIxMjYwNjAyMTUxNTM1WjAvMS0wKwYDVQQD +DCQ3NTI3YmQ3Ny1hYjNlLTQ3NGItYWNlNy1lZWQ2MDUzOTMxZTcwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC+eM2oE76X5wMhiD+87P8aa+sn7Qklry+V +e3NoBXA6zsBBJZ9Hrp4S3Rqwlviw3Te4XGGtb1raVJFXwOfP3+P543FnNK6igAEW +pZ5TCaeSvjEk2hW3kx6iRAwSZTdwelfLPwK8KFKNVSm769wkKPS02gpuJCRx/CUu +c4crHE2BeTmdRHNLvFuxdge2+nvcROANMKvScl5VHUFoBcaPDNcIxvpWEN4IhIf5 +yM2EEh/LHJcrkAY0dKendh0K8vYLBAgqXV/PYFRpg60TMWIyDSOhxuYuMxaqJaog +JnOWmkcQ4vRzhJJmvo88FLYXMx+wurLX3EfeHOEJ6xrC9YggmoPbAgMBAAGjbzBt +MB0GA1UdDgQWBBTF8JyAnL1L+tufXWCMA6XleU/rYjAfBgNVHSMEGDAWgBTF8JyA +nL1L+tufXWCMA6XleU/rYjAPBgNVHRMBAf8EBTADAQH/MBoGA1UdEQQTMBGCCWxv +Y2FsaG9zdIcEfwAAATANBgkqhkiG9w0BAQsFAAOCAQEAcFBWL1aKqwzkCMCYB7dD +sC7vceAvLroJiGZ+gu2u5AEunVIedewhTbbibFUIVERfPLsSuoCUqEeh3s6xSEQH +prfoZsZaK4ZkZzOXB9MeEFFyZG4dVSsboDiJVMWA9WhIrjSuDb9E9RF/HBsXRiS9 +lgiKg2wbPXJ/9PqEP913H3FRjmlvj37vfpiLMHZN0NXo7VEKAZLLCeImmn6qZxWD +InotY0lBM51cc9LvZZK8OlFLFxBrNt4SLJZKJDlw7a4n7aMhv4p66k+jlmblwrq8 +pVnIZmWTWht1Yef46oTxNVSSZyP1LAbObgUAIdAzXWYsYJflUWtNu71lzHPjGk/l +rw== +-----END CERTIFICATE----- From d2aab1faa80ace5b07093ea89d582ddd6ce7d9c0 Mon Sep 17 00:00:00 2001 From: Matt Paletta Date: Mon, 29 Jun 2026 10:21:19 +0100 Subject: [PATCH 2/6] ci: run attestation test via mocha directly, not pnpm, under libfaketime `pnpm run test:filter attestGA` hangs indefinitely when launched under LD_PRELOAD=libfaketime (CI log shows apt-get completing, then 30 min of silence in the test command). pnpm is a heavier Node process than the npm it replaced and deadlocks under faked time. Invoke the mocha binary directly so only the test process is wrapped by libfaketime. Co-Authored-By: Claude Opus 4.8 --- .github/workflows/test.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e6bc1beb..c4c6494b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -28,7 +28,9 @@ jobs: - run: pnpm run test:coverage - run: | sudo apt-get update ; sudo apt-get install -y libfaketime - LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1 pnpm run test:filter attestGA + # Run mocha directly rather than via `pnpm run`: pnpm hangs when + # launched under libfaketime, so only the test process is wrapped. + LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1 ./node_modules/.bin/mocha 'tests/**/*.test.js' --grep attestGA env: FAKETIME: '2023-09-22 11:24:32' if: ${{ matrix.perform-attestation }} From 179bda7fd1326e0a659295a7935c150b1477d4d7 Mon Sep 17 00:00:00 2001 From: Matt Paletta Date: Mon, 6 Jul 2026 14:51:39 +0100 Subject: [PATCH 3/6] Fixes from review --- .envrc | 1 + .github/workflows/e2e.yml | 6 +++--- .gitignore | 1 + package.json | 3 +++ 4 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 .envrc diff --git a/.envrc b/.envrc new file mode 100644 index 00000000..8392d159 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake \ No newline at end of file diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index f17fc76f..b96d86c8 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -20,9 +20,9 @@ jobs: include: - perform-attestation: true steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v5 + - uses: pnpm/action-setup@v5 + - uses: actions/setup-node@v5 with: node-version: ${{ matrix.node-version }} cache: 'pnpm' diff --git a/.gitignore b/.gitignore index ee390c09..6671f03b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ types +.direnv # Logs logs diff --git a/package.json b/package.json index d535dd40..c8a858bc 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,9 @@ "lib", "types" ], + "engines": { + "node": ">=22" + }, "homepage": "https://github.com/evervault/evervault-node#readme", "dependencies": { "agent-base": "^6.0.2", From 52e0462c0725cc24a35061badbf3e9999f3b2e17 Mon Sep 17 00:00:00 2001 From: Matt Paletta Date: Mon, 6 Jul 2026 14:54:00 +0100 Subject: [PATCH 4/6] Update more versions --- .github/workflows/codeql.yml | 2 +- .github/workflows/release.yml | 16 ++++++++-------- .github/workflows/test.yml | 6 +++--- .nvmrc | 1 + 4 files changed, 13 insertions(+), 12 deletions(-) create mode 100644 .nvmrc diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 2038b7f7..25ce5b26 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -38,7 +38,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v6 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8664cf10..3b1e1c9b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,15 +11,15 @@ jobs: should_publish: ${{ steps.check_release.outputs.should_publish }} steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Get tags run: git fetch --tags origin - name: Setup pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@v5 - name: Setup Node.js environment - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: - node-version: '24' + node-version-file: '.nvmrc' cache: 'pnpm' - name: Install dependencies run: pnpm install --frozen-lockfile @@ -68,13 +68,13 @@ jobs: contents: read steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@v5 - name: Setup Node.js environment - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: - node-version: '24' + node-version-file: '.nvmrc' registry-url: 'https://registry.npmjs.org' cache: 'pnpm' - name: Install dependencies diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c4c6494b..fb55ba30 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,9 +17,9 @@ jobs: include: - perform-attestation: true steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v6 + - uses: pnpm/action-setup@v5 + - uses: actions/setup-node@v5 with: node-version: ${{ matrix.node-version }} cache: 'pnpm' diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..244fbb4b --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v22.23.1 \ No newline at end of file From 1663caa9a2f0291ef56dbe6cfc0af0865b21f372 Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 20 Aug 2026 16:57:04 +0100 Subject: [PATCH 5/6] chore: remove dead code and reclassify test-only dependencies (#242) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: remove dead code and reclassify test-only dependencies Delete unused internal modules that were unreachable from the public API: - lib/core/labs.js + lib/core/labs/index.js (legacy `proxy-cage` helper) - lib/utils/dataHelper.js (imported `big.js`, which was never a declared dependency, and was referenced nowhere) - lib/utils/environment.js (legacy Function env-var extraction, unused) Move `crc-32` and `uuid` to devDependencies since they are only used by the test suite, not by lib/. Remove the leftover EV_CAGE_RUN_URL reference from the config test (the env var no longer exists in config). Test baseline unchanged: 204 passing (the 5 pre-existing proxy.test.js failures are environmental and unrelated to this change). Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_011HwoTRLdV2YMub47j88mv5 * feat!: convert SDK to TypeScript with a dual ESM/CJS build (#243) * feat!: convert SDK to TypeScript with a dual ESM/CJS build Rewrite the SDK source (lib/*.js -> lib/*.ts) in strict TypeScript, preserving runtime behaviour and the on-the-wire encryption formats exactly. Only module syntax and type annotations changed; the public API is identical. Build & packaging: - Add tsconfig.json (strict) and build with tsup to dist/ as dual ESM (index.mjs) + CommonJS (index.js) with bundled .d.ts. - Point package "main"/"module"/"types"/"exports" at dist and ship only dist; drop the tsc-based generate-types step. - keepNames so error `type`/constructor names are preserved. - require('@evervault/sdk') still returns the EvervaultClient class; `import Evervault from '@evervault/sdk'` works for ESM consumers. Types & internals: - Fold the hand-written types.d.ts / domainTargets.d.ts into source types; monkey-patched Node core modules use default imports so the mutable module.exports is patched (works in both CJS and ESM). Tests & CI: - Run the existing mocha suite against the TS source via tsx and replace rewire (incompatible with compiled TS) with proxyquire / shared-singleton config mutation. 204 passing, unchanged from the JS baseline (the 5 proxy.test.js failures are pre-existing and environmental). - Add typecheck + build steps to CI; bump CodeQL to v3 with the javascript-typescript language. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_011HwoTRLdV2YMub47j88mv5 * fix: don't clobber global https.request from non-relay clients; inject config in sdk tests CI ran the suite against the real network and surfaced two test-infra regressions from the TS migration that the local sandbox hid: - EvervaultClient's constructor called `_shouldOverloadHttpModule`, whose else-branch unconditionally ran `https.request = originalRequest`. On every non-relay client this reset the global `https.request`, removing nock's interception (nock doesn't re-patch once "active"), which cascaded failures across client/http test files. Guard the restore so it only runs when this process actually overloaded `https.request` for Relay. This is also more correct: a plain client no longer disables another client's outbound Relay. - sdk.test.js pointed the client at its mock server by mutating the config singleton. Under tsx the module-cache timing made that unreliable, so the client hit the real API. Inject the mutated config into the client with proxyquire (`{ './config': config }`), mirroring the old rewire `__set__`. Local suite unchanged (204 passing; the 5 proxy.test.js failures are environmental to this sandbox). Verified the guard preserves nock's patch and that config injection reaches the client. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_011HwoTRLdV2YMub47j88mv5 * test: run the suite against compiled CJS under plain Node instead of tsx The nock-based tests passed locally but failed in CI only. Running the suite through tsx (on-the-fly TS transpilation with a custom module loader) interacted with nock/axios HTTP interception differently on the CI runners, so requests bypassed nock and hit the network. Compile lib/*.ts to CJS with `tsc -p tsconfig.build.json` and run mocha against the emitted JS under plain Node — the same execution model the JavaScript suite used before the TypeScript migration. The compiled lib/*.js are build artifacts (git- and prettier-ignored); tsup still builds the published dual-format bundle from the .ts sources, and `tsc --noEmit` still type-checks. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_011HwoTRLdV2YMub47j88mv5 * fix: stop mocharc spec from pulling the unit suite into the e2e run Mocha concatenates the `spec` from `.mocharc.json` with any CLI positional file arguments rather than letting the CLI override it. The `test:e2e` script (run by the `e2e.yml` workflow) invokes `mocha 'e2e/**/*.test.js'`, so once `.mocharc.json` declared `spec: tests/**`, that job silently ran the entire unit suite alongside the e2e tests. The e2e tests run first, call `enableOutboundRelay()` which monkey-patches the global `https.request`, and that leaves nock unable to intercept the unit tests — producing the CI-only failures. Keep only `timeout` in `.mocharc.json` and pass the unit spec explicitly on the CLI in `test` / `test:filter`, so each mocha invocation resolves exactly one suite (matching the pre-TypeScript setup). Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_011HwoTRLdV2YMub47j88mv5 * feat: infer real types across the SDK, replacing any at the public API Give consumers precise types instead of `any` on the client surface: - encrypt returns EncryptedData, preserving input shape (objects keep their keys with encrypted string leaves, Buffers stay Buffers, primitives become strings) and rejecting non-encryptable inputs - decrypt, run (-> FunctionRunResult), createRunToken (-> RunToken) and createClientSideDecryptToken (-> ClientSideToken) now carry real types - hidden ECDH fields typed as Buffer / crypto.ECDH / NodeJS.Timeout Internally, export a reusable HttpClient type and thread it through attestationDoc/relayOutboundConfig/httpsHelper; type the PCR store, the attestation helpers, and the key/token/relay response shapes. Also make Http.getAppKey throw mapResponseCodeToError on non-2xx (mirroring getCageKey) instead of returning undefined and crashing downstream. Genuinely dynamic/vendored surfaces (crypto key material that is Buffer|string, the agent-base subclass, the asn1js DER encoder, the https.request/tls monkeypatch paths) are left untyped with rationale comments. Co-Authored-By: Claude Opus 4.8 * fix: raise e2e mocha timeout to 30s to absorb httpbin latency The two path-filtering outbound-relay tests each make two httpbin.org requests; the 5s timeout was too tight for slow-but-reachable httpbin, causing intermittent timeouts. Align with the .mocharc.json default (30s). Co-Authored-By: Claude Opus 4.8 * Format and fix * Rename lint to format --------- Co-authored-by: Claude * Remove uuid dependency and cleanup changelog --------- Co-authored-by: Claude --- .changeset/typescript-rewrite.md | 9 + .github/workflows/codeql.yml | 8 +- .github/workflows/e2e.yml | 2 +- .github/workflows/test.yml | 4 +- .gitignore | 4 + .husky/pre-commit | 2 +- .mocharc.json | 3 + .prettierignore | 6 + .prettierrc | 1 - CONTRIBUTING.md | 2 +- lib/{config.js => config.ts} | 8 +- .../{attestationDoc.js => attestationDoc.ts} | 32 +- lib/core/{crypto.js => crypto.ts} | 181 +- lib/core/{http.js => http.ts} | 114 +- lib/core/index.js | 8 - lib/core/index.ts | 5 + lib/core/labs.js | 12 - lib/core/labs/index.js | 3 - lib/core/{pcrManager.js => pcrManager.ts} | 38 +- ...tboundConfig.js => relayOutboundConfig.ts} | 16 +- .../{repeatedTimer.js => repeatedTimer.ts} | 22 +- lib/curves/{base.js => base.ts} | 38 +- lib/curves/{constants.js => constants.ts} | 2 +- lib/curves/index.js | 3 - lib/curves/index.ts | 1 + lib/{index.js => index.ts} | 266 +-- lib/types.d.ts | 67 - lib/types.ts | 147 ++ lib/utils/{attest.js => attest.ts} | 119 +- lib/utils/{certHelper.js => certHelper.ts} | 13 +- lib/utils/{crc32.js => crc32.ts} | 4 +- lib/utils/dataHelper.js | 28 - lib/utils/datatypes.js | 74 - lib/utils/datatypes.ts | 59 + lib/utils/domainTargets.d.ts | 14 - .../{domainTargets.js => domainTargets.ts} | 57 +- lib/utils/environment.js | 23 - lib/utils/errors.js | 102 -- lib/utils/errors.ts | 113 ++ lib/utils/{httpsHelper.js => httpsHelper.ts} | 91 +- lib/utils/index.js | 10 - lib/utils/index.ts | 7 + lib/utils/{proxyAgent.js => proxyAgent.ts} | 61 +- ...alidationHelper.js => validationHelper.ts} | 23 +- package.json | 45 +- pnpm-lock.yaml | 1589 +++++++++++++---- pnpm-workspace.yaml | 3 +- tests/client.test.js | 14 +- tests/config.test.js | 15 +- tests/core/crypto.test.js | 2 +- tests/core/http.test.js | 9 +- tests/core/repeatedTimer.test.js | 2 +- tests/proxy.test.js | 2 +- tests/sdk.test.js | 17 +- tsconfig.build.json | 11 + tsconfig.json | 19 + tsup.config.ts | 12 + 57 files changed, 2273 insertions(+), 1269 deletions(-) create mode 100644 .changeset/typescript-rewrite.md create mode 100644 .mocharc.json create mode 100644 .prettierignore rename lib/{config.js => config.ts} (93%) rename lib/core/{attestationDoc.js => attestationDoc.ts} (63%) rename lib/core/{crypto.js => crypto.ts} (76%) rename lib/core/{http.js => http.ts} (73%) delete mode 100644 lib/core/index.js create mode 100644 lib/core/index.ts delete mode 100644 lib/core/labs.js delete mode 100644 lib/core/labs/index.js rename lib/core/{pcrManager.js => pcrManager.ts} (78%) rename lib/core/{relayOutboundConfig.js => relayOutboundConfig.ts} (71%) rename lib/core/{repeatedTimer.js => repeatedTimer.ts} (66%) rename lib/curves/{base.js => base.ts} (81%) rename lib/curves/{constants.js => constants.ts} (98%) delete mode 100644 lib/curves/index.js create mode 100644 lib/curves/index.ts rename lib/{index.js => index.ts} (68%) delete mode 100644 lib/types.d.ts create mode 100644 lib/types.ts rename lib/utils/{attest.js => attest.ts} (64%) rename lib/utils/{certHelper.js => certHelper.ts} (65%) rename lib/utils/{crc32.js => crc32.ts} (89%) delete mode 100644 lib/utils/dataHelper.js delete mode 100644 lib/utils/datatypes.js create mode 100644 lib/utils/datatypes.ts delete mode 100644 lib/utils/domainTargets.d.ts rename lib/utils/{domainTargets.js => domainTargets.ts} (71%) delete mode 100644 lib/utils/environment.js delete mode 100644 lib/utils/errors.js create mode 100644 lib/utils/errors.ts rename lib/utils/{httpsHelper.js => httpsHelper.ts} (62%) delete mode 100644 lib/utils/index.js create mode 100644 lib/utils/index.ts rename lib/utils/{proxyAgent.js => proxyAgent.ts} (81%) rename lib/utils/{validationHelper.js => validationHelper.ts} (75%) create mode 100644 tsconfig.build.json create mode 100644 tsconfig.json create mode 100644 tsup.config.ts diff --git a/.changeset/typescript-rewrite.md b/.changeset/typescript-rewrite.md new file mode 100644 index 00000000..ffd9e4bd --- /dev/null +++ b/.changeset/typescript-rewrite.md @@ -0,0 +1,9 @@ +--- +"@evervault/sdk": major +--- + +Rewrite the SDK in TypeScript. The package now ships a compiled `dist/` bundle with dual ESM and CommonJS entry points plus bundled type declarations (built with `tsup`), replacing the previously shipped JavaScript source and the `tsc`-generated `types/` directory. + +The public API is unchanged: `require('@evervault/sdk')` still returns the `EvervaultClient` class, `import Evervault from '@evervault/sdk'` works for ESM consumers, and every client method keeps the same signature and runtime behaviour (including the on-the-wire encryption formats). This is released as a major version only because the package's internal file layout and `exports` map changed, which can affect consumers that imported internal file paths directly. + +Remove unused internal modules (`labs`, `dataHelper`, `environment`) and their dead dependency reference (`big.js` was imported but never installed). Move test-only dependencies `crc-32` to `devDependencies`. Removed dependency on uuid. diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 25ce5b26..01354d80 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -32,7 +32,7 @@ jobs: strategy: fail-fast: false matrix: - language: ['javascript'] + language: ['javascript-typescript'] # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support @@ -42,7 +42,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -55,7 +55,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@v3 # ℹ️ Command-line programs to run using the OS shell. # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun @@ -68,6 +68,6 @@ jobs: # ./location_of_script_within_repo/buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 with: category: '/language:${{matrix.language}}' diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index b96d86c8..3612c1ea 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -27,7 +27,7 @@ jobs: node-version: ${{ matrix.node-version }} cache: 'pnpm' - run: pnpm install --frozen-lockfile - - run: pnpm run lint + - run: pnpm run format - run: pnpm run test:e2e env: EV_APP_UUID: ${{ secrets.EV_APP_UUID_V5 }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index fb55ba30..509fce52 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -24,7 +24,9 @@ jobs: node-version: ${{ matrix.node-version }} cache: 'pnpm' - run: pnpm install --frozen-lockfile - - run: pnpm run lint + - run: pnpm run format + - run: pnpm run typecheck + - run: pnpm run build - run: pnpm run test:coverage - run: | sudo apt-get update ; sudo apt-get install -y libfaketime diff --git a/.gitignore b/.gitignore index 6671f03b..a1e27329 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,10 @@ types .direnv +# Compiled JS emitted from lib/*.ts for running the test suite under plain Node +lib/**/*.js +lib/**/*.js.map + # Logs logs *.log diff --git a/.husky/pre-commit b/.husky/pre-commit index 5e592735..80fabd3a 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1,4 @@ #!/bin/sh . "$(dirname "$0")/_/husky.sh" -pnpm exec lint-staged +pnpm format diff --git a/.mocharc.json b/.mocharc.json new file mode 100644 index 00000000..d84a0c2c --- /dev/null +++ b/.mocharc.json @@ -0,0 +1,3 @@ +{ + "timeout": 30000 +} diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..75a52e40 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,6 @@ +dist +node_modules +coverage +pnpm-lock.yaml +lib/**/*.js +lib/**/*.js.map diff --git a/.prettierrc b/.prettierrc index 7b5de068..c07e9c1e 100644 --- a/.prettierrc +++ b/.prettierrc @@ -3,6 +3,5 @@ tabWidth: 2 semi: true singleQuote: true bracketSpacing: true -jsxBracketSameLine: false arrowParens: 'always' insertPragma: false diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 11ee3dbe..b48a19cd 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -30,7 +30,7 @@ The `pre-commit` hook ensures that code is formatted correctly. We use [prettier It should be possible to configure your editor to run prettier on save, which should make your life easier - have a look at [editor support](https://prettier.io/docs/en/editors.html). -There is a test that is run whenever a pull request is made (`pnpm run lint`), so please ensure that your code is formatted correctly before committing! +There is a test that is run whenever a pull request is made (`pnpm run format`), so please ensure that your code is formatted correctly before committing! ## Commit Formatting & Releases diff --git a/lib/config.js b/lib/config.ts similarity index 93% rename from lib/config.js rename to lib/config.ts index 1ec72378..5b9c2933 100644 --- a/lib/config.js +++ b/lib/config.ts @@ -1,4 +1,5 @@ -const { version } = require('../package.json'); +import { version } from '../package.json'; +import type { MasterConfig } from './types'; const DEFAULT_API_URL = 'https://api.evervault.com'; const DEFAULT_TUNNEL_HOSTNAME = 'https://relay.evervault.com:443'; @@ -9,8 +10,7 @@ const DEFAULT_MAX_FILE_SIZE_IN_MB = 25; const DEFAULT_ATTEST_POLL_INTERVAL = 120; const DEFAULT_PCR_PROVIDER_POLL_INTERVAL = 60; -/** @type {import('./types').MasterConfig} */ -module.exports = { +const config: MasterConfig = { http: { baseUrl: process.env.EV_API_URL || DEFAULT_API_URL, userAgent: `evervault-node/${version}`, @@ -61,3 +61,5 @@ module.exports = { }, }, }; + +export = config; diff --git a/lib/core/attestationDoc.js b/lib/core/attestationDoc.ts similarity index 63% rename from lib/core/attestationDoc.js rename to lib/core/attestationDoc.ts index 76c25b80..0783035d 100644 --- a/lib/core/attestationDoc.js +++ b/lib/core/attestationDoc.ts @@ -1,7 +1,23 @@ -const RepeatedTimer = require('./repeatedTimer'); +import RepeatedTimer from './repeatedTimer'; +import type { HttpClient } from './http'; +import type { MasterConfig } from '../types'; class AttestationDoc { - constructor(config, http, enclaves, appUuid, hostname) { + appUuid: string; + http: HttpClient; + enclaves: string[]; + config: MasterConfig; + polling: ReturnType | null; + attestationDocCache: Record | null; + hostname: string; + + constructor( + config: MasterConfig, + http: HttpClient, + enclaves: string[], + appUuid: string, + hostname: string + ) { this.appUuid = appUuid.replace(/_/g, '-'); this.http = http; this.enclaves = enclaves; @@ -25,21 +41,21 @@ class AttestationDoc { return null; }; - loadAttestationDoc = async (name) => { + loadAttestationDoc = async (name: string) => { try { const response = await this.http.getAttestationDoc( name, this.appUuid, this.hostname ); - this.attestationDocCache[name] = response.attestation_doc; + this.attestationDocCache![name] = response.attestation_doc; } catch (e) { console.warn(`Couldn't load attestation doc for ${name} ${e}`); } }; - get = (name) => { - const doc = this.attestationDocCache[name]; + get = (name: string) => { + const doc = this.attestationDocCache![name]; if (!doc) { console.warn(`No attestation doc found for ${name}`); } @@ -65,10 +81,10 @@ class AttestationDoc { _getAttestationDocs = async () => { await Promise.all( this.enclaves.map(async (name) => { - await this.loadAttestationDoc(name, this.appUuid); + await this.loadAttestationDoc(name); }) ); }; } -module.exports = AttestationDoc; +export default AttestationDoc; diff --git a/lib/core/crypto.js b/lib/core/crypto.ts similarity index 76% rename from lib/core/crypto.js rename to lib/core/crypto.ts index abcbc833..a70e3caa 100644 --- a/lib/core/crypto.js +++ b/lib/core/crypto.ts @@ -1,13 +1,14 @@ -const crypto = require('crypto'); -const { Encoding } = require('../curves'); -const Datatypes = require('../utils/datatypes'); -const { errors } = require('../utils'); -const CRC32 = require('../utils/crc32'); +import * as crypto from 'crypto'; +import { Encoding } from '../curves'; +import * as Datatypes from '../utils/datatypes'; +import { errors } from '../utils'; +import CRC32 from '../utils/crc32'; +import type { CurveConfig } from '../types'; const PRIME256V1 = 'prime256v1'; const SECP256K1 = 'secp256k1'; -const generateBytes = (byteLength) => { +const generateBytes = (byteLength: number): Promise => { return new Promise((resolve, reject) => crypto.randomBytes(byteLength, (err, buf) => { return err ? reject(err) : resolve(buf); @@ -17,22 +18,22 @@ const generateBytes = (byteLength) => { const DEFAULT_ENCRYPT_OPTIONS = { preserveObjectShape: true, - fieldsToEncrypt: undefined, + fieldsToEncrypt: undefined as string[] | undefined, }; -/** - * @param {import('../types').CurveConfig} config - */ -module.exports = (config) => { - let MAX_FILE_SIZE_IN_BYTES = config.maxFileSizeInMB * 1024 * 1024; +type EncryptOptions = typeof DEFAULT_ENCRYPT_OPTIONS; + +const Crypto = (config: CurveConfig) => { + let MAX_FILE_SIZE_IN_BYTES = Number(config.maxFileSizeInMB) * 1024 * 1024; const _encryptObject = async ( - curve, - ecdhTeamKey, - ecdhPublicKey, - derivedSecret, - data, - role - ) => { + curve: string, + ecdhTeamKey: any, + ecdhPublicKey: any, + derivedSecret: Buffer, + data: any, + role?: string | null, + _options?: EncryptOptions + ): Promise => { return await _traverseObject( curve, ecdhTeamKey, @@ -43,13 +44,13 @@ module.exports = (config) => { ); }; const _traverseObject = async ( - curve, - ecdhTeamKey, - ecdhPublicKey, - derivedSecret, - data, - role - ) => { + curve: string, + ecdhTeamKey: any, + ecdhPublicKey: any, + derivedSecret: Buffer, + data: any, + role?: string | null + ): Promise => { if (Datatypes.isEncryptable(data)) { return await _encryptString( curve, @@ -74,9 +75,9 @@ module.exports = (config) => { } return encryptedObject; } else if (Datatypes.isArray(data)) { - const encryptedArray = [...data]; + const encryptedArray: any[] = [...data]; for (let [key, value] of Object.entries(encryptedArray)) { - encryptedArray[key] = await _traverseObject( + encryptedArray[key as any] = await _traverseObject( curve, ecdhTeamKey, ecdhPublicKey, @@ -91,11 +92,16 @@ module.exports = (config) => { } }; - const base64RemovePadding = (str) => { + const base64RemovePadding = (str: string): string => { return str.replace(/={1,2}$/, ''); }; - const getSharedSecret = (ecdh, publicKey, ephemeralPublicKey, curveName) => { + const getSharedSecret = ( + ecdh: crypto.ECDH, + publicKey: any, + ephemeralPublicKey: any, + curveName: string + ): Buffer => { const secret = ecdh.computeSecret(Buffer.from(publicKey, 'base64')); const uncompressedKey = crypto.ECDH.convertKey( ephemeralPublicKey, @@ -103,7 +109,7 @@ module.exports = (config) => { 'base64', 'base64', 'uncompressed' - ); + ) as string; const concatSecret = Buffer.concat([ secret, Buffer.from([0x00, 0x00, 0x00, 0x01]), @@ -116,11 +122,11 @@ module.exports = (config) => { }; function createV2Aad( - dataType, - hasDataPolicy, - ephemeralPublicKeyBytes, - appPublicKeyBytes - ) { + dataType: string | undefined, + hasDataPolicy: boolean, + ephemeralPublicKeyBytes: Buffer, + appPublicKeyBytes: Buffer + ): Buffer { let dataTypeNumber = 0; // Default to String if (dataType === 'number') { @@ -163,23 +169,23 @@ module.exports = (config) => { } const _encryptString = async ( - curve, - ecdhTeamKey, - ecdhPublicKey, - derivedSecret, - str, - datatype, - role - ) => { + curve: string, + ecdhTeamKey: any, + ecdhPublicKey: any, + derivedSecret: Buffer, + str: any, + datatype: string | undefined, + role?: string | null + ): Promise => { const keyIv = await generateBytes(config.ivLength); const cipher = crypto.createCipheriv( - config.cipherAlgorithm, + config.cipherAlgorithm as crypto.CipherGCMTypes, derivedSecret, keyIv, { authTagLength: config.authTagLength, } - ); + ) as crypto.CipherGCM; if (role && (curve === PRIME256V1 || curve === SECP256K1)) { const aad = createV2Aad( datatype, @@ -209,8 +215,11 @@ module.exports = (config) => { ); }; - const buildEncodedMetadata = (role, encryptionTimestamp) => { - let buffer = []; + const buildEncodedMetadata = ( + role: string | null | undefined, + encryptionTimestamp: number + ): Buffer => { + let buffer: number[] = []; // Binary representation of a fixed map with 2 or 3 items, followed by the key-value pairs. buffer.push(0x80 | (!role ? 2 : 3)); @@ -249,8 +258,8 @@ module.exports = (config) => { return Buffer.from(buffer); }; - const buildCipherBuffer = (data, role) => { - let result; + const buildCipherBuffer = (data: any, role?: string | null): Buffer => { + let result: Buffer; if (role) { const metadataBytes = buildEncodedMetadata( role, @@ -265,10 +274,10 @@ module.exports = (config) => { return result; }; - const _evVersionPrefix = (role) => + const _evVersionPrefix = (role?: string | null | boolean): string => role ? config.evVersionWithMetadata : config.evVersion; - const _evEncryptedFileVersion = () => { + const _evEncryptedFileVersion = (): Buffer => { if (config.ecdhCurve == 'secp256k1') { return Buffer.from([0x02]); } else if (config.ecdhCurve === 'prime256v1') { @@ -279,12 +288,12 @@ module.exports = (config) => { }; const _format = ( - datatype = 'string', - keyIv, - ecdhPublicKey, - encryptedData, - role - ) => { + datatype: string | undefined = 'string', + keyIv: string, + ecdhPublicKey: any, + encryptedData: string, + role?: string | null + ): string => { return `ev:${_evVersionPrefix(role)}${ datatype !== 'string' ? ':' + datatype : '' }:${base64RemovePadding(keyIv)}:${base64RemovePadding( @@ -293,20 +302,20 @@ module.exports = (config) => { }; const _encryptBytes = ( - data, - setAuthData, - derivedSecret, - ecdhTeamKey, - keyIv - ) => { + data: Buffer, + setAuthData: boolean, + derivedSecret: Buffer, + ecdhTeamKey: any, + keyIv: Buffer + ): Buffer => { const cipher = crypto.createCipheriv( - config.cipherAlgorithm, + config.cipherAlgorithm as crypto.CipherGCMTypes, derivedSecret, keyIv, { authTagLength: config.authTagLength, } - ); + ) as crypto.CipherGCM; if (setAuthData) { cipher.setAAD(Buffer.from(ecdhTeamKey, 'base64')); @@ -320,13 +329,13 @@ module.exports = (config) => { }; const _encryptFile = async ( - curve, - ecdhTeamKey, - ecdhPublicKey, - derivedSecret, - data, - role - ) => { + curve: string, + ecdhTeamKey: any, + ecdhPublicKey: any, + derivedSecret: Buffer, + data: Buffer, + role?: string | null + ): Promise => { const fileSizeInBytes = data.length; if (role) { throw new errors.DataRolesNotSupportedError( @@ -353,11 +362,15 @@ module.exports = (config) => { return _formatFile(keyIv, ecdhPublicKey, encryptedBuffer); }; - const _calculateOffsetToData = () => { + const _calculateOffsetToData = (): Buffer => { return Buffer.from([0x37, 0x00]); // 55 bytes to starting byte of data if no metadtata }; - const _formatFile = async (keyIv, ecdhPublicKey, encryptedData) => { + const _formatFile = async ( + keyIv: Buffer, + ecdhPublicKey: any, + encryptedData: Buffer + ): Promise => { const evEncryptedFileIdentifier = Buffer.from([ 0x25, 0x45, 0x56, 0x45, 0x4e, 0x43, ]); @@ -386,14 +399,14 @@ module.exports = (config) => { }; const encrypt = async ( - curve, - ecdhTeamKey, - ecdhPublicKey, - derivedSecret, - data, - role = undefined, - options = DEFAULT_ENCRYPT_OPTIONS - ) => { + curve: string, + ecdhTeamKey: any, + ecdhPublicKey: any, + derivedSecret: Buffer, + data: any, + role: string | null | undefined = undefined, + options: EncryptOptions = DEFAULT_ENCRYPT_OPTIONS + ): Promise => { if (!Datatypes.isDefined(data)) { throw new Error('Data must not be undefined'); } @@ -449,3 +462,5 @@ module.exports = (config) => { buildEncodedMetadata, }; }; + +export default Crypto; diff --git a/lib/core/http.js b/lib/core/http.ts similarity index 73% rename from lib/core/http.js rename to lib/core/http.ts index 7ee60edb..1824b469 100644 --- a/lib/core/http.js +++ b/lib/core/http.ts @@ -1,23 +1,41 @@ -const { errors, Datatypes } = require('../utils'); +import { errors, Datatypes } from '../utils'; +import axios from 'axios'; +import type { + AxiosRequestConfig, + AxiosResponse, + Method, + ResponseType, +} from 'axios'; +import type { + HttpConfig, + TeamKeyResponse, + ClientSideToken, + RelayOutboundConfigResponse, + DecryptableData, +} from '../types'; +import type { Agent as HttpAgent } from 'http'; +import type { Agent as HttpsAgent } from 'https'; -const axios = require('axios'); +interface HttpAgents { + httpAgent?: HttpAgent; + httpsAgent?: HttpsAgent; +} -/** - * @param {string} appUuid - * @param {string} apiKey - * @param {import('../types').HttpConfig} config - * @param {{ httpAgent?: import('http').Agent, httpsAgent?: import('https').Agent }} [agents] - */ -module.exports = (appUuid, apiKey, config, { httpAgent, httpsAgent } = {}) => { +const Http = ( + appUuid: string, + apiKey: string, + config: HttpConfig, + { httpAgent, httpsAgent }: HttpAgents = {} +) => { const request = ( - method, - path, - additionalHeaders = {}, - data = undefined, + method: Method, + path: string, + additionalHeaders: Record = {}, + data: unknown = undefined, basicAuth = false, - responseType = 'json' - ) => { - const headers = { + responseType: ResponseType = 'json' + ): Promise => { + const headers: Record = { 'user-agent': config.userAgent, ...additionalHeaders, }; @@ -29,7 +47,7 @@ module.exports = (appUuid, apiKey, config, { httpAgent, httpsAgent } = {}) => { headers['api-key'] = apiKey; } - const requestConfig = { + const requestConfig: AxiosRequestConfig = { url: path.startsWith('https://') || path.startsWith('http://') ? path @@ -37,7 +55,7 @@ module.exports = (appUuid, apiKey, config, { httpAgent, httpsAgent } = {}) => { method, headers, data, - validateStatus: (_) => true, + validateStatus: (_status: number) => true, responseType, }; @@ -47,19 +65,20 @@ module.exports = (appUuid, apiKey, config, { httpAgent, httpsAgent } = {}) => { return axios(requestConfig); }; - const get = (path, headers) => request('GET', path, headers); + const get = (path: string, headers?: Record) => + request('GET', path, headers); const post = ( - path, - data, - headers = { 'Content-Type': 'application/json' }, + path: string, + data: unknown, + headers: Record = { 'Content-Type': 'application/json' }, basicAuth = false, - responseType = 'json' + responseType: ResponseType = 'json' ) => request('POST', path, headers, data, basicAuth, responseType); - const getCageKey = async () => { + const getCageKey = async (): Promise => { const getCagesKeyCallback = async () => { - return await get('cages/key', {}, true).catch((_e) => { + return await get('cages/key', {}).catch((_e) => { throw new errors.EvervaultError( "An error occurred while retrieving the cage's key" ); @@ -72,7 +91,7 @@ module.exports = (appUuid, apiKey, config, { httpAgent, httpsAgent } = {}) => { throw errors.mapResponseCodeToError(response); }; - const getAppKey = async () => { + const getAppKey = async (): Promise => { const getAppKeyCallback = async () => { return await get('keys', { 'x-evervault-app-id': appUuid, @@ -86,6 +105,7 @@ module.exports = (appUuid, apiKey, config, { httpAgent, httpsAgent } = {}) => { if (response.status >= 200 && response.status < 300) { return response.data; } + throw errors.mapResponseCodeToError(response); }; const getCert = async () => { @@ -99,7 +119,11 @@ module.exports = (appUuid, apiKey, config, { httpAgent, httpsAgent } = {}) => { return response.data; }; - const getAttestationDoc = async (enclaveName, appUuid, hostname) => { + const getAttestationDoc = async ( + enclaveName: string, + appUuid: string, + hostname?: string + ) => { let url = `https://${enclaveName}.${appUuid}.${ hostname ? hostname : config.enclavesHostname }/.well-known/attestation`; @@ -113,7 +137,10 @@ module.exports = (appUuid, apiKey, config, { httpAgent, httpsAgent } = {}) => { return response.data; }; - const getRelayOutboundConfig = async () => { + const getRelayOutboundConfig = async (): Promise<{ + pollInterval: number | null; + data: RelayOutboundConfigResponse; + }> => { const response = await get('v2/relay-outbound').catch((e) => { throw new errors.EvervaultError( `An error occoured while retrieving the Relay Outbound configuration: ${e}` @@ -131,7 +158,10 @@ module.exports = (appUuid, apiKey, config, { httpAgent, httpsAgent } = {}) => { throw errors.mapResponseCodeToError(response); }; - const runFunction = async (functionName, payload) => { + const runFunction = async ( + functionName: string, + payload: Record + ) => { const response = await post( `${config.baseUrl}/functions/${functionName}/runs`, { @@ -155,7 +185,10 @@ module.exports = (appUuid, apiKey, config, { httpAgent, httpsAgent } = {}) => { throw errors.mapApiResponseToError(responseBody); }; - const createRunToken = (functionName, payload) => { + const createRunToken = ( + functionName: string, + payload: Record + ) => { return post( `v2/functions/${functionName}/run-token`, { @@ -168,13 +201,13 @@ module.exports = (appUuid, apiKey, config, { httpAgent, httpsAgent } = {}) => { }; async function makeGetRequestWithRetry( - requestCallback, + requestCallback: () => Promise, maxRetries = 3, retryDelay = 250 - ) { + ): Promise { let retryCount = 0; let retryDelayMs = retryDelay; - let error = null; + let error: unknown = null; while (retryCount < maxRetries) { try { return await requestCallback().then((response) => { @@ -195,10 +228,10 @@ module.exports = (appUuid, apiKey, config, { httpAgent, httpsAgent } = {}) => { throw error; } - const decrypt = async (encryptedData) => { + const decrypt = async (encryptedData: DecryptableData): Promise => { let contentType; let data; - let responseType; + let responseType: ResponseType; if (Buffer.isBuffer(encryptedData)) { contentType = 'application/octet-stream'; data = encryptedData; @@ -232,7 +265,11 @@ module.exports = (appUuid, apiKey, config, { httpAgent, httpsAgent } = {}) => { throw errors.mapApiResponseToError(resBody); }; - const createToken = async (action, payload, expiry) => { + const createToken = async ( + action: string, + payload: unknown, + expiry?: Date | number | null + ): Promise => { let wellFormedExpiry; if (expiry) { if (expiry && expiry instanceof Date) { @@ -288,3 +325,8 @@ module.exports = (appUuid, apiKey, config, { httpAgent, httpsAgent } = {}) => { getAttestationDoc, }; }; + +export default Http; + +/** The HTTP client returned by {@link Http}. */ +export type HttpClient = ReturnType; diff --git a/lib/core/index.js b/lib/core/index.js deleted file mode 100644 index 92df3cee..00000000 --- a/lib/core/index.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - Crypto: require('./crypto'), - Http: require('./http'), - Labs: require('./labs'), - RelayOutboundConfig: require('./relayOutboundConfig'), - AttestationDoc: require('./attestationDoc'), - PcrManager: require('./pcrManager'), -}; diff --git a/lib/core/index.ts b/lib/core/index.ts new file mode 100644 index 00000000..081234c1 --- /dev/null +++ b/lib/core/index.ts @@ -0,0 +1,5 @@ +export { default as Crypto } from './crypto'; +export { default as Http } from './http'; +export * as RelayOutboundConfig from './relayOutboundConfig'; +export { default as AttestationDoc } from './attestationDoc'; +export { default as PcrManager } from './pcrManager'; diff --git a/lib/core/labs.js b/lib/core/labs.js deleted file mode 100644 index 3113466a..00000000 --- a/lib/core/labs.js +++ /dev/null @@ -1,12 +0,0 @@ -module.exports = ({ http, crypto, run }) => { - return { - fetch: async (url, options) => { - const { body } = await http.runFunction('proxy-cage', { - url, - options, - }); - - return body.result; - }, - }; -}; diff --git a/lib/core/labs/index.js b/lib/core/labs/index.js deleted file mode 100644 index 400f8838..00000000 --- a/lib/core/labs/index.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - // Currently no experimental features -}; diff --git a/lib/core/pcrManager.js b/lib/core/pcrManager.ts similarity index 78% rename from lib/core/pcrManager.js rename to lib/core/pcrManager.ts index 4bb49e0b..6ac4f033 100644 --- a/lib/core/pcrManager.js +++ b/lib/core/pcrManager.ts @@ -1,8 +1,19 @@ -const RepeatedTimer = require('./repeatedTimer'); +import RepeatedTimer from './repeatedTimer'; +import type { + MasterConfig, + PCRs, + AttestationData, + AttestationCallback, +} from '../types'; + +interface PcrStoreEntry { + pcrs: AttestationData | null; + provider: () => Promise; +} -const staticPcrsToProvider = (pcrs) => { +const staticPcrsToProvider = (pcrs: PCRs[]): PcrStoreEntry => { const provider = async () => { - return new Promise((resolve) => { + return new Promise((resolve) => { resolve(pcrs); }); }; @@ -10,8 +21,10 @@ const staticPcrsToProvider = (pcrs) => { return { pcrs, provider }; }; -const loadPcrStore = (attestationData) => { - const providers = {}; +const loadPcrStore = ( + attestationData: Record +) => { + const providers: Record = {}; for (const [enclaveName, value] of Object.entries(attestationData)) { if (Array.isArray(value)) { providers[enclaveName] = staticPcrsToProvider(value); @@ -28,7 +41,14 @@ const loadPcrStore = (attestationData) => { }; class PcrManager { - constructor(config, attestationData) { + store: Record; + config: MasterConfig; + polling: ReturnType | null; + + constructor( + config: MasterConfig, + attestationData: Record + ) { this.store = loadPcrStore(attestationData); this.config = config; this.polling = null; @@ -48,7 +68,7 @@ class PcrManager { return null; }; - fetchPcrs = async (enclaveName) => { + fetchPcrs = async (enclaveName: string) => { const enclave = this.store[enclaveName]; if (!enclave || !enclave.provider) { @@ -92,7 +112,7 @@ class PcrManager { } }; - get = (enclaveName) => { + get = (enclaveName: string) => { const storedAttestationData = this.store[enclaveName]; const pcrs = storedAttestationData ? storedAttestationData.pcrs : undefined; @@ -137,4 +157,4 @@ class PcrManager { }; } -module.exports = PcrManager; +export default PcrManager; diff --git a/lib/core/relayOutboundConfig.js b/lib/core/relayOutboundConfig.ts similarity index 71% rename from lib/core/relayOutboundConfig.js rename to lib/core/relayOutboundConfig.ts index 7b124865..86b4434f 100644 --- a/lib/core/relayOutboundConfig.js +++ b/lib/core/relayOutboundConfig.ts @@ -1,7 +1,9 @@ -const RepeatedTimer = require('./repeatedTimer'); +import RepeatedTimer from './repeatedTimer'; +import type { HttpClient } from './http'; +import type { MasterConfig } from '../types'; -let polling = null; -let decryptionDomainsCache = null; +let polling: ReturnType | null = null; +let decryptionDomainsCache: string[] | null = null; const disablePolling = () => { if (polling) { @@ -21,11 +23,11 @@ const clearCache = () => { decryptionDomainsCache = null; }; -const getDecryptionDomains = () => { +const getDecryptionDomains = (): string[] | null => { return decryptionDomainsCache; }; -const init = async (config, http) => { +const init = async (config: MasterConfig, http: HttpClient) => { let pollingInterval = config.http.pollInterval; const getRelayOutboundConfigFromApi = async () => { @@ -38,7 +40,7 @@ const init = async (config, http) => { } decryptionDomainsCache = Object.values( configResponse.data.outboundDestinations - ).map((config) => config.destinationDomain); + ).map((destination) => destination.destinationDomain); }; /* Initialization */ @@ -52,7 +54,7 @@ const init = async (config, http) => { return polling; }; -module.exports = { +export { init, getDecryptionDomains, disablePolling, diff --git a/lib/core/repeatedTimer.js b/lib/core/repeatedTimer.ts similarity index 66% rename from lib/core/repeatedTimer.js rename to lib/core/repeatedTimer.ts index 8f2de5d1..f16ef8a4 100644 --- a/lib/core/repeatedTimer.js +++ b/lib/core/repeatedTimer.ts @@ -1,7 +1,13 @@ -const { InvalidInterval } = require('../utils/errors'); - -module.exports = (defaultInterval, cb) => { - const parsedInterval = parseFloat(defaultInterval); +import { InvalidInterval } from '../utils/errors'; + +export default ( + defaultInterval: number | string, + cb: () => Promise | void +) => { + const parsedInterval = + typeof defaultInterval === 'string' + ? parseFloat(defaultInterval) + : defaultInterval; if (Number.isNaN(parsedInterval)) { throw new InvalidInterval(`Expected number, received ${parsedInterval}`); } @@ -23,7 +29,7 @@ module.exports = (defaultInterval, cb) => { } }; - const updateInterval = (newInterval) => { + const updateInterval = (newInterval: number) => { if (interval !== newInterval) { interval = newInterval; stop(); @@ -34,15 +40,15 @@ module.exports = (defaultInterval, cb) => { const getInterval = () => interval; const stop = () => { - clearInterval(currentIntervalId); + if (currentIntervalId) clearInterval(currentIntervalId); currentIntervalId = null; }; const isRunning = () => currentIntervalId !== null; /* Initialization */ - let interval = defaultInterval; - let currentIntervalId = null; + let interval: number = parsedInterval; + let currentIntervalId: NodeJS.Timeout | null = null; start(); return { diff --git a/lib/curves/base.js b/lib/curves/base.ts similarity index 81% rename from lib/curves/base.js rename to lib/curves/base.ts index 19778233..650a5840 100644 --- a/lib/curves/base.js +++ b/lib/curves/base.ts @@ -1,6 +1,10 @@ -const crypto = require('crypto'); -const ASN1 = require('asn1js'); -const curveConstants = require('./constants'); +import * as crypto from 'crypto'; +import * as ASN1ns from 'asn1js'; +import curveConstants from './constants'; + +// asn1js's constructor param typings are awkward for this low-level DER +// encoder; treat the namespace as untyped here and rely on runtime behavior. +const ASN1: any = ASN1ns; /** * Given an EC curve name and its constants, generate a DER encoder for its compressed public keys @@ -9,7 +13,7 @@ const curveConstants = require('./constants'); * @returns Function(compressedPubKey): base64EncodedString */ const createCurve = () => { - return (curveName, compressedPubKey) => { + return (curveName: string, compressedPubKey: string): Buffer => { const asn1Encoder = buildEncoder(curveName); const decompressed = crypto.ECDH.convertKey( compressedPubKey, @@ -17,13 +21,13 @@ const createCurve = () => { 'base64', 'hex', 'uncompressed' - ); + ).toString(); return asn1Encoder(decompressed); }; }; -const hexStringToUint8Array = (hexString) => { - return hexString.match(/../g).map((h) => parseInt(h, 16)); +const hexStringToUint8Array = (hexString: string): number[] => { + return hexString.match(/../g)!.map((h) => parseInt(h, 16)); }; const PUBLIC_KEY_TYPE = '1.2.840.10045.2.1'; @@ -35,7 +39,7 @@ const VERSION = '01'; // https://www.bsi.bund.de/SharedDocs/Downloads/EN/BSI/Publications/TechGuidelines/TR03111/BSI-TR-03111_V-2-0_pdf.pdf?__blob=publicationFile&v=1 // // The seed parameter is optional. -const FieldId = (curveParams) => { +const FieldId = (curveParams: any) => { return new ASN1.Sequence({ name: 'fieldID', value: [ @@ -55,7 +59,7 @@ const FieldId = (curveParams) => { }); }; -const Curve = (curveParams) => { +const Curve = (curveParams: any) => { return new ASN1.Sequence({ name: 'curve', value: curveParams.seed @@ -93,7 +97,7 @@ const Curve = (curveParams) => { }); }; -const ECParameters = (curveParams) => { +const ECParameters = (curveParams: any) => { return new ASN1.Sequence({ name: 'ecParameters', value: [ @@ -125,7 +129,7 @@ const ECParameters = (curveParams) => { }); }; -const AlgorithmIdentifier = (curveParams) => { +const AlgorithmIdentifier = (curveParams: any) => { return new ASN1.Sequence({ name: 'algorithm', value: [ @@ -138,7 +142,7 @@ const AlgorithmIdentifier = (curveParams) => { }); }; -const SubjectPublicKeyInfo = (curveParams, decompressedKey) => { +const SubjectPublicKeyInfo = (curveParams: any, decompressedKey: string) => { return new ASN1.Sequence({ name: 'SubjectPublicKeyInfo', value: [ @@ -151,14 +155,12 @@ const SubjectPublicKeyInfo = (curveParams, decompressedKey) => { }); }; -const buildEncoder = (curveName) => { - const curveParams = curveConstants[curveName]; - return (decompressedKey) => { +const buildEncoder = (curveName: string) => { + const curveParams = curveConstants[curveName as keyof typeof curveConstants]; + return (decompressedKey: string): Buffer => { const spki = SubjectPublicKeyInfo(curveParams, decompressedKey); return Buffer.from(spki.toString('hex'), 'hex'); }; }; -module.exports = { - encodePublicKey: createCurve(), -}; +export const encodePublicKey = createCurve(); diff --git a/lib/curves/constants.js b/lib/curves/constants.ts similarity index 98% rename from lib/curves/constants.js rename to lib/curves/constants.ts index e3aa1bad..11850bce 100644 --- a/lib/curves/constants.js +++ b/lib/curves/constants.ts @@ -1,5 +1,5 @@ // https://neuromancer.sk/std/x962/prime256v1 -module.exports = { +export default { prime256v1: { p: 'FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF', a: 'FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC', diff --git a/lib/curves/index.js b/lib/curves/index.js deleted file mode 100644 index 91e964c5..00000000 --- a/lib/curves/index.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - Encoding: require('./base'), -}; diff --git a/lib/curves/index.ts b/lib/curves/index.ts new file mode 100644 index 00000000..cdf5239b --- /dev/null +++ b/lib/curves/index.ts @@ -0,0 +1 @@ +export * as Encoding from './base'; diff --git a/lib/index.js b/lib/index.ts similarity index 68% rename from lib/index.js rename to lib/index.ts index 07b18d6d..719559dd 100644 --- a/lib/index.js +++ b/lib/index.ts @@ -1,55 +1,90 @@ -const crypto = require('crypto'); -const http = require('http'); -const https = require('https'); -const retry = require('async-retry'); -const { Buffer } = require('buffer'); - -const { +import * as crypto from 'crypto'; +import * as http from 'http'; +import https from 'https'; +import type { AgentOptions } from 'https'; +import retry from 'async-retry'; +import { Buffer } from 'buffer'; + +import { Datatypes, errors, validationHelper, httpsHelper, attest, -} = require('./utils'); -const config = require('./config'); -const { +} from './utils'; +import config from './config'; +import { Crypto, Http, RelayOutboundConfig, AttestationDoc, PcrManager, -} = require('./core'); -const { TokenCreationError } = require('./utils/errors'); -const HttpsProxyAgent = require('./utils/proxyAgent'); -const { importTarget, matchTarget } = require('./utils/domainTargets'); +} from './core'; +import { TokenCreationError } from './utils/errors'; +import HttpsProxyAgent from './utils/proxyAgent'; +import { importTarget, matchTarget } from './utils/domainTargets'; +import type { Target } from './utils/domainTargets'; +import type { + MasterConfig, + SdkOptions, + OutboundRelayOptions, + SupportedCurve, + AttestationData, + AttestationCallback, + AttestationBindings, + EncryptableData, + EncryptedData, + DecryptableData, + FunctionRunResult, + RunToken, + ClientSideToken, +} from './types'; const originalRequest = https.request; +// Tracks whether this process has overloaded `https.request` for Relay. We only +// restore the original request when we were the ones who replaced it, so that a +// plain client never clobbers an unrelated `https.request` (e.g. a test's nock). +let httpsRequestOverloaded = false; + +type Timer = ReturnType; class EvervaultClient { - /** @type {{ [curveName: string]: import('./types').SupportedCurve }} */ - static CURVES = { + static CURVES: { + readonly SECP256K1: SupportedCurve; + readonly PRIME256V1: SupportedCurve; + } = { SECP256K1: 'secp256k1', PRIME256V1: 'prime256v1', }; - /** @typedef {ReturnType} Timer */ - /** @private @type {{ enclaves: Timer[] | null, relayOutbound: Timer | null}} */ _backgroundJobs; - - /** @private @type {string} */ apiKey; - /** @private @type {string} */ appId; - /** @private @type {import('./types')} */ config; - /** @private @type {import('./types').SupportedCurve} */ curve; - /** @private @type {ReturnType} */ http; - /** @private @type {import('./utils/httpsHelper')} */ httpsHelper; - /** @private @type {boolean | undefined} */ retry; - /** @private @type {ReturnType} */ crypto; - - /** - * @param {string} appId - * @param {string} apiKey - * @param {Partial} options - */ - constructor(appId, apiKey = undefined, options = {}) { + private _backgroundJobs: { + enclaves: Timer[] | null; + relayOutbound: Timer | null; + }; + private apiKey?: string; + private appId: string; + private config: MasterConfig; + private curve: SupportedCurve; + private http: ReturnType; + private httpsHelper: typeof httpsHelper; + private retry?: boolean; + private crypto: ReturnType; + private encryptionMode?: boolean; + + // Hidden properties defined via defineHiddenProperty (Object.defineProperty). + // These are populated imperatively (and invisibly to the type checker) by + // `defineHiddenProperty`, so they use definite assignment assertions. + private _ecdhTeamKey!: Buffer; + private _ecdh!: crypto.ECDH; + private _ecdhPublicKey!: Buffer; + private _derivedAesKey!: Buffer; + private _refreshInterval!: NodeJS.Timeout; + + constructor( + appId: string, + apiKey: string | undefined = undefined, + options: Partial = {} + ) { if ( appId === '' || !Datatypes.isString(appId) || @@ -69,7 +104,7 @@ class EvervaultClient { ); } this.config = config; - let curve; + let curve: SupportedCurve; if (!options.curve || !this.config.encryption[options.curve]) { curve = EvervaultClient.CURVES.SECP256K1; //default to old curve } else { @@ -96,7 +131,7 @@ class EvervaultClient { this.curve = curve; this.retry = options.retry; - this.http = Http(appId, apiKey, this.config.http, { + this.http = Http(appId, apiKey as string, this.config.http, { httpAgent: options.httpAgent, httpsAgent: options.httpsAgent, }); @@ -118,12 +153,10 @@ class EvervaultClient { this._shouldOverloadHttpModule(options, apiKey); } - /** - * @param {Record} attestationData - * @param {import('./types').AttestationBindings} attestationBindings - * @throws {import('./utils/errors').MalformedAttestationData} - */ - async enableEnclaves(attestationData, attestationBindings) { + async enableEnclaves( + attestationData: Record, + attestationBindings: AttestationBindings + ) { validationHelper.validateApiKey(this.appId, this.apiKey); attest.validateAttestationData(attestationData); // Store attestation documents in cache @@ -160,13 +193,11 @@ class EvervaultClient { } } - /** - * @param {import('./types') AttestationData} attestationData - * @param {import('./types').AttestationBindings} attestationBindings - * @param {import('https').AgentOptions} option - * @throws {import('./utils/errors').MalformedAttestationData} - **/ - async createEnclaveHttpsAgent(attestationData, attestationBindings, options) { + async createEnclaveHttpsAgent( + attestationData: Record, + attestationBindings: AttestationBindings, + options?: AgentOptions + ) { attest.validateAttestationData(attestationData); const attestationCache = new AttestationDoc( @@ -192,19 +223,15 @@ class EvervaultClient { ); } - /** @returns {Promise} */ - async generateNonce() { + async generateNonce(): Promise { const nonce = await this.crypto.generateBytes(16); return nonce.toString('base64').replaceAll(/=|\//g, ''); } - /** - * @private - * @param {Partial} options - * @param {string} apiKey - * @returns {Promise} - */ - async _shouldOverloadHttpModule(options, apiKey) { + private async _shouldOverloadHttpModule( + options: Partial, + apiKey?: string + ): Promise { if (options.decryptionDomains && options.decryptionDomains.length > 0) { const decryptionDomainsFilter = this._decryptionDomainsFilter( options.decryptionDomains @@ -217,6 +244,7 @@ class EvervaultClient { this.http, originalRequest ); + httpsRequestOverloaded = true; } else if (options.enableOutboundRelay) { await this.httpsHelper.overloadHttpsModule( apiKey, @@ -226,32 +254,29 @@ class EvervaultClient { this.http, originalRequest ); - } else { - https.request = originalRequest; + httpsRequestOverloaded = true; + } else if (httpsRequestOverloaded) { + (https as any).request = originalRequest; + httpsRequestOverloaded = false; } } - /** - * @private - * @returns {string[]} - */ - _alwaysIgnoreDomains() { + private _alwaysIgnoreDomains(): string[] { const caHost = new URL(this.config.http.certHostname).host; const apiHost = new URL(this.config.http.baseUrl).host; return [caHost, apiHost, this.config.http.enclavesHostname]; } - /** - * @private - * @param {string[]} decryptionDomains - * @returns {(domain: string, path: string) => boolean} - */ - _decryptionDomainsFilter(decryptionDomains) { + private _decryptionDomainsFilter( + decryptionDomains: string[] + ): (domain: string, path: string) => boolean { const parsedDomains = decryptionDomains .map((decryptionDomain) => importTarget(decryptionDomain)) - .filter((importedTarget) => importedTarget != null); - return (domain, path) => + .filter( + (importedTarget): importedTarget is Target => importedTarget != null + ); + return (domain: string, path: string) => this._isDecryptionDomain( domain, path, @@ -260,32 +285,28 @@ class EvervaultClient { ); } - /** - * @private - * @param {string} domain - * @param {string} path - * @param {import('./utils/domainTargets').Target[]} decryptionDomains - * @param {string[]} alwaysIgnore - */ - _isDecryptionDomain(domain, path, decryptionDomains, alwaysIgnore) { + private _isDecryptionDomain( + domain: string, + path: string, + decryptionDomains: Target[], + alwaysIgnore: string[] + ): boolean { if (alwaysIgnore.includes(domain)) return false; return decryptionDomains.some((decryptionDomain) => matchTarget(domain, path, decryptionDomain) ); } - /** @private @returns {(domain: string, path: string) => boolean} */ - _relayOutboundConfigDomainFilter() { + private _relayOutboundConfigDomainFilter(): ( + domain: string, + path: string + ) => boolean { return this._decryptionDomainsFilter( - RelayOutboundConfig.getDecryptionDomains() + RelayOutboundConfig.getDecryptionDomains() as string[] ).bind(this); } - /** - * @private - * @param {string | undefined} role - */ - _refreshKeys(role) { + private _refreshKeys(role?: string | null) { this._ecdh.generateKeys(); this.defineHiddenProperty( '_ecdhPublicKey', @@ -312,12 +333,10 @@ class EvervaultClient { } } - /** - * @param {Object || String} data - * @param {String || undefined} role - * @returns {Promise} - */ - async encrypt(data, role = null) { + async encrypt( + data: T, + role: string | null = null + ): Promise> { const dataRoleRegex = /^[a-z0-9-]{1,20}$/; if (role !== null && !dataRoleRegex.test(role)) { throw new Error( @@ -344,7 +363,7 @@ class EvervaultClient { this.defineHiddenProperty( '_refreshInterval', setInterval( - (ref) => { + (ref: EvervaultClient) => { ref._refreshKeys(role); }, this.config.encryption[this.curve].keyCycleMinutes * 60 * 1000, @@ -362,21 +381,15 @@ class EvervaultClient { ); } - /** - * @param {any} encryptedData - * @returns {Promise} - */ - async decrypt(encryptedData) { + async decrypt(encryptedData: DecryptableData): Promise { validationHelper.validateApiKey(this.appId, this.apiKey); return this.http.decrypt(encryptedData); } - /** - * @param {string} functionName - * @param {object} payload - * @returns {Promise<*>} - */ - async run(functionName, payload) { + async run( + functionName: string, + payload: Record + ): Promise> { validationHelper.validateApiKey(this.appId, this.apiKey); validationHelper.validateFunctionName(functionName); validationHelper.validatePayload(payload); @@ -395,12 +408,10 @@ class EvervaultClient { } } - /** - * @param {string} functionName - * @param {object} payload - * @returns {Promise<*>} - */ - async createRunToken(functionName, payload) { + async createRunToken( + functionName: string, + payload: Record + ): Promise { validationHelper.validateApiKey(this.appId, this.apiKey); validationHelper.validatePayload(payload); validationHelper.validateFunctionName(functionName); @@ -409,10 +420,7 @@ class EvervaultClient { return response.data; } - /** - * @param {import('./types').OutboundRelayOptions} options - */ - async enableOutboundRelay(options = {}) { + async enableOutboundRelay(options: OutboundRelayOptions = {}): Promise { validationHelper.validateApiKey(this.appId, this.apiKey); validationHelper.validateRelayOutboundOptions(options); if (!options || !options.decryptionDomains) { @@ -435,6 +443,7 @@ class EvervaultClient { this.http, originalRequest ); + httpsRequestOverloaded = true; } else { const decryptionDomainsFilter = this._decryptionDomainsFilter( options.decryptionDomains @@ -447,6 +456,7 @@ class EvervaultClient { this.http, originalRequest ); + httpsRequestOverloaded = true; } } @@ -456,10 +466,7 @@ class EvervaultClient { } } - /** - * @returns {HttpsProxyAgent} - */ - createRelayHttpsAgent() { + createRelayHttpsAgent(): HttpsProxyAgent { validationHelper.validateApiKey(this.appId, this.apiKey); return this.httpsHelper.httpsRelayAgent( { @@ -470,12 +477,10 @@ class EvervaultClient { ); } - /** - * @private - * @param {string | number | symbol} property - * @param {*} value - */ - defineHiddenProperty(property, value) { + private defineHiddenProperty( + property: string | number | symbol, + value: unknown + ) { Object.defineProperty(this, property, { enumerable: false, configurable: true, @@ -484,7 +489,10 @@ class EvervaultClient { }); } - async createClientSideDecryptToken(payload, expiry = null) { + async createClientSideDecryptToken( + payload: unknown, + expiry: Date | number | null = null + ): Promise { validationHelper.validateApiKey(this.appId, this.apiKey); if (!payload) { throw new TokenCreationError( @@ -495,4 +503,4 @@ class EvervaultClient { } } -module.exports = EvervaultClient; +export = EvervaultClient; diff --git a/lib/types.d.ts b/lib/types.d.ts deleted file mode 100644 index 240a07e4..00000000 --- a/lib/types.d.ts +++ /dev/null @@ -1,67 +0,0 @@ -export interface HttpConfig { - baseUrl: string; - userAgent: string; - tunnelHostname: string; - certHostname: string; - enclavesHostname: string; - pollInterval: string | number; - attestationDocPollInterval: string | number; - pcrProviderPollInterval: string | number; - proxiedMarker: Symbol; -} - -export interface CurveConfig { - ecdhCurve: string; - keyCycleMinutes: number; - cipherAlgorithm: string; - keyLength: number; - ivLength: number; - authTagLength: number; - evVersion: string; - evVersionWithMetadata: string; - header: { iss: string; version: number }; - maxFileSizeInMB: string | number; -} - -export type SupportedCurve = 'secp256k1' | 'prime256v1'; - -export interface CryptoConfig { - secp256k1: CurveConfig; - prime256v1: CurveConfig; -} - -export interface MasterConfig { - http: HttpConfig; - encryption: CryptoConfig; -} - -export interface OutboundRelayOptions { - decryptionDomains?: string[]; - debugRequests?: boolean; -} - -export interface SdkOptions { - curve?: SupportedCurve; - retry?: boolean; - enableOutboundRelay?: boolean; - httpAgent?: import('http').Agent; - httpsAgent?: import('https').Agent; -} - -export interface PCRs { - pcr0?: string; - pcr1?: string; - pcr2?: string; - pcr8?: string; -} - -export type AttestationData = PCRs | PCRs[]; -export type AttestationCallback = () => Promise; - -export interface AttestationBindings { - attestEnclave: ( - cert: Buffer, - expectedPcrsList: Array, - attestationDoc: Buffer - ) => boolean; -} diff --git a/lib/types.ts b/lib/types.ts new file mode 100644 index 00000000..c7b2ff73 --- /dev/null +++ b/lib/types.ts @@ -0,0 +1,147 @@ +import type { Agent as HttpAgent } from 'http'; +import type { Agent as HttpsAgent } from 'https'; + +export interface HttpConfig { + baseUrl: string; + userAgent: string; + tunnelHostname: string; + certHostname: string; + enclavesHostname: string; + pollInterval: string | number; + attestationDocPollInterval: string | number; + pcrProviderPollInterval: string | number; + proxiedMarker: symbol; +} + +export interface CurveConfig { + ecdhCurve: string; + keyCycleMinutes: number; + cipherAlgorithm: string; + keyLength: number; + ivLength: number; + authTagLength: number; + evVersion: string; + evVersionWithMetadata: string; + header: { iss: string; version: number }; + maxFileSizeInMB: string | number; +} + +export type SupportedCurve = 'secp256k1' | 'prime256v1'; + +export interface CryptoConfig { + secp256k1: CurveConfig; + prime256v1: CurveConfig; +} + +export interface MasterConfig { + http: HttpConfig; + encryption: CryptoConfig; +} + +export interface OutboundRelayOptions { + decryptionDomains?: string[]; + debugRequests?: boolean; +} + +export interface SdkOptions { + curve?: SupportedCurve; + retry?: boolean; + enableOutboundRelay?: boolean; + encryptionMode?: boolean; + httpAgent?: HttpAgent; + httpsAgent?: HttpsAgent; +} + +export interface PCRs { + pcr0?: string; + pcr1?: string; + pcr2?: string; + pcr8?: string; +} + +export type AttestationData = PCRs | PCRs[]; +export type AttestationCallback = () => Promise; + +export interface AttestationBindings { + attestEnclave: ( + cert: Buffer, + expectedPcrsList: Array, + attestationDoc: Buffer + ) => boolean; +} + +/** + * A value that can be passed to `encrypt`. Primitives, Buffers, and any nested + * combination of objects and arrays of those are all supported. + */ +export type EncryptableData = + | string + | number + | boolean + | null + | Buffer + | EncryptableData[] + | { [key: string]: EncryptableData }; + +/** + * The result of encrypting a value of type `T`. The shape of the input is + * preserved: Buffers stay Buffers, primitives become encrypted strings, and + * objects/arrays are traversed with each leaf value encrypted. + */ +export type EncryptedData = T extends Buffer + ? Buffer + : T extends string | number | boolean + ? string + : T extends null | undefined + ? T + : T extends Array + ? EncryptedData[] + : T extends object + ? { [K in keyof T]: EncryptedData } + : string; + +/** + * A value that can be passed to `decrypt`. Mirrors the shape produced by + * `encrypt`: encrypted strings, Buffers, and nested objects/arrays of those. + */ +export type DecryptableData = + | string + | Buffer + | DecryptableData[] + | { [key: string]: DecryptableData }; + +/** The response returned by a successful Function run. */ +export interface FunctionRunResult { + id: string; + result: T; + status: 'success'; +} + +/** A short-lived token used to invoke a Function from an untrusted client. */ +export interface RunToken { + token: string; +} + +/** A short-lived token created via `createClientSideDecryptToken`. */ +export interface ClientSideToken { + token: string; + createdAt: Date; + expiry: Date; +} + +/** The team/app key material returned by the keys endpoints. */ +export interface TeamKeyResponse { + key?: string; + ecdhKey: string; + ecdhP256Key: string; +} + +/** A single outbound Relay destination entry. */ +export interface RelayOutboundDestination { + destinationDomain: string; +} + +/** The body returned by the Relay Outbound configuration endpoint. */ +export interface RelayOutboundConfigResponse { + outboundDestinations: Record; +} diff --git a/lib/utils/attest.js b/lib/utils/attest.ts similarity index 64% rename from lib/utils/attest.js rename to lib/utils/attest.ts index 0004c50d..12408709 100644 --- a/lib/utils/attest.js +++ b/lib/utils/attest.ts @@ -1,10 +1,16 @@ -const { AttestationError, MalformedAttestationData } = require('./errors'); -const tls = require('tls'); -const https = require('https'); -const { hostname } = require('os'); +import { AttestationError, MalformedAttestationData } from './errors'; +import tls from 'tls'; +import * as https from 'https'; +import type { HttpConfig, AttestationBindings, PCRs } from '../types'; +import type PcrManager from '../core/pcrManager'; +import type AttestationDoc from '../core/attestationDoc'; + const origCheckServerIdentity = tls.checkServerIdentity; -function parseNameAndAppFromHost(hostname) { +function parseNameAndAppFromHost(hostname: string): { + name: string; + appUuid: string; +} { const hostnameTokens = hostname.split('.'); // Check if nonce prefix is present if (hostnameTokens[1] === 'attest') { @@ -14,21 +20,13 @@ function parseNameAndAppFromHost(hostname) { } } -/** - * @param {string} hostname - * @param {Buffer} cert - * @param {import('../core/pcrManager')} pcrManager - * @param {import('../core/attestationDoc')} attestationCache - * @param {import('../types').AttestationBindings} attestationBindings - * @returns {Error | undefined} - */ function attestConnection( - hostname, - cert, - cagePcrManager, - attestationCache, - attestationBindings -) { + hostname: string, + cert: Buffer, + cagePcrManager: PcrManager, + attestationCache: AttestationDoc, + attestationBindings: AttestationBindings +): Error | undefined { try { if (!attestationBindings == null) { throw new AttestationError( @@ -42,11 +40,11 @@ function attestConnection( // check if PCRs for this cage have been given const pcrs = cagePcrManager.get(name); - var pcrsList = []; + let pcrsList: PCRs[] = []; if (Array.isArray(pcrs)) { pcrsList = pcrs; } else if (typeof pcrs === 'object') { - pcrsList = [pcrs]; + pcrsList = [pcrs as PCRs]; } let attestationDoc = attestationCache.get(name); @@ -69,7 +67,7 @@ function attestConnection( cert ); } - } catch (err) { + } catch (err: any) { console.error( `EVERVAULT ERROR :: An unexpected error occurred while attempting to attest a connection to your Enclave`, err.message @@ -83,18 +81,17 @@ function attestConnection( * Pass this to a https request to ensure that the connection is attested. */ class EnclaveAgent extends https.Agent { - /** - * @param {import('https').AgentOptions} option - * @param {import('../core/attestationDoc')} attestationCache - * @param {import('../core/pcrManager')} pcrManager - * @param {import('../types').AttestationBindings} attestationBindings - * */ + config: HttpConfig; + attestationCache: AttestationDoc; + pcrManager: PcrManager; + attestationBindings: AttestationBindings; + constructor( - option, - config, - attestationCache, - pcrManager, - attestationBindings + option: https.AgentOptions | undefined, + config: HttpConfig, + attestationCache: AttestationDoc, + pcrManager: PcrManager, + attestationBindings: AttestationBindings ) { super(option); this.config = config; @@ -103,7 +100,10 @@ class EnclaveAgent extends https.Agent { this.attestationBindings = attestationBindings; } - #checkEnclaveServerIdentity = (hostname, cert) => { + #checkEnclaveServerIdentity = ( + hostname: string, + cert: tls.PeerCertificate + ): Error | undefined => { if (hostname.endsWith(this.config.enclavesHostname)) { const attestationResult = attestConnection( hostname, @@ -120,31 +120,26 @@ class EnclaveAgent extends https.Agent { return origCheckServerIdentity(hostname, cert); }; - createConnection(options, callback) { + // Overrides https.Agent#createConnection to force TLS attestation. Node's + // Agent typings model this as returning a generic Duplex over RequestOptions, + // which doesn't match the tls.connect signature used here, so the params stay + // untyped. + createConnection(options: any, callback: any): tls.TLSSocket { options.checkServerIdentity = this.#checkEnclaveServerIdentity; return tls.connect(options, callback); } } -/** - * - * @param {import('../types').HttpConfig} config - * @param {import('../core/attestationDoc')} attestationCache - * @param {import('../core/pcrManager')} pcrManager - * @param {import('../types').AttestationBindings} attestationBindings - */ function addAttestationListener( - config, - attestationCache, - pcrManager, - attestationBindings -) { - /** - * @param {string} hostname - * @param {import('node:tls').PeerCertificate} cert - * @returns {Error | undefined} - */ - tls.checkServerIdentity = function (hostname, cert) { + config: HttpConfig, + attestationCache: AttestationDoc, + pcrManager: PcrManager, + attestationBindings: AttestationBindings +): void { + (tls as any).checkServerIdentity = function ( + hostname: string, + cert: tls.PeerCertificate + ): Error | undefined { // only attempt attestation if the host is a cage if (hostname.endsWith(config.enclavesHostname)) { // we expect undefined when attestation is successful, else an error @@ -167,23 +162,25 @@ function addAttestationListener( /** * Ensure that the provided attestation data is correctly structured - * @param {unknown} providedAttestationData - * @throws {MalformedAttestationData} */ -function validateAttestationData(providedAttestationData) { - const isObject = (val) => +function validateAttestationData(providedAttestationData: unknown): void { + const isObject = (val: unknown) => val != null && typeof val === 'object' && !Array.isArray(val); - const isFunction = (val) => typeof val === 'function'; + const isFunction = (val: unknown) => typeof val === 'function'; if (!isObject(providedAttestationData)) { throw new MalformedAttestationData( `Expected an object to be provided as attestation data, received ${ - Array.isArray(providedAttestationData) ? 'Array' : typeof val + Array.isArray(providedAttestationData) + ? 'Array' + : typeof providedAttestationData }` ); } - const containsOnlyObjects = Object.values(providedAttestationData).every( + const containsOnlyObjects = Object.values( + providedAttestationData as Record + ).every( (pcrs) => isObject(pcrs) || (Array.isArray(pcrs) && pcrs.every(isObject)) || @@ -196,7 +193,7 @@ function validateAttestationData(providedAttestationData) { } } -module.exports = { +export { attestConnection, addAttestationListener, parseNameAndAppFromHost, diff --git a/lib/utils/certHelper.js b/lib/utils/certHelper.ts similarity index 65% rename from lib/utils/certHelper.js rename to lib/utils/certHelper.ts index 45a4d47a..c80f9c0c 100644 --- a/lib/utils/certHelper.js +++ b/lib/utils/certHelper.ts @@ -1,12 +1,11 @@ -const { X509Certificate } = require('crypto'); +import { X509Certificate } from 'crypto'; +import * as tls from 'tls'; +import * as net from 'net'; -const parseX509 = (cert) => { +const parseX509 = (cert: string | Buffer) => { if (X509Certificate) { return new X509Certificate(cert); } else { - const tls = require('tls'); - const net = require('net'); - const secureContext = tls.createSecureContext({ cert, }); @@ -17,6 +16,4 @@ const parseX509 = (cert) => { } }; -module.exports = { - parseX509, -}; +export { parseX509 }; diff --git a/lib/utils/crc32.js b/lib/utils/crc32.ts similarity index 89% rename from lib/utils/crc32.js rename to lib/utils/crc32.ts index fda5a54a..bbb895f5 100644 --- a/lib/utils/crc32.js +++ b/lib/utils/crc32.ts @@ -15,7 +15,7 @@ for (let i = 0; i < 256; i++) { // // @param {ArrayBuffer} buffer // @return {Number} -function crc32(buffer) { +function crc32(buffer: Buffer): number { let crc = 0xffffffff; const len = buffer.byteLength; @@ -26,4 +26,4 @@ function crc32(buffer) { return crc ^ 0xffffffff; } -module.exports = crc32; +export default crc32; diff --git a/lib/utils/dataHelper.js b/lib/utils/dataHelper.js deleted file mode 100644 index 13091d45..00000000 --- a/lib/utils/dataHelper.js +++ /dev/null @@ -1,28 +0,0 @@ -const Big = require('big.js'); - -const VERSIONS_TO_ECDH_CURVES = { - T1JL: 'prime256v1', - RFVC: 'secp256k1', - Tk9D: 'prime256v1', -}; - -const parseDecryptedDataToDatatype = (datatype, value) => { - try { - if (datatype.toLowerCase() === 'number') { - return Number(value); - } else if (datatype.toLowerCase() === 'bignumber') { - return Big(value); - } else if (datatype.toLowerCase() === 'boolean') { - return Boolean(value); - } else { - return JSON.parse(value); - } - } catch (_) { - return value; - } -}; - -module.exports = { - VERSIONS_TO_ECDH_CURVES, - parseDecryptedDataToDatatype, -}; diff --git a/lib/utils/datatypes.js b/lib/utils/datatypes.js deleted file mode 100644 index 0404af46..00000000 --- a/lib/utils/datatypes.js +++ /dev/null @@ -1,74 +0,0 @@ -const isArray = (data) => isDefined(data) && data.constructor.name === 'Array'; -const isBuffer = (data) => data.constructor.name.toLowerCase() === 'buffer'; -const isObject = (data) => typeof data === 'object'; -const isObjectStrict = (data) => - isDefined(data) && isObject(data) && !isArray(data) && !isBuffer(data); -const isString = (data) => typeof data === 'string'; -const isNumber = (data) => typeof data === 'number'; -const isDefined = (data) => typeof data !== 'undefined' && data !== null; -const isUndefined = (data) => typeof data === 'undefined'; -const isBoolean = (data) => typeof data === 'boolean'; -const isFunction = (data) => typeof data === 'function'; - -const isEncryptable = (data) => - isDefined(data) && (isString(data) || isNumber(data) || isBoolean(data)); - -const getHeaderType = (data) => { - if (!isDefined(data)) return; - if (isArray(data)) return 'array'; - else { - return typeof data; - } -}; - -const ensureString = (data) => { - if (isUndefined(data)) return; - - if (!isDefined(data)) return JSON.stringify(data); - if (isString(data)) return data.trim(); - if (['bigint', 'function'].includes(typeof data)) { - return data.toString(); - } - if (isBuffer(data)) { - return data.toString('utf8'); - } - return JSON.stringify(data); -}; - -const base64ToBase64Url = (base64String) => { - return base64String.replace('+', '-').replace('/', '_'); -}; - -const base64ToBuffer = (data) => Buffer.from(data, 'base64'); -const utf8ToBase64Url = (data) => { - const base64 = Buffer.from(data, 'utf8').toString('base64'); - return base64ToBase64Url(base64); -}; - -const KEY_HEADER = '-----BEGIN PUBLIC KEY-----\n'; -const KEY_FOOTER = '-----END PUBLIC KEY-----'; -const formatKey = (key) => { - if (key.includes(KEY_HEADER) && key.includes(KEY_FOOTER)) { - return key; - } - return `${KEY_HEADER}${key.match(/.{0,64}/g).join('\n')}${KEY_FOOTER}`; -}; - -module.exports = { - isArray, - isObject, - isObjectStrict, - isBuffer, - isString, - isFunction, - isEncryptable, - isNumber, - isBoolean, - getHeaderType, - isDefined, - isUndefined, - ensureString, - base64ToBuffer, - utf8ToBase64Url, - formatKey, -}; diff --git a/lib/utils/datatypes.ts b/lib/utils/datatypes.ts new file mode 100644 index 00000000..2817ab3b --- /dev/null +++ b/lib/utils/datatypes.ts @@ -0,0 +1,59 @@ +export const isArray = (data: any): boolean => + isDefined(data) && data.constructor.name === 'Array'; +export const isBuffer = (data: any): boolean => + data.constructor.name.toLowerCase() === 'buffer'; +export const isObject = (data: any): boolean => typeof data === 'object'; +export const isObjectStrict = (data: any): boolean => + isDefined(data) && isObject(data) && !isArray(data) && !isBuffer(data); +export const isString = (data: any): data is string => typeof data === 'string'; +export const isNumber = (data: any): boolean => typeof data === 'number'; +export const isDefined = (data: any): boolean => + typeof data !== 'undefined' && data !== null; +export const isUndefined = (data: any): boolean => typeof data === 'undefined'; +export const isBoolean = (data: any): boolean => typeof data === 'boolean'; +export const isFunction = (data: any): boolean => typeof data === 'function'; + +export const isEncryptable = (data: any): boolean => + isDefined(data) && (isString(data) || isNumber(data) || isBoolean(data)); + +export const getHeaderType = (data: any): string | undefined => { + if (!isDefined(data)) return; + if (isArray(data)) return 'array'; + else { + return typeof data; + } +}; + +export const ensureString = (data: any): string | undefined => { + if (isUndefined(data)) return; + + if (!isDefined(data)) return JSON.stringify(data); + if (isString(data)) return data.trim(); + if (['bigint', 'function'].includes(typeof data)) { + return data.toString(); + } + if (isBuffer(data)) { + return data.toString('utf8'); + } + return JSON.stringify(data); +}; + +const base64ToBase64Url = (base64String: string): string => { + return base64String.replace('+', '-').replace('/', '_'); +}; + +export const base64ToBuffer = (data: string): Buffer => + Buffer.from(data, 'base64'); +export const utf8ToBase64Url = (data: string): string => { + const base64 = Buffer.from(data, 'utf8').toString('base64'); + return base64ToBase64Url(base64); +}; + +const KEY_HEADER = '-----BEGIN PUBLIC KEY-----\n'; +const KEY_FOOTER = '-----END PUBLIC KEY-----'; +export const formatKey = (key: string): string => { + if (key.includes(KEY_HEADER) && key.includes(KEY_FOOTER)) { + return key; + } + return `${KEY_HEADER}${key.match(/.{0,64}/g)!.join('\n')}${KEY_FOOTER}`; +}; diff --git a/lib/utils/domainTargets.d.ts b/lib/utils/domainTargets.d.ts deleted file mode 100644 index 7c90faf1..00000000 --- a/lib/utils/domainTargets.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -export type MatcherSpecificity = "wildcard" | "absolute"; -export type MatcherType = "host" | "path"; - -export interface Target { - rawValue: string; - host: Matcher; - path?: Matcher; -} - -export interface Matcher { - specificity: MatcherSpecificity; - type: MatcherType; - value: string; -} \ No newline at end of file diff --git a/lib/utils/domainTargets.js b/lib/utils/domainTargets.ts similarity index 71% rename from lib/utils/domainTargets.js rename to lib/utils/domainTargets.ts index 6f3d00f6..41544fda 100644 --- a/lib/utils/domainTargets.js +++ b/lib/utils/domainTargets.ts @@ -2,12 +2,25 @@ * Grouping of helpers and types to aid reasoning about destinations when intercepting outbound traffic. */ +export type MatcherSpecificity = 'wildcard' | 'absolute'; +export type MatcherType = 'host' | 'path'; + +export interface Matcher { + type: MatcherType; + specificity: MatcherSpecificity; + value: string; +} + +export interface Target { + rawValue: string; + host: Matcher; + path?: Matcher; +} + /** * Apply the matching logic based on the matcher type and specificity. - * @param {string} givenValue - * @param {import("./domainTargets").Matcher} matcher */ -function applyMatch(givenValue, matcher) { +function applyMatch(givenValue: string, matcher: Matcher): boolean { if (matcher.specificity === 'absolute') { return givenValue === matcher.value; } @@ -22,11 +35,12 @@ function applyMatch(givenValue, matcher) { /** * Apply a target matcher against the given host and path combination. If a path matcher is defined on the target, it will only match if *both* the host and path match. - * @param {string} requestedHost - * @param {string} requestedPath - * @param {import('./domainTargets').Target} target */ -function matchTarget(requestedHost, requestedPath, target) { +function matchTarget( + requestedHost: string, + requestedPath: string, + target: Target +): boolean { if (target.path != null) { return ( applyMatch(requestedHost, target.host) && @@ -38,20 +52,18 @@ function matchTarget(requestedHost, requestedPath, target) { /** * Check if the given hostname includes a protocol prefix. - * @param {string} val - * @returns {boolean} */ -function startsWithProto(val) { +function startsWithProto(val: string): boolean { return val.startsWith('https://') || val.startsWith('http://'); } /** * Create a matcher object from a hostname string. If the hostname begins with an asterisk, it will be treated as a wildcard matcher. - * @param {string} host - * @return {import('./domainTargets').Matcher} */ -function buildHostMatcher(host) { - const specificity = host.startsWith('*') ? 'wildcard' : 'absolute'; +function buildHostMatcher(host: string): Matcher { + const specificity: MatcherSpecificity = host.startsWith('*') + ? 'wildcard' + : 'absolute'; const value = specificity === 'wildcard' ? host.slice(1) : host; return { type: 'host', @@ -62,11 +74,11 @@ function buildHostMatcher(host) { /** * Create a matcher object from a path string. If the string ends with an asterisk, it will be treated as a wildcard matcher. - * @param {string} path - * @return {import('./domainTargets').Matcher} */ -function buildPathMatcher(path) { - const specificity = path.endsWith('*') ? 'wildcard' : 'absolute'; +function buildPathMatcher(path: string): Matcher { + const specificity: MatcherSpecificity = path.endsWith('*') + ? 'wildcard' + : 'absolute'; const value = specificity === 'wildcard' ? path.slice(0, -1) : path; return { type: 'path', @@ -77,10 +89,8 @@ function buildPathMatcher(path) { /** * Convert a user provided input into a target matcher, lightly validating the input in the process. - * @param {unknown} rawInputValue - * @returns {import("./domainTargets").Target | null} */ -function importTarget(rawInputValue) { +function importTarget(rawInputValue: unknown): Target | null { if (typeof rawInputValue !== 'string' || rawInputValue.length === 0) { return null; } @@ -108,7 +118,4 @@ function importTarget(rawInputValue) { }; } -module.exports = { - importTarget, - matchTarget, -}; +export { importTarget, matchTarget }; diff --git a/lib/utils/environment.js b/lib/utils/environment.js deleted file mode 100644 index 4260e114..00000000 --- a/lib/utils/environment.js +++ /dev/null @@ -1,23 +0,0 @@ -module.exports = { - getEnvironment: (func) => { - const parsed = func.toString(); - const environmentVariables = {}; - var indices = []; - for ( - var pos = parsed.indexOf('process.env'); - pos !== -1; - pos = parsed.indexOf('process.env', pos + 1) - ) { - indices.push(pos); - } - - indices.forEach((env) => { - const startEnv = parsed.substr(env); - const environment = startEnv.split(/[^a-zA-Z_.\d:-]/)[0].slice(12); - - environmentVariables[environment] = process.env[environment]; - }); - - return environmentVariables; - }, -}; diff --git a/lib/utils/errors.js b/lib/utils/errors.js deleted file mode 100644 index 1bed9ad7..00000000 --- a/lib/utils/errors.js +++ /dev/null @@ -1,102 +0,0 @@ -class EvervaultError extends Error { - constructor(message) { - super(message); - this.type = this.constructor.name; - } -} - -class FunctionTimeoutError extends EvervaultError {} - -class FunctionNotReadyError extends EvervaultError {} - -class FunctionRuntimeError extends EvervaultError { - constructor(message, stack, id) { - super(message); - this.stack = stack; - this.id = id; - } -} - -class AttestationError extends EvervaultError { - constructor(reason, host, cert) { - super(reason); - this.host = host; - this.cert = cert; - } -} - -class MalformedAttestationData extends EvervaultError { - constructor(message) { - super(`Malformed attestation data provided - ${message}`); - } -} - -class InvalidInterval extends EvervaultError { - constructor(reason) { - super(`Invalid interval provided to repeated timer. ${reason}`); - } -} - -class ExceededMaxFileSizeError extends EvervaultError {} - -class DataRolesNotSupportedError extends EvervaultError {} - -class TokenCreationError extends EvervaultError {} - -const mapFunctionFailureResponseToError = ({ error, id }) => { - if (error) { - throw new FunctionRuntimeError(error.message, error.stack, id); - } - throw new EvervaultError('An unknown error occurred.'); -}; - -const mapApiResponseToError = ({ code, detail }) => { - if (code === 'functions/request-timeout') { - throw new FunctionTimeoutError(detail); - } - if (code === 'functions/function-not-ready') { - throw new FunctionNotReadyError(detail); - } - throw new EvervaultError(detail); -}; - -const mapResponseCodeToError = ({ status, data, headers }) => { - if (status === 401) - return new EvervaultError('Invalid authorization provided.'); - if ( - status === 403 && - headers['x-evervault-error-code'] === 'forbidden-ip-error' - ) { - return new EvervaultError( - data.message || "IP is not present on the invoked Enclave's whitelist." - ); - } - if (status === 403) { - return new EvervaultError( - 'The API key provided does not have the required permissions.' - ); - } - if (status === 422) { - return new EvervaultError(data.message || 'Unable to decrypt data.'); - } - if (data.message) { - return new EvervaultError(data.message); - } - return new EvervaultError(`Request returned with status [${status}]`); -}; - -module.exports = { - EvervaultError, - mapApiResponseToError, - mapResponseCodeToError, - mapFunctionFailureResponseToError, - AttestationError, - ExceededMaxFileSizeError, - TokenCreationError, - FunctionTimeoutError, - FunctionNotReadyError, - FunctionRuntimeError, - MalformedAttestationData, - InvalidInterval, - DataRolesNotSupportedError, -}; diff --git a/lib/utils/errors.ts b/lib/utils/errors.ts new file mode 100644 index 00000000..39ea1b38 --- /dev/null +++ b/lib/utils/errors.ts @@ -0,0 +1,113 @@ +export class EvervaultError extends Error { + type: string; + + constructor(message: string) { + super(message); + this.type = this.constructor.name; + } +} + +export class FunctionTimeoutError extends EvervaultError {} + +export class FunctionNotReadyError extends EvervaultError {} + +export class FunctionRuntimeError extends EvervaultError { + id: string; + + constructor(message: string, stack: string | undefined, id: string) { + super(message); + this.stack = stack; + this.id = id; + } +} + +export class AttestationError extends EvervaultError { + host: string; + cert: Buffer; + + constructor(reason: string, host: string, cert: Buffer) { + super(reason); + this.host = host; + this.cert = cert; + } +} + +export class MalformedAttestationData extends EvervaultError { + constructor(message: string) { + super(`Malformed attestation data provided - ${message}`); + } +} + +export class InvalidInterval extends EvervaultError { + constructor(reason: string) { + super(`Invalid interval provided to repeated timer. ${reason}`); + } +} + +export class ExceededMaxFileSizeError extends EvervaultError {} + +export class DataRolesNotSupportedError extends EvervaultError {} + +export class TokenCreationError extends EvervaultError {} + +export const mapFunctionFailureResponseToError = ({ + error, + id, +}: { + error?: { message: string; stack?: string }; + id?: string; +}): never => { + if (error) { + throw new FunctionRuntimeError(error.message, error.stack, id as string); + } + throw new EvervaultError('An unknown error occurred.'); +}; + +export const mapApiResponseToError = ({ + code, + detail, +}: { + code?: string; + detail?: string; +}): never => { + if (code === 'functions/request-timeout') { + throw new FunctionTimeoutError(detail as string); + } + if (code === 'functions/function-not-ready') { + throw new FunctionNotReadyError(detail as string); + } + throw new EvervaultError(detail as string); +}; + +export const mapResponseCodeToError = ({ + status, + data, + headers, +}: { + status: number; + data: { message?: string }; + headers: Record; +}): EvervaultError => { + if (status === 401) + return new EvervaultError('Invalid authorization provided.'); + if ( + status === 403 && + headers['x-evervault-error-code'] === 'forbidden-ip-error' + ) { + return new EvervaultError( + data.message || "IP is not present on the invoked Enclave's whitelist." + ); + } + if (status === 403) { + return new EvervaultError( + 'The API key provided does not have the required permissions.' + ); + } + if (status === 422) { + return new EvervaultError(data.message || 'Unable to decrypt data.'); + } + if (data.message) { + return new EvervaultError(data.message); + } + return new EvervaultError(`Request returned with status [${status}]`); +}; diff --git a/lib/utils/httpsHelper.js b/lib/utils/httpsHelper.ts similarity index 62% rename from lib/utils/httpsHelper.js rename to lib/utils/httpsHelper.ts index f29439ee..b1e0989f 100644 --- a/lib/utils/httpsHelper.js +++ b/lib/utils/httpsHelper.ts @@ -1,22 +1,23 @@ -const https = require('https'); -const tls = require('tls'); -const Datatypes = require('./datatypes'); -const certHelper = require('./certHelper'); -const HttpsProxyAgent = require('./proxyAgent'); -const { - http: { proxiedMarker }, -} = require('../config'); +import https from 'https'; +import tls from 'tls'; +import * as Datatypes from './datatypes'; +import * as certHelper from './certHelper'; +import HttpsProxyAgent from './proxyAgent'; +import config from '../config'; +import type { HttpClient } from '../core/http'; + +const proxiedMarker = config.http.proxiedMarker; const origCreateSecureContext = tls.createSecureContext; const EVERVAULT_DOMAINS = ['evervault.com', 'evervault.io', 'evervault.dev']; -const certificateUtil = (evClient) => { - let x509 = null; +const certificateUtil = (evClient: HttpClient) => { + let x509: any = null; async function updateCertificate() { const pem = await evClient.getCert(); let cert = pem.toString(); x509 = certHelper.parseX509(cert); - tls.createSecureContext = (options) => { - const context = origCreateSecureContext(options); + (tls as any).createSecureContext = (options: any) => { + const context: any = origCreateSecureContext(options); context.context.addCACert(pem); return context; }; @@ -39,12 +40,10 @@ const certificateUtil = (evClient) => { }; }; -/** - * - * @param {Parameters} args - * @returns {{ domain: string, path: string }} - */ -function getDomainAndPathFromArgs(args) { +function getDomainAndPathFromArgs(args: any[]): { + domain: string; + path: string; +} { if (typeof args[0] === 'string') { const parsedUrl = new URL(args[0]); return { domain: parsedUrl.host, path: parsedUrl.pathname }; @@ -54,7 +53,7 @@ function getDomainAndPathFromArgs(args) { return { domain: args[0].host, path: args[0].pathname }; } - let domain, path; + let domain: any, path: any; for (const arg of args) { if (arg instanceof Object) { domain = domain ?? arg.hostname ?? arg.host; @@ -67,28 +66,15 @@ function getDomainAndPathFromArgs(args) { }; } -/** - * @param {string} apiKey - * @param {string} tunnelHostname - * @param {(domain: string, path: string) => boolean} domainFilter - * @param {boolean} debugRequests - * @param {ReturnType} evClient - * @param {typeof import('node:https').request} originalRequest - * @returns {void} - */ const overloadHttpsModule = ( - apiKey, - tunnelHostname, - domainFilter, + apiKey: string | undefined, + tunnelHostname: string, + domainFilter: (domain: string, path: string) => boolean, debugRequests = false, - evClient, - originalRequest -) => { - /** - * @param {Parameters} args - * @returns {ReturnType} - */ - function wrapMethodRequest(...args) { + evClient: HttpClient, + originalRequest: typeof https.request +): void => { + function wrapMethodRequest(this: any, ...args: any[]) { const { domain, path } = getDomainAndPathFromArgs(args); const shouldProxy = !!domain && domainFilter(domain, path); if ( @@ -101,7 +87,7 @@ const overloadHttpsModule = ( `EVERVAULT DEBUG :: Request to domain: ${domain}${path}, Outbound Proxy enabled: ${shouldProxy}` ); } - args = args.map((arg) => { + args = args.map((arg: any) => { if (shouldProxy && arg instanceof Object) { const { updateCertificate, isCertificateInvalid } = certificateUtil(evClient); @@ -114,19 +100,26 @@ const overloadHttpsModule = ( } return arg; }); - const request = originalRequest.apply(this, args); + const request: any = (originalRequest as any).apply(this, args); request[proxiedMarker] = shouldProxy; return request; } - https.request = wrapMethodRequest; + (https as any).request = wrapMethodRequest; }; +interface RelayAgentConfig { + hostname: string; + port?: number; + rejectUnauthorized?: boolean; + secureProxy?: boolean; +} + const httpsRelayAgent = ( - agentConfig = { port: 443, rejectUnauthorized: true, secureProxy: true }, - evClient, - apiKey -) => { + agentConfig: RelayAgentConfig, + evClient: HttpClient, + apiKey?: string +): HttpsProxyAgent => { const { updateCertificate, isCertificateInvalid } = certificateUtil(evClient); const parsedUrl = new URL(agentConfig.hostname); const agent = new HttpsProxyAgent( @@ -144,8 +137,4 @@ const httpsRelayAgent = ( return agent; }; -module.exports = { - overloadHttpsModule, - httpsRelayAgent, - getDomainAndPathFromArgs, -}; +export { overloadHttpsModule, httpsRelayAgent, getDomainAndPathFromArgs }; diff --git a/lib/utils/index.js b/lib/utils/index.js deleted file mode 100644 index 88bc5446..00000000 --- a/lib/utils/index.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - Datatypes: require('./datatypes'), - domainTargets: require('./domainTargets'), - errors: require('./errors'), - certHelper: require('./certHelper'), - environment: require('./environment'), - validationHelper: require('./validationHelper'), - httpsHelper: require('./httpsHelper'), - attest: require('./attest'), -}; diff --git a/lib/utils/index.ts b/lib/utils/index.ts new file mode 100644 index 00000000..13550023 --- /dev/null +++ b/lib/utils/index.ts @@ -0,0 +1,7 @@ +export * as Datatypes from './datatypes'; +export * as domainTargets from './domainTargets'; +export * as errors from './errors'; +export * as certHelper from './certHelper'; +export * as validationHelper from './validationHelper'; +export * as httpsHelper from './httpsHelper'; +export * as attest from './attest'; diff --git a/lib/utils/proxyAgent.js b/lib/utils/proxyAgent.ts similarity index 81% rename from lib/utils/proxyAgent.js rename to lib/utils/proxyAgent.ts index 13d0b106..fde7ce31 100644 --- a/lib/utils/proxyAgent.js +++ b/lib/utils/proxyAgent.ts @@ -1,8 +1,12 @@ -const net = require('net'); -const tls = require('tls'); -const url = require('url'); -const assert = require('assert'); -const { Agent } = require('agent-base'); +import * as net from 'net'; +import * as tls from 'tls'; +import * as url from 'url'; +import assert from 'assert'; +import agentBase from 'agent-base'; + +// agent-base is a CommonJS module; import the default and pull `Agent` off it so +// the ESM build doesn't attempt an unsupported named import from CJS. +const { Agent } = agentBase as any; /** * The `HttpsProxyAgent` implements an HTTP Agent subclass that connects to @@ -18,8 +22,19 @@ const { Agent } = require('agent-base'); * * @api public */ -class HttpsProxyAgent extends Agent { - constructor(_opts, updateCertificateCallback, isCertificateInvalidCallback) { +// agent-base's Agent typings (abstract callback shape, constructor overloads) +// fight this vendored subclass; extend it untyped and rely on runtime behavior. +class HttpsProxyAgent extends (Agent as any) { + secureProxy: boolean; + proxy: any; + private _updateCertificateCallback: any; + private _isCertificateInvalidCallback: any; + + constructor( + _opts: any, + updateCertificateCallback?: any, + isCertificateInvalidCallback?: any + ) { let opts; if (typeof _opts === 'string') { opts = url.parse(_opts); @@ -75,7 +90,7 @@ class HttpsProxyAgent extends Agent { * * @api protected */ - async callback(req, opts) { + async callback(req: any, opts: any): Promise { const { proxy, secureProxy } = this; // Wait until the proxy is ready to initialize @@ -88,14 +103,14 @@ class HttpsProxyAgent extends Agent { } // Create a socket connection to the proxy server. - let socket; + let socket: any; if (secureProxy) { socket = tls.connect(proxy); } else { socket = net.connect(proxy); } - const headers = { ...proxy.headers }; + const headers: Record = { ...proxy.headers }; const hostname = `${opts.host}:${opts.port}`; let payload = `CONNECT ${hostname} HTTP/1.1\r\n`; @@ -157,7 +172,7 @@ class HttpsProxyAgent extends Agent { fakeSocket.readable = true; // Need to wait for the "socket" event to re-play the "data" events. - req.once('socket', (s) => { + req.once('socket', (s: any) => { assert(s.listenerCount('data') > 0); // Replay the "buffered" Buffer onto the fake `socket`, since at @@ -171,24 +186,24 @@ class HttpsProxyAgent extends Agent { } } -function isFunction(value) { +function isFunction(value: any): boolean { return typeof value === 'function'; } -function resume(socket) { +function resume(socket: any): void { socket.resume(); } -function isDefaultPort(port, secure) { +function isDefaultPort(port: any, secure: any): boolean { return Boolean((!secure && port === 80) || (secure && port === 443)); } -function isHTTPS(protocol) { +function isHTTPS(protocol: any): boolean { return typeof protocol === 'string' ? /^https:?$/i.test(protocol) : false; } -function omit(obj, ...keys) { - const ret = {}; +function omit(obj: any, ...keys: string[]): any { + const ret: any = {}; for (let key in obj) { if (!keys.includes(key)) { @@ -198,14 +213,16 @@ function omit(obj, ...keys) { return ret; } -function parseProxyResponse(socket) { +function parseProxyResponse( + socket: any +): Promise<{ statusCode: number; buffered: Buffer }> { return new Promise((resolve, reject) => { // we need to buffer any HTTP traffic that happens with the proxy before we get // the CONNECT response, so that if the response is anything other than an "200" // response code, then we can re-play the "data" events on the socket once the // HTTP parser is hooked up... let buffersLength = 0; - const buffers = []; + const buffers: Buffer[] = []; function read() { const b = socket.read(); @@ -218,12 +235,12 @@ function parseProxyResponse(socket) { socket.removeListener('readable', read); } - function onerror(err) { + function onerror(err: any) { cleanup(); reject(err); } - function ondata(b) { + function ondata(b: Buffer) { buffers.push(b); buffersLength += b.length; @@ -250,4 +267,4 @@ function parseProxyResponse(socket) { }); } -module.exports = HttpsProxyAgent; +export default HttpsProxyAgent; diff --git a/lib/utils/validationHelper.js b/lib/utils/validationHelper.ts similarity index 75% rename from lib/utils/validationHelper.js rename to lib/utils/validationHelper.ts index aa94159a..948942ef 100644 --- a/lib/utils/validationHelper.js +++ b/lib/utils/validationHelper.ts @@ -1,8 +1,13 @@ -const crypto = require('crypto'); -const errors = require('./errors'); -const Datatypes = require('./datatypes'); +import * as crypto from 'crypto'; +import * as errors from './errors'; +import * as Datatypes from './datatypes'; +import type { OutboundRelayOptions, SdkOptions } from '../types'; -const validateApiKey = (appUuid, apiKey, options = {}) => { +const validateApiKey = ( + appUuid: string, + apiKey?: string, + options: Partial = {} +): void => { if (options.encryptionMode === true) { return; } @@ -27,7 +32,7 @@ const validateApiKey = (appUuid, apiKey, options = {}) => { } }; -const validatePayload = (payload) => { +const validatePayload = (payload: any): void => { if ( !Datatypes.isObjectStrict(payload) && (payload != null || payload != undefined) @@ -36,12 +41,14 @@ const validatePayload = (payload) => { } }; -const validateFunctionName = (functionName) => { +const validateFunctionName = (functionName: string): void => { if (!Datatypes.isString(functionName)) throw new errors.EvervaultError('Function name invalid'); }; -const validateRelayOutboundOptions = (options = {}) => { +const validateRelayOutboundOptions = ( + options: OutboundRelayOptions = {} +): void => { if ( (Datatypes.isDefined(options) && !Datatypes.isObjectStrict(options)) || (Datatypes.isDefined(options) && @@ -55,7 +62,7 @@ const validateRelayOutboundOptions = (options = {}) => { } }; -module.exports = { +export { validateApiKey, validatePayload, validateFunctionName, diff --git a/package.json b/package.json index c8a858bc..694eebd9 100644 --- a/package.json +++ b/package.json @@ -3,18 +3,28 @@ "version": "6.4.0", "description": "Node.js SDK for Evervault", "packageManager": "pnpm@11.9.0", - "main": "lib/index.js", - "typings": "types/index.d.ts", + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.mjs", + "require": "./dist/index.js" + } + }, "scripts": { "prepare": "husky install", - "lint": "prettier --check \"./**/*.js\"", - "test": "mocha 'tests/**/*.test.js' --timeout 30000", - "test:e2e": "mocha 'e2e/**/*.test.js' --timeout 5000 --exit", - "test:filter": "mocha 'tests/**/*.test.js' --grep", - "test:e2e:filter": "mocha 'e2e/**/*.test.js' --timeout 5000 --grep", + "build": "tsup", + "build:test": "tsc -p tsconfig.build.json", + "format": "prettier --check \"./**/*.{ts,js}\"", + "typecheck": "tsc --noEmit", + "test": "pnpm run build:test && mocha 'tests/**/*.test.js'", + "test:e2e": "pnpm run build:test && mocha 'e2e/**/*.test.js' --timeout 30000 --exit", + "test:filter": "pnpm run build:test && mocha 'tests/**/*.test.js' --grep", + "test:e2e:filter": "pnpm run build:test && mocha 'e2e/**/*.test.js' --timeout 30000 --grep", "test:coverage": "nyc --reporter=text pnpm run test", - "prepublishOnly": "pnpm run generate-types", - "generate-types": "tsc lib/*.js lib/**/*.js --declaration --allowJs --emitDeclarationOnly --allowSyntheticDefaultImports --outDir types" + "prepublishOnly": "pnpm run build" }, "repository": { "type": "git", @@ -33,8 +43,7 @@ "url": "https://github.com/evervault/evervault-node/issues" }, "files": [ - "lib", - "types" + "dist" ], "engines": { "node": ">=22" @@ -44,25 +53,29 @@ "agent-base": "^6.0.2", "asn1js": "^3.0.5", "async-retry": "^1.3.3", - "crc-32": "^1.2.2", "axios": "^1.12.0" }, "devDependencies": { "@changesets/cli": "^2.29.2", + "@types/async-retry": "^1.4.9", + "@types/node": "^22.10.2", "chai": "^4.2.0", "chai-as-promised": "^7.1.1", + "crc-32": "^1.2.2", "husky": "^7.0.2", "lint-staged": "^11.1.2", "mocha": "^10.0.0", "msgpackr": "^1.9.9", "nock": "^12.0.3", "nyc": "^17.0.0", - "prettier": "^2.3.2", + "prettier": "^2.8.8", "proxy": "^1.0.2", - "rewire": "^7.0.0", + "proxyquire": "^2.1.3", "sinon": "^9.0.2", "sinon-chai": "^3.5.0", - "typescript": "^5.3.3" + "tsup": "^8.3.5", + "tsx": "^4.19.2", + "typescript": "^5.9.3" }, "release": { "branches": [ @@ -70,6 +83,6 @@ ] }, "lint-staged": { - "**/*.js": "prettier --write --ignore-unknown \"./**/*.js\"" + "**/*.{ts,js}": "prettier --write --ignore-unknown" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4f403a56..1630e81c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,7 +8,6 @@ overrides: js-yaml@<=4.1.1: ^4.1.2 serialize-javascript@<=7.0.2: ^7.0.3 serialize-javascript@>=5.0.0 <7.0.5: ^7.0.5 - uuid@<11.1.1: ^11.1.1 lodash@>=4.0.0 <4.17.23: ^4.17.23 importers: @@ -27,19 +26,25 @@ importers: axios: specifier: ^1.12.0 version: 1.18.1(supports-color@8.1.1) - crc-32: - specifier: ^1.2.2 - version: 1.2.2 devDependencies: '@changesets/cli': specifier: ^2.29.2 - version: 2.31.0 + version: 2.31.0(@types/node@22.20.1) + '@types/async-retry': + specifier: ^1.4.9 + version: 1.4.9 + '@types/node': + specifier: ^22.10.2 + version: 22.20.1 chai: specifier: ^4.2.0 version: 4.5.0 chai-as-promised: specifier: ^7.1.1 version: 7.1.2(chai@4.5.0) + crc-32: + specifier: ^1.2.2 + version: 1.2.2 husky: specifier: ^7.0.2 version: 7.0.4 @@ -59,22 +64,28 @@ importers: specifier: ^17.0.0 version: 17.1.0(supports-color@8.1.1) prettier: - specifier: ^2.3.2 + specifier: ^2.8.8 version: 2.8.8 proxy: specifier: ^1.0.2 version: 1.0.2(supports-color@8.1.1) - rewire: - specifier: ^7.0.0 - version: 7.0.0(supports-color@8.1.1) + proxyquire: + specifier: ^2.1.3 + version: 2.1.3 sinon: specifier: ^9.0.2 version: 9.2.4 sinon-chai: specifier: ^3.5.0 version: 3.7.0(chai@4.5.0)(sinon@9.2.4) + tsup: + specifier: ^8.3.5 + version: 8.5.1(supports-color@8.1.1)(tsx@4.23.0)(typescript@5.9.3) + tsx: + specifier: ^4.19.2 + version: 4.23.0 typescript: - specifier: ^5.3.3 + specifier: ^5.9.3 version: 5.9.3 packages: @@ -205,36 +216,317 @@ packages: '@changesets/write@0.4.0': resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} - '@eslint-community/eslint-utils@4.9.1': - resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.28.1': + resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.28.1': + resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] - '@eslint-community/regexpp@4.12.2': - resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@esbuild/android-arm@0.28.1': + resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead + '@esbuild/android-x64@0.28.1': + resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead + '@esbuild/darwin-arm64@0.28.1': + resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.1': + resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.28.1': + resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.1': + resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.28.1': + resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.28.1': + resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.28.1': + resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.28.1': + resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.28.1': + resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.28.1': + resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.1': + resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.28.1': + resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.28.1': + resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.28.1': + resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.1': + resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.28.1': + resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.1': + resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/openharmony-arm64@0.28.1': + resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.28.1': + resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.28.1': + resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.28.1': + resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.28.1': + resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] '@inquirer/external-editor@1.0.3': resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} @@ -317,6 +609,144 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@rollup/rollup-android-arm-eabi@4.62.2': + resolution: {integrity: sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.62.2': + resolution: {integrity: sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.62.2': + resolution: {integrity: sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.62.2': + resolution: {integrity: sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.62.2': + resolution: {integrity: sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.62.2': + resolution: {integrity: sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.62.2': + resolution: {integrity: sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.62.2': + resolution: {integrity: sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.62.2': + resolution: {integrity: sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.62.2': + resolution: {integrity: sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.62.2': + resolution: {integrity: sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.62.2': + resolution: {integrity: sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.62.2': + resolution: {integrity: sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.62.2': + resolution: {integrity: sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.62.2': + resolution: {integrity: sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.62.2': + resolution: {integrity: sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.62.2': + resolution: {integrity: sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.62.2': + resolution: {integrity: sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.62.2': + resolution: {integrity: sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.62.2': + resolution: {integrity: sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.62.2': + resolution: {integrity: sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.62.2': + resolution: {integrity: sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.62.2': + resolution: {integrity: sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.62.2': + resolution: {integrity: sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.62.2': + resolution: {integrity: sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==} + cpu: [x64] + os: [win32] + '@sinonjs/commons@1.8.6': resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} @@ -332,19 +762,23 @@ packages: Deprecated: no longer maintained and no longer used by Sinon packages. See https://github.com/sinonjs/nise/issues/243 for replacement details. + '@types/async-retry@1.4.9': + resolution: {integrity: sha512-s1ciZQJzRh3708X/m3vPExr5KJlzlZJvXsKpbtE2luqNcbROr64qU+3KpJsYHqWMeaxI839OvXf9PrUSw1Xtyg==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + '@types/node@22.20.1': + resolution: {integrity: sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==} + '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - '@ungap/structured-clone@1.3.2': - resolution: {integrity: sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==} - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@types/retry@0.12.5': + resolution: {integrity: sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw==} acorn@8.17.0: resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} @@ -359,9 +793,6 @@ packages: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} - ajv@6.15.0: - resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -382,6 +813,9 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -461,6 +895,16 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + caching-transform@4.0.0: resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} engines: {node: '>=8'} @@ -515,6 +959,10 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -556,6 +1004,10 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} @@ -566,6 +1018,13 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} @@ -606,9 +1065,6 @@ packages: resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - default-require-extensions@3.0.1: resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==} engines: {node: '>=8'} @@ -637,10 +1093,6 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -677,6 +1129,16 @@ packages: es6-error@4.1.1: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.28.1: + resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -689,40 +1151,6 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true - - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - esquery@1.7.0: - resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -730,25 +1158,25 @@ packages: extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fill-keys@1.0.2: + resolution: {integrity: sha512-tcgI872xXjwFF4xgQmLxi76GnwJG3g/3isB1l4/G5Z4zrbddGpBjqZCO9oEAcB5wX0Hj/5iQB3toxfO7in1hHA==} + engines: {node: '>=0.10.0'} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} @@ -766,17 +1194,13 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true - flatted@3.4.2: - resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} - follow-redirects@1.16.0: resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} engines: {node: '>=4.0'} @@ -854,10 +1278,6 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me @@ -867,10 +1287,6 @@ packages: engines: {node: '>=12'} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -882,9 +1298,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -967,6 +1380,10 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} + engines: {node: '>= 0.4'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -987,9 +1404,8 @@ packages: resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} engines: {node: '>=0.10.0'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} + is-object@1.0.2: + resolution: {integrity: sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==} is-plain-obj@2.1.0: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} @@ -1052,6 +1468,10 @@ packages: resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -1064,18 +1484,9 @@ packages: engines: {node: '>=6'} hasBin: true - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} @@ -1090,16 +1501,13 @@ packages: just-extend@4.2.1: resolution: {integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==} - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - leven@2.1.0: resolution: {integrity: sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==} engines: {node: '>=0.10.0'} - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -1117,6 +1525,10 @@ packages: enquirer: optional: true + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -1132,9 +1544,6 @@ packages: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} @@ -1155,6 +1564,9 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} @@ -1167,6 +1579,9 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -1197,11 +1612,17 @@ packages: resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} engines: {node: '>=10'} + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + mocha@10.8.2: resolution: {integrity: sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==} engines: {node: '>= 14.0.0'} hasBin: true + module-not-found-error@1.0.1: + resolution: {integrity: sha512-pEk4ECWQXV6z2zjhRZUongnLJNUeGQJ3w6OQ5ctGwD+i5o93qjRQUk2Rt6VdNeu3sEP0AB4LcfvdebpxBRVr4g==} + mri@1.1.4: resolution: {integrity: sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==} engines: {node: '>=4'} @@ -1220,8 +1641,8 @@ packages: msgpackr@1.12.1: resolution: {integrity: sha512-4EUH9tQHnMmEgzW/MdAP0KIfa1T9AF+htl0ffe2n5vb2EKn9y2co8ccpgWko6S52Jy1PQZKwRnx5/KkYjtd9MQ==} - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} nise@4.1.0: resolution: {integrity: sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==} @@ -1255,6 +1676,10 @@ packages: engines: {node: '>=18'} hasBin: true + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -1262,10 +1687,6 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} @@ -1332,6 +1753,9 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-to-regexp@1.9.0: resolution: {integrity: sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==} @@ -1339,6 +1763,9 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} @@ -1349,20 +1776,45 @@ packages: resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + please-upgrade-node@3.2.0: resolution: {integrity: sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==} - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} @@ -1385,9 +1837,8 @@ packages: resolution: {integrity: sha512-KNac2ueWRpjbUh77OAFPZuNdfEqNynm9DD4xHT14CccGpW8wKZwEkN0yjlb7X9G9Z9F55N0Q+1z+WfgAhwYdzQ==} hasBin: true - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + proxyquire@2.1.3: + resolution: {integrity: sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg==} pvtsutils@1.3.6: resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} @@ -1410,6 +1861,10 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + release-zalgo@1.0.0: resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} engines: {node: '>=4'} @@ -1429,6 +1884,11 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} + hasBin: true + restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} @@ -1441,9 +1901,6 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rewire@7.0.0: - resolution: {integrity: sha512-DyyNyzwMtGYgu0Zl/ya0PR/oaunM+VuCuBxCuhYJHHaV0V+YvYa3bBGxb5OZ71vndgmp1pYY8F4YOwQo1siRGw==} - rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} @@ -1452,6 +1909,11 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + rollup@4.62.2: + resolution: {integrity: sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -1521,6 +1983,10 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + spawn-wrap@2.0.0: resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} engines: {node: '>=8'} @@ -1560,6 +2026,11 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -1572,6 +2043,10 @@ packages: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} @@ -1580,22 +2055,60 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + tsup@8.5.1: + resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + + tsx@4.23.0: + resolution: {integrity: sha512-eUdUIaCr963q2h5u3+QwvYp0+eqPvn+egeqZUm0hwERCqqx1E3kK5ehbGCvqSE5MQAULr67ww0cA3jKc3YkM1w==} + engines: {node: '>=18.0.0'} + hasBin: true type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} @@ -1605,10 +2118,6 @@ packages: resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} engines: {node: '>=4'} - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} @@ -1625,6 +2134,12 @@ packages: engines: {node: '>=14.17'} hasBin: true + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -1635,11 +2150,9 @@ packages: peerDependencies: browserslist: '>= 4.21.0' - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - uuid@11.1.1: - resolution: {integrity: sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==} + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true which-module@2.0.1: @@ -1650,10 +2163,6 @@ packages: engines: {node: '>= 8'} hasBin: true - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - workerpool@6.5.1: resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} @@ -1842,7 +2351,7 @@ snapshots: dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.31.0': + '@changesets/cli@2.31.0(@types/node@22.20.1)': dependencies: '@changesets/apply-release-plan': 7.1.1 '@changesets/assemble-release-plan': 6.0.10 @@ -1858,7 +2367,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.3 + '@inquirer/external-editor': 1.0.3(@types/node@22.20.1) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 enquirer: 2.4.1 @@ -1918,83 +2427,206 @@ snapshots: dependencies: picocolors: 1.1.1 - '@changesets/parse@0.4.3': - dependencies: - '@changesets/types': 6.1.0 - js-yaml: 4.2.0 + '@changesets/parse@0.4.3': + dependencies: + '@changesets/types': 6.1.0 + js-yaml: 4.2.0 + + '@changesets/pre@2.0.2': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + + '@changesets/read@0.6.7': + dependencies: + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.3 + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.1 + + '@changesets/should-skip-package@0.1.2': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.1.0': {} + + '@changesets/write@0.4.0': + dependencies: + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + human-id: 4.2.0 + prettier: 2.8.8 + + '@esbuild/aix-ppc64@0.27.7': + optional: true + + '@esbuild/aix-ppc64@0.28.1': + optional: true + + '@esbuild/android-arm64@0.27.7': + optional: true + + '@esbuild/android-arm64@0.28.1': + optional: true + + '@esbuild/android-arm@0.27.7': + optional: true + + '@esbuild/android-arm@0.28.1': + optional: true + + '@esbuild/android-x64@0.27.7': + optional: true + + '@esbuild/android-x64@0.28.1': + optional: true + + '@esbuild/darwin-arm64@0.27.7': + optional: true + + '@esbuild/darwin-arm64@0.28.1': + optional: true + + '@esbuild/darwin-x64@0.27.7': + optional: true + + '@esbuild/darwin-x64@0.28.1': + optional: true + + '@esbuild/freebsd-arm64@0.27.7': + optional: true + + '@esbuild/freebsd-arm64@0.28.1': + optional: true + + '@esbuild/freebsd-x64@0.27.7': + optional: true + + '@esbuild/freebsd-x64@0.28.1': + optional: true + + '@esbuild/linux-arm64@0.27.7': + optional: true + + '@esbuild/linux-arm64@0.28.1': + optional: true + + '@esbuild/linux-arm@0.27.7': + optional: true + + '@esbuild/linux-arm@0.28.1': + optional: true + + '@esbuild/linux-ia32@0.27.7': + optional: true + + '@esbuild/linux-ia32@0.28.1': + optional: true + + '@esbuild/linux-loong64@0.27.7': + optional: true + + '@esbuild/linux-loong64@0.28.1': + optional: true + + '@esbuild/linux-mips64el@0.27.7': + optional: true + + '@esbuild/linux-mips64el@0.28.1': + optional: true + + '@esbuild/linux-ppc64@0.27.7': + optional: true + + '@esbuild/linux-ppc64@0.28.1': + optional: true + + '@esbuild/linux-riscv64@0.27.7': + optional: true + + '@esbuild/linux-riscv64@0.28.1': + optional: true + + '@esbuild/linux-s390x@0.27.7': + optional: true + + '@esbuild/linux-s390x@0.28.1': + optional: true + + '@esbuild/linux-x64@0.27.7': + optional: true + + '@esbuild/linux-x64@0.28.1': + optional: true + + '@esbuild/netbsd-arm64@0.27.7': + optional: true + + '@esbuild/netbsd-arm64@0.28.1': + optional: true + + '@esbuild/netbsd-x64@0.27.7': + optional: true + + '@esbuild/netbsd-x64@0.28.1': + optional: true - '@changesets/pre@2.0.2': - dependencies: - '@changesets/errors': 0.2.0 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 + '@esbuild/openbsd-arm64@0.27.7': + optional: true - '@changesets/read@0.6.7': - dependencies: - '@changesets/git': 3.0.4 - '@changesets/logger': 0.1.1 - '@changesets/parse': 0.4.3 - '@changesets/types': 6.1.0 - fs-extra: 7.0.1 - p-filter: 2.1.0 - picocolors: 1.1.1 + '@esbuild/openbsd-arm64@0.28.1': + optional: true - '@changesets/should-skip-package@0.1.2': - dependencies: - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 + '@esbuild/openbsd-x64@0.27.7': + optional: true - '@changesets/types@4.1.0': {} + '@esbuild/openbsd-x64@0.28.1': + optional: true - '@changesets/types@6.1.0': {} + '@esbuild/openharmony-arm64@0.27.7': + optional: true - '@changesets/write@0.4.0': - dependencies: - '@changesets/types': 6.1.0 - fs-extra: 7.0.1 - human-id: 4.2.0 - prettier: 2.8.8 + '@esbuild/openharmony-arm64@0.28.1': + optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1(supports-color@8.1.1))': - dependencies: - eslint: 8.57.1(supports-color@8.1.1) - eslint-visitor-keys: 3.4.3 + '@esbuild/sunos-x64@0.27.7': + optional: true - '@eslint-community/regexpp@4.12.2': {} + '@esbuild/sunos-x64@0.28.1': + optional: true - '@eslint/eslintrc@2.1.4(supports-color@8.1.1)': - dependencies: - ajv: 6.15.0 - debug: 4.4.3(supports-color@8.1.1) - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.2.0 - minimatch: 3.1.5 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color + '@esbuild/win32-arm64@0.27.7': + optional: true - '@eslint/js@8.57.1': {} + '@esbuild/win32-arm64@0.28.1': + optional: true - '@humanwhocodes/config-array@0.13.0(supports-color@8.1.1)': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.3(supports-color@8.1.1) - minimatch: 3.1.5 - transitivePeerDependencies: - - supports-color + '@esbuild/win32-ia32@0.27.7': + optional: true + + '@esbuild/win32-ia32@0.28.1': + optional: true - '@humanwhocodes/module-importer@1.0.1': {} + '@esbuild/win32-x64@0.27.7': + optional: true - '@humanwhocodes/object-schema@2.0.3': {} + '@esbuild/win32-x64@0.28.1': + optional: true - '@inquirer/external-editor@1.0.3': + '@inquirer/external-editor@1.0.3(@types/node@22.20.1)': dependencies: chardet: 2.2.0 iconv-lite: 0.7.2 + optionalDependencies: + '@types/node': 22.20.1 '@istanbuljs/load-nyc-config@1.1.0': dependencies: @@ -2071,6 +2703,81 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 + '@rollup/rollup-android-arm-eabi@4.62.2': + optional: true + + '@rollup/rollup-android-arm64@4.62.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.62.2': + optional: true + + '@rollup/rollup-darwin-x64@4.62.2': + optional: true + + '@rollup/rollup-freebsd-arm64@4.62.2': + optional: true + + '@rollup/rollup-freebsd-x64@4.62.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.62.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.62.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.62.2': + optional: true + + '@rollup/rollup-openbsd-x64@4.62.2': + optional: true + + '@rollup/rollup-openharmony-arm64@4.62.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.62.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.62.2': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.62.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.62.2': + optional: true + '@sinonjs/commons@1.8.6': dependencies: type-detect: 4.0.8 @@ -2087,15 +2794,21 @@ snapshots: '@sinonjs/text-encoding@0.7.3': {} - '@types/node@12.20.55': {} + '@types/async-retry@1.4.9': + dependencies: + '@types/retry': 0.12.5 - '@types/parse-json@4.0.2': {} + '@types/estree@1.0.9': {} - '@ungap/structured-clone@1.3.2': {} + '@types/node@12.20.55': {} - acorn-jsx@5.3.2(acorn@8.17.0): + '@types/node@22.20.1': dependencies: - acorn: 8.17.0 + undici-types: 6.21.0 + + '@types/parse-json@4.0.2': {} + + '@types/retry@0.12.5': {} acorn@8.17.0: {} @@ -2110,13 +2823,6 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 - ajv@6.15.0: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - ansi-colors@4.1.3: {} ansi-escapes@4.3.2: @@ -2133,6 +2839,8 @@ snapshots: dependencies: color-convert: 2.0.1 + any-promise@1.3.0: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -2216,6 +2924,13 @@ snapshots: node-releases: 2.0.50 update-browserslist-db: 1.2.3(browserslist@4.28.4) + bundle-require@5.1.0(esbuild@0.27.7): + dependencies: + esbuild: 0.27.7 + load-tsconfig: 0.2.5 + + cac@6.7.14: {} + caching-transform@4.0.0: dependencies: hasha: 5.2.2 @@ -2282,6 +2997,10 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + clean-stack@2.2.0: {} cli-cursor@3.1.0: @@ -2325,12 +3044,18 @@ snapshots: dependencies: delayed-stream: 1.0.0 + commander@4.1.1: {} + commander@8.3.0: {} commondir@1.0.1: {} concat-map@0.0.1: {} + confbox@0.1.8: {} + + consola@3.4.2: {} + convert-source-map@1.9.0: {} convert-source-map@2.0.0: {} @@ -2365,8 +3090,6 @@ snapshots: dependencies: type-detect: 4.1.0 - deep-is@0.1.4: {} - default-require-extensions@3.0.1: dependencies: strip-bom: 4.0.0 @@ -2386,10 +3109,6 @@ snapshots: dependencies: path-type: 4.0.0 - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -2426,80 +3145,70 @@ snapshots: es6-error@4.1.1: {} + esbuild@0.27.7: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 + + esbuild@0.28.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.1 + '@esbuild/android-arm': 0.28.1 + '@esbuild/android-arm64': 0.28.1 + '@esbuild/android-x64': 0.28.1 + '@esbuild/darwin-arm64': 0.28.1 + '@esbuild/darwin-x64': 0.28.1 + '@esbuild/freebsd-arm64': 0.28.1 + '@esbuild/freebsd-x64': 0.28.1 + '@esbuild/linux-arm': 0.28.1 + '@esbuild/linux-arm64': 0.28.1 + '@esbuild/linux-ia32': 0.28.1 + '@esbuild/linux-loong64': 0.28.1 + '@esbuild/linux-mips64el': 0.28.1 + '@esbuild/linux-ppc64': 0.28.1 + '@esbuild/linux-riscv64': 0.28.1 + '@esbuild/linux-s390x': 0.28.1 + '@esbuild/linux-x64': 0.28.1 + '@esbuild/netbsd-arm64': 0.28.1 + '@esbuild/netbsd-x64': 0.28.1 + '@esbuild/openbsd-arm64': 0.28.1 + '@esbuild/openbsd-x64': 0.28.1 + '@esbuild/openharmony-arm64': 0.28.1 + '@esbuild/sunos-x64': 0.28.1 + '@esbuild/win32-arm64': 0.28.1 + '@esbuild/win32-ia32': 0.28.1 + '@esbuild/win32-x64': 0.28.1 + escalade@3.2.0: {} escape-string-regexp@1.0.5: {} escape-string-regexp@4.0.0: {} - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.4.3: {} - - eslint@8.57.1(supports-color@8.1.1): - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1(supports-color@8.1.1)) - '@eslint-community/regexpp': 4.12.2 - '@eslint/eslintrc': 2.1.4(supports-color@8.1.1) - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0(supports-color@8.1.1) - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.3.2 - ajv: 6.15.0 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.3(supports-color@8.1.1) - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.7.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.2.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.5 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - espree@9.6.1: - dependencies: - acorn: 8.17.0 - acorn-jsx: 5.3.2(acorn@8.17.0) - eslint-visitor-keys: 3.4.3 - - esquery@1.7.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@5.3.0: {} - - esutils@2.0.3: {} - execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -2514,8 +3223,6 @@ snapshots: extendable-error@0.1.7: {} - fast-deep-equal@3.1.3: {} - fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2524,17 +3231,18 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - fastq@1.20.1: dependencies: reusify: 1.1.0 - file-entry-cache@6.0.1: + fdir@6.5.0(picomatch@4.0.5): + optionalDependencies: + picomatch: 4.0.5 + + fill-keys@1.0.2: dependencies: - flat-cache: 3.2.0 + is-object: 1.0.2 + merge-descriptors: 1.0.3 fill-range@7.1.1: dependencies: @@ -2556,16 +3264,14 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - flat-cache@3.2.0: + fix-dts-default-cjs-exports@1.0.1: dependencies: - flatted: 3.4.2 - keyv: 4.5.4 - rimraf: 3.0.2 + magic-string: 0.30.21 + mlly: 1.8.2 + rollup: 4.62.2 flat@5.0.2: {} - flatted@3.4.2: {} - follow-redirects@1.16.0: {} foreground-child@2.0.0: @@ -2641,10 +3347,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -2662,10 +3364,6 @@ snapshots: minimatch: 5.1.9 once: 1.4.0 - globals@13.24.0: - dependencies: - type-fest: 0.20.2 - globby@11.1.0: dependencies: array-union: 2.1.0 @@ -2679,8 +3377,6 @@ snapshots: graceful-fs@4.2.11: {} - graphemer@1.4.0: {} - has-flag@3.0.0: {} has-flag@4.0.0: {} @@ -2745,6 +3441,10 @@ snapshots: dependencies: binary-extensions: 2.3.0 + is-core-module@2.16.2: + dependencies: + hasown: 2.0.4 + is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -2757,7 +3457,7 @@ snapshots: is-obj@1.0.1: {} - is-path-inside@3.0.3: {} + is-object@1.0.2: {} is-plain-obj@2.1.0: {} @@ -2802,7 +3502,7 @@ snapshots: istanbul-lib-coverage: 3.2.2 p-map: 3.0.0 rimraf: 3.0.2 - uuid: 11.1.1 + uuid: 8.3.2 istanbul-lib-report@3.0.1: dependencies: @@ -2823,6 +3523,8 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 + joycon@3.1.1: {} + js-tokens@4.0.0: {} js-yaml@4.2.0: @@ -2831,14 +3533,8 @@ snapshots: jsesc@3.1.0: {} - json-buffer@3.0.1: {} - json-parse-even-better-errors@2.3.1: {} - json-schema-traverse@0.4.1: {} - - json-stable-stringify-without-jsonify@1.0.1: {} - json-stringify-safe@5.0.1: {} json5@2.2.3: {} @@ -2849,16 +3545,9 @@ snapshots: just-extend@4.2.1: {} - keyv@4.5.4: - dependencies: - json-buffer: 3.0.1 - leven@2.1.0: {} - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -2892,6 +3581,8 @@ snapshots: optionalDependencies: enquirer: 2.4.1 + load-tsconfig@0.2.5: {} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -2904,8 +3595,6 @@ snapshots: lodash.get@4.4.2: {} - lodash.merge@4.6.2: {} - lodash.startcase@4.4.0: {} lodash@4.18.1: {} @@ -2930,6 +3619,10 @@ snapshots: dependencies: yallist: 3.1.1 + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + make-dir@3.1.0: dependencies: semver: 6.3.1 @@ -2940,6 +3633,8 @@ snapshots: math-intrinsics@1.1.0: {} + merge-descriptors@1.0.3: {} + merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -2965,6 +3660,13 @@ snapshots: dependencies: brace-expansion: 2.1.1 + mlly@1.8.2: + dependencies: + acorn: 8.17.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 + mocha@10.8.2: dependencies: ansi-colors: 4.1.3 @@ -2988,6 +3690,8 @@ snapshots: yargs-parser: 20.2.9 yargs-unparser: 2.0.0 + module-not-found-error@1.0.1: {} + mri@1.1.4: {} mri@1.2.0: {} @@ -3010,7 +3714,11 @@ snapshots: optionalDependencies: msgpackr-extract: 3.0.4 - natural-compare@1.4.0: {} + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 nise@4.1.0: dependencies: @@ -3078,6 +3786,8 @@ snapshots: transitivePeerDependencies: - supports-color + object-assign@4.1.1: {} + once@1.4.0: dependencies: wrappy: 1.0.2 @@ -3086,15 +3796,6 @@ snapshots: dependencies: mimic-fn: 2.1.0 - optionator@0.9.4: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - outdent@0.5.0: {} p-filter@2.1.0: @@ -3157,29 +3858,47 @@ snapshots: path-key@3.1.1: {} + path-parse@1.0.7: {} + path-to-regexp@1.9.0: dependencies: isarray: 0.0.1 path-type@4.0.0: {} + pathe@2.0.3: {} + pathval@1.1.1: {} picocolors@1.1.1: {} picomatch@2.3.2: {} + picomatch@4.0.5: {} + pify@4.0.1: {} + pirates@4.0.7: {} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 + please-upgrade-node@3.2.0: dependencies: semver-compare: 1.0.0 - prelude-ls@1.2.1: {} + postcss-load-config@6.0.1(tsx@4.23.0): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + tsx: 4.23.0 prettier@2.8.8: {} @@ -3199,7 +3918,11 @@ snapshots: transitivePeerDependencies: - supports-color - punycode@2.3.1: {} + proxyquire@2.1.3: + dependencies: + fill-keys: 1.0.2 + module-not-found-error: 1.0.1 + resolve: 1.22.12 pvtsutils@1.3.6: dependencies: @@ -3222,6 +3945,8 @@ snapshots: dependencies: picomatch: 2.3.2 + readdirp@4.1.2: {} + release-zalgo@1.0.0: dependencies: es6-error: 4.1.1 @@ -3234,6 +3959,13 @@ snapshots: resolve-from@5.0.0: {} + resolve@1.22.12: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.2 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + restore-cursor@3.1.0: dependencies: onetime: 5.1.2 @@ -3243,18 +3975,43 @@ snapshots: reusify@1.1.0: {} - rewire@7.0.0(supports-color@8.1.1): - dependencies: - eslint: 8.57.1(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - rfdc@1.4.1: {} rimraf@3.0.2: dependencies: glob: 7.2.3 + rollup@4.62.2: + dependencies: + '@types/estree': 1.0.9 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.62.2 + '@rollup/rollup-android-arm64': 4.62.2 + '@rollup/rollup-darwin-arm64': 4.62.2 + '@rollup/rollup-darwin-x64': 4.62.2 + '@rollup/rollup-freebsd-arm64': 4.62.2 + '@rollup/rollup-freebsd-x64': 4.62.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.62.2 + '@rollup/rollup-linux-arm-musleabihf': 4.62.2 + '@rollup/rollup-linux-arm64-gnu': 4.62.2 + '@rollup/rollup-linux-arm64-musl': 4.62.2 + '@rollup/rollup-linux-loong64-gnu': 4.62.2 + '@rollup/rollup-linux-loong64-musl': 4.62.2 + '@rollup/rollup-linux-ppc64-gnu': 4.62.2 + '@rollup/rollup-linux-ppc64-musl': 4.62.2 + '@rollup/rollup-linux-riscv64-gnu': 4.62.2 + '@rollup/rollup-linux-riscv64-musl': 4.62.2 + '@rollup/rollup-linux-s390x-gnu': 4.62.2 + '@rollup/rollup-linux-x64-gnu': 4.62.2 + '@rollup/rollup-linux-x64-musl': 4.62.2 + '@rollup/rollup-openbsd-x64': 4.62.2 + '@rollup/rollup-openharmony-arm64': 4.62.2 + '@rollup/rollup-win32-arm64-msvc': 4.62.2 + '@rollup/rollup-win32-ia32-msvc': 4.62.2 + '@rollup/rollup-win32-x64-gnu': 4.62.2 + '@rollup/rollup-win32-x64-msvc': 4.62.2 + fsevents: 2.3.3 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -3315,6 +4072,8 @@ snapshots: source-map@0.6.1: {} + source-map@0.7.6: {} + spawn-wrap@2.0.0: dependencies: foreground-child: 2.0.0 @@ -3355,6 +4114,16 @@ snapshots: strip-json-comments@3.1.1: {} + sucrase@3.35.1: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + tinyglobby: 0.2.17 + ts-interface-checker: 0.1.13 + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -3367,6 +4136,8 @@ snapshots: dependencies: has-flag: 4.0.0 + supports-preserve-symlinks-flag@1.0.0: {} + term-size@2.2.1: {} test-exclude@6.0.0: @@ -3375,26 +4146,70 @@ snapshots: glob: 7.2.3 minimatch: 3.1.5 - text-table@0.2.0: {} + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 through@2.3.8: {} + tinyexec@0.3.2: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 + tree-kill@1.2.2: {} + + ts-interface-checker@0.1.13: {} + tslib@2.8.1: {} - type-check@0.4.0: + tsup@8.5.1(supports-color@8.1.1)(tsx@4.23.0)(typescript@5.9.3): dependencies: - prelude-ls: 1.2.1 + bundle-require: 5.1.0(esbuild@0.27.7) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.3(supports-color@8.1.1) + esbuild: 0.27.7 + fix-dts-default-cjs-exports: 1.0.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(tsx@4.23.0) + resolve-from: 5.0.0 + rollup: 4.62.2 + source-map: 0.7.6 + sucrase: 3.35.1 + tinyexec: 0.3.2 + tinyglobby: 0.2.17 + tree-kill: 1.2.2 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + + tsx@4.23.0: + dependencies: + esbuild: 0.28.1 + optionalDependencies: + fsevents: 2.3.3 type-detect@4.0.8: {} type-detect@4.1.0: {} - type-fest@0.20.2: {} - type-fest@0.21.3: {} type-fest@0.8.1: {} @@ -3405,6 +4220,10 @@ snapshots: typescript@5.9.3: {} + ufo@1.6.4: {} + + undici-types@6.21.0: {} + universalify@0.1.2: {} update-browserslist-db@1.2.3(browserslist@4.28.4): @@ -3413,11 +4232,7 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - - uuid@11.1.1: {} + uuid@8.3.2: {} which-module@2.0.1: {} @@ -3425,8 +4240,6 @@ snapshots: dependencies: isexe: 2.0.0 - word-wrap@1.2.5: {} - workerpool@6.5.1: {} wrap-ansi@6.2.0: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 77dc0ac3..7b141a84 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,12 +1,11 @@ allowBuilds: + esbuild: true msgpackr-extract: false minimumReleaseAgeExclude: - serialize-javascript@7.0.3 || 7.0.5 - - uuid@11.1.1 - js-yaml@4.1.2 overrides: js-yaml@<=4.1.1: ^4.1.2 serialize-javascript@<=7.0.2: ^7.0.3 serialize-javascript@>=5.0.0 <7.0.5: ^7.0.5 - uuid@<11.1.1: ^11.1.1 lodash@>=4.0.0 <4.17.23: ^4.17.23 diff --git a/tests/client.test.js b/tests/client.test.js index db7b3364..f70118bb 100644 --- a/tests/client.test.js +++ b/tests/client.test.js @@ -5,7 +5,7 @@ const nock = require('nock'); const sinon = require('sinon'); const axios = require('axios'); const https = require('https'); -const rewire = require('rewire'); +const proxyquire = require('proxyquire'); const { RelayOutboundConfig } = require('../lib/core'); const { errors } = require('../lib/utils'); const fixtures = require('./utilities/fixtures'); @@ -22,11 +22,13 @@ let EvervaultClient; const encryptStub = sinon.stub(); describe('Testing the Evervault SDK', () => { beforeEach(() => { - EvervaultClient = rewire('../lib'); - EvervaultClient.__set__({ - Crypto: () => ({ - encrypt: encryptStub, - }), + EvervaultClient = proxyquire('../lib', { + './core': { + ...require('../lib/core'), + Crypto: () => ({ + encrypt: encryptStub, + }), + }, }); }); diff --git a/tests/config.test.js b/tests/config.test.js index 3a63d42e..2c5dbac1 100644 --- a/tests/config.test.js +++ b/tests/config.test.js @@ -3,7 +3,7 @@ chai.use(require('sinon-chai')); const { expect } = chai; const sinon = require('sinon'); -const rewire = require('rewire'); +const proxyquire = require('proxyquire'); const { errors } = require('../lib/utils'); const testApiKey = @@ -14,18 +14,19 @@ let EvervaultClient; const encryptStub = sinon.stub(); describe('Testing the Evervault SDK Config', () => { beforeEach(() => { - EvervaultClient = rewire('../lib'); - EvervaultClient.__set__({ - Crypto: () => ({ - encrypt: encryptStub, - }), + EvervaultClient = proxyquire('../lib', { + './core': { + ...require('../lib/core'), + Crypto: () => ({ + encrypt: encryptStub, + }), + }, }); }); afterEach(() => { encryptStub.reset(); process.env.EV_API_URL = undefined; - process.env.EV_CAGE_RUN_URL = undefined; process.env.EV_TUNNEL_HOSTNAME = undefined; process.env.EV_CERT_HOSTNAME = undefined; }); diff --git a/tests/core/crypto.test.js b/tests/core/crypto.test.js index 8c7a0efb..640cc9ec 100644 --- a/tests/core/crypto.test.js +++ b/tests/core/crypto.test.js @@ -1,7 +1,7 @@ const { expect } = require('chai'); const crypto = require('crypto'); const { unpack } = require('msgpackr'); -const Crypto = require('../../lib/core/crypto'); +const Crypto = require('../../lib/core/crypto').default; const { errors } = require('../../lib/utils'); const crc32 = require('crc-32'); diff --git a/tests/core/http.test.js b/tests/core/http.test.js index f6b0d817..83fe724a 100644 --- a/tests/core/http.test.js +++ b/tests/core/http.test.js @@ -9,7 +9,7 @@ describe('Http Module', () => { 'ev:key:1:3bOqOkKrVFrk2Ps9yM1tHEi90CvZCjsGIihoyZncM9SdLoXQxknPPjwxiMLyDVYyX:cRhR9o:tCZFZV'; const testAppId = 'app_8022cc5a3073'; const testValidConfig = require('../../lib/config').http; - const testHttpClient = require('../../lib/core/http')( + const testHttpClient = require('../../lib/core/http').default( testAppId, testApiKey, testValidConfig @@ -707,14 +707,13 @@ describe('Http Module', () => { }); describe('agent forwarding', () => { - const rewire = require('rewire'); + const proxyquire = require('proxyquire'); /** * Creates a rewired http module with a stub axios and optional agents, * returning both the client and a getter for the last captured axios config. */ const buildClientWithAxiosStub = (agents = {}) => { - const httpModule = rewire('../../lib/core/http'); let capturedConfig; const axiosStub = (cfg) => { capturedConfig = cfg; @@ -724,7 +723,9 @@ describe('Http Module', () => { headers: { 'x-poll-interval': '5' }, }); }; - httpModule.__set__('axios', axiosStub); + const httpModule = proxyquire('../../lib/core/http', { + axios: axiosStub, + }).default; const client = httpModule(testAppId, testApiKey, testValidConfig, agents); return { client, diff --git a/tests/core/repeatedTimer.test.js b/tests/core/repeatedTimer.test.js index 5cd86cb3..fd528743 100644 --- a/tests/core/repeatedTimer.test.js +++ b/tests/core/repeatedTimer.test.js @@ -2,7 +2,7 @@ const { expect } = require('chai'); const Sinon = require('sinon'); const { InvalidInterval } = require('../../lib/utils/errors'); -const RepeatedTimer = require('../../lib/core/repeatedTimer'); +const RepeatedTimer = require('../../lib/core/repeatedTimer').default; describe('RepeatedTimer Module', () => { it('Rejects when given a non-numeric value', () => { diff --git a/tests/proxy.test.js b/tests/proxy.test.js index e064a854..84290b00 100644 --- a/tests/proxy.test.js +++ b/tests/proxy.test.js @@ -4,7 +4,7 @@ const http = require('http'); const https = require('https'); const assert = require('assert'); const Proxy = require('proxy'); -const HttpsProxyAgent = require('../lib/utils/proxyAgent'); +const HttpsProxyAgent = require('../lib/utils/proxyAgent').default; const { httpsRelayAgent } = require('../lib/utils/httpsHelper'); const { Http } = require('../lib/core'); diff --git a/tests/sdk.test.js b/tests/sdk.test.js index 25196558..20fc7337 100644 --- a/tests/sdk.test.js +++ b/tests/sdk.test.js @@ -5,7 +5,7 @@ chai.use(require('sinon-chai')); const { expect } = chai; const axios = require('axios'); const { errors } = require('../lib/utils'); -const rewire = require('rewire'); +const proxyquire = require('proxyquire'); const { createProxyServer, createServer } = require('./utilities/mockServer'); const testApiKey = @@ -199,10 +199,9 @@ describe('evervault client', () => { // rewiring is needed to set the config environment variables // there isn't a clean way to do this at runtime because of Node.js // module caching system. - EvervaultClient = rewire('../lib'); const config = require('../lib/config'); config.http.baseUrl = `http://localhost:${server.address().port}`; - EvervaultClient.__set__('config', config); + EvervaultClient = proxyquire('../lib', { './config': config }); Evervault = EvervaultClient; }); @@ -274,10 +273,9 @@ describe('evervault client', () => { // rewiring is needed to set the config environment variables // there isn't a clean way to do this at runtime because of Node.js // module caching system. - EvervaultClient = rewire('../lib'); const config = require('../lib/config'); config.http.baseUrl = `http://localhost:${server.address().port}`; - EvervaultClient.__set__('config', config); + EvervaultClient = proxyquire('../lib', { './config': config }); Evervault = EvervaultClient; }); @@ -329,10 +327,9 @@ describe('evervault client', () => { // rewiring is needed to set the config environment variables // there isn't a clean way to do this at runtime because of Node.js // module caching system. - EvervaultClient = rewire('../lib'); const config = require('../lib/config'); config.http.baseUrl = `http://localhost:${server.address().port}`; - EvervaultClient.__set__('config', config); + EvervaultClient = proxyquire('../lib', { './config': config }); Evervault = EvervaultClient; }); @@ -384,10 +381,9 @@ describe('evervault client', () => { // rewiring is needed to set the config environment variables // there isn't a clean way to do this at runtime because of Node.js // module caching system. - EvervaultClient = rewire('../lib'); const config = require('../lib/config'); config.http.baseUrl = `http://localhost:${server.address().port}`; - EvervaultClient.__set__('config', config); + EvervaultClient = proxyquire('../lib', { './config': config }); Evervault = EvervaultClient; }); @@ -466,13 +462,12 @@ describe('evervault client', () => { // rewiring is needed to set the config environment variables // there isn't a clean way to do this at runtime because of Node.js // module caching system. - EvervaultClient = rewire('../lib'); + EvervaultClient = require('../lib'); const config = require('../lib/config'); config.http.baseUrl = `http://localhost:${apiServer.address().port}`; config.http.tunnelHostname = `http://localhost:${ proxyServer.address().port }`; - EvervaultClient.__set__('config', config); Evervault = EvervaultClient; }); diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 00000000..eea57e63 --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": false, + "declaration": false, + "sourceMap": true, + "rootDir": ".", + "outDir": "." + }, + "include": ["lib/**/*.ts"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..aeafba54 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "commonjs", + "moduleResolution": "node", + "lib": ["ES2022"], + "types": ["node"], + "strict": true, + "declaration": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "resolveJsonModule": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true, + "noEmit": true + }, + "include": ["lib/**/*.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/tsup.config.ts b/tsup.config.ts new file mode 100644 index 00000000..6e10cf74 --- /dev/null +++ b/tsup.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from 'tsup'; + +export default defineConfig({ + entry: ['lib/index.ts'], + format: ['cjs', 'esm'], + dts: true, + sourcemap: true, + clean: true, + target: 'node22', + outDir: 'dist', + keepNames: true, +}); From 4402360bf7e453a9281328133b43e6e6328897e6 Mon Sep 17 00:00:00 2001 From: Matt Paletta Date: Thu, 20 Aug 2026 17:09:53 +0100 Subject: [PATCH 6/6] build: keep compiled JS out of the source tree, fix declarations for JS consumers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `build:test` compiled every `lib/**/*.ts` to a `.js` sibling so mocha could require the sources under plain Node, which meant carrying `lib/**/*.js` ignore rules in both .gitignore and .prettierignore to hide the emitted files. Run the suite directly against the TypeScript instead, via the tsx loader in .mocharc.json. `tsup` remains the only thing that emits, into the already-ignored `dist/`, so no compiled JS lands in `lib/` at all. Also fixes a packaging regression the rewrite introduced. The runtime is `module.exports = EvervaultClient`, but tsup's dts rollup emitted `export { EvervaultClient as default }`, so `new Evervault(...)` failed to type-check for consumers with TS2351 "not constructable" — the previous `tsc`-generated `types/` correctly emitted `export = EvervaultClient`. `cjsInterop` restores that form for the CJS declaration while leaving the `.d.mts` as a default export, and the `exports` map now nests `types` under each condition so ESM consumers stop resolving the CJS declaration. Verified against a packed tarball: CJS require, ESM import, and declaration resolution under node, node16, and bundler. Co-Authored-By: Claude Opus 5 --- .changeset/typescript-rewrite.md | 6 ++++-- .gitignore | 4 ---- .mocharc.json | 3 ++- .prettierignore | 2 -- package.json | 20 ++++++++++++-------- tsconfig.build.json | 11 ----------- tsup.config.ts | 1 + 7 files changed, 19 insertions(+), 28 deletions(-) delete mode 100644 tsconfig.build.json diff --git a/.changeset/typescript-rewrite.md b/.changeset/typescript-rewrite.md index ffd9e4bd..a0ad1214 100644 --- a/.changeset/typescript-rewrite.md +++ b/.changeset/typescript-rewrite.md @@ -1,9 +1,11 @@ --- -"@evervault/sdk": major +'@evervault/sdk': major --- Rewrite the SDK in TypeScript. The package now ships a compiled `dist/` bundle with dual ESM and CommonJS entry points plus bundled type declarations (built with `tsup`), replacing the previously shipped JavaScript source and the `tsc`-generated `types/` directory. The public API is unchanged: `require('@evervault/sdk')` still returns the `EvervaultClient` class, `import Evervault from '@evervault/sdk'` works for ESM consumers, and every client method keeps the same signature and runtime behaviour (including the on-the-wire encryption formats). This is released as a major version only because the package's internal file layout and `exports` map changed, which can affect consumers that imported internal file paths directly. -Remove unused internal modules (`labs`, `dataHelper`, `environment`) and their dead dependency reference (`big.js` was imported but never installed). Move test-only dependencies `crc-32` to `devDependencies`. Removed dependency on uuid. +Type declarations are resolved per export condition: CommonJS consumers get `export = EvervaultClient` (matching the `module.exports = EvervaultClient` runtime), and ESM consumers get a default export. This keeps `new Evervault(...)` type-checking for plain JavaScript consumers using `// @ts-check` or editor IntelliSense. + +Remove unused internal modules (`labs`, `dataHelper`, `environment`) and their dead dependency reference (`big.js` was imported but never installed). Move test-only dependencies `crc-32` to `devDependencies`. Removed dependency on uuid. diff --git a/.gitignore b/.gitignore index a1e27329..6671f03b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,6 @@ types .direnv -# Compiled JS emitted from lib/*.ts for running the test suite under plain Node -lib/**/*.js -lib/**/*.js.map - # Logs logs *.log diff --git a/.mocharc.json b/.mocharc.json index d84a0c2c..17cc1aff 100644 --- a/.mocharc.json +++ b/.mocharc.json @@ -1,3 +1,4 @@ { - "timeout": 30000 + "timeout": 30000, + "import": "tsx" } diff --git a/.prettierignore b/.prettierignore index 75a52e40..b2d1f452 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,5 +2,3 @@ dist node_modules coverage pnpm-lock.yaml -lib/**/*.js -lib/**/*.js.map diff --git a/package.json b/package.json index 694eebd9..18f7562d 100644 --- a/package.json +++ b/package.json @@ -8,21 +8,25 @@ "types": "./dist/index.d.ts", "exports": { ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.mjs", - "require": "./dist/index.js" + "import": { + "types": "./dist/index.d.mts", + "default": "./dist/index.mjs" + }, + "require": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } } }, "scripts": { "prepare": "husky install", "build": "tsup", - "build:test": "tsc -p tsconfig.build.json", "format": "prettier --check \"./**/*.{ts,js}\"", "typecheck": "tsc --noEmit", - "test": "pnpm run build:test && mocha 'tests/**/*.test.js'", - "test:e2e": "pnpm run build:test && mocha 'e2e/**/*.test.js' --timeout 30000 --exit", - "test:filter": "pnpm run build:test && mocha 'tests/**/*.test.js' --grep", - "test:e2e:filter": "pnpm run build:test && mocha 'e2e/**/*.test.js' --timeout 30000 --grep", + "test": "mocha 'tests/**/*.test.js'", + "test:e2e": "mocha 'e2e/**/*.test.js' --timeout 30000 --exit", + "test:filter": "mocha 'tests/**/*.test.js' --grep", + "test:e2e:filter": "mocha 'e2e/**/*.test.js' --timeout 30000 --grep", "test:coverage": "nyc --reporter=text pnpm run test", "prepublishOnly": "pnpm run build" }, diff --git a/tsconfig.build.json b/tsconfig.build.json deleted file mode 100644 index eea57e63..00000000 --- a/tsconfig.build.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "noEmit": false, - "declaration": false, - "sourceMap": true, - "rootDir": ".", - "outDir": "." - }, - "include": ["lib/**/*.ts"] -} diff --git a/tsup.config.ts b/tsup.config.ts index 6e10cf74..4ac7c41a 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -9,4 +9,5 @@ export default defineConfig({ target: 'node22', outDir: 'dist', keepNames: true, + cjsInterop: true, });