diff --git a/.github/renovate.json5 b/.github/renovate.json5 new file mode 100644 index 0000000..5017ff0 --- /dev/null +++ b/.github/renovate.json5 @@ -0,0 +1,6 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": ["config:base", "schedule:monthly", "group:allNonMajor"], + "rangeStrategy": "bump", + "packageRules": [{ "depTypeList": ["peerDependencies"], "enabled": false }] +} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..016376a --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,79 @@ + +name: Release Full + +on: + workflow_dispatch: + inputs: + version: + type: choice + description: "Release Version Type" + required: true + default: "patch" + options: + - major + - premajor + - minor + - preminor + - patch + - prepatch + - prerelease + + tag: + type: choice + description: "Release Npm Tag" + required: true + default: "latest" + options: + - canary + - nightly + - latest + - beta + - alpha + + dry_run: + type: boolean + description: "DryRun release" + required: true + default: false + +permissions: + # To publish packages with provenance + id-token: write + +jobs: + release: + name: Release + permissions: + contents: write + # To publish packages with provenance + id-token: write + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install Pnpm + run: corepack enable + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: "pnpm" + + - name: Install Dependencies + run: pnpm install + + - name: Run Test + run: pnpm run test + + - name: Try release to npm + run: pnpm run release + env: + DRY_RUN: ${{ inputs.dry_run }} + TAG: ${{ inputs.tag }} + VERSION: ${{ inputs.version }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + + diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..3370530 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,36 @@ +name: Test + +# Controls when the action will run. +on: + # Triggers the workflow on pull request events but only for the main branch + pull_request: + branches: [main] + push: + branches: [main] + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + test: + runs-on: ubuntu-latest + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install Pnpm + run: corepack enable + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: "pnpm" + + - name: Install Dependencies + run: pnpm install + + - name: Run Test + run: pnpm run test diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3879224 --- /dev/null +++ b/.gitignore @@ -0,0 +1,21 @@ +# Local +.DS_Store +*.local +*.log* + +# Dist +node_modules +dist/ +test-results + +# Test +test/js/ + +# IDE +.vscode/* +!.vscode/settings.json +!.vscode/extensions.json +.idea +*.tsbuildinfo + + diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..699ed73 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["biomejs.biome"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..58f2f56 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,18 @@ +{ + "search.useIgnoreFiles": true, + "[json]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[typescript]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[javascript]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[javascriptreact]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[css]": { + "editor.defaultFormatter": "biomejs.biome" + } +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..b9a5f26 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1 @@ +# @rspack/lite-tapable diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4631010 --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2022-present Bytedance, Inc. and its affiliates. + + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..b864cc7 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ + + + Rspack Banner + + +# @rspack/lite-tapable + +Lite weight tapable for Rspack. + +## Documentation + +See for details. + +## License + +Rspack is [MIT licensed](https://github.com/web-infra-dev/rspack/blob/main/LICENSE). diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..debe211 --- /dev/null +++ b/biome.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.8.3/schema.json", + "organizeImports": { + "enabled": true + }, + "vcs": { + "enabled": true, + "defaultBranch": "main", + "clientKind": "git", + "useIgnoreFile": true + }, + "formatter": { + "indentStyle": "space", + "ignore": ["./test/**/*"] + }, + "javascript": { + "formatter": { + "quoteStyle": "single" + } + }, + "css": { + "formatter": { + "enabled": true + } + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "correctness": { + "noVoidTypeReturn": "off" + }, + "complexity": { + "noBannedTypes": "off" + } + }, + "ignore": ["./test/**/*", "./scripts/**/*"] + } +} diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..0fcdc44 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,11 @@ +/** @type {import('ts-jest/dist/types').JestConfigWithTsJest} */ +const config = { + preset: 'ts-jest', + testEnvironment: './scripts/patch-node-env.cjs', + testTimeout: process.env.CI ? 200000 : 30000, + testMatch: ['/test/**/*.test.ts', '/test/**/*.test.js'], + watchPathIgnorePatterns: ['/test/.*/dist'], + extensionsToTreatAsEsm: ['.mts'], +}; + +module.exports = config; diff --git a/package.json b/package.json new file mode 100644 index 0000000..bd78561 --- /dev/null +++ b/package.json @@ -0,0 +1,54 @@ +{ + "name": "@rspack/lite-tapable", + "version": "1.0.0-beta.3", + "repository": "https://github.com/rspack-contrib/rspack-lite-tapable", + "license": "MIT", + "description": "Lite weight tapable for Rspack", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "scripts": { + "build": "tsc -b ./tsconfig.build.json", + "dev": "tsc -b -w", + "lint": "biome check .", + "lint:write": "biome check . --write", + "prepare": "simple-git-hooks && npm run build", + "test": "jest --colors", + "release": "node ./scripts/release.mjs" + }, + "files": ["dist"], + "simple-git-hooks": { + "pre-commit": "npx nano-staged" + }, + "nano-staged": { + "*.{js,jsx,ts,tsx,mjs,cjs}": [ + "biome check --write --no-errors-on-unmatched" + ] + }, + "devDependencies": { + "@biomejs/biome": "^1.8.3", + "@rspack/core": "1.0.0-beta.3", + "@rspack/test-tools": "1.0.0-beta.3", + "@types/node": "^20.14.13", + "@types/jest": "29.5.12", + "cross-env": "^7.0.3", + "execa": "9.3.0", + "fs-extra": "11.2.0", + "jest": "29.7.0", + "jest-cli": "29.7.0", + "jest-environment-node": "29.7.0", + "nano-staged": "^0.8.0", + "semver": "7.6.3", + "simple-git-hooks": "^2.11.1", + "ts-jest": "29.1.2", + "typescript": "5.0.2" + }, + "packageManager": "pnpm@9.6.0", + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org/", + "provenance": true + }, + "engines": { + "node": ">=16.0.0" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..e83bb20 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,4188 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@biomejs/biome': + specifier: ^1.8.3 + version: 1.8.3 + '@rspack/core': + specifier: 1.0.0-beta.3 + version: 1.0.0-beta.3 + '@rspack/test-tools': + specifier: 1.0.0-beta.3 + version: 1.0.0-beta.3(@rspack/core@1.0.0-beta.3) + '@types/jest': + specifier: 29.5.12 + version: 29.5.12 + '@types/node': + specifier: ^20.14.13 + version: 20.14.14 + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + execa: + specifier: 9.3.0 + version: 9.3.0 + fs-extra: + specifier: 11.2.0 + version: 11.2.0 + jest: + specifier: 29.7.0 + version: 29.7.0(@types/node@20.14.14) + jest-cli: + specifier: 29.7.0 + version: 29.7.0(@types/node@20.14.14) + jest-environment-node: + specifier: 29.7.0 + version: 29.7.0 + nano-staged: + specifier: ^0.8.0 + version: 0.8.0 + semver: + specifier: 7.6.3 + version: 7.6.3 + simple-git-hooks: + specifier: ^2.11.1 + version: 2.11.1 + ts-jest: + specifier: 29.1.2 + version: 29.1.2(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.14.14))(typescript@5.0.2) + typescript: + specifier: 5.0.2 + version: 5.0.2 + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.25.2': + resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.25.2': + resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.23.0': + resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.25.0': + resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.25.2': + resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-environment-visitor@7.24.7': + resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.24.7': + resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-hoist-variables@7.24.7': + resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.7': + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.25.2': + resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.24.8': + resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-simple-access@7.24.7': + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.24.7': + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.24.8': + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.23.2': + resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.25.0': + resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.23.0': + resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@7.25.3': + resolution: {integrity: sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.24.7': + resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.24.7': + resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.22.15': + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.25.0': + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.23.2': + resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.25.3': + resolution: {integrity: sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.23.0': + resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.25.2': + resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@biomejs/biome@1.8.3': + resolution: {integrity: sha512-/uUV3MV+vyAczO+vKrPdOW0Iaet7UnJMU4bNMinggGJTAnBPjCoLEYcyYtYHNnUNYlv4xZMH6hVIQCAozq8d5w==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@1.8.3': + resolution: {integrity: sha512-9DYOjclFpKrH/m1Oz75SSExR8VKvNSSsLnVIqdnKexj6NwmiMlKk94Wa1kZEdv6MCOHGHgyyoV57Cw8WzL5n3A==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@1.8.3': + resolution: {integrity: sha512-UeW44L/AtbmOF7KXLCoM+9PSgPo0IDcyEUfIoOXYeANaNXXf9mLUwV1GeF2OWjyic5zj6CnAJ9uzk2LT3v/wAw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@1.8.3': + resolution: {integrity: sha512-9yjUfOFN7wrYsXt/T/gEWfvVxKlnh3yBpnScw98IF+oOeCYb5/b/+K7YNqKROV2i1DlMjg9g/EcN9wvj+NkMuQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-arm64@1.8.3': + resolution: {integrity: sha512-fed2ji8s+I/m8upWpTJGanqiJ0rnlHOK3DdxsyVLZQ8ClY6qLuPc9uehCREBifRJLl/iJyQpHIRufLDeotsPtw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-x64-musl@1.8.3': + resolution: {integrity: sha512-UHrGJX7PrKMKzPGoEsooKC9jXJMa28TUSMjcIlbDnIO4EAavCoVmNQaIuUSH0Ls2mpGMwUIf+aZJv657zfWWjA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-linux-x64@1.8.3': + resolution: {integrity: sha512-I8G2QmuE1teISyT8ie1HXsjFRz9L1m5n83U1O6m30Kw+kPMPSKjag6QGUn+sXT8V+XWIZxFFBoTDEDZW2KPDDw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-win32-arm64@1.8.3': + resolution: {integrity: sha512-J+Hu9WvrBevfy06eU1Na0lpc7uR9tibm9maHynLIoAjLZpQU3IW+OKHUtyL8p6/3pT2Ju5t5emReeIS2SAxhkQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@1.8.3': + resolution: {integrity: sha512-/PJ59vA1pnQeKahemaQf4Nyj7IKUvGQSc3Ze1uIGi+Wvr1xF7rGobSrAAG01T/gUDG21vkDsZYM03NAmPiVkqg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/console@29.7.0': + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/core@29.7.0': + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect-utils@29.7.0': + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect@29.7.0': + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/fake-timers@29.7.0': + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/globals@29.7.0': + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/reporters@29.7.0': + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/source-map@29.6.3': + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-result@29.7.0': + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-sequencer@29.7.0': + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/transform@29.7.0': + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@module-federation/runtime-tools@0.2.3': + resolution: {integrity: sha512-capN8CVTCEqNAjnl102girrkevczoQfnQYyiYC4WuyKsg7+LUqfirIe1Eiyv6VSE2UgvOTZDnqvervA6rBOlmg==} + + '@module-federation/runtime@0.2.3': + resolution: {integrity: sha512-N+ZxBUb1mkmfO9XT1BwgYQgShtUTlijHbukqQ4afFka5lRAT+ayC7RKfHJLz0HbuexKPCmPBDfdmCnErR5WyTQ==} + + '@module-federation/sdk@0.2.3': + resolution: {integrity: sha512-W9zrPchLocyCBc/B8CW21akcfJXLl++9xBe1L1EtgxZGfj/xwHt0GcBWE/y+QGvYTL2a1iZjwscbftbUhxgxXg==} + + '@module-federation/webpack-bundler-runtime@0.2.3': + resolution: {integrity: sha512-L/jt2uJ+8dwYiyn9GxryzDR6tr/Wk8rpgvelM2EBeLIhu7YxCHSmSjQYhw3BTux9zZIr47d1K9fGjBFsVRd/SQ==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@rspack/binding-darwin-arm64@1.0.0-beta.3': + resolution: {integrity: sha512-v+2TFNWttB0ZqEkYP2pf3qpm7O8bJiVcl9Ym90lL+uMfYNRzzrGd57tu7NBp/6nhE3T3emxiFvaeVDpqIqykZQ==} + cpu: [arm64] + os: [darwin] + + '@rspack/binding-darwin-x64@1.0.0-beta.3': + resolution: {integrity: sha512-OM4jqlt23j2W9gxAqwrjf86TLnJ6u6lNeli/haJmfjaj8maHYY7LkEo7imK3MqfGXCFExQbsY367O+epZQ2pcQ==} + cpu: [x64] + os: [darwin] + + '@rspack/binding-linux-arm64-gnu@1.0.0-beta.3': + resolution: {integrity: sha512-NV3i1mIBSEN5nmf83TvX0M3jb6CzAPdaydFytQ6p8WP6UWZnJIJ19HEqZiab+R4kYhs7I27wbWJuJGpADTEKvQ==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-arm64-musl@1.0.0-beta.3': + resolution: {integrity: sha512-rusWEqc+niYk6LD9y+2lFtT4x/3T5PKUk2dYuRTRUGIl01BhOFoqnavLq40mQMgrXZCD4htUjSM5C1pjD0FkFw==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-x64-gnu@1.0.0-beta.3': + resolution: {integrity: sha512-vVP3bgOictg5glmByVSML5sIxiJAMZ46h2kSWdIHv1eb/zg9Jw48mNiymtOXjNgkBenvYiERgAaOlBqAX+ySMw==} + cpu: [x64] + os: [linux] + + '@rspack/binding-linux-x64-musl@1.0.0-beta.3': + resolution: {integrity: sha512-al7Rwikv0wQLNrWoyymUqZdWwRUjyyovUFzlSh8A1pR84UTPyeRdXmmO6+F8b5KBvK7QkFBnb3eeALMGvQw9Qw==} + cpu: [x64] + os: [linux] + + '@rspack/binding-win32-arm64-msvc@1.0.0-beta.3': + resolution: {integrity: sha512-GtxVR+HgSRyD2ybQ+Pk0rXcv9t1ndU/FWrYV7A2jY47dndwa/BNXLclRdyWBfmA1cBZVM8MfLUAVmSKz8hg8Aw==} + cpu: [arm64] + os: [win32] + + '@rspack/binding-win32-ia32-msvc@1.0.0-beta.3': + resolution: {integrity: sha512-4ccqbsPfNFXQ1BkN40Z2SuNfun1XvfdsbjG87NwjAWPEKH1I9lTZg7IeLIHdm+WvGwNSdg9xk8tu/ZA9aeLANA==} + cpu: [ia32] + os: [win32] + + '@rspack/binding-win32-x64-msvc@1.0.0-beta.3': + resolution: {integrity: sha512-QL0c+lP7gz6gR5lo8bhrx1VsvlgE3wkOReu96k5cscf9I349L+xeRMr7L5EsfcFyiK2mG8RjvlhLWIz9CFZ3IQ==} + cpu: [x64] + os: [win32] + + '@rspack/binding@1.0.0-beta.3': + resolution: {integrity: sha512-TJA2vC5UdNKVhogU9O1pwFGCD90dYtRXWRRXqI+fYgXdlOqqXYAjzON/CIuF9ZHUCL29TNKPQKMTNTpK3Q+exA==} + + '@rspack/core@1.0.0-beta.3': + resolution: {integrity: sha512-BOI3UHuWV2kjRJjvuMLIhwY86NpDS3CTePR/+PmEfRkrGy/BZd4Z+Sp8H0nw0RWUq9JU7nrwdGF+zj4aQCC2Jg==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@swc/helpers': '>=0.5.1' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@rspack/lite-tapable@1.0.0-beta.3': + resolution: {integrity: sha512-K/OwOFX4SsILeSAJtmVCoBZUPaXLNFGeIXerK0SY09in8+0i21c+luZAhjlD0mH9+cD2A/zBGL+GIEPKkW6IwQ==} + engines: {node: '>=16.0.0'} + + '@rspack/test-tools@1.0.0-beta.3': + resolution: {integrity: sha512-4tR4ehj4htMOa7zgSS8ZwTZ+rC9U+sdx2VS12As0GJniony54B2QN4kdgeA54WBhxstgEAk303xBEnonGx5EmQ==} + peerDependencies: + '@rspack/core': '>=0.7.0' + + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@9.6.0': + resolution: {integrity: sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/jest@29.5.12': + resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node@20.14.14': + resolution: {integrity: sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==} + + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + + '@webassemblyjs/ast@1.12.1': + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + + '@webassemblyjs/floating-point-hex-parser@1.11.6': + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + '@webassemblyjs/helper-api-error@1.11.6': + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + '@webassemblyjs/helper-buffer@1.12.1': + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + + '@webassemblyjs/helper-numbers@1.11.6': + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + '@webassemblyjs/helper-wasm-section@1.12.1': + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + + '@webassemblyjs/ieee754@1.11.6': + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + + '@webassemblyjs/leb128@1.11.6': + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + + '@webassemblyjs/utf8@1.11.6': + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + '@webassemblyjs/wasm-edit@1.12.1': + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + + '@webassemblyjs/wasm-gen@1.12.1': + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + + '@webassemblyjs/wasm-opt@1.12.1': + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + + '@webassemblyjs/wasm-parser@1.12.1': + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + + '@webassemblyjs/wast-printer@1.12.1': + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + 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-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + 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'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + babel-preset-current-node-syntax@1.0.1: + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + + babel-preset-jest@29.6.3: + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + 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.30001651: + resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} + + 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'} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cjs-module-lexer@1.3.1: + resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + + 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==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + create-jest@29.7.0: + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + + cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + cssstyle@4.0.1: + resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} + engines: {node: '>=18'} + + csv-to-markdown-table@1.4.1: + resolution: {integrity: sha512-jhLkfM7LXGQCuhxCwIw0QmpHCbMXy8ouC+T8KKoKaZ43DQAezpHCxNl74j2S9Sb4SEnVgMK8/RqJfNUk6xMHRQ==} + hasBin: true + + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + + debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + + dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + electron-to-chromium@1.5.5: + resolution: {integrity: sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==} + + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + enhanced-resolve@5.17.1: + resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@9.3.0: + resolution: {integrity: sha512-l6JFbqnHEadBoVAVpN5dl2yCyfX28WoBAGaoQcNmLLSedOxTxcn2Qa83s8I/PA5i56vWru2OHOtrwF7Om2vqlg==} + engines: {node: ^18.19.0 || >=20.5.0} + + exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + + expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + + filename-reserved-regex@2.0.0: + resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==} + engines: {node: '>=4'} + + filenamify@4.3.0: + resolution: {integrity: sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==} + engines: {node: '>=8'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + + 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-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + 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'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.5: + resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} + engines: {node: '>= 14'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@7.0.0: + resolution: {integrity: sha512-74kytxOUSvNbjrT9KisAbaTZ/eJwD/LrbM/kh5j0IhPuJzwuA19dWvniFGwBzN9rVjg+O/e+F310PjObDXS+9Q==} + engines: {node: '>=18.18.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + 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-core-module@2.15.0: + resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + + is-unicode-supported@2.0.0: + resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} + engines: {node: '>=18'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + + 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.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-cli@29.7.0: + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@29.7.0: + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-serializer-path@0.1.15: + resolution: {integrity: sha512-sXb+Ckz9LK5bB5sRAXFeG/nwhGn1XBKayy9xhPpgOmAWaljJiS+VN/xJ3P4I19jZ+WejowvO/kES+A9HePTMvQ==} + engines: {node: '>=6.4.x', npm: '>=3.10.3'} + + jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest@29.7.0: + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + jsdom@24.1.1: + resolution: {integrity: sha512-5O1wWV99Jhq4DV7rCLIoZ/UIhyQeDR7wHVyZAHAshbrvZsLs+Xzz7gtwnlJTJDjleiTKh54F4dXrX70vJQTyJQ==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^2.11.2 + peerDependenciesMeta: + canvas: + optional: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + 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==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + lodash.iserror@3.1.1: + resolution: {integrity: sha512-eT/VeNns9hS7vAj1NKW/rRX6b+C3UX3/IAAqEE7aC4Oo2C0iD82NaP5IS4bSlQsammTii4qBJ8G1zd1LTL8hCw==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + memfs@4.8.1: + resolution: {integrity: sha512-7q/AdPzf2WpwPlPL4v1kE2KsJsHl7EF4+hAeVzlyanr2+YnR21NVn9mDqo+7DEaKDRsQy8nvxPlKH4WqMtiO0w==} + engines: {node: '>= 4.0.0'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + 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.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + nano-staged@0.8.0: + resolution: {integrity: sha512-QSEqPGTCJbkHU2yLvfY6huqYPjdBrOaTMKatO1F8nCSrkQGXeKwtCiCnsdxnuMhbg3DTVywKaeWLGCE5oJpq0g==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + 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'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + nwsapi@2.2.12: + resolution: {integrity: sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==} + + 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'} + + 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-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + + parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + + 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-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + pretty-ms@9.1.0: + resolution: {integrity: sha512-o1piW0n3tgKIKCwk2vpM/vOV13zjJzvP37Ioze54YlTHE06m4tjEbzg9WsKkvTuyYln2DHjo5pY4qrZGI0otpw==} + engines: {node: '>=18'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rrweb-cssom@0.6.0: + resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} + + rrweb-cssom@0.7.1: + resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + 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'} + + simple-git-hooks@2.11.1: + resolution: {integrity: sha512-tgqwPUMDcNDhuf1Xf6KTUsyeqGdgKMhzaH4PAZZuzguOgTl5uuyeYe/8mWgAr6IBxB5V06uqEf6Dy37gIWDtDg==} + hasBin: true + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@2.0.0: + resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} + engines: {node: '>=6'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + 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-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-outer@1.0.1: + resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} + engines: {node: '>=0.10.0'} + + 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'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + terser-webpack-plugin@5.3.10: + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.31.4: + resolution: {integrity: sha512-3OU03GgblDgu0g+sdnsVzhBPxnjV+WJuMmocN1qBBZDQ3ia7jZQSAkePeKbPlYAejGXUTYe1CmSaUeV51mvaIw==} + engines: {node: '>=10'} + hasBin: true + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + + tr46@5.0.0: + resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} + engines: {node: '>=18'} + + trim-repeated@1.0.0: + resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==} + engines: {node: '>=0.10.0'} + + ts-jest@29.1.2: + resolution: {integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==} + engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + + tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + typescript@5.0.2: + resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} + engines: {node: '>=12.20'} + hasBin: true + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} + + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + watchpack@2.4.1: + resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} + engines: {node: '>=10.13.0'} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + webpack-merge@5.9.0: + resolution: {integrity: sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==} + engines: {node: '>=10.0.0'} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack@5.93.0: + resolution: {integrity: sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@14.0.0: + resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} + engines: {node: '>=18'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yoctocolors@2.1.1: + resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} + engines: {node: '>=18'} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.24.7': + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 + + '@babel/compat-data@7.25.2': {} + + '@babel/core@7.25.2': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.0 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helpers': 7.25.0 + '@babel/parser': 7.25.3 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + convert-source-map: 2.0.0 + debug: 4.3.6 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.23.0': + dependencies: + '@babel/types': 7.23.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/generator@7.25.0': + dependencies: + '@babel/types': 7.25.2 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-compilation-targets@7.25.2': + dependencies: + '@babel/compat-data': 7.25.2 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.23.3 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-environment-visitor@7.24.7': + dependencies: + '@babel/types': 7.25.2 + + '@babel/helper-function-name@7.24.7': + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 + + '@babel/helper-hoist-variables@7.24.7': + dependencies: + '@babel/types': 7.25.2 + + '@babel/helper-module-imports@7.24.7': + dependencies: + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.24.8': {} + + '@babel/helper-simple-access@7.24.7': + dependencies: + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-split-export-declaration@7.24.7': + dependencies: + '@babel/types': 7.25.2 + + '@babel/helper-string-parser@7.24.8': {} + + '@babel/helper-validator-identifier@7.24.7': {} + + '@babel/helper-validator-option@7.24.8': {} + + '@babel/helpers@7.23.2': + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.25.0': + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 + + '@babel/highlight@7.24.7': + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + + '@babel/parser@7.23.0': + dependencies: + '@babel/types': 7.23.0 + + '@babel/parser@7.25.3': + dependencies: + '@babel/types': 7.25.2 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/template@7.22.15': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + + '@babel/template@7.25.0': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.25.3 + '@babel/types': 7.25.2 + + '@babel/traverse@7.23.2': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.23.0 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-hoist-variables': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + debug: 4.3.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/traverse@7.25.3': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.0 + '@babel/parser': 7.25.3 + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 + debug: 4.3.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.23.0': + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + + '@babel/types@7.25.2': + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + + '@bcoe/v8-coverage@0.2.3': {} + + '@biomejs/biome@1.8.3': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.8.3 + '@biomejs/cli-darwin-x64': 1.8.3 + '@biomejs/cli-linux-arm64': 1.8.3 + '@biomejs/cli-linux-arm64-musl': 1.8.3 + '@biomejs/cli-linux-x64': 1.8.3 + '@biomejs/cli-linux-x64-musl': 1.8.3 + '@biomejs/cli-win32-arm64': 1.8.3 + '@biomejs/cli-win32-x64': 1.8.3 + + '@biomejs/cli-darwin-arm64@1.8.3': + optional: true + + '@biomejs/cli-darwin-x64@1.8.3': + optional: true + + '@biomejs/cli-linux-arm64-musl@1.8.3': + optional: true + + '@biomejs/cli-linux-arm64@1.8.3': + optional: true + + '@biomejs/cli-linux-x64-musl@1.8.3': + optional: true + + '@biomejs/cli-linux-x64@1.8.3': + optional: true + + '@biomejs/cli-win32-arm64@1.8.3': + optional: true + + '@biomejs/cli-win32-x64@1.8.3': + optional: true + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@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: 3.14.1 + resolve-from: 5.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jest/console@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.14.14 + chalk: 4.1.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + + '@jest/core@29.7.0': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.14.14 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.14.14) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + '@jest/environment@29.7.0': + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.14.14 + jest-mock: 29.7.0 + + '@jest/expect-utils@29.7.0': + dependencies: + jest-get-type: 29.6.3 + + '@jest/expect@29.7.0': + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/fake-timers@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 20.14.14 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + '@jest/globals@29.7.0': + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/reporters@29.7.0': + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + '@types/node': 20.14.14 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.3.0 + transitivePeerDependencies: + - supports-color + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jest/source-map@29.6.3': + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + callsites: 3.1.0 + graceful-fs: 4.2.11 + + '@jest/test-result@29.7.0': + dependencies: + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + + '@jest/test-sequencer@29.7.0': + dependencies: + '@jest/test-result': 29.7.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + slash: 3.0.0 + + '@jest/transform@29.7.0': + dependencies: + '@babel/core': 7.25.2 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.7 + pirates: 4.0.6 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.14.14 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@module-federation/runtime-tools@0.2.3': + dependencies: + '@module-federation/runtime': 0.2.3 + '@module-federation/webpack-bundler-runtime': 0.2.3 + + '@module-federation/runtime@0.2.3': + dependencies: + '@module-federation/sdk': 0.2.3 + + '@module-federation/sdk@0.2.3': {} + + '@module-federation/webpack-bundler-runtime@0.2.3': + dependencies: + '@module-federation/runtime': 0.2.3 + '@module-federation/sdk': 0.2.3 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@rspack/binding-darwin-arm64@1.0.0-beta.3': + optional: true + + '@rspack/binding-darwin-x64@1.0.0-beta.3': + optional: true + + '@rspack/binding-linux-arm64-gnu@1.0.0-beta.3': + optional: true + + '@rspack/binding-linux-arm64-musl@1.0.0-beta.3': + optional: true + + '@rspack/binding-linux-x64-gnu@1.0.0-beta.3': + optional: true + + '@rspack/binding-linux-x64-musl@1.0.0-beta.3': + optional: true + + '@rspack/binding-win32-arm64-msvc@1.0.0-beta.3': + optional: true + + '@rspack/binding-win32-ia32-msvc@1.0.0-beta.3': + optional: true + + '@rspack/binding-win32-x64-msvc@1.0.0-beta.3': + optional: true + + '@rspack/binding@1.0.0-beta.3': + optionalDependencies: + '@rspack/binding-darwin-arm64': 1.0.0-beta.3 + '@rspack/binding-darwin-x64': 1.0.0-beta.3 + '@rspack/binding-linux-arm64-gnu': 1.0.0-beta.3 + '@rspack/binding-linux-arm64-musl': 1.0.0-beta.3 + '@rspack/binding-linux-x64-gnu': 1.0.0-beta.3 + '@rspack/binding-linux-x64-musl': 1.0.0-beta.3 + '@rspack/binding-win32-arm64-msvc': 1.0.0-beta.3 + '@rspack/binding-win32-ia32-msvc': 1.0.0-beta.3 + '@rspack/binding-win32-x64-msvc': 1.0.0-beta.3 + + '@rspack/core@1.0.0-beta.3': + dependencies: + '@module-federation/runtime-tools': 0.2.3 + '@rspack/binding': 1.0.0-beta.3 + '@rspack/lite-tapable': 1.0.0-beta.3 + caniuse-lite: 1.0.30001651 + + '@rspack/lite-tapable@1.0.0-beta.3': {} + + '@rspack/test-tools@1.0.0-beta.3(@rspack/core@1.0.0-beta.3)': + dependencies: + '@babel/generator': 7.23.0 + '@babel/helpers': 7.23.2 + '@babel/parser': 7.23.0 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 + '@rspack/core': 1.0.0-beta.3 + csv-to-markdown-table: 1.4.1 + deepmerge: 4.3.1 + filenamify: 4.3.0 + fs-extra: 11.2.0 + glob: 10.4.5 + jest-diff: 29.7.0 + jest-serializer-path: 0.1.15 + jest-snapshot: 29.7.0 + jsdom: 24.1.1 + memfs: 4.8.1 + mkdirp: 0.5.6 + pretty-format: 29.7.0 + rimraf: 3.0.2 + strip-ansi: 6.0.1 + webpack: 5.93.0 + webpack-merge: 5.9.0 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - bufferutil + - canvas + - esbuild + - supports-color + - uglify-js + - utf-8-validate + - webpack-cli + + '@sec-ant/readable-stream@0.4.1': {} + + '@sinclair/typebox@0.27.8': {} + + '@sindresorhus/merge-streams@4.0.0': {} + + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@10.3.0': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.25.3 + '@babel/types': 7.25.2 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.25.2 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.25.3 + '@babel/types': 7.25.2 + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.25.2 + + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 9.6.0 + '@types/estree': 1.0.5 + + '@types/eslint@9.6.0': + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 + + '@types/estree@1.0.5': {} + + '@types/graceful-fs@4.1.9': + dependencies: + '@types/node': 20.14.14 + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + '@types/jest@29.5.12': + dependencies: + expect: 29.7.0 + pretty-format: 29.7.0 + + '@types/json-schema@7.0.15': {} + + '@types/node@20.14.14': + dependencies: + undici-types: 5.26.5 + + '@types/stack-utils@2.0.3': {} + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.33': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@webassemblyjs/ast@1.12.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + + '@webassemblyjs/floating-point-hex-parser@1.11.6': {} + + '@webassemblyjs/helper-api-error@1.11.6': {} + + '@webassemblyjs/helper-buffer@1.12.1': {} + + '@webassemblyjs/helper-numbers@1.11.6': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} + + '@webassemblyjs/helper-wasm-section@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.12.1 + + '@webassemblyjs/ieee754@1.11.6': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.11.6': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.11.6': {} + + '@webassemblyjs/wasm-edit@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-opt': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/wast-printer': 1.12.1 + + '@webassemblyjs/wasm-gen@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + '@webassemblyjs/wasm-opt@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + + '@webassemblyjs/wasm-parser@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + '@webassemblyjs/wast-printer@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@xtuc/long': 4.2.2 + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + + acorn-import-attributes@1.9.5(acorn@8.12.1): + dependencies: + acorn: 8.12.1 + + acorn@8.12.1: {} + + agent-base@7.1.1: + dependencies: + debug: 4.3.6 + transitivePeerDependencies: + - supports-color + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv@6.12.6: + 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-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansi-styles@6.2.1: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + asynckit@0.4.0: {} + + babel-jest@29.7.0(@babel/core@7.25.2): + dependencies: + '@babel/core': 7.25.2 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.25.2) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-istanbul@6.1.1: + dependencies: + '@babel/helper-plugin-utils': 7.24.8 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-jest-hoist@29.6.3: + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.6 + + babel-preset-current-node-syntax@1.0.1(@babel/core@7.25.2): + dependencies: + '@babel/core': 7.25.2 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) + + babel-preset-jest@29.6.3(@babel/core@7.25.2): + dependencies: + '@babel/core': 7.25.2 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.25.2) + + balanced-match@1.0.2: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.23.3: + dependencies: + caniuse-lite: 1.0.30001651 + electron-to-chromium: 1.5.5 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) + + bs-logger@0.2.6: + dependencies: + fast-json-stable-stringify: 2.1.0 + + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + + buffer-from@1.1.2: {} + + callsites@3.1.0: {} + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001651: {} + + 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 + + char-regex@1.0.2: {} + + chrome-trace-event@1.0.4: {} + + ci-info@3.9.0: {} + + cjs-module-lexer@1.3.1: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone-deep@4.0.1: + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + + co@4.6.0: {} + + collect-v8-coverage@1.0.2: {} + + 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: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@2.20.3: {} + + concat-map@0.0.1: {} + + convert-source-map@2.0.0: {} + + create-jest@29.7.0(@types/node@20.14.14): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@20.14.14) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + cross-env@7.0.3: + dependencies: + cross-spawn: 7.0.3 + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssstyle@4.0.1: + dependencies: + rrweb-cssom: 0.6.0 + + csv-to-markdown-table@1.4.1: {} + + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 + + debug@4.3.6: + dependencies: + ms: 2.1.2 + + decimal.js@10.4.3: {} + + dedent@1.5.3: {} + + deepmerge@4.3.1: {} + + delayed-stream@1.0.0: {} + + detect-newline@3.1.0: {} + + diff-sequences@29.6.3: {} + + eastasianwidth@0.2.0: {} + + electron-to-chromium@1.5.5: {} + + emittery@0.13.1: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + enhanced-resolve@5.17.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + entities@4.5.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-module-lexer@1.5.4: {} + + escalade@3.1.2: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@2.0.0: {} + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + esprima@4.0.1: {} + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + events@3.3.0: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.3 + 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 + + execa@9.3.0: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.3 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 7.0.0 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 5.3.0 + pretty-ms: 9.1.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.1 + + exit@0.1.2: {} + + expect@29.7.0: + dependencies: + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + + figures@6.1.0: + dependencies: + is-unicode-supported: 2.0.0 + + filename-reserved-regex@2.0.0: {} + + filenamify@4.3.0: + dependencies: + filename-reserved-regex: 2.0.0 + strip-outer: 1.0.1 + trim-repeated: 1.0.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + fs-extra@11.2.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + 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-package-type@0.1.0: {} + + get-stream@6.0.1: {} + + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + + glob-to-regexp@0.4.1: {} + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@11.12.0: {} + + graceful-fs@4.2.11: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + + html-escaper@2.0.2: {} + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.1 + debug: 4.3.6 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.5: + dependencies: + agent-base: 7.1.1 + debug: 4.3.6 + transitivePeerDependencies: + - supports-color + + human-signals@2.1.0: {} + + human-signals@7.0.0: {} + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + is-arrayish@0.2.1: {} + + is-core-module@2.15.0: + dependencies: + hasown: 2.0.2 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-fn@2.1.0: {} + + is-number@7.0.0: {} + + is-plain-obj@4.1.0: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-potential-custom-element-name@1.0.1: {} + + is-stream@2.0.1: {} + + is-stream@4.0.1: {} + + is-unicode-supported@2.0.0: {} + + isexe@2.0.0: {} + + isobject@3.0.1: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-instrument@5.2.1: + dependencies: + '@babel/core': 7.25.2 + '@babel/parser': 7.25.3 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + istanbul-lib-instrument@6.0.3: + dependencies: + '@babel/core': 7.25.2 + '@babel/parser': 7.25.3 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + + 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: + dependencies: + debug: 4.3.6 + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jest-changed-files@29.7.0: + dependencies: + execa: 5.1.1 + jest-util: 29.7.0 + p-limit: 3.1.0 + + jest-circus@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.14.14 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.5.3 + is-generator-fn: 2.1.0 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + p-limit: 3.1.0 + pretty-format: 29.7.0 + pure-rand: 6.1.0 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-cli@29.7.0(@types/node@20.14.14): + dependencies: + '@jest/core': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@20.14.14) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@20.14.14) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest-config@29.7.0(@types/node@20.14.14): + dependencies: + '@babel/core': 7.25.2 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 20.14.14 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-diff@29.7.0: + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-docblock@29.7.0: + dependencies: + detect-newline: 3.1.0 + + jest-each@29.7.0: + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 + + jest-environment-node@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.14.14 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + jest-get-type@29.6.3: {} + + jest-haste-map@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 20.14.14 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.7 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + + jest-leak-detector@29.7.0: + dependencies: + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-matcher-utils@29.7.0: + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-message-util@29.7.0: + dependencies: + '@babel/code-frame': 7.24.7 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + + jest-mock@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.14.14 + jest-util: 29.7.0 + + jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + optionalDependencies: + jest-resolve: 29.7.0 + + jest-regex-util@29.6.3: {} + + jest-resolve-dependencies@29.7.0: + dependencies: + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + jest-resolve@29.7.0: + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + resolve: 1.22.8 + resolve.exports: 2.0.2 + slash: 3.0.0 + + jest-runner@29.7.0: + dependencies: + '@jest/console': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.14.14 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + + jest-runtime@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0 + '@jest/source-map': 29.6.3 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.14.14 + chalk: 4.1.2 + cjs-module-lexer: 1.3.1 + collect-v8-coverage: 1.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + + jest-serializer-path@0.1.15: + dependencies: + lodash.clonedeep: 4.5.0 + lodash.iserror: 3.1.1 + slash: 2.0.0 + + jest-snapshot@29.7.0: + dependencies: + '@babel/core': 7.25.2 + '@babel/generator': 7.23.0 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.25.2) + '@babel/types': 7.23.0 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.25.2) + chalk: 4.1.2 + expect: 29.7.0 + graceful-fs: 4.2.11 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + natural-compare: 1.4.0 + pretty-format: 29.7.0 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.14.14 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + + jest-validate@29.7.0: + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + + jest-watcher@29.7.0: + dependencies: + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.14.14 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.7.0 + string-length: 4.0.2 + + jest-worker@27.5.1: + dependencies: + '@types/node': 20.14.14 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest-worker@29.7.0: + dependencies: + '@types/node': 20.14.14 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest@29.7.0(@types/node@20.14.14): + dependencies: + '@jest/core': 29.7.0 + '@jest/types': 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@20.14.14) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + js-tokens@4.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + jsdom@24.1.1: + dependencies: + cssstyle: 4.0.1 + data-urls: 5.0.0 + decimal.js: 10.4.3 + form-data: 4.0.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.5 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.12 + parse5: 7.1.2 + rrweb-cssom: 0.7.1 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 4.1.4 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 + ws: 8.18.0 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + jsesc@2.5.2: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json5@2.2.3: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + kind-of@6.0.3: {} + + kleur@3.0.3: {} + + leven@3.1.0: {} + + lines-and-columns@1.2.4: {} + + loader-runner@4.3.0: {} + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash.clonedeep@4.5.0: {} + + lodash.iserror@3.1.1: {} + + lodash.memoize@4.1.2: {} + + lru-cache@10.4.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + make-dir@4.0.0: + dependencies: + semver: 7.6.3 + + make-error@1.3.6: {} + + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + + memfs@4.8.1: + dependencies: + tslib: 2.6.3 + + merge-stream@2.0.0: {} + + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mimic-fn@2.1.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + + ms@2.1.2: {} + + nano-staged@0.8.0: + dependencies: + picocolors: 1.0.1 + + natural-compare@1.4.0: {} + + neo-async@2.6.2: {} + + node-int64@0.4.0: {} + + node-releases@2.0.18: {} + + normalize-path@3.0.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + nwsapi@2.2.12: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 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-try@2.2.0: {} + + package-json-from-dist@1.0.0: {} + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.24.7 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-ms@4.0.0: {} + + parse5@7.1.2: + dependencies: + entities: 4.5.0 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + pirates@4.0.6: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + pretty-ms@9.1.0: + dependencies: + parse-ms: 4.0.0 + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + psl@1.9.0: {} + + punycode@2.3.1: {} + + pure-rand@6.1.0: {} + + querystringify@2.2.0: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + react-is@18.3.1: {} + + require-directory@2.1.1: {} + + requires-port@1.0.0: {} + + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-from@5.0.0: {} + + resolve.exports@2.0.2: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.15.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rrweb-cssom@0.6.0: {} + + rrweb-cssom@0.7.1: {} + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + + schema-utils@3.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + semver@6.3.1: {} + + semver@7.6.3: {} + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + shallow-clone@3.0.1: + dependencies: + kind-of: 6.0.3 + + 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: {} + + simple-git-hooks@2.11.1: {} + + sisteransi@1.0.5: {} + + slash@2.0.0: {} + + slash@3.0.0: {} + + source-map-support@0.5.13: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + sprintf-js@1.0.3: {} + + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + + string-length@4.0.2: + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + strip-bom@4.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-final-newline@4.0.0: {} + + strip-json-comments@3.1.1: {} + + strip-outer@1.0.1: + dependencies: + escape-string-regexp: 1.0.5 + + 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 + + supports-preserve-symlinks-flag@1.0.0: {} + + symbol-tree@3.2.4: {} + + tapable@2.2.1: {} + + terser-webpack-plugin@5.3.10(webpack@5.93.0): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.31.4 + webpack: 5.93.0 + + terser@5.31.4: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.12.1 + commander: 2.20.3 + source-map-support: 0.5.21 + + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + + tmpl@1.0.5: {} + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tough-cookie@4.1.4: + dependencies: + psl: 1.9.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + + tr46@5.0.0: + dependencies: + punycode: 2.3.1 + + trim-repeated@1.0.0: + dependencies: + escape-string-regexp: 1.0.5 + + ts-jest@29.1.2(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.14.14))(typescript@5.0.2): + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@20.14.14) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 5.0.2 + yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.25.2 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + + tslib@2.6.3: {} + + type-detect@4.0.8: {} + + type-fest@0.21.3: {} + + typescript@5.0.2: {} + + undici-types@5.26.5: {} + + universalify@0.2.0: {} + + universalify@2.0.1: {} + + update-browserslist-db@1.1.0(browserslist@4.23.3): + dependencies: + browserslist: 4.23.3 + escalade: 3.1.2 + picocolors: 1.0.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + url-parse@1.5.10: + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + + v8-to-istanbul@9.3.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + + walker@1.0.8: + dependencies: + makeerror: 1.0.12 + + watchpack@2.4.1: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + webidl-conversions@7.0.0: {} + + webpack-merge@5.9.0: + dependencies: + clone-deep: 4.0.1 + wildcard: 2.0.1 + + webpack-sources@3.2.3: {} + + webpack@5.93.0: + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.12.1 + acorn-import-attributes: 1.9.5(acorn@8.12.1) + browserslist: 4.23.3 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.1 + es-module-lexer: 1.5.4 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(webpack@5.93.0) + watchpack: 2.4.1 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + whatwg-url@14.0.0: + dependencies: + tr46: 5.0.0 + webidl-conversions: 7.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wildcard@2.0.1: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + write-file-atomic@4.0.2: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + + ws@8.18.0: {} + + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} + + yoctocolors@2.1.1: {} diff --git a/scripts/patch-node-env.cjs b/scripts/patch-node-env.cjs new file mode 100644 index 0000000..d32fcf7 --- /dev/null +++ b/scripts/patch-node-env.cjs @@ -0,0 +1,18 @@ +// Copied from +// +const NodeEnvironment = + // For jest@29 + require('jest-environment-node').TestEnvironment || + // For jest@27 + require('jest-environment-node'); + +class CustomEnvironment extends NodeEnvironment { + // Workaround for `Symbol('JEST_STATE_SYMBOL')` + async handleTestEvent(event, state) { + if (!this.global.JEST_STATE_SYMBOL) { + this.global.JEST_STATE_SYMBOL = state; + } + } +} + +module.exports = CustomEnvironment; diff --git a/scripts/release.mjs b/scripts/release.mjs new file mode 100644 index 0000000..7382d31 --- /dev/null +++ b/scripts/release.mjs @@ -0,0 +1,80 @@ +import path from 'path'; +import * as url from 'url'; +import { $ } from 'execa'; +import fs from 'fs-extra'; +import { inc } from 'semver'; + +const RELEASE_TAG = process.env.TAG || 'beta'; +const RELEASE_DRY_RUN = process.env.DRY_RUN || 'true'; +const RELEASE_VERSION_TYPE = process.env.VERSION || 'prerelease'; +const RELEASE_NPM_TOKEN = process.env.NPM_TOKEN || ''; + +const __dirname = url.fileURLToPath(new URL('.', import.meta.url)); +const PKG_PATH = path.resolve(__dirname, '../package.json'); +const pkg = fs.readJsonSync(PKG_PATH); +const currentVersion = pkg.version; +const nextVersion = inc(currentVersion, RELEASE_VERSION_TYPE); +if (!nextVersion) { + throw new Error( + `Failed to generate next version from "${currentVersion}" with type "${RELEASE_VERSION_TYPE}"`, + ); +} + +console.info(`Release ${RELEASE_TAG} version ${nextVersion}`); + +// Update pkg version +console.info(`Updating version from ${currentVersion} to ${nextVersion}`); +pkg.version = nextVersion; +fs.writeJsonSync(PKG_PATH, pkg, { spaces: 2 }); + +// Write npmrc +const npmrcPath = `${process.env.HOME}/.npmrc`; +console.info(`Writing npmrc to ${npmrcPath}`); +fs.writeFileSync( + npmrcPath, + `//registry.npmjs.org/:_authToken=${RELEASE_NPM_TOKEN}`, +); + +// Publish to npm +console.info(`Publishing to npm with tag ${RELEASE_TAG}`); +const dryRun = RELEASE_DRY_RUN === 'true' ? ['--dry-run'] : []; +try { + await $`pnpm publish ${dryRun} --tag ${RELEASE_TAG} --no-git-checks --provenance`; + console.info(`Published successfully`); +} catch (e) { + console.error(`Publish failed: ${e.message}`); + process.exit(1); +} finally { + fs.removeSync(npmrcPath); +} + +// Push tag to github +if (RELEASE_DRY_RUN !== 'true') { + console.info(`Pushing tag to github`); + const tagName = `v${nextVersion}`; + try { + await $`git config --global --add safe.directory /github/workspace`; + await $`git config --global user.name "github-actions[bot]"`; + await $`git config --global user.email "github-actions[bot]@users.noreply.github.com"`; + await $`git status`; + await $`git tag ${tagName}`; + await $`git push origin ${tagName}`; + console.info(`Pushed tag successfully`); + } catch (e) { + console.error(`Push tag failed: ${e.message}`); + process.exit(1); + } + + try { + await $`git add --all`; + const commitMsg = `release ${tagName}`; + await $`git commit -m ${commitMsg}`; + await $`git push`; + console.info(`Pushed branch successfully`); + } catch (e) { + console.error(`Update branch failed: ${e.message}`); + process.exit(1); + } +} + +console.info(`Release completed`); diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..34a66c5 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,1159 @@ +type FixedSizeArray = T extends 0 + ? undefined[] + : ReadonlyArray & { + 0: U; + length: T; + }; +type Measure = T extends 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 + ? T + : never; +type Append = { + 0: [U]; + 1: [T[0], U]; + 2: [T[0], T[1], U]; + 3: [T[0], T[1], T[2], U]; + 4: [T[0], T[1], T[2], T[3], U]; + 5: [T[0], T[1], T[2], T[3], T[4], U]; + 6: [T[0], T[1], T[2], T[3], T[4], T[5], U]; + 7: [T[0], T[1], T[2], T[3], T[4], T[5], T[6], U]; + 8: [T[0], T[1], T[2], T[3], T[4], T[5], T[6], T[7], U]; +}[Measure]; +export type AsArray = T extends unknown[] ? T : [T]; + +export type Fn = (...args: AsArray) => R; +export type FnAsync = ( + ...args: Append, InnerCallback> +) => void; +export type FnPromise = (...args: AsArray) => Promise; + +declare class UnsetAdditionalOptions { + _UnsetAdditionalOptions: true; +} +type IfSet = X extends UnsetAdditionalOptions ? {} : X; + +export type Callback = (error: E | null, result?: T) => void; +type InnerCallback = (error?: E | null | false, result?: T) => void; + +type FullTap = Tap & { + type: 'sync' | 'async' | 'promise'; + fn: Function; +}; + +type Tap = TapOptions & { + name: string; +}; + +type TapOptions = { + before?: string; + stage?: number; +}; + +export type Options = + | string + | (Tap & IfSet); + +export interface HookInterceptor< + T, + R, + AdditionalOptions = UnsetAdditionalOptions, +> { + name?: string; + tap?: (tap: FullTap & IfSet) => void; + call?: (...args: unknown[]) => void; + loop?: (...args: unknown[]) => void; + error?: (err: Error) => void; + result?: (result: R) => void; + done?: () => void; + register?: ( + tap: FullTap & IfSet, + ) => FullTap & IfSet; +} + +type ArgumentNames = FixedSizeArray; +type ExtractHookArgs = H extends Hook ? T : never; +type ExtractHookReturn = H extends Hook ? R : never; +type ExtractHookAdditionalOptions = H extends Hook + ? A + : never; + +export interface Hook< + T = unknown, + R = unknown, + AdditionalOptions = UnsetAdditionalOptions, +> { + name?: string; + tap(opt: Options, fn: Fn): void; + tapAsync(opt: Options, fn: FnAsync): void; + tapPromise(opt: Options, fn: FnPromise): void; + intercept(interceptor: HookInterceptor): void; + isUsed(): boolean; + withOptions( + opt: TapOptions & IfSet, + ): Hook; + queryStageRange(stageRange: StageRange): QueriedHook; +} + +export class HookBase + implements Hook +{ + args: ArgumentNames>; + name?: string; + taps: (FullTap & IfSet)[]; + interceptors: HookInterceptor[]; + + constructor( + args = [] as unknown as ArgumentNames>, + name?: string, + ) { + this.args = args; + this.name = name; + this.taps = []; + this.interceptors = []; + } + + intercept(interceptor: HookInterceptor) { + this.interceptors.push(Object.assign({}, interceptor)); + if (interceptor.register) { + for (let i = 0; i < this.taps.length; i++) { + this.taps[i] = interceptor.register(this.taps[i]); + } + } + } + + _runRegisterInterceptors( + options: FullTap & IfSet, + ): FullTap & IfSet { + return this.interceptors.reduce((options, interceptor) => { + return interceptor.register?.(options) ?? options; + }, options); + } + + _runCallInterceptors(...args: unknown[]) { + for (const interceptor of this.interceptors) { + if (interceptor.call) { + interceptor.call(...args); + } + } + } + + _runErrorInterceptors(e: Error) { + for (const interceptor of this.interceptors) { + if (interceptor.error) { + interceptor.error(e); + } + } + } + + _runTapInterceptors(tap: FullTap & IfSet) { + for (const interceptor of this.interceptors) { + if (interceptor.tap) { + interceptor.tap(tap); + } + } + } + + _runDoneInterceptors() { + for (const interceptor of this.interceptors) { + if (interceptor.done) { + interceptor.done(); + } + } + } + + _runResultInterceptors(r: R) { + for (const interceptor of this.interceptors) { + if (interceptor.result) { + interceptor.result(r); + } + } + } + + withOptions( + options: TapOptions & IfSet, + ): Hook { + const mergeOptions = (opt: T) => + Object.assign({}, options, typeof opt === 'string' ? { name: opt } : opt); + + return { + name: this.name, + tap: (opt: Options, fn: Fn) => + this.tap(mergeOptions(opt), fn), + tapAsync: (opt: Options, fn: FnAsync) => + this.tapAsync(mergeOptions(opt), fn), + tapPromise: (opt: Options, fn: FnPromise) => + this.tapPromise(mergeOptions(opt), fn), + intercept: (interceptor: HookInterceptor) => + this.intercept(interceptor), + isUsed: () => this.isUsed(), + withOptions: (opt: TapOptions & IfSet) => + this.withOptions(mergeOptions(opt)), + queryStageRange: (stageRange: StageRange) => + this.queryStageRange(stageRange), + }; + } + + isUsed() { + return this.taps.length > 0 || this.interceptors.length > 0; + } + + queryStageRange( + stageRange: StageRange, + ): QueriedHook { + return new QueriedHook(stageRange, this); + } + + callAsyncStageRange( + queried: QueriedHook, + ...args: Append, Callback> + ) { + throw new Error('Hook should implement there own _callAsyncStageRange'); + } + + callAsync(...args: Append, Callback>): void { + return this.callAsyncStageRange( + this.queryStageRange(allStageRange), + ...args, + ); + } + + promiseStageRange( + queried: QueriedHook, + ...args: AsArray + ): Promise { + return new Promise((resolve, reject) => { + this.callAsyncStageRange( + queried, + // @ts-expect-error + ...args, + (e: Error, r: R) => { + if (e) return reject(e); + return resolve(r); + }, + ); + }); + } + + promise(...args: AsArray): Promise { + return this.promiseStageRange(this.queryStageRange(allStageRange), ...args); + } + + tap(options: Options, fn: Fn) { + this._tap('sync', options, fn); + } + + tapAsync(options: Options, fn: FnAsync) { + this._tap('async', options, fn); + } + + tapPromise(options: Options, fn: FnPromise) { + this._tap('promise', options, fn); + } + + _tap( + type: 'sync' | 'async' | 'promise', + options: Options, + fn: Function, + ) { + let normalizedOptions = options as Tap & IfSet; + + if (typeof options === 'string') { + normalizedOptions = { + name: options.trim(), + } as Tap & IfSet; + } else if (typeof options !== 'object' || options === null) { + throw new Error('Invalid tap options'); + } + + if ( + typeof normalizedOptions.name !== 'string' || + normalizedOptions.name === '' + ) { + throw new Error('Missing name for tap'); + } + + this._insert( + this._runRegisterInterceptors( + Object.assign({ type, fn }, normalizedOptions), + ), + ); + } + + _insert(item: FullTap & IfSet) { + let before: Set | undefined; + if (typeof item.before === 'string') { + before = new Set([item.before]); + } else if (Array.isArray(item.before)) { + before = new Set(item.before); + } + let stage = 0; + if (typeof item.stage === 'number') { + stage = item.stage; + } + let i = this.taps.length; + while (i > 0) { + i--; + const x = this.taps[i]; + this.taps[i + 1] = x; + const xStage = x.stage || 0; + if (before) { + if (before.has(x.name)) { + before.delete(x.name); + continue; + } + if (before.size > 0) { + continue; + } + } + if (xStage > stage) { + continue; + } + i++; + break; + } + this.taps[i] = item; + } + + _prepareArgs(args: AsArray): (T | undefined)[] { + const len = this.args.length; + if (args.length < len) { + args.length = len; + return (args as (T | undefined)[]).fill(undefined, args.length, len); + } + if (args.length > len) { + args.length = len; + return args as (T | undefined)[]; + } + return args as (T | undefined)[]; + } +} + +export type StageRange = readonly [number, number]; +export const minStage = Number.NEGATIVE_INFINITY; +export const maxStage = Number.POSITIVE_INFINITY; +const allStageRange = [minStage, maxStage] as const; +const i32MIN = -(2 ** 31); +const i32MAX = 2 ** 31 - 1; +export const safeStage = (stage: number) => { + if (stage < i32MIN) return i32MIN; + if (stage > i32MAX) return i32MAX; + return stage; +}; + +export class QueriedHook { + stageRange: StageRange; + hook: HookBase; + tapsInRange: (FullTap & IfSet)[]; + + constructor(stageRange: StageRange, hook: HookBase) { + const tapsInRange: typeof hook.taps = []; + const [from, to] = stageRange; + for (const tap of hook.taps) { + const stage = tap.stage ?? 0; + if (from <= stage && stage < to) { + tapsInRange.push(tap); + } else if (to === maxStage && stage === maxStage) { + tapsInRange.push(tap); + } + } + this.stageRange = stageRange; + this.hook = hook; + this.tapsInRange = tapsInRange; + } + + isUsed(): boolean { + if (this.tapsInRange.length > 0) return true; + if ( + this.stageRange[0] === minStage && + this.hook.interceptors.some((i) => i.call) + ) + return true; + if ( + this.stageRange[1] === maxStage && + this.hook.interceptors.some((i) => i.done) + ) + return true; + return false; + } + + call(...args: AsArray): R { + if ( + typeof (this.hook as SyncHook).callStageRange !== + 'function' + ) { + throw new Error( + 'hook is not a SyncHook, call methods only exists on SyncHook', + ); + } + return (this.hook as SyncHook).callStageRange( + this, + ...args, + ); + } + + callAsync(...args: Append, Callback>): void { + return this.hook.callAsyncStageRange(this, ...args); + } + + promise(...args: AsArray): Promise { + return this.hook.promiseStageRange(this, ...args); + } +} + +export class SyncHook< + T, + R = void, + AdditionalOptions = UnsetAdditionalOptions, +> extends HookBase { + callAsyncStageRange( + queried: QueriedHook, + ...args: Append, Callback> + ) { + const { + stageRange: [from, to], + tapsInRange, + } = queried; + const argsWithoutCb = args.slice(0, args.length - 1) as AsArray; + const cb = args[args.length - 1] as Callback; + const args2 = this._prepareArgs(argsWithoutCb); + if (from === minStage) { + this._runCallInterceptors(...args2); + } + for (const tap of tapsInRange) { + this._runTapInterceptors(tap); + try { + tap.fn(...args2); + } catch (e) { + const err = e as Error; + this._runErrorInterceptors(err); + return cb(err); + } + } + if (to === maxStage) { + this._runDoneInterceptors(); + cb(null); + } + } + + call(...args: AsArray): R { + return this.callStageRange(this.queryStageRange(allStageRange), ...args); + } + + callStageRange( + queried: QueriedHook, + ...args: AsArray + ): R { + let result: R | undefined; + let error: Error | undefined; + this.callAsyncStageRange( + queried, + // @ts-expect-error + ...args, + (e: Error, r: R): void => { + error = e; + result = r; + }, + ); + if (error) { + throw error; + } + return result as R; + } + + tapAsync(): never { + throw new Error('tapAsync is not supported on a SyncHook'); + } + + tapPromise(): never { + throw new Error('tapPromise is not supported on a SyncHook'); + } +} + +export class SyncBailHook< + T, + R, + AdditionalOptions = UnsetAdditionalOptions, +> extends HookBase { + callAsyncStageRange( + queried: QueriedHook, + ...args: Append, Callback> + ) { + const { + stageRange: [from, to], + tapsInRange, + } = queried; + const argsWithoutCb = args.slice(0, args.length - 1) as AsArray; + const cb = args[args.length - 1] as Callback; + const args2 = this._prepareArgs(argsWithoutCb); + if (from === minStage) { + this._runCallInterceptors(...args2); + } + for (const tap of tapsInRange) { + this._runTapInterceptors(tap); + let r = undefined; + try { + r = tap.fn(...args2); + } catch (e) { + const err = e as Error; + this._runErrorInterceptors(err); + return cb(err); + } + if (r !== undefined) { + this._runResultInterceptors(r); + return cb(null, r); + } + } + if (to === maxStage) { + this._runDoneInterceptors(); + cb(null); + } + } + + call(...args: AsArray): R { + return this.callStageRange(this.queryStageRange(allStageRange), ...args); + } + + callStageRange( + queried: QueriedHook, + ...args: AsArray + ): R { + let result: R | undefined; + let error: Error | undefined; + this.callAsyncStageRange( + queried, + // @ts-expect-error + ...args, + (e: Error, r: R): void => { + error = e; + result = r; + }, + ); + if (error) { + throw error; + } + return result as R; + } + + tapAsync(): never { + throw new Error('tapAsync is not supported on a SyncBailHook'); + } + + tapPromise(): never { + throw new Error('tapPromise is not supported on a SyncBailHook'); + } +} + +export class SyncWaterfallHook< + T, + AdditionalOptions = UnsetAdditionalOptions, +> extends HookBase[0], AdditionalOptions> { + constructor( + args = [] as unknown as ArgumentNames>, + name?: string, + ) { + if (args.length < 1) + throw new Error('Waterfall hooks must have at least one argument'); + super(args, name); + } + + callAsyncStageRange( + queried: QueriedHook[0], AdditionalOptions>, + ...args: Append, Callback[0]>> + ) { + const { + stageRange: [from, to], + tapsInRange, + } = queried; + const argsWithoutCb = args.slice(0, args.length - 1) as AsArray; + const cb = args[args.length - 1] as Callback[0]>; + const args2 = this._prepareArgs(argsWithoutCb); + if (from === minStage) { + this._runCallInterceptors(...args2); + } + for (const tap of tapsInRange) { + this._runTapInterceptors(tap); + try { + const r = tap.fn(...args2); + if (r !== undefined) { + args2[0] = r; + } + } catch (e) { + const err = e as Error; + this._runErrorInterceptors(err); + return cb(err); + } + } + if (to === maxStage) { + this._runDoneInterceptors(); + cb(null, args2[0]); + } + } + + call(...args: AsArray): AsArray[0] { + return this.callStageRange(this.queryStageRange(allStageRange), ...args); + } + + callStageRange( + queried: QueriedHook[0], AdditionalOptions>, + ...args: AsArray + ): AsArray[0] { + let result: AsArray[0] | undefined; + let error: Error | undefined; + this.callAsyncStageRange( + queried, + // @ts-expect-error + ...args, + (e: Error, r: AsArray[0]): void => { + error = e; + result = r; + }, + ); + if (error) { + throw error; + } + return result as AsArray[0]; + } + + tapAsync(): never { + throw new Error('tapAsync is not supported on a SyncWaterfallHook'); + } + + tapPromise(): never { + throw new Error('tapPromise is not supported on a SyncWaterfallHook'); + } +} + +export class AsyncParallelHook< + T, + AdditionalOptions = UnsetAdditionalOptions, +> extends HookBase { + callAsyncStageRange( + queried: QueriedHook, + ...args: Append, Callback> + ) { + const { + stageRange: [from], + tapsInRange, + } = queried; + const argsWithoutCb = args.slice(0, args.length - 1) as AsArray; + const cb = args[args.length - 1] as Callback; + const args2 = this._prepareArgs(argsWithoutCb); + if (from === minStage) { + this._runCallInterceptors(...args2); + } + const done = () => { + this._runDoneInterceptors(); + cb(null); + }; + const error = (e: Error) => { + this._runErrorInterceptors(e); + cb(e); + }; + if (tapsInRange.length === 0) return done(); + let counter = tapsInRange.length; + for (const tap of tapsInRange) { + this._runTapInterceptors(tap); + if (tap.type === 'promise') { + const promise = tap.fn(...args2); + if (!promise || !promise.then) { + throw new Error( + `Tap function (tapPromise) did not return promise (returned ${promise})`, + ); + } + promise.then( + () => { + counter -= 1; + if (counter === 0) { + done(); + } + }, + (e: Error) => { + counter = 0; + error(e); + }, + ); + } else if (tap.type === 'async') { + tap.fn(...args2, (e: Error) => { + if (e) { + counter = 0; + error(e); + } else { + counter -= 1; + if (counter === 0) { + done(); + } + } + }); + } else { + let hasError = false; + try { + tap.fn(...args2); + } catch (e) { + hasError = true; + counter = 0; + error(e as Error); + } + if (!hasError && --counter === 0) { + done(); + } + } + if (counter <= 0) return; + } + } +} + +export class AsyncSeriesHook< + T, + AdditionalOptions = UnsetAdditionalOptions, +> extends HookBase { + callAsyncStageRange( + queried: QueriedHook, + ...args: Append, Callback> + ) { + const { + stageRange: [from], + tapsInRange, + } = queried; + const argsWithoutCb = args.slice(0, args.length - 1) as AsArray; + const cb = args[args.length - 1] as Callback; + const args2 = this._prepareArgs(argsWithoutCb); + if (from === minStage) { + this._runCallInterceptors(...args2); + } + const done = () => { + this._runDoneInterceptors(); + cb(null); + }; + const error = (e: Error) => { + this._runErrorInterceptors(e); + cb(e); + }; + if (tapsInRange.length === 0) return done(); + let index = 0; + const next = () => { + const tap = tapsInRange[index]; + this._runTapInterceptors(tap); + if (tap.type === 'promise') { + const promise = tap.fn(...args2); + if (!promise || !promise.then) { + throw new Error( + `Tap function (tapPromise) did not return promise (returned ${promise})`, + ); + } + promise.then( + () => { + index += 1; + if (index === tapsInRange.length) { + done(); + } else { + next(); + } + }, + (e: Error) => { + index = tapsInRange.length; + error(e); + }, + ); + } else if (tap.type === 'async') { + tap.fn(...args2, (e: Error) => { + if (e) { + index = tapsInRange.length; + error(e); + } else { + index += 1; + if (index === tapsInRange.length) { + done(); + } else { + next(); + } + } + }); + } else { + let hasError = false; + try { + tap.fn(...args2); + } catch (e) { + hasError = true; + index = tapsInRange.length; + error(e as Error); + } + if (!hasError) { + index += 1; + if (index === tapsInRange.length) { + done(); + } else { + next(); + } + } + } + if (index === tapsInRange.length) return; + }; + next(); + } +} + +export class AsyncSeriesBailHook< + T, + R, + AdditionalOptions = UnsetAdditionalOptions, +> extends HookBase { + callAsyncStageRange( + queried: QueriedHook, + ...args: Append, Callback> + ) { + const { + stageRange: [from], + tapsInRange, + } = queried; + const argsWithoutCb = args.slice(0, args.length - 1) as AsArray; + const cb = args[args.length - 1] as Callback; + const args2 = this._prepareArgs(argsWithoutCb); + if (from === minStage) { + this._runCallInterceptors(...args2); + } + const done = () => { + this._runDoneInterceptors(); + cb(null); + }; + const error = (e: Error) => { + this._runErrorInterceptors(e); + cb(e); + }; + const result = (r: R) => { + this._runResultInterceptors(r); + cb(null, r); + }; + if (tapsInRange.length === 0) return done(); + let index = 0; + const next = () => { + const tap = tapsInRange[index]; + this._runTapInterceptors(tap); + if (tap.type === 'promise') { + const promise = tap.fn(...args2); + if (!promise || !promise.then) { + throw new Error( + `Tap function (tapPromise) did not return promise (returned ${promise})`, + ); + } + promise.then( + (r: R) => { + index += 1; + if (r !== undefined) { + result(r); + } else if (index === tapsInRange.length) { + done(); + } else { + next(); + } + }, + (e: Error) => { + index = tapsInRange.length; + error(e); + }, + ); + } else if (tap.type === 'async') { + tap.fn(...args2, (e: Error, r: R) => { + if (e) { + index = tapsInRange.length; + error(e); + } else { + index += 1; + if (r !== undefined) { + result(r); + } else if (index === tapsInRange.length) { + done(); + } else { + next(); + } + } + }); + } else { + let hasError = false; + let r = undefined; + try { + r = tap.fn(...args2); + } catch (e) { + hasError = true; + index = tapsInRange.length; + error(e as Error); + } + if (!hasError) { + index += 1; + if (r !== undefined) { + result(r); + } else if (index === tapsInRange.length) { + done(); + } else { + next(); + } + } + } + if (index === tapsInRange.length) return; + }; + next(); + } +} + +export class AsyncSeriesWaterfallHook< + T, + AdditionalOptions = UnsetAdditionalOptions, +> extends HookBase[0], AdditionalOptions> { + constructor( + args = [] as unknown as ArgumentNames>, + name?: string, + ) { + if (args.length < 1) + throw new Error('Waterfall hooks must have at least one argument'); + super(args, name); + } + + callAsyncStageRange( + queried: QueriedHook[0], AdditionalOptions>, + ...args: Append, Callback[0]>> + ) { + const { + stageRange: [from], + tapsInRange, + } = queried; + const argsWithoutCb = args.slice(0, args.length - 1) as AsArray; + const cb = args[args.length - 1] as Callback[0]>; + const args2 = this._prepareArgs(argsWithoutCb); + if (from === minStage) { + this._runCallInterceptors(...args2); + } + const result = (r: AsArray[0]) => { + this._runResultInterceptors(r); + cb(null, r); + }; + const error = (e: Error) => { + this._runErrorInterceptors(e); + cb(e); + }; + if (tapsInRange.length === 0) return result(args2[0]); + let index = 0; + const next = () => { + const tap = tapsInRange[index]; + this._runTapInterceptors(tap); + if (tap.type === 'promise') { + const promise = tap.fn(...args2); + if (!promise || !promise.then) { + throw new Error( + `Tap function (tapPromise) did not return promise (returned ${promise})`, + ); + } + promise.then( + (r: AsArray[0]) => { + index += 1; + if (r !== undefined) { + args2[0] = r as T | undefined; + } + if (index === tapsInRange.length) { + result(args2[0]); + } else { + next(); + } + }, + (e: Error) => { + index = tapsInRange.length; + error(e); + }, + ); + } else if (tap.type === 'async') { + tap.fn(...args2, (e: Error, r: AsArray[0]) => { + if (e) { + index = tapsInRange.length; + error(e); + } else { + index += 1; + if (r !== undefined) { + args2[0] = r as T | undefined; + } + if (index === tapsInRange.length) { + result(args2[0]); + } else { + next(); + } + } + }); + } else { + let hasError = false; + try { + const r = tap.fn(...args2); + if (r !== undefined) { + args2[0] = r; + } + } catch (e) { + hasError = true; + index = tapsInRange.length; + error(e as Error); + } + if (!hasError) { + index += 1; + if (index === tapsInRange.length) { + result(args2[0]); + } else { + next(); + } + } + } + if (index === tapsInRange.length) return; + }; + next(); + } +} + +const defaultFactory = (key: HookMapKey, hook: unknown) => hook; + +export type HookMapKey = unknown; +export type HookFactory = (key: HookMapKey, hook?: H) => H; +export interface HookMapInterceptor { + factory?: HookFactory; +} + +export class HookMap { + _map: Map = new Map(); + _factory: HookFactory; + name?: string; + _interceptors: HookMapInterceptor[]; + + constructor(factory: HookFactory, name?: string) { + this.name = name; + this._factory = factory; + this._interceptors = []; + } + + get(key: HookMapKey) { + return this._map.get(key); + } + + for(key: HookMapKey) { + const hook = this.get(key); + if (hook !== undefined) { + return hook; + } + let newHook = this._factory(key); + const interceptors = this._interceptors; + for (let i = 0; i < interceptors.length; i++) { + const factory = interceptors[i].factory; + if (factory) { + newHook = factory(key, newHook); + } + } + this._map.set(key, newHook); + return newHook; + } + + intercept(interceptor: HookMapInterceptor) { + this._interceptors.push( + Object.assign( + { + factory: defaultFactory, + }, + interceptor, + ), + ); + } + + isUsed(): boolean { + for (const key of this._map.keys()) { + const hook = this.get(key); + if (hook?.isUsed()) { + return true; + } + } + return false; + } + + queryStageRange(stageRange: StageRange): QueriedHookMap { + return new QueriedHookMap(stageRange, this); + } +} + +export class QueriedHookMap { + stageRange: StageRange; + hookMap: HookMap; + + constructor(stageRange: StageRange, hookMap: HookMap) { + this.stageRange = stageRange; + this.hookMap = hookMap; + } + + get(key: HookMapKey) { + return this.hookMap.get(key)?.queryStageRange(this.stageRange); + } + + for(key: HookMapKey) { + return this.hookMap.for(key).queryStageRange(this.stageRange); + } + + isUsed(): boolean { + for (const key in this.hookMap._map.keys()) { + if (this.get(key)?.isUsed()) { + return true; + } + } + return false; + } +} + +export class MultiHook { + hooks: H[]; + name?: string; + + constructor(hooks: H[], name?: string) { + this.hooks = hooks; + this.name = name; + } + + tap( + options: Options>, + fn: Fn, ExtractHookReturn>, + ) { + for (const hook of this.hooks) { + hook.tap(options, fn); + } + } + + tapAsync( + options: Options>, + fn: FnAsync, ExtractHookReturn>, + ) { + for (const hook of this.hooks) { + hook.tapAsync(options, fn); + } + } + + tapPromise( + options: Options>, + fn: FnPromise, ExtractHookReturn>, + ) { + for (const hook of this.hooks) { + hook.tapPromise(options, fn); + } + } + + isUsed() { + for (const hook of this.hooks) { + if (hook.isUsed()) return true; + } + return false; + } + + intercept( + interceptor: HookInterceptor< + ExtractHookArgs, + ExtractHookReturn, + ExtractHookAdditionalOptions + >, + ) { + for (const hook of this.hooks) { + hook.intercept(interceptor); + } + } + + withOptions(options: TapOptions & IfSet>) { + return new MultiHook( + this.hooks.map((h) => h.withOptions(options)), + this.name, + ); + } +} diff --git a/test/AsyncParallelHooks.test.js b/test/AsyncParallelHooks.test.js new file mode 100644 index 0000000..2155cd1 --- /dev/null +++ b/test/AsyncParallelHooks.test.js @@ -0,0 +1,34 @@ +/** + * The following code is modified based on + * https://github.com/webpack/tapable/blob/a0a7b26/lib/__tests__/AsyncParallelHooks.js + * + * MIT Licensed + * Author Tobias Koppers @sokra + * Copyright (c) JS Foundation and other contributors + * https://github.com/webpack/webpack/blob/main/LICENSE + */ + +"use strict"; + +const HookTester = require("./HookTester"); +const { AsyncParallelHook } = require("../"); + +describe("AsyncParallelHook", () => { + it("should have to correct behavior", async () => { + const tester = new HookTester(args => new AsyncParallelHook(args)); + + const result = await tester.run(); + + expect(result).toMatchSnapshot(); + }, 15000); +}); + +// describe("AsyncParallelBailHook", () => { +// it("should have to correct behavior", async () => { +// const tester = new HookTester(args => new AsyncParallelBailHook(args)); + +// const result = await tester.run(); + +// expect(result).toMatchSnapshot(); +// }, 15000); +// }); diff --git a/test/AsyncSeriesHooks.test.js b/test/AsyncSeriesHooks.test.js new file mode 100644 index 0000000..3ec2284 --- /dev/null +++ b/test/AsyncSeriesHooks.test.js @@ -0,0 +1,91 @@ +/** + * The following code is modified based on + * https://github.com/webpack/tapable/blob/a0a7b26/lib/__tests__/AsyncSeriesHooks.js + * + * MIT Licensed + * Author Tobias Koppers @sokra + * Copyright (c) JS Foundation and other contributors + * https://github.com/webpack/webpack/blob/main/LICENSE + */ + +"use strict"; + +const HookTester = require("./HookTester"); +const { + AsyncSeriesHook, + AsyncSeriesBailHook, + AsyncSeriesWaterfallHook +} = require("../"); + +describe("AsyncSeriesHook", () => { + it("should not have call method", () => { + const hook = new AsyncSeriesHook([]); + expect(hook.call).toEqual(undefined); + expect(typeof hook.callAsync).toEqual("function"); + expect(typeof hook.promise).toEqual("function"); + }); + + it("should have tap method", done => { + const hook = new AsyncSeriesHook([]); + const mockTap = jest.fn(); + hook.tap("somePlugin", mockTap); + hook.callAsync(() => done()); + expect(mockTap).toHaveBeenCalledTimes(1); + }); + + it("should have promise method", done => { + const hook = new AsyncSeriesHook([]); + const mockTap = jest.fn(); + hook.tap("somePlugin", mockTap); + hook.promise().then(() => done()); + expect(mockTap).toHaveBeenCalledTimes(1); + }); + + it("should have to correct behavior", async () => { + const tester = new HookTester(args => new AsyncSeriesHook(args)); + + const result = await tester.run(); + + expect(result).toMatchSnapshot(); + }); +}); + +describe("AsyncSeriesBailHook", () => { + it("should have to correct behavior", async () => { + const tester = new HookTester(args => new AsyncSeriesBailHook(args)); + + const result = await tester.run(); + + expect(result).toMatchSnapshot(); + }); + + it("should not crash with many plugins", () => { + const hook = new AsyncSeriesBailHook(["x"]); + for (let i = 0; i < 1000; i++) { + hook.tap("Test", () => 42); + } + hook.tapAsync("Test", (x, callback) => callback(null, 42)); + hook.tapPromise("Test", x => Promise.resolve(42)); + return expect(hook.promise()).resolves.toBe(42); + }); +}); + +describe("AsyncSeriesWaterfallHook", () => { + it("should have to correct behavior", async () => { + const tester = new HookTester(args => new AsyncSeriesWaterfallHook(args)); + + const result = await tester.run(); + + expect(result).toMatchSnapshot(); + }); +}); + +// describe("AsyncSeriesLoopHook", () => { +// it("should have to correct behavior", async () => { +// const tester = new HookTester(args => new AsyncSeriesLoopHook(args)); + +// const result = await tester.runForLoop(); + +// expect(result).toMatchSnapshot(); +// }); +// }); diff --git a/test/Hook.test.js b/test/Hook.test.js new file mode 100644 index 0000000..7cb2cc7 --- /dev/null +++ b/test/Hook.test.js @@ -0,0 +1,85 @@ +/** + * The following code is modified based on + * https://github.com/webpack/tapable/blob/a0a7b26/lib/__tests__/Hook.js + * + * MIT Licensed + * Author Tobias Koppers @sokra + * Copyright (c) JS Foundation and other contributors + * https://github.com/webpack/webpack/blob/main/LICENSE + */ + +"use strict"; + +const { SyncHook } = require("../"); + +describe("Hook", () => { + it("should allow to insert hooks before others and in stages", () => { + const hook = new SyncHook(); + + const calls = []; + hook.tap("A", () => calls.push("A")); + hook.tap( + { + name: "B", + before: "A" + }, + () => calls.push("B") + ); + + calls.length = 0; + hook.call(); + expect(calls).toEqual(["B", "A"]); + + hook.tap( + { + name: "C", + before: ["A", "B"] + }, + () => calls.push("C") + ); + + calls.length = 0; + hook.call(); + expect(calls).toEqual(["C", "B", "A"]); + + hook.tap( + { + name: "D", + before: "B" + }, + () => calls.push("D") + ); + + calls.length = 0; + hook.call(); + expect(calls).toEqual(["C", "D", "B", "A"]); + + hook.tap( + { + name: "E", + stage: -5 + }, + () => calls.push("E") + ); + hook.tap( + { + name: "F", + stage: -3 + }, + () => calls.push("F") + ); + + calls.length = 0; + hook.call(); + expect(calls).toEqual(["E", "F", "C", "D", "B", "A"]); + }); + it("should throw without a valid name", () => { + const hook = new SyncHook(); + expect(() => hook.tap("", () => {})).toThrow( + new Error("Missing name for tap") + ); + expect(() => hook.tap(" ", () => {})).toThrow( + new Error("Missing name for tap") + ); + }); +}); diff --git a/test/HookTester.js b/test/HookTester.js new file mode 100644 index 0000000..ea45e2e --- /dev/null +++ b/test/HookTester.js @@ -0,0 +1,1231 @@ +/** + * The following code is modified based on + * https://github.com/webpack/tapable/blob/a0a7b26/lib/__tests__/HookTester.js + * + * MIT Licensed + * Author Tobias Koppers @sokra + * Copyright (c) JS Foundation and other contributors + * https://github.com/webpack/webpack/blob/main/LICENSE + */ + +"use strict"; + +describe("HookTester", () => { + it("should run", () => {}); +}); + +process.on("unhandledRejection", err => console.error(err.stack)); + +class HookTester { + constructor(hookCreator, sync) { + this.hookCreator = hookCreator; + this.sync = sync; + } + + async run(syncOnly) { + const result = { + sync: {}, + async: {}, + intercept: {} + }; + + if (syncOnly) { + await this.runSync(result.sync, "call"); + } else { + await this.runAsync(result.async, "callAsync"); + await this.runAsync(result.async, "promise"); + + await this.runIntercept(result.intercept, "callAsync"); + await this.runIntercept(result.intercept, "promise"); + } + + await this.runSync(result.sync, "callAsync"); + await this.runSync(result.sync, "promise"); + + return result; + } + + async runForLoop(syncOnly) { + const result = { + sync: {}, + async: {} + }; + + if (syncOnly) { + await this.runForLoopSync(result.sync, "call"); + } else { + await this.runForLoopAsync(result.async, "callAsync"); + await this.runForLoopAsync(result.async, "promise"); + } + + await this.runForLoopSync(result.sync, "callAsync"); + await this.runForLoopSync(result.sync, "promise"); + + return result; + } + + async runForLoopAsync(result, method) { + { + const hook = this.createHook([], `${method}BrokenPromise`); + hook.tapPromise("promise", () => "this is not a promise"); + result[`${method}BrokenPromise`] = await this.gainResult(cb => + hook[method](cb) + ); + } + { + const hook = this.createHook([], `${method}SinglePromise`); + hook.tapPromise("promise", () => { + result[`${method}SinglePromiseCalled`] = + (result[`${method}SinglePromiseCalled`] || 0) + 1; + if (result[`${method}SinglePromiseCalled`] < 42) + return Promise.resolve().then(() => true); + return Promise.resolve().then(() => {}); + }); + result[`${method}SinglePromise`] = await this.gainResult(cb => + hook[method](cb) + ); + } + + { + const hook = this.createHook([], `${method}MultiplePromise`); + hook.tapPromise("promise1", () => { + result[`${method}MultiplePromiseCalled1`] = + (result[`${method}MultiplePromiseCalled1`] || 0) + 1; + if (result[`${method}MultiplePromiseCalled1`] < 42) + return Promise.resolve().then(() => true); + return Promise.resolve().then(() => {}); + }); + hook.tapPromise("promise2", () => { + result[`${method}MultiplePromiseCalled2`] = + (result[`${method}MultiplePromiseCalled2`] || 0) + 1; + if (result[`${method}MultiplePromiseCalled2`] < 42) + return Promise.resolve().then(() => true); + return Promise.resolve().then(() => {}); + }); + result[`${method}MultiplePromise`] = await this.gainResult(cb => + hook[method](cb) + ); + } + + { + const hook = this.createHook([], `${method}SingleAsync`); + hook.tapAsync("async", callback => { + result[`${method}SingleAsyncCalled`] = + (result[`${method}SingleAsyncCalled`] || 0) + 1; + if (result[`${method}SingleAsyncCalled`] < 42) + return Promise.resolve().then(() => callback(null, true)); + return Promise.resolve().then(() => callback()); + }); + result[`${method}SingleAsync`] = await this.gainResult(cb => + hook[method](cb) + ); + } + + { + const hook = this.createHook([], `${method}MultipleAsync`); + hook.tapAsync("async1", callback => { + result[`${method}MultipleAsyncCalled1`] = + (result[`${method}MultipleAsyncCalled1`] || 0) + 1; + if (result[`${method}MultipleAsyncCalled1`] < 42) + return Promise.resolve().then(() => callback(null, true)); + return Promise.resolve().then(() => callback()); + }); + hook.tapAsync("async2", callback => { + result[`${method}MultipleAsyncCalled2`] = + (result[`${method}MultipleAsyncCalled2`] || 0) + 1; + if (result[`${method}MultipleAsyncCalled2`] < 42) + return Promise.resolve().then(() => callback(null, true)); + return Promise.resolve().then(() => callback()); + }); + result[`${method}MultipleAsync`] = await this.gainResult(cb => + hook[method](cb) + ); + } + + { + const hook = this.createHook([], `${method}Mixed`); + hook.tapAsync("async1", callback => { + result[`${method}MixedCalled1`] = + (result[`${method}MixedCalled1`] || 0) + 1; + if (result[`${method}MixedCalled1`] < 42) + return Promise.resolve().then(() => callback(null, true)); + return Promise.resolve().then(() => callback()); + }); + hook.tap("sync2", () => { + result[`${method}MixedCalled2`] = + (result[`${method}MixedCalled2`] || 0) + 1; + if (result[`${method}MixedCalled2`] < 42) return true; + }); + hook.tapPromise("promise3", () => { + result[`${method}MixedCalled3`] = + (result[`${method}MixedCalled3`] || 0) + 1; + if (result[`${method}MixedCalled3`] < 42) + return Promise.resolve().then(() => true); + return Promise.resolve().then(() => {}); + }); + result[`${method}Mixed`] = await this.gainResult(cb => hook[method](cb)); + } + } + + async runForLoopSync(result, method) { + { + const hook = this.createHook([], `${method}None`); + result[`${method}None`] = await this.gainResult(cb => hook[method](cb)); + } + + { + const hook = this.createHook(["arg"], `${method}NoneWithArg`); + result[`${method}NoneWithArg`] = await this.gainResult(cb => + hook[method](42, cb) + ); + } + + { + const hook = this.createHook([], `${method}SingleSync`); + hook.tap("sync", () => { + result[`${method}SingleSyncCalled`] = + (result[`${method}SingleSyncCalled`] || 0) + 1; + if (result[`${method}SingleSyncCalled`] < 42) return true; + }); + result[`${method}SingleSync`] = await this.gainResult(cb => + hook[method](cb) + ); + } + + { + const hook = this.createHook([], `${method}MultipleSync`); + hook.tap("sync1", () => { + result[`${method}MultipleSyncCalled1`] = + (result[`${method}MultipleSyncCalled1`] || 0) + 1; + if (result[`${method}MultipleSyncCalled1`] < 42) return true; + }); + hook.tap("sync2", () => { + result[`${method}MultipleSyncCalled2`] = + (result[`${method}MultipleSyncCalled2`] || 0) + 1; + if (result[`${method}MultipleSyncCalled2`] < 42) return true; + }); + result[`${method}MultipleSync`] = await this.gainResult(cb => + hook[method](cb) + ); + } + + { + const hook = this.createHook([], `${method}InterceptedSync`); + hook.tap("sync1", () => { + result[`${method}InterceptedSyncCalled1`] = + (result[`${method}InterceptedSyncCalled1`] || 0) + 1; + if (result[`${method}InterceptedSyncCalled1`] < 42) return true; + }); + hook.tap("sync2", () => { + result[`${method}InterceptedSyncCalled2`] = + (result[`${method}InterceptedSyncCalled2`] || 0) + 1; + if (result[`${method}InterceptedSyncCalled2`] < 42) return true; + }); + hook.intercept({ + call: a => + (result[`${method}InterceptedSyncCalledCall`] = + (result[`${method}InterceptedSyncCalledCall`] || 0) + 1), + loop: a => + (result[`${method}InterceptedSyncCalledLoop`] = + (result[`${method}InterceptedSyncCalledLoop`] || 0) + 1), + tap: tap => { + result[`${method}InterceptedSyncCalledTap`] = + (result[`${method}InterceptedSyncCalledTap`] || 0) + 1; + } + }); + result[`${method}InterceptedSync`] = await this.gainResult(cb => + hook[method](cb) + ); + } + } + + async runSync(result, method) { + { + const hook = this.createHook([], `${method}None`); + result[`${method}None`] = await this.gainResult(cb => hook[method](cb)); + } + + { + const hook = this.createHook(["arg"], `${method}NoneWithArg`); + result[`${method}NoneWithArg`] = await this.gainResult(cb => + hook[method](42, cb) + ); + } + + { + const hook = this.createHook([], `${method}SingleSync`); + hook.tap("sync", () => { + result[`${method}SingleSyncCalled`] = true; + return 42; + }); + result[`${method}SingleSync`] = await this.gainResult(cb => + hook[method](cb) + ); + } + + { + const hook = this.createHook(["myArg"], `${method}SingleSyncWithArg`); + hook.tap("sync", nr => { + result[`${method}SingleSyncWithArgCalled`] = nr; + return nr; + }); + result[`${method}SingleSyncWithArg`] = await this.gainResult(cb => + hook[method](42, cb) + ); + } + + { + const hook = this.createHook([], `${method}MultipleSync`); + hook.tap("sync1", () => { + result[`${method}MultipleSyncCalled1`] = true; + return 42; + }); + hook.tap("sync2", () => { + result[`${method}MultipleSyncCalled2`] = true; + return 43; + }); + result[`${method}MultipleSync`] = await this.gainResult(cb => + hook[method](cb) + ); + } + + { + const hook = this.createHook(["a"], `${method}MultipleSyncWithArg`); + hook.tap("sync1", a => { + result[`${method}MultipleSyncWithArgCalled1`] = a; + return 42 + a; + }); + hook.tap("sync2", a => { + result[`${method}MultipleSyncWithArgCalled2`] = a; + return 43 + a; + }); + result[`${method}MultipleSyncWithArg`] = await this.gainResult(cb => + hook[method](42, cb) + ); + } + + { + const hook = this.createHook( + ["a"], + `${method}MultipleSyncWithArgNoReturn` + ); + hook.tap("sync1", a => { + result[`${method}MultipleSyncWithArgNoReturnCalled1`] = a; + }); + hook.tap("sync2", a => { + result[`${method}MultipleSyncWithArgNoReturnCalled2`] = a; + }); + result[`${method}MultipleSyncWithArgNoReturn`] = await this.gainResult( + cb => hook[method](42, cb) + ); + } + + { + const hook = this.createHook( + ["a"], + `${method}MultipleSyncWithArgFirstReturn` + ); + hook.tap("sync1", a => { + result[`${method}MultipleSyncWithArgFirstReturnCalled1`] = a; + return 42 + a; + }); + hook.tap("sync2", a => { + result[`${method}MultipleSyncWithArgFirstReturnCalled2`] = a; + }); + result[`${method}MultipleSyncWithArgFirstReturn`] = await this.gainResult( + cb => hook[method](42, cb) + ); + } + + { + const hook = this.createHook( + ["a"], + `${method}MultipleSyncWithArgLastReturn` + ); + hook.tap("sync1", a => { + result[`${method}MultipleSyncWithArgLastReturnCalled1`] = a; + }); + hook.tap("sync2", a => { + result[`${method}MultipleSyncWithArgLastReturnCalled2`] = a; + return 43 + a; + }); + result[`${method}MultipleSyncWithArgLastReturn`] = await this.gainResult( + cb => hook[method](42, cb) + ); + } + + { + const hook = this.createHook( + ["a", "b", "c"], + `${method}MultipleSyncWithArgs` + ); + hook.tap("sync1", (a, b, c) => { + result[`${method}MultipleSyncWithArgsCalled1`] = [a, b, c]; + return a + b + c; + }); + hook.tap("sync2", (a, b, c) => { + result[`${method}MultipleSyncWithArgsCalled2`] = [a, b, c]; + return a + b + c + 1; + }); + result[`${method}MultipleSyncWithArgs`] = await this.gainResult(cb => + hook[method](42, 43, 44, cb) + ); + } + + { + const hook = this.createHook([], `${method}MultipleSyncError`); + hook.tap("sync1", () => { + result[`${method}MultipleSyncErrorCalled1`] = true; + }); + hook.tap("sync2", () => { + result[`${method}MultipleSyncErrorCalled2`] = true; + throw new Error("Error in sync2"); + }); + hook.tap("sync3", () => { + result[`${method}MultipleSyncErrorCalled3`] = true; + }); + result[`${method}MultipleSyncError`] = await this.gainResult(cb => + hook[method](cb) + ); + } + + { + const hook = this.createHook(["a", "b", "c"], `${method}Intercepted`); + hook.intercept({ + call: (a, b, c) => { + result[`${method}InterceptedCall1`] = [a, b, c]; + }, + tap: tap => { + result[`${method}InterceptedTap1`] = Object.assign({}, tap, { + fn: tap.fn.length + }); + } + }); + hook.intercept({ + call: (a, b, c) => { + result[`${method}InterceptedCall2`] = [a, b, c]; + }, + tap: tap => { + if (!result[`${method}InterceptedTap2`]) + result[`${method}InterceptedTap2`] = Object.assign({}, tap, { + fn: tap.fn.length + }); + } + }); + hook.tap("sync1", (a, b, c) => a + b + c); + hook.tap("sync2", (a, b) => a + b + 1); + result[`${method}Intercepted`] = await this.gainResult(cb => + hook[method](1, 2, 3, cb) + ); + } + } + + async runAsync(result, type) { + { + const hook = this.createHook([], `${type}None`); + result[`${type}None`] = await this.gainResult(cb => hook[type](cb)); + } + + { + const hook = this.createHook(["arg"], `${type}NoneWithArg`); + result[`${type}NoneWithArg`] = await this.gainResult(cb => + hook[type](42, cb) + ); + } + + { + const hook = this.createHook([], `${type}SingleSync`); + hook.tap("sync", () => { + result[`${type}SingleSyncCalled1`] = true; + return 42; + }); + result[`${type}SingleSync`] = await this.gainResult(cb => hook[type](cb)); + } + + { + const hook = this.createHook(["x"], `${type}SingleSyncWithArg`); + hook.tap("sync", arg => { + result[`${type}SingleSyncWithArgCalled1`] = arg; + return arg + 1; + }); + result[`${type}SingleSyncWithArg`] = await this.gainResult(cb => + hook[type](42, cb) + ); + } + + { + const hook = this.createHook(["x"], `${type}SingleSyncWithArgNoReturn`); + hook.tap("sync", arg => { + result[`${type}SingleSyncWithArgNoReturnCalled1`] = arg; + }); + result[`${type}SingleSyncWithArgNoReturn`] = await this.gainResult(cb => + hook[type](42, cb) + ); + } + + { + const hook = this.createHook([], `${type}MultipleSync`); + hook.tap("sync1", () => { + result[`${type}MultipleSyncCalled1`] = true; + return 42; + }); + hook.tap("sync2", () => { + result[`${type}MultipleSyncCalled2`] = true; + return 43; + }); + result[`${type}MultipleSync`] = await this.gainResult(cb => + hook[type](cb) + ); + } + + { + const hook = this.createHook([], `${type}MultipleSyncLastReturn`); + hook.tap("sync1", () => { + result[`${type}MultipleSyncLastReturnCalled1`] = true; + }); + hook.tap("sync2", () => { + result[`${type}MultipleSyncLastReturnCalled2`] = true; + return 43; + }); + result[`${type}MultipleSyncLastReturn`] = await this.gainResult(cb => + hook[type](cb) + ); + } + + { + const hook = this.createHook([], `${type}MultipleSyncNoReturn`); + hook.tap("sync1", () => { + result[`${type}MultipleSyncNoReturnCalled1`] = true; + }); + hook.tap("sync2", () => { + result[`${type}MultipleSyncNoReturnCalled2`] = true; + }); + result[`${type}MultipleSyncNoReturn`] = await this.gainResult(cb => + hook[type](cb) + ); + } + + { + const hook = this.createHook(["arg"], `${type}MultipleSyncWithArg`); + hook.tap("sync1", arg => { + result[`${type}MultipleSyncWithArgCalled1`] = arg; + return arg + 1; + }); + hook.tap("sync2", arg => { + result[`${type}MultipleSyncWithArgCalled2`] = arg; + return arg + 2; + }); + result[`${type}MultipleSyncWithArg`] = await this.gainResult(cb => + hook[type](42, cb) + ); + } + + { + const hook = this.createHook( + ["arg"], + `${type}MultipleSyncWithArgNoReturn` + ); + hook.tap("sync1", arg => { + result[`${type}MultipleSyncWithArgNoReturnCalled1`] = arg; + }); + hook.tap("sync2", arg => { + result[`${type}MultipleSyncWithArgNoReturnCalled2`] = arg; + }); + result[`${type}MultipleSyncWithArgNoReturn`] = await this.gainResult(cb => + hook[type](42, cb) + ); + } + + { + const hook = this.createHook( + ["arg"], + `${type}MultipleSyncWithArgLastReturn` + ); + hook.tap("sync1", arg => { + result[`${type}MultipleSyncWithArgLastReturnCalled1`] = arg; + }); + hook.tap("sync2", arg => { + result[`${type}MultipleSyncWithArgLastReturnCalled2`] = arg; + return arg + 2; + }); + result[`${type}MultipleSyncWithArgLastReturn`] = await this.gainResult( + cb => hook[type](42, cb) + ); + } + + { + const hook = this.createHook( + ["arg"], + `${type}MultipleSyncWithArgFirstReturn` + ); + hook.tap("sync1", arg => { + result[`${type}MultipleSyncWithArgFirstReturnCalled1`] = arg; + return arg + 1; + }); + hook.tap("sync2", arg => { + result[`${type}MultipleSyncWithArgFirstReturnCalled2`] = arg; + }); + result[`${type}MultipleSyncWithArgFirstReturn`] = await this.gainResult( + cb => hook[type](42, cb) + ); + } + + { + const hook = this.createHook(["x"], `${type}SingleAsyncWithArg`); + hook.tapAsync("async", (arg, callback) => { + result[`${type}SingleAsyncWithArgCalled1`] = arg; + callback(null, arg); + }); + result[`${type}SingleAsyncWithArg`] = await this.gainResult(cb => + hook[type](42, cb) + ); + } + + { + const hook = this.createHook(["x"], `${type}MultipleAsyncWithArg`); + hook.tapAsync("async1", (arg, callback) => { + result[`${type}MultipleAsyncWithArgCalled1`] = arg; + callback(null, arg + 1); + }); + hook.tapAsync("async2", (arg, callback) => { + result[`${type}MultipleAsyncWithArgCalled2`] = arg; + callback(null, arg + 2); + }); + result[`${type}MultipleAsyncWithArg`] = await this.gainResult(cb => + hook[type](42, cb) + ); + } + + { + const hook = this.createHook( + ["x"], + `${type}MultipleAsyncWithArgNoReturn` + ); + hook.tapAsync("async1", (arg, callback) => { + result[`${type}MultipleAsyncWithArgNoReturnCalled1`] = arg; + callback(); + }); + hook.tapAsync("async2", (arg, callback) => { + result[`${type}MultipleAsyncWithArgNoReturnCalled2`] = arg; + callback(); + }); + result[`${type}MultipleAsyncWithArgNoReturn`] = await this.gainResult( + cb => hook[type](42, cb) + ); + } + + { + const hook = this.createHook( + ["x"], + `${type}MultipleAsyncWithArgFirstReturn` + ); + hook.tapAsync("async1", (arg, callback) => { + result[`${type}MultipleAsyncWithArgFirstReturnCalled1`] = arg; + callback(null, arg + 1); + }); + hook.tapAsync("async2", (arg, callback) => { + result[`${type}MultipleAsyncWithArgFirstReturnCalled2`] = arg; + callback(); + }); + result[`${type}MultipleAsyncWithArgFirstReturn`] = await this.gainResult( + cb => hook[type](42, cb) + ); + } + + { + const hook = this.createHook( + ["x"], + `${type}MultipleAsyncWithArgLastReturn` + ); + hook.tapAsync("async1", (arg, callback) => { + result[`${type}MultipleAsyncWithArgLastReturnCalled1`] = arg; + callback(); + }); + hook.tapAsync("async2", (arg, callback) => { + result[`${type}MultipleAsyncWithArgLastReturnCalled2`] = arg; + callback(null, arg + 2); + }); + result[`${type}MultipleAsyncWithArgLastReturn`] = await this.gainResult( + cb => hook[type](42, cb) + ); + } + + { + const hook = this.createHook(["x"], `${type}SinglePromiseWithArg`); + hook.tapPromise("promise", arg => { + result[`${type}SinglePromiseWithArgCalled1`] = arg; + return Promise.resolve(arg + 1); + }); + result[`${type}SinglePromiseWithArg`] = await this.gainResult(cb => + hook[type](42, cb) + ); + } + + { + const hook = this.createHook(["x"], `${type}MultiplePromiseWithArg`); + hook.tapPromise("promise1", arg => { + result[`${type}MultiplePromiseWithArgCalled1`] = arg; + return Promise.resolve(arg + 1); + }); + hook.tapPromise("promise2", arg => { + result[`${type}MultiplePromiseWithArgCalled2`] = arg; + return Promise.resolve(arg + 2); + }); + result[`${type}MultiplePromiseWithArg`] = await this.gainResult(cb => + hook[type](42, cb) + ); + } + + { + const hook = this.createHook( + ["x"], + `${type}MultiplePromiseWithArgNoReturn` + ); + hook.tapPromise("promise1", arg => { + result[`${type}MultiplePromiseWithArgNoReturnCalled1`] = arg; + return Promise.resolve(); + }); + hook.tapPromise("promise2", arg => { + result[`${type}MultiplePromiseWithArgNoReturnCalled2`] = arg; + return Promise.resolve(); + }); + result[`${type}MultiplePromiseWithArgNoReturn`] = await this.gainResult( + cb => hook[type](42, cb) + ); + } + + { + const hook = this.createHook( + ["x"], + `${type}MultiplePromiseWithArgFirstReturn` + ); + hook.tapPromise("promise1", arg => { + result[`${type}MultiplePromiseWithArgFirstReturnCalled1`] = arg; + return Promise.resolve(arg + 1); + }); + hook.tapPromise("promise2", arg => { + result[`${type}MultiplePromiseWithArgFirstReturnCalled2`] = arg; + return Promise.resolve(); + }); + result[`${type}MultiplePromiseWithArgFirstReturn`] = + await this.gainResult(cb => hook[type](42, cb)); + } + + { + const hook = this.createHook( + ["x"], + `${type}MultiplePromiseWithArgLastReturn` + ); + hook.tapPromise("promise1", arg => { + result[`${type}MultiplePromiseWithArgLastReturnCalled1`] = arg; + return Promise.resolve(); + }); + hook.tapPromise("promise2", arg => { + result[`${type}MultiplePromiseWithArgLastReturnCalled2`] = arg; + return Promise.resolve(arg + 2); + }); + result[`${type}MultiplePromiseWithArgLastReturn`] = await this.gainResult( + cb => hook[type](42, cb) + ); + } + + { + const hook = this.createHook(["x"], `${type}MultipleMixed1WithArg`); + hook.tapAsync("async", (arg, callback) => { + result[`${type}MultipleMixed1WithArgCalled1`] = arg; + callback(null, arg + 1); + }); + hook.tapPromise("promise", arg => { + result[`${type}MultipleMixed1WithArgCalled2`] = arg; + return Promise.resolve(arg + 2); + }); + hook.tap("sync", arg => { + result[`${type}MultipleMixed1WithArgCalled3`] = arg; + return arg + 3; + }); + result[`${type}MultipleMixed1WithArg`] = await this.gainResult(cb => + hook[type](42, cb) + ); + } + + { + const hook = this.createHook(["x"], `${type}MultipleMixed2WithArg`); + hook.tapAsync("async", (arg, callback) => { + result[`${type}MultipleMixed2WithArgCalled1`] = arg; + setTimeout(() => callback(null, arg + 1), 100); + }); + hook.tapPromise("promise", arg => { + result[`${type}MultipleMixed2WithArgCalled2`] = arg; + return Promise.resolve(arg + 2); + }); + result[`${type}MultipleMixed2WithArg`] = await this.gainResult(cb => + hook[type](42, cb) + ); + } + + { + const hook = this.createHook(["x"], `${type}MultipleMixed3WithArg`); + hook.tapAsync("async1", (arg, callback) => { + result[`${type}MultipleMixed3WithArgCalled1`] = arg; + callback(null, arg + 1); + }); + hook.tapPromise("promise", arg => { + result[`${type}MultipleMixed3WithArgCalled2`] = arg; + return Promise.resolve(arg + 2); + }); + hook.tapAsync("async2", (arg, callback) => { + result[`${type}MultipleMixed3WithArgCalled3`] = arg; + setTimeout(() => callback(null, arg + 3), 100); + }); + result[`${type}MultipleMixed3WithArg`] = await this.gainResult(cb => + hook[type](42, cb) + ); + } + + { + const hook = this.createHook([], `${type}MultipleSyncError`); + hook.tap("sync1", () => { + result[`${type}MultipleSyncErrorCalled1`] = true; + }); + hook.tap("sync2", () => { + throw new Error("Error in sync2"); + }); + hook.tap("sync3", () => { + result[`${type}MultipleSyncErrorCalled3`] = true; + }); + result[`${type}MultipleSyncError`] = await this.gainResult(cb => + hook[type](cb) + ); + } + + { + const hook = this.createHook([], `${type}MultipleAsyncError`); + hook.tapAsync("async1", callback => { + result[`${type}MultipleAsyncErrorCalled1`] = true; + callback(); + }); + hook.tapAsync("async2", callback => { + callback(new Error("Error in async2")); + }); + hook.tapAsync("async3", callback => { + result[`${type}MultipleAsyncErrorCalled3`] = true; + callback(); + }); + result[`${type}MultipleAsyncError`] = await this.gainResult(cb => + hook[type](cb) + ); + } + + { + const hook = this.createHook([], `${type}MultipleAsyncLateError`); + hook.tapAsync("async1", callback => { + result[`${type}MultipleAsyncLateErrorCalled1`] = true; + callback(); + }); + hook.tapAsync("async2", callback => { + setTimeout(() => callback(new Error("Error in async2")), 100); + }); + hook.tapAsync("async3", callback => { + result[`${type}MultipleAsyncLateErrorCalled3`] = true; + callback(); + }); + result[`${type}MultipleAsyncLateError`] = await this.gainResult(cb => + hook[type](cb) + ); + } + + { + const hook = this.createHook( + [], + `${type}MultipleAsyncLateErrorEarlyResult1` + ); + hook.tapAsync("async1", callback => { + result[`${type}MultipleAsyncLateErrorEarlyResult1Called1`] = true; + callback(); + }); + hook.tapAsync("async2", callback => { + setTimeout(() => callback(new Error("Error in async2")), 100); + }); + hook.tapAsync("async3", callback => { + result[`${type}MultipleAsyncLateErrorEarlyResult1Called3`] = true; + callback(null, 7); + }); + result[`${type}MultipleAsyncLateErrorEarlyResult1`] = + await this.gainResult(cb => hook[type](cb)); + } + + { + const hook = this.createHook( + [], + `${type}MultipleAsyncLateErrorEarlyResult2` + ); + hook.tapAsync("async1", callback => { + result[`${type}MultipleAsyncLateErrorEarlyResult2Called1`] = true; + setTimeout(() => callback(null, 42), 200); + }); + hook.tapAsync("async2", callback => { + setTimeout(() => callback(new Error("Error in async2")), 100); + }); + hook.tapAsync("async3", callback => { + result[`${type}MultipleAsyncLateErrorEarlyResult2Called3`] = true; + callback(null, 7); + }); + result[`${type}MultipleAsyncLateErrorEarlyResult2`] = + await this.gainResult(cb => hook[type](cb)); + } + + { + const hook = this.createHook([], `${type}MultipleAsyncEarlyError`); + hook.tapAsync("async1", callback => { + result[`${type}MultipleAsyncEarlyErrorCalled1`] = true; + setTimeout(() => callback(), 100); + }); + hook.tapAsync("async2", callback => { + callback(new Error("Error in async2")); + }); + hook.tapAsync("async3", callback => { + result[`${type}MultipleAsyncEarlyErrorCalled3`] = true; + setTimeout(() => callback(), 100); + }); + result[`${type}MultipleAsyncEarlyError`] = await this.gainResult(cb => + hook[type](cb) + ); + } + + { + const hook = this.createHook([], `${type}MultiplePromiseError`); + hook.tapPromise("promise1", () => { + result[`${type}MultiplePromiseErrorCalled1`] = true; + return Promise.resolve(); + }); + hook.tapPromise("promise2", () => { + return Promise.resolve().then(() => { + throw new Error("Error in async2"); + }); + }); + hook.tapPromise("promise3", () => { + result[`${type}MultiplePromiseErrorCalled3`] = true; + return Promise.resolve(); + }); + result[`${type}MultiplePromiseError`] = await this.gainResult(cb => + hook[type](cb) + ); + } + + { + const hook = this.createHook([], `${type}MultiplePromiseLateError`); + hook.tapPromise("promise1", () => { + result[`${type}MultiplePromiseLateErrorCalled1`] = true; + return Promise.resolve(); + }); + hook.tapPromise("promise2", () => { + return new Promise((resolve, reject) => { + setTimeout(() => reject(new Error("Error in async2")), 100); + }); + }); + hook.tapPromise("promise3", () => { + result[`${type}MultiplePromiseLateErrorCalled3`] = true; + return Promise.resolve(); + }); + result[`${type}MultiplePromiseLateError`] = await this.gainResult(cb => + hook[type](cb) + ); + } + + { + const hook = this.createHook([], `${type}MultiplePromiseEarlyError`); + hook.tapPromise("promise1", () => { + result[`${type}MultiplePromiseEarlyErrorCalled1`] = true; + return new Promise(resolve => setTimeout(() => resolve(), 100)); + }); + hook.tapPromise("promise2", () => { + return Promise.resolve().then(() => { + throw new Error("Error in async2"); + }); + }); + hook.tapPromise("promise3", () => { + result[`${type}MultiplePromiseEarlyErrorCalled3`] = true; + return new Promise(resolve => setTimeout(() => resolve(), 100)); + }); + result[`${type}MultiplePromiseEarlyError`] = await this.gainResult(cb => + hook[type](cb) + ); + } + + { + const hook = this.createHook(["x"], `${type}MultipleMixedError1WithArg`); + hook.tapAsync("async", (arg, callback) => { + result[`${type}MultipleMixedError1WithArgCalled1`] = arg; + callback(null, arg); + }); + hook.tapPromise("promise", arg => { + result[`${type}MultipleMixedError1WithArgCalled2`] = arg; + return Promise.resolve(arg + 1); + }); + hook.tap("sync", arg => { + result[`${type}MultipleMixedError1WithArgCalled3`] = arg; + throw new Error("Error in sync"); + }); + result[`${type}MultipleMixedError1WithArg`] = await this.gainResult(cb => + hook[type](42, cb) + ); + } + + { + const hook = this.createHook(["x"], `${type}MultipleMixedError2WithArg`); + hook.tapAsync("async", (arg, callback) => { + result[`${type}MultipleMixedError2WithArgCalled1`] = arg; + callback(null, arg); + }); + hook.tapPromise("promise", arg => { + result[`${type}MultipleMixedError2WithArgCalled2`] = arg; + return Promise.resolve().then(() => { + throw new Error("Error in promise"); + }); + }); + hook.tap("sync", arg => { + result[`${type}MultipleMixedError2WithArgCalled3`] = arg; + return arg + 2; + }); + result[`${type}MultipleMixedError2WithArg`] = await this.gainResult(cb => + hook[type](42, cb) + ); + } + + { + const hook = this.createHook(["x"], `${type}MultipleMixedError3WithArg`); + hook.tapAsync("async", (arg, callback) => { + result[`${type}MultipleMixedError3WithArgCalled1`] = arg; + callback(new Error("Error in async")); + }); + hook.tapPromise("promise", arg => { + result[`${type}MultipleMixedError3WithArgCalled2`] = arg; + return Promise.resolve(arg + 1); + }); + hook.tap("sync", arg => { + result[`${type}MultipleMixedError3WithArgCalled3`] = arg; + return arg + 2; + }); + result[`${type}MultipleMixedError3WithArg`] = await this.gainResult(cb => + hook[type](42, cb) + ); + } + + { + const hook = this.createHook([], `${type}MultipleMixedLateError`); + hook.tapAsync("async", callback => { + result[`${type}MultipleMixedLateErrorCalled1`] = true; + setTimeout(() => callback(new Error("Error in async")), 100); + }); + hook.tapPromise("promise", () => { + result[`${type}MultipleMixedLateErrorCalled2`] = true; + return Promise.resolve(42); + }); + hook.tap("sync", () => { + result[`${type}MultipleMixedLateErrorCalled3`] = true; + return 43; + }); + result[`${type}MultipleMixedLateError`] = await this.gainResult(cb => + hook[type](cb) + ); + } + } + + async runIntercept(result, type) { + { + const hook = this.createHook(["a", "b", "c"], `${type}Intercepted`); + hook.intercept({ + call: (a, b, c) => { + result[`${type}InterceptedCall1`] = [a, b, c]; + }, + + done: () => { + result[`${type}InterceptedDone1`] = true; + }, + + result: r => { + result[`${type}InterceptedResult1`] = r; + }, + + error: err => { + result[`${type}InterceptedError1`] = err; + }, + + tap: tap => { + result[`${type}InterceptedTap1`] = Object.assign({}, tap, { + fn: tap.fn.length + }); + } + }); + hook.intercept({ + call: (a, b, c) => { + result[`${type}InterceptedCall2`] = [a, b, c]; + }, + + done: () => { + result[`${type}InterceptedDone2`] = true; + }, + + result: r => { + result[`${type}InterceptedResult2`] = r; + }, + + error: err => { + result[`${type}InterceptedError2`] = err; + }, + + tap: tap => { + if (!result[`${type}InterceptedTap2`]) + result[`${type}InterceptedTap2`] = Object.assign({}, tap, { + fn: tap.fn.length + }); + } + }); + hook.tap("sync", (a, b, c) => a + b + c); + hook.tapPromise("promise", (a, b) => Promise.resolve(a + b + 1)); + result[`${type}Intercepted`] = await this.gainResult(cb => + hook[type](1, 2, 3, cb) + ); + } + + // We don't support context, it's deprecated in tapable + // { + // const hook = this.createHook( + // ["a", "b", "c"], + // `${type}ContextIntercepted` + // ); + // hook.intercept({ + // call: (context, a, b, c) => { + // context.number = 42; + // result[`${type}ContextInterceptedCall1`] = [context, a, b, c]; + // }, + // loop: (context, a, b, c) => { + // context.number2 = 88; + // result[`${type}ContextInterceptedLoop1`] = [context, a, b, c]; + // }, + // tap: (context, tap) => { + // result[`${type}ContextInterceptedTap1`] = context; + // }, + // context: true + // }); + // hook.intercept({ + // call: (a, b, c) => { + // result[`${type}ContextInterceptedCall2`] = [a, b, c]; + // } + // }); + // hook.tap( + // { + // name: "sync", + // context: true + // }, + // (context, a, b, c) => context.number + a + b + c + // ); + // result[`${type}ContextIntercepted`] = await this.gainResult(cb => + // hook[type](1, 2, 3, cb) + // ); + // } + + // { + // const hook = this.createHook( + // ["a", "b", "c"], + // `${type}UnusedContextIntercepted` + // ); + // hook.intercept({ + // call: (context, a, b, c) => { + // result[`${type}UnusedContextInterceptedCall1`] = [context, a, b, c]; + // }, + // tap: (context, tap) => { + // result[`${type}UnusedContextInterceptedTap1`] = context; + // }, + // context: true + // }); + // hook.intercept({ + // call: (a, b, c) => { + // result[`${type}UnusedContextInterceptedCall2`] = [a, b, c]; + // } + // }); + // hook.tap("sync", (a, b, c) => a + b + c); + // result[`${type}UnusedContextIntercepted`] = await this.gainResult(cb => + // hook[type](1, 2, 3, cb) + // ); + // } + } + + gainResult(fn) { + return Promise.race([ + new Promise(resolve => { + try { + const ret = fn((err, result) => { + if (err) { + resolve({ + type: "async", + error: err.message + }); + } else { + resolve({ + type: "async", + value: result + }); + } + }); + if (ret instanceof Promise) { + resolve( + ret.then( + res => ({ + type: "promise", + value: res + }), + err => ({ + type: "promise", + error: err.message + }) + ) + ); + } else if (ret !== undefined) { + resolve({ + type: "return", + value: ret + }); + } + } catch (e) { + resolve({ + error: e.message + }); + } + }), + new Promise(resolve => { + setTimeout( + () => + resolve({ + type: "no result" + }), + 1000 + ); + }) + ]); + } + + createHook(args, name) { + try { + return this.hookCreator(args, name); + } catch (err) { + return { + tap: () => {}, + tapPromise: () => {}, + tapAsync: () => {}, + intercept: () => {}, + call: () => { + throw err; + }, + callAsync: () => { + throw err; + }, + promise: () => { + throw err; + } + }; + } + } +} + +module.exports = HookTester; diff --git a/test/MultiHook.test.js b/test/MultiHook.test.js new file mode 100644 index 0000000..f050410 --- /dev/null +++ b/test/MultiHook.test.js @@ -0,0 +1,80 @@ +/** + * The following code is modified based on + * https://github.com/webpack/tapable/blob/a0a7b26/lib/__tests__/MultiHook.js + * + * MIT Licensed + * Author Tobias Koppers @sokra + * Copyright (c) JS Foundation and other contributors + * https://github.com/webpack/webpack/blob/main/LICENSE + */ + +"use strict"; + +const { MultiHook } = require("../"); + +describe("MultiHook", () => { + const redirectedMethods = ["tap", "tapAsync", "tapPromise"]; + for (const name of redirectedMethods) { + it(`should redirect ${name}`, () => { + const calls = []; + const fakeHook = { + [name]: (options, fn) => { + calls.push({ options, fn }); + } + }; + new MultiHook([fakeHook, fakeHook])[name]("options", "fn"); + expect(calls).toEqual([ + { options: "options", fn: "fn" }, + { options: "options", fn: "fn" } + ]); + }); + } + it("should redirect intercept", () => { + const calls = []; + const fakeHook = { + intercept: interceptor => { + calls.push(interceptor); + } + }; + new MultiHook([fakeHook, fakeHook]).intercept("interceptor"); + expect(calls).toEqual(["interceptor", "interceptor"]); + }); + // it("should redirect withOptions", () => { + // const calls = []; + // const fakeHook = { + // withOptions: options => { + // calls.push(options); + // return { + // tap: (options, fn) => { + // calls.push({ options, fn }); + // } + // }; + // } + // }; + // const newHook = new MultiHook([fakeHook, fakeHook]).withOptions("options"); + // newHook.tap("options", "fn"); + // expect(calls).toEqual([ + // "options", + // "options", + // { options: "options", fn: "fn" }, + // { options: "options", fn: "fn" } + // ]); + // }); + it("should redirect isUsed", () => { + const calls = []; + const fakeHook1 = { + isUsed: () => { + return true; + } + }; + const fakeHook2 = { + isUsed: () => { + return false; + } + }; + expect(new MultiHook([fakeHook1, fakeHook1]).isUsed()).toEqual(true); + expect(new MultiHook([fakeHook1, fakeHook2]).isUsed()).toEqual(true); + expect(new MultiHook([fakeHook2, fakeHook1]).isUsed()).toEqual(true); + expect(new MultiHook([fakeHook2, fakeHook2]).isUsed()).toEqual(false); + }); +}); diff --git a/test/SyncBailHook.test.js b/test/SyncBailHook.test.js new file mode 100644 index 0000000..6ac4273 --- /dev/null +++ b/test/SyncBailHook.test.js @@ -0,0 +1,108 @@ +/** + * The following code is modified based on + * https://github.com/webpack/tapable/blob/a0a7b26/lib/__tests__/SyncBailHook.js + * + * MIT Licensed + * Author Tobias Koppers @sokra + * Copyright (c) JS Foundation and other contributors + * https://github.com/webpack/webpack/blob/main/LICENSE + */ + +"use strict"; + +const { SyncBailHook } = require("../"); + +describe("SyncBailHook", () => { + it("should allow to create sync bail hooks", async () => { + const h1 = new SyncBailHook(["a"]); + const h2 = new SyncBailHook(["a", "b"]); + + let r = h1.call(1); + expect(r).toEqual(undefined); + + h1.tap("A", a => undefined); + h2.tap("A", (a, b) => [a, b]); + + expect(h1.call(1)).toEqual(undefined); + expect(await h1.promise(1)).toEqual(undefined); + expect(await pify(cb => h1.callAsync(1, cb))).toEqual(undefined); + expect(h2.call(1, 2)).toEqual([1, 2]); + expect(await h2.promise(1, 2)).toEqual([1, 2]); + expect(await pify(cb => h2.callAsync(1, 2, cb))).toEqual([1, 2]); + + h1.tap("B", a => "ok" + a); + h2.tap("B", (a, b) => "wrong"); + + expect(h1.call(10)).toEqual("ok10"); + expect(await h1.promise(10)).toEqual("ok10"); + expect(await pify(cb => h1.callAsync(10, cb))).toEqual("ok10"); + expect(h2.call(10, 20)).toEqual([10, 20]); + expect(await h2.promise(10, 20)).toEqual([10, 20]); + expect(await pify(cb => h2.callAsync(10, 20, cb))).toEqual([10, 20]); + }); + + it("should bail on non-null return", async () => { + const h1 = new SyncBailHook(["a"]); + const mockCall1 = jest.fn(); + const mockCall2 = jest.fn(() => "B"); + const mockCall3 = jest.fn(() => "C"); + h1.tap("A", mockCall1); + h1.tap("B", mockCall2); + h1.tap("C", mockCall3); + expect(h1.call()).toEqual("B"); + expect(mockCall1).toHaveBeenCalledTimes(1); + expect(mockCall2).toHaveBeenCalledTimes(1); + expect(mockCall3).toHaveBeenCalledTimes(0); + }); + + it("should allow to intercept calls", () => { + const hook = new SyncBailHook(["x"]); + + const mockCall = jest.fn(); + const mockTap = jest.fn(x => x); + + hook.intercept({ + call: mockCall, + tap: mockTap + }); + + hook.call(5); + + expect(mockCall).toHaveBeenLastCalledWith(5); + expect(mockTap).not.toHaveBeenCalled(); + + hook.tap("test", () => 10); + + hook.call(7); + + expect(mockCall).toHaveBeenLastCalledWith(7); + expect(mockTap).toHaveBeenCalled(); + }); + + it("should throw on tapAsync", () => { + const hook = new SyncBailHook(["x"]); + expect(() => hook.tapAsync()).toThrow(/tapAsync/); + }); + + it("should throw on tapPromise", () => { + const hook = new SyncBailHook(["x"]); + expect(() => hook.tapPromise()).toThrow(/tapPromise/); + }); + + it("should not crash with many plugins", () => { + const hook = new SyncBailHook(["x"]); + for (let i = 0; i < 1000; i++) { + hook.tap("Test", () => 42); + } + expect(hook.call()).toBe(42); + }); +}); + +function pify(fn) { + return new Promise((resolve, reject) => { + fn((err, result) => { + if (err) reject(err); + else resolve(result); + }); + }); +} diff --git a/test/SyncHook.test.js b/test/SyncHook.test.js new file mode 100644 index 0000000..26435e8 --- /dev/null +++ b/test/SyncHook.test.js @@ -0,0 +1,132 @@ +/** + * The following code is modified based on + * https://github.com/webpack/tapable/blob/a0a7b26/lib/__tests__/SyncHook.js + * + * MIT Licensed + * Author Tobias Koppers @sokra + * Copyright (c) JS Foundation and other contributors + * https://github.com/webpack/webpack/blob/main/LICENSE + */ + +"use strict"; + +const { SyncHook } = require("../"); + +describe("SyncHook", () => { + it("should allow to create sync hooks", async () => { + const h0 = new SyncHook(); + const h1 = new SyncHook(["test"]); + const h2 = new SyncHook(["test", "arg2"]); + const h3 = new SyncHook(["test", "arg2", "arg3"]); + + h0.call(); + await h0.promise(); + await new Promise(resolve => h0.callAsync(resolve)); + + const mock0 = jest.fn(); + h0.tap("A", mock0); + + h0.call(); + + expect(mock0).toHaveBeenLastCalledWith(); + + const mock1 = jest.fn(); + h0.tap("B", mock1); + + h0.call(); + + expect(mock1).toHaveBeenLastCalledWith(); + + const mock2 = jest.fn(); + const mock3 = jest.fn(); + const mock4 = jest.fn(); + const mock5 = jest.fn(); + + h1.tap("C", mock2); + h2.tap("D", mock3); + h3.tap("E", mock4); + h3.tap("F", mock5); + + h1.call("1"); + h2.call("1", 2); + h3.call("1", 2, 3); + + expect(mock2).toHaveBeenLastCalledWith("1"); + expect(mock3).toHaveBeenLastCalledWith("1", 2); + expect(mock4).toHaveBeenLastCalledWith("1", 2, 3); + expect(mock5).toHaveBeenLastCalledWith("1", 2, 3); + + await new Promise(resolve => h1.callAsync("a", resolve)); + await h2.promise("a", "b"); + await new Promise(resolve => h3.callAsync("a", "b", "c", resolve)); + + expect(mock2).toHaveBeenLastCalledWith("a"); + expect(mock3).toHaveBeenLastCalledWith("a", "b"); + expect(mock4).toHaveBeenLastCalledWith("a", "b", "c"); + expect(mock5).toHaveBeenLastCalledWith("a", "b", "c"); + + await h3.promise("x", "y"); + + expect(mock4).toHaveBeenLastCalledWith("x", "y", undefined); + expect(mock5).toHaveBeenLastCalledWith("x", "y", undefined); + }); + + it("should sync execute hooks", () => { + const h1 = new SyncHook(["a"]); + const mockCall1 = jest.fn(); + const mockCall2 = jest.fn(() => "B"); + const mockCall3 = jest.fn(() => "C"); + h1.tap("A", mockCall1); + h1.tap("B", mockCall2); + h1.tap("C", mockCall3); + expect(h1.call()).toEqual(undefined); + expect(mockCall1).toHaveBeenCalledTimes(1); + expect(mockCall2).toHaveBeenCalledTimes(1); + expect(mockCall3).toHaveBeenCalledTimes(1); + }); + + it("should allow to intercept calls", () => { + const hook = new SyncHook(["arg1", "arg2"]); + + const mockCall = jest.fn(); + const mock0 = jest.fn(); + const mockRegister = jest.fn(x => ({ + name: "huh", + type: "sync", + fn: mock0 + })); + + const mock1 = jest.fn(); + hook.tap("Test1", mock1); + + hook.intercept({ + call: mockCall, + register: mockRegister + }); + + const mock2 = jest.fn(); + hook.tap("Test2", mock2); + + hook.call(1, 2); + + expect(mockCall).toHaveBeenLastCalledWith(1, 2); + expect(mockRegister).toHaveBeenLastCalledWith({ + type: "sync", + name: "Test2", + fn: mock2 + }); + expect(mock1).not.toHaveBeenLastCalledWith(1, 2); + expect(mock2).not.toHaveBeenLastCalledWith(1, 2); + expect(mock0).toHaveBeenLastCalledWith(1, 2); + }); + + it("should throw error on tapAsync", () => { + const hook = new SyncHook(["arg1", "arg2"]); + expect(() => hook.tapAsync()).toThrow(/tapAsync/); + }); + + it("should throw error on tapPromise", () => { + const hook = new SyncHook(["arg1", "arg2"]); + expect(() => hook.tapPromise()).toThrow(/tapPromise/); + }); +}); diff --git a/test/SyncHooks.test.js b/test/SyncHooks.test.js new file mode 100644 index 0000000..8abe743 --- /dev/null +++ b/test/SyncHooks.test.js @@ -0,0 +1,54 @@ +/** + * The following code is modified based on + * https://github.com/webpack/tapable/blob/a0a7b26/lib/__tests__/SyncHooks.js + * + * MIT Licensed + * Author Tobias Koppers @sokra + * Copyright (c) JS Foundation and other contributors + * https://github.com/webpack/webpack/blob/main/LICENSE + */ + +"use strict"; + +const HookTester = require("./HookTester"); +const { SyncHook, SyncBailHook, SyncWaterfallHook } = require("../"); + +describe("SyncHook", () => { + it("should have to correct behavior", async () => { + const tester = new HookTester(args => new SyncHook(args)); + + const result = await tester.run(true); + + expect(result).toMatchSnapshot(); + }, 15000); +}); + +describe("SyncBailHook", () => { + it("should have to correct behavior", async () => { + const tester = new HookTester(args => new SyncBailHook(args)); + + const result = await tester.run(true); + + expect(result).toMatchSnapshot(); + }, 15000); +}); + +describe("SyncWaterfallHook", () => { + it("should have to correct behavior", async () => { + const tester = new HookTester(args => new SyncWaterfallHook(args)); + + const result = await tester.run(true); + + expect(result).toMatchSnapshot(); + }, 15000); +}); + +// describe("SyncLoopHook", () => { +// it("should have to correct behavior", async () => { +// const tester = new HookTester(args => new SyncLoopHook(args)); + +// const result = await tester.runForLoop(true); + +// expect(result).toMatchSnapshot(); +// }, 15000); +// }); diff --git a/test/SyncWaterfallHook.test.js b/test/SyncWaterfallHook.test.js new file mode 100644 index 0000000..3fc279f --- /dev/null +++ b/test/SyncWaterfallHook.test.js @@ -0,0 +1,164 @@ +/** + * The following code is modified based on + * https://github.com/webpack/tapable/blob/a0a7b26/lib/__tests__/SyncWaterfallHook.js + * + * MIT Licensed + * Author Tobias Koppers @sokra + * Copyright (c) JS Foundation and other contributors + * https://github.com/webpack/webpack/blob/main/LICENSE + */ + +"use strict"; + +const { SyncWaterfallHook } = require("../"); + +describe("SyncWaterfallHook", () => { + it("should throw an error when hook has no argument", () => { + expect(() => new SyncWaterfallHook()).toThrow( + "Waterfall hooks must have at least one argument" + ); + }); + + it("should allow to create sync hooks", async () => { + const hook = new SyncWaterfallHook(["arg1", "arg2"]); + + const mock0 = jest.fn(arg => arg + ",0"); + const mock1 = jest.fn(arg => arg + ",1"); + const mock2 = jest.fn(arg => arg + ",2"); + hook.tap("A", mock0); + hook.tap("B", mock1); + hook.tap("C", mock2); + + const returnValue0 = hook.call("sync", "a2"); + expect(returnValue0).toBe("sync,0,1,2"); + expect(mock0).toHaveBeenLastCalledWith("sync", "a2"); + expect(mock1).toHaveBeenLastCalledWith("sync,0", "a2"); + expect(mock2).toHaveBeenLastCalledWith("sync,0,1", "a2"); + + const returnValue1 = await new Promise(resolve => + hook.callAsync("async", "a2", (...args) => resolve(args)) + ); + + expect(returnValue1).toEqual([null, "async,0,1,2"]); + expect(mock0).toHaveBeenLastCalledWith("async", "a2"); + expect(mock1).toHaveBeenLastCalledWith("async,0", "a2"); + expect(mock2).toHaveBeenLastCalledWith("async,0,1", "a2"); + + const returnValue2 = await hook.promise("promise", "a2"); + + expect(returnValue2).toBe("promise,0,1,2"); + expect(mock0).toHaveBeenLastCalledWith("promise", "a2"); + expect(mock1).toHaveBeenLastCalledWith("promise,0", "a2"); + expect(mock2).toHaveBeenLastCalledWith("promise,0,1", "a2"); + }); + + it("should allow to intercept calls", () => { + const hook = new SyncWaterfallHook(["arg1", "arg2"]); + + const mockCall = jest.fn(); + const mock0 = jest.fn(() => "mock0"); + const mockRegister = jest.fn(x => ({ + name: "huh", + type: "sync", + fn: mock0 + })); + + const mock1 = jest.fn(() => "mock1"); + hook.tap("Test1", mock1); + + hook.intercept({ + call: mockCall, + register: mockRegister + }); + + const mock2 = jest.fn(() => "mock2"); + hook.tap("Test2", mock2); + + const returnValue = hook.call(1, 2); + + expect(returnValue).toBe("mock0"); + expect(mockCall).toHaveBeenLastCalledWith(1, 2); + expect(mockRegister).toHaveBeenLastCalledWith({ + type: "sync", + name: "Test2", + fn: mock2 + }); + expect(mock1).not.toHaveBeenLastCalledWith(1, 2); + expect(mock2).not.toHaveBeenLastCalledWith(1, 2); + expect(mock0.mock.calls).toEqual([ + [1, 2], + ["mock0", 2] + ]); + }); + it("should allow to create waterfall hooks", async () => { + const h1 = new SyncWaterfallHook(["a"]); + const h2 = new SyncWaterfallHook(["a", "b"]); + + expect(h1.call(1)).toEqual(1); + + h1.tap("A", a => undefined); + h2.tap("A", (a, b) => [a, b]); + + expect(h1.call(1)).toEqual(1); + expect(await h1.promise(1)).toEqual(1); + expect(await pify(cb => h1.callAsync(1, cb))).toEqual(1); + expect(h2.call(1, 2)).toEqual([1, 2]); + expect(await h2.promise(1, 2)).toEqual([1, 2]); + expect(await pify(cb => h2.callAsync(1, 2, cb))).toEqual([1, 2]); + + let count = 1; + count = h1.call(count + ++count); // 1 + 2 => 3 + count = h1.call(count + ++count); // 3 + 4 => 7 + count = h1.call(count + ++count); // 7 + 8 => 15 + expect(count).toEqual(15); + }); + + it("should throw when args have length less than 1", () => { + expect(() => { + new SyncWaterfallHook([]); + }).toThrow(/Waterfall/); + }); + + it("should allow to intercept calls", () => { + const hook = new SyncWaterfallHook(["x"]); + + const mockCall = jest.fn(); + const mockTap = jest.fn(x => x); + + hook.intercept({ + call: mockCall, + tap: mockTap + }); + + hook.call(5); + + expect(mockCall).toHaveBeenLastCalledWith(5); + expect(mockTap).not.toHaveBeenCalled(); + + hook.tap("test", () => 10); + + hook.call(7); + + expect(mockCall).toHaveBeenLastCalledWith(7); + expect(mockTap).toHaveBeenCalled(); + }); + + it("should throw on tapAsync", () => { + const hook = new SyncWaterfallHook(["x"]); + expect(() => hook.tapAsync()).toThrow(/tapAsync/); + }); + + it("should throw on tapPromise", () => { + const hook = new SyncWaterfallHook(["x"]); + expect(() => hook.tapPromise()).toThrow(/tapPromise/); + }); +}); + +function pify(fn) { + return new Promise((resolve, reject) => { + fn((err, result) => { + if (err) reject(err); + else resolve(result); + }); + }); +} diff --git a/test/__snapshots__/AsyncParallelHooks.test.js.snap b/test/__snapshots__/AsyncParallelHooks.test.js.snap new file mode 100644 index 0000000..ea31b4f --- /dev/null +++ b/test/__snapshots__/AsyncParallelHooks.test.js.snap @@ -0,0 +1,688 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`AsyncParallelHook should have to correct behavior 1`] = ` +{ + "async": { + "callAsyncMultipleAsyncEarlyError": { + "error": "Error in async2", + "type": "async", + }, + "callAsyncMultipleAsyncEarlyErrorCalled1": true, + "callAsyncMultipleAsyncError": { + "error": "Error in async2", + "type": "async", + }, + "callAsyncMultipleAsyncErrorCalled1": true, + "callAsyncMultipleAsyncLateError": { + "error": "Error in async2", + "type": "async", + }, + "callAsyncMultipleAsyncLateErrorCalled1": true, + "callAsyncMultipleAsyncLateErrorCalled3": true, + "callAsyncMultipleAsyncLateErrorEarlyResult1": { + "error": "Error in async2", + "type": "async", + }, + "callAsyncMultipleAsyncLateErrorEarlyResult1Called1": true, + "callAsyncMultipleAsyncLateErrorEarlyResult1Called3": true, + "callAsyncMultipleAsyncLateErrorEarlyResult2": { + "error": "Error in async2", + "type": "async", + }, + "callAsyncMultipleAsyncLateErrorEarlyResult2Called1": true, + "callAsyncMultipleAsyncLateErrorEarlyResult2Called3": true, + "callAsyncMultipleAsyncWithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleAsyncWithArgCalled1": 42, + "callAsyncMultipleAsyncWithArgCalled2": 42, + "callAsyncMultipleAsyncWithArgFirstReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleAsyncWithArgFirstReturnCalled1": 42, + "callAsyncMultipleAsyncWithArgFirstReturnCalled2": 42, + "callAsyncMultipleAsyncWithArgLastReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleAsyncWithArgLastReturnCalled1": 42, + "callAsyncMultipleAsyncWithArgLastReturnCalled2": 42, + "callAsyncMultipleAsyncWithArgNoReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleAsyncWithArgNoReturnCalled1": 42, + "callAsyncMultipleAsyncWithArgNoReturnCalled2": 42, + "callAsyncMultipleMixed1WithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleMixed1WithArgCalled1": 42, + "callAsyncMultipleMixed1WithArgCalled2": 42, + "callAsyncMultipleMixed1WithArgCalled3": 42, + "callAsyncMultipleMixed2WithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleMixed2WithArgCalled1": 42, + "callAsyncMultipleMixed2WithArgCalled2": 42, + "callAsyncMultipleMixed3WithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleMixed3WithArgCalled1": 42, + "callAsyncMultipleMixed3WithArgCalled2": 42, + "callAsyncMultipleMixed3WithArgCalled3": 42, + "callAsyncMultipleMixedError1WithArg": { + "error": "Error in sync", + "type": "async", + }, + "callAsyncMultipleMixedError1WithArgCalled1": 42, + "callAsyncMultipleMixedError1WithArgCalled2": 42, + "callAsyncMultipleMixedError1WithArgCalled3": 42, + "callAsyncMultipleMixedError2WithArg": { + "error": "Error in promise", + "type": "async", + }, + "callAsyncMultipleMixedError2WithArgCalled1": 42, + "callAsyncMultipleMixedError2WithArgCalled2": 42, + "callAsyncMultipleMixedError2WithArgCalled3": 42, + "callAsyncMultipleMixedError3WithArg": { + "error": "Error in async", + "type": "async", + }, + "callAsyncMultipleMixedError3WithArgCalled1": 42, + "callAsyncMultipleMixedLateError": { + "error": "Error in async", + "type": "async", + }, + "callAsyncMultipleMixedLateErrorCalled1": true, + "callAsyncMultipleMixedLateErrorCalled2": true, + "callAsyncMultipleMixedLateErrorCalled3": true, + "callAsyncMultiplePromiseEarlyError": { + "error": "Error in async2", + "type": "async", + }, + "callAsyncMultiplePromiseEarlyErrorCalled1": true, + "callAsyncMultiplePromiseEarlyErrorCalled3": true, + "callAsyncMultiplePromiseError": { + "error": "Error in async2", + "type": "async", + }, + "callAsyncMultiplePromiseErrorCalled1": true, + "callAsyncMultiplePromiseErrorCalled3": true, + "callAsyncMultiplePromiseLateError": { + "error": "Error in async2", + "type": "async", + }, + "callAsyncMultiplePromiseLateErrorCalled1": true, + "callAsyncMultiplePromiseLateErrorCalled3": true, + "callAsyncMultiplePromiseWithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncMultiplePromiseWithArgCalled1": 42, + "callAsyncMultiplePromiseWithArgCalled2": 42, + "callAsyncMultiplePromiseWithArgFirstReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultiplePromiseWithArgFirstReturnCalled1": 42, + "callAsyncMultiplePromiseWithArgFirstReturnCalled2": 42, + "callAsyncMultiplePromiseWithArgLastReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultiplePromiseWithArgLastReturnCalled1": 42, + "callAsyncMultiplePromiseWithArgLastReturnCalled2": 42, + "callAsyncMultiplePromiseWithArgNoReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultiplePromiseWithArgNoReturnCalled1": 42, + "callAsyncMultiplePromiseWithArgNoReturnCalled2": 42, + "callAsyncMultipleSync": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncCalled1": true, + "callAsyncMultipleSyncCalled2": true, + "callAsyncMultipleSyncError": { + "error": "Error in sync2", + "type": "async", + }, + "callAsyncMultipleSyncErrorCalled1": true, + "callAsyncMultipleSyncLastReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncLastReturnCalled1": true, + "callAsyncMultipleSyncLastReturnCalled2": true, + "callAsyncMultipleSyncNoReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncNoReturnCalled1": true, + "callAsyncMultipleSyncNoReturnCalled2": true, + "callAsyncMultipleSyncWithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncWithArgCalled1": 42, + "callAsyncMultipleSyncWithArgCalled2": 42, + "callAsyncMultipleSyncWithArgFirstReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncWithArgFirstReturnCalled1": 42, + "callAsyncMultipleSyncWithArgFirstReturnCalled2": 42, + "callAsyncMultipleSyncWithArgLastReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncWithArgLastReturnCalled1": 42, + "callAsyncMultipleSyncWithArgLastReturnCalled2": 42, + "callAsyncMultipleSyncWithArgNoReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncWithArgNoReturnCalled1": 42, + "callAsyncMultipleSyncWithArgNoReturnCalled2": 42, + "callAsyncNone": { + "type": "async", + "value": undefined, + }, + "callAsyncNoneWithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncSingleAsyncWithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncSingleAsyncWithArgCalled1": 42, + "callAsyncSinglePromiseWithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncSinglePromiseWithArgCalled1": 42, + "callAsyncSingleSync": { + "type": "async", + "value": undefined, + }, + "callAsyncSingleSyncCalled1": true, + "callAsyncSingleSyncWithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncSingleSyncWithArgCalled1": 42, + "callAsyncSingleSyncWithArgNoReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncSingleSyncWithArgNoReturnCalled1": 42, + "promiseMultipleAsyncEarlyError": { + "error": "Error in async2", + "type": "promise", + }, + "promiseMultipleAsyncEarlyErrorCalled1": true, + "promiseMultipleAsyncError": { + "error": "Error in async2", + "type": "promise", + }, + "promiseMultipleAsyncErrorCalled1": true, + "promiseMultipleAsyncLateError": { + "error": "Error in async2", + "type": "promise", + }, + "promiseMultipleAsyncLateErrorCalled1": true, + "promiseMultipleAsyncLateErrorCalled3": true, + "promiseMultipleAsyncLateErrorEarlyResult1": { + "error": "Error in async2", + "type": "promise", + }, + "promiseMultipleAsyncLateErrorEarlyResult1Called1": true, + "promiseMultipleAsyncLateErrorEarlyResult1Called3": true, + "promiseMultipleAsyncLateErrorEarlyResult2": { + "error": "Error in async2", + "type": "promise", + }, + "promiseMultipleAsyncLateErrorEarlyResult2Called1": true, + "promiseMultipleAsyncLateErrorEarlyResult2Called3": true, + "promiseMultipleAsyncWithArg": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleAsyncWithArgCalled1": 42, + "promiseMultipleAsyncWithArgCalled2": 42, + "promiseMultipleAsyncWithArgFirstReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleAsyncWithArgFirstReturnCalled1": 42, + "promiseMultipleAsyncWithArgFirstReturnCalled2": 42, + "promiseMultipleAsyncWithArgLastReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleAsyncWithArgLastReturnCalled1": 42, + "promiseMultipleAsyncWithArgLastReturnCalled2": 42, + "promiseMultipleAsyncWithArgNoReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleAsyncWithArgNoReturnCalled1": 42, + "promiseMultipleAsyncWithArgNoReturnCalled2": 42, + "promiseMultipleMixed1WithArg": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleMixed1WithArgCalled1": 42, + "promiseMultipleMixed1WithArgCalled2": 42, + "promiseMultipleMixed1WithArgCalled3": 42, + "promiseMultipleMixed2WithArg": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleMixed2WithArgCalled1": 42, + "promiseMultipleMixed2WithArgCalled2": 42, + "promiseMultipleMixed3WithArg": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleMixed3WithArgCalled1": 42, + "promiseMultipleMixed3WithArgCalled2": 42, + "promiseMultipleMixed3WithArgCalled3": 42, + "promiseMultipleMixedError1WithArg": { + "error": "Error in sync", + "type": "promise", + }, + "promiseMultipleMixedError1WithArgCalled1": 42, + "promiseMultipleMixedError1WithArgCalled2": 42, + "promiseMultipleMixedError1WithArgCalled3": 42, + "promiseMultipleMixedError2WithArg": { + "error": "Error in promise", + "type": "promise", + }, + "promiseMultipleMixedError2WithArgCalled1": 42, + "promiseMultipleMixedError2WithArgCalled2": 42, + "promiseMultipleMixedError2WithArgCalled3": 42, + "promiseMultipleMixedError3WithArg": { + "error": "Error in async", + "type": "promise", + }, + "promiseMultipleMixedError3WithArgCalled1": 42, + "promiseMultipleMixedLateError": { + "error": "Error in async", + "type": "promise", + }, + "promiseMultipleMixedLateErrorCalled1": true, + "promiseMultipleMixedLateErrorCalled2": true, + "promiseMultipleMixedLateErrorCalled3": true, + "promiseMultiplePromiseEarlyError": { + "error": "Error in async2", + "type": "promise", + }, + "promiseMultiplePromiseEarlyErrorCalled1": true, + "promiseMultiplePromiseEarlyErrorCalled3": true, + "promiseMultiplePromiseError": { + "error": "Error in async2", + "type": "promise", + }, + "promiseMultiplePromiseErrorCalled1": true, + "promiseMultiplePromiseErrorCalled3": true, + "promiseMultiplePromiseLateError": { + "error": "Error in async2", + "type": "promise", + }, + "promiseMultiplePromiseLateErrorCalled1": true, + "promiseMultiplePromiseLateErrorCalled3": true, + "promiseMultiplePromiseWithArg": { + "type": "promise", + "value": undefined, + }, + "promiseMultiplePromiseWithArgCalled1": 42, + "promiseMultiplePromiseWithArgCalled2": 42, + "promiseMultiplePromiseWithArgFirstReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultiplePromiseWithArgFirstReturnCalled1": 42, + "promiseMultiplePromiseWithArgFirstReturnCalled2": 42, + "promiseMultiplePromiseWithArgLastReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultiplePromiseWithArgLastReturnCalled1": 42, + "promiseMultiplePromiseWithArgLastReturnCalled2": 42, + "promiseMultiplePromiseWithArgNoReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultiplePromiseWithArgNoReturnCalled1": 42, + "promiseMultiplePromiseWithArgNoReturnCalled2": 42, + "promiseMultipleSync": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncCalled1": true, + "promiseMultipleSyncCalled2": true, + "promiseMultipleSyncError": { + "error": "Error in sync2", + "type": "promise", + }, + "promiseMultipleSyncErrorCalled1": true, + "promiseMultipleSyncLastReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncLastReturnCalled1": true, + "promiseMultipleSyncLastReturnCalled2": true, + "promiseMultipleSyncNoReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncNoReturnCalled1": true, + "promiseMultipleSyncNoReturnCalled2": true, + "promiseMultipleSyncWithArg": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncWithArgCalled1": 42, + "promiseMultipleSyncWithArgCalled2": 42, + "promiseMultipleSyncWithArgFirstReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncWithArgFirstReturnCalled1": 42, + "promiseMultipleSyncWithArgFirstReturnCalled2": 42, + "promiseMultipleSyncWithArgLastReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncWithArgLastReturnCalled1": 42, + "promiseMultipleSyncWithArgLastReturnCalled2": 42, + "promiseMultipleSyncWithArgNoReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncWithArgNoReturnCalled1": 42, + "promiseMultipleSyncWithArgNoReturnCalled2": 42, + "promiseNone": { + "type": "promise", + "value": undefined, + }, + "promiseNoneWithArg": { + "type": "promise", + "value": undefined, + }, + "promiseSingleAsyncWithArg": { + "type": "promise", + "value": undefined, + }, + "promiseSingleAsyncWithArgCalled1": 42, + "promiseSinglePromiseWithArg": { + "type": "promise", + "value": undefined, + }, + "promiseSinglePromiseWithArgCalled1": 42, + "promiseSingleSync": { + "type": "promise", + "value": undefined, + }, + "promiseSingleSyncCalled1": true, + "promiseSingleSyncWithArg": { + "type": "promise", + "value": undefined, + }, + "promiseSingleSyncWithArgCalled1": 42, + "promiseSingleSyncWithArgNoReturn": { + "type": "promise", + "value": undefined, + }, + "promiseSingleSyncWithArgNoReturnCalled1": 42, + }, + "intercept": { + "callAsyncIntercepted": { + "type": "async", + "value": undefined, + }, + "callAsyncInterceptedCall1": [ + 1, + 2, + 3, + ], + "callAsyncInterceptedCall2": [ + 1, + 2, + 3, + ], + "callAsyncInterceptedDone1": true, + "callAsyncInterceptedDone2": true, + "callAsyncInterceptedTap1": { + "fn": 2, + "name": "promise", + "type": "promise", + }, + "callAsyncInterceptedTap2": { + "fn": 3, + "name": "sync", + "type": "sync", + }, + "promiseIntercepted": { + "type": "promise", + "value": undefined, + }, + "promiseInterceptedCall1": [ + 1, + 2, + 3, + ], + "promiseInterceptedCall2": [ + 1, + 2, + 3, + ], + "promiseInterceptedDone1": true, + "promiseInterceptedDone2": true, + "promiseInterceptedTap1": { + "fn": 2, + "name": "promise", + "type": "promise", + }, + "promiseInterceptedTap2": { + "fn": 3, + "name": "sync", + "type": "sync", + }, + }, + "sync": { + "callAsyncIntercepted": { + "type": "async", + "value": undefined, + }, + "callAsyncInterceptedCall1": [ + 1, + 2, + 3, + ], + "callAsyncInterceptedCall2": [ + 1, + 2, + 3, + ], + "callAsyncInterceptedTap1": { + "fn": 2, + "name": "sync2", + "type": "sync", + }, + "callAsyncInterceptedTap2": { + "fn": 3, + "name": "sync1", + "type": "sync", + }, + "callAsyncMultipleSync": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncCalled1": true, + "callAsyncMultipleSyncCalled2": true, + "callAsyncMultipleSyncError": { + "error": "Error in sync2", + "type": "async", + }, + "callAsyncMultipleSyncErrorCalled1": true, + "callAsyncMultipleSyncErrorCalled2": true, + "callAsyncMultipleSyncWithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncWithArgCalled1": 42, + "callAsyncMultipleSyncWithArgCalled2": 42, + "callAsyncMultipleSyncWithArgFirstReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncWithArgFirstReturnCalled1": 42, + "callAsyncMultipleSyncWithArgFirstReturnCalled2": 42, + "callAsyncMultipleSyncWithArgLastReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncWithArgLastReturnCalled1": 42, + "callAsyncMultipleSyncWithArgLastReturnCalled2": 42, + "callAsyncMultipleSyncWithArgNoReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncWithArgNoReturnCalled1": 42, + "callAsyncMultipleSyncWithArgNoReturnCalled2": 42, + "callAsyncMultipleSyncWithArgs": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncWithArgsCalled1": [ + 42, + 43, + 44, + ], + "callAsyncMultipleSyncWithArgsCalled2": [ + 42, + 43, + 44, + ], + "callAsyncNone": { + "type": "async", + "value": undefined, + }, + "callAsyncNoneWithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncSingleSync": { + "type": "async", + "value": undefined, + }, + "callAsyncSingleSyncCalled": true, + "callAsyncSingleSyncWithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncSingleSyncWithArgCalled": 42, + "promiseIntercepted": { + "type": "promise", + "value": undefined, + }, + "promiseInterceptedCall1": [ + 1, + 2, + 3, + ], + "promiseInterceptedCall2": [ + 1, + 2, + 3, + ], + "promiseInterceptedTap1": { + "fn": 2, + "name": "sync2", + "type": "sync", + }, + "promiseInterceptedTap2": { + "fn": 3, + "name": "sync1", + "type": "sync", + }, + "promiseMultipleSync": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncCalled1": true, + "promiseMultipleSyncCalled2": true, + "promiseMultipleSyncError": { + "error": "Error in sync2", + "type": "promise", + }, + "promiseMultipleSyncErrorCalled1": true, + "promiseMultipleSyncErrorCalled2": true, + "promiseMultipleSyncWithArg": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncWithArgCalled1": 42, + "promiseMultipleSyncWithArgCalled2": 42, + "promiseMultipleSyncWithArgFirstReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncWithArgFirstReturnCalled1": 42, + "promiseMultipleSyncWithArgFirstReturnCalled2": 42, + "promiseMultipleSyncWithArgLastReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncWithArgLastReturnCalled1": 42, + "promiseMultipleSyncWithArgLastReturnCalled2": 42, + "promiseMultipleSyncWithArgNoReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncWithArgNoReturnCalled1": 42, + "promiseMultipleSyncWithArgNoReturnCalled2": 42, + "promiseMultipleSyncWithArgs": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncWithArgsCalled1": [ + 42, + 43, + 44, + ], + "promiseMultipleSyncWithArgsCalled2": [ + 42, + 43, + 44, + ], + "promiseNone": { + "type": "promise", + "value": undefined, + }, + "promiseNoneWithArg": { + "type": "promise", + "value": undefined, + }, + "promiseSingleSync": { + "type": "promise", + "value": undefined, + }, + "promiseSingleSyncCalled": true, + "promiseSingleSyncWithArg": { + "type": "promise", + "value": undefined, + }, + "promiseSingleSyncWithArgCalled": 42, + }, +} +`; diff --git a/test/__snapshots__/AsyncSeriesHooks.test.js.snap b/test/__snapshots__/AsyncSeriesHooks.test.js.snap new file mode 100644 index 0000000..6fe1c25 --- /dev/null +++ b/test/__snapshots__/AsyncSeriesHooks.test.js.snap @@ -0,0 +1,1880 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`AsyncSeriesBailHook should have to correct behavior 1`] = ` +{ + "async": { + "callAsyncMultipleAsyncEarlyError": { + "error": "Error in async2", + "type": "async", + }, + "callAsyncMultipleAsyncEarlyErrorCalled1": true, + "callAsyncMultipleAsyncError": { + "error": "Error in async2", + "type": "async", + }, + "callAsyncMultipleAsyncErrorCalled1": true, + "callAsyncMultipleAsyncLateError": { + "error": "Error in async2", + "type": "async", + }, + "callAsyncMultipleAsyncLateErrorCalled1": true, + "callAsyncMultipleAsyncLateErrorEarlyResult1": { + "error": "Error in async2", + "type": "async", + }, + "callAsyncMultipleAsyncLateErrorEarlyResult1Called1": true, + "callAsyncMultipleAsyncLateErrorEarlyResult2": { + "type": "async", + "value": 42, + }, + "callAsyncMultipleAsyncLateErrorEarlyResult2Called1": true, + "callAsyncMultipleAsyncWithArg": { + "type": "async", + "value": 43, + }, + "callAsyncMultipleAsyncWithArgCalled1": 42, + "callAsyncMultipleAsyncWithArgFirstReturn": { + "type": "async", + "value": 43, + }, + "callAsyncMultipleAsyncWithArgFirstReturnCalled1": 42, + "callAsyncMultipleAsyncWithArgLastReturn": { + "type": "async", + "value": 44, + }, + "callAsyncMultipleAsyncWithArgLastReturnCalled1": 42, + "callAsyncMultipleAsyncWithArgLastReturnCalled2": 42, + "callAsyncMultipleAsyncWithArgNoReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleAsyncWithArgNoReturnCalled1": 42, + "callAsyncMultipleAsyncWithArgNoReturnCalled2": 42, + "callAsyncMultipleMixed1WithArg": { + "type": "async", + "value": 43, + }, + "callAsyncMultipleMixed1WithArgCalled1": 42, + "callAsyncMultipleMixed2WithArg": { + "type": "async", + "value": 43, + }, + "callAsyncMultipleMixed2WithArgCalled1": 42, + "callAsyncMultipleMixed3WithArg": { + "type": "async", + "value": 43, + }, + "callAsyncMultipleMixed3WithArgCalled1": 42, + "callAsyncMultipleMixedError1WithArg": { + "type": "async", + "value": 42, + }, + "callAsyncMultipleMixedError1WithArgCalled1": 42, + "callAsyncMultipleMixedError2WithArg": { + "type": "async", + "value": 42, + }, + "callAsyncMultipleMixedError2WithArgCalled1": 42, + "callAsyncMultipleMixedError3WithArg": { + "error": "Error in async", + "type": "async", + }, + "callAsyncMultipleMixedError3WithArgCalled1": 42, + "callAsyncMultipleMixedLateError": { + "error": "Error in async", + "type": "async", + }, + "callAsyncMultipleMixedLateErrorCalled1": true, + "callAsyncMultiplePromiseEarlyError": { + "error": "Error in async2", + "type": "async", + }, + "callAsyncMultiplePromiseEarlyErrorCalled1": true, + "callAsyncMultiplePromiseError": { + "error": "Error in async2", + "type": "async", + }, + "callAsyncMultiplePromiseErrorCalled1": true, + "callAsyncMultiplePromiseLateError": { + "error": "Error in async2", + "type": "async", + }, + "callAsyncMultiplePromiseLateErrorCalled1": true, + "callAsyncMultiplePromiseWithArg": { + "type": "async", + "value": 43, + }, + "callAsyncMultiplePromiseWithArgCalled1": 42, + "callAsyncMultiplePromiseWithArgFirstReturn": { + "type": "async", + "value": 43, + }, + "callAsyncMultiplePromiseWithArgFirstReturnCalled1": 42, + "callAsyncMultiplePromiseWithArgLastReturn": { + "type": "async", + "value": 44, + }, + "callAsyncMultiplePromiseWithArgLastReturnCalled1": 42, + "callAsyncMultiplePromiseWithArgLastReturnCalled2": 42, + "callAsyncMultiplePromiseWithArgNoReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultiplePromiseWithArgNoReturnCalled1": 42, + "callAsyncMultiplePromiseWithArgNoReturnCalled2": 42, + "callAsyncMultipleSync": { + "type": "async", + "value": 42, + }, + "callAsyncMultipleSyncCalled1": true, + "callAsyncMultipleSyncError": { + "error": "Error in sync2", + "type": "async", + }, + "callAsyncMultipleSyncErrorCalled1": true, + "callAsyncMultipleSyncLastReturn": { + "type": "async", + "value": 43, + }, + "callAsyncMultipleSyncLastReturnCalled1": true, + "callAsyncMultipleSyncLastReturnCalled2": true, + "callAsyncMultipleSyncNoReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncNoReturnCalled1": true, + "callAsyncMultipleSyncNoReturnCalled2": true, + "callAsyncMultipleSyncWithArg": { + "type": "async", + "value": 43, + }, + "callAsyncMultipleSyncWithArgCalled1": 42, + "callAsyncMultipleSyncWithArgFirstReturn": { + "type": "async", + "value": 43, + }, + "callAsyncMultipleSyncWithArgFirstReturnCalled1": 42, + "callAsyncMultipleSyncWithArgLastReturn": { + "type": "async", + "value": 44, + }, + "callAsyncMultipleSyncWithArgLastReturnCalled1": 42, + "callAsyncMultipleSyncWithArgLastReturnCalled2": 42, + "callAsyncMultipleSyncWithArgNoReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncWithArgNoReturnCalled1": 42, + "callAsyncMultipleSyncWithArgNoReturnCalled2": 42, + "callAsyncNone": { + "type": "async", + "value": undefined, + }, + "callAsyncNoneWithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncSingleAsyncWithArg": { + "type": "async", + "value": 42, + }, + "callAsyncSingleAsyncWithArgCalled1": 42, + "callAsyncSinglePromiseWithArg": { + "type": "async", + "value": 43, + }, + "callAsyncSinglePromiseWithArgCalled1": 42, + "callAsyncSingleSync": { + "type": "async", + "value": 42, + }, + "callAsyncSingleSyncCalled1": true, + "callAsyncSingleSyncWithArg": { + "type": "async", + "value": 43, + }, + "callAsyncSingleSyncWithArgCalled1": 42, + "callAsyncSingleSyncWithArgNoReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncSingleSyncWithArgNoReturnCalled1": 42, + "promiseMultipleAsyncEarlyError": { + "error": "Error in async2", + "type": "promise", + }, + "promiseMultipleAsyncEarlyErrorCalled1": true, + "promiseMultipleAsyncError": { + "error": "Error in async2", + "type": "promise", + }, + "promiseMultipleAsyncErrorCalled1": true, + "promiseMultipleAsyncLateError": { + "error": "Error in async2", + "type": "promise", + }, + "promiseMultipleAsyncLateErrorCalled1": true, + "promiseMultipleAsyncLateErrorEarlyResult1": { + "error": "Error in async2", + "type": "promise", + }, + "promiseMultipleAsyncLateErrorEarlyResult1Called1": true, + "promiseMultipleAsyncLateErrorEarlyResult2": { + "type": "promise", + "value": 42, + }, + "promiseMultipleAsyncLateErrorEarlyResult2Called1": true, + "promiseMultipleAsyncWithArg": { + "type": "promise", + "value": 43, + }, + "promiseMultipleAsyncWithArgCalled1": 42, + "promiseMultipleAsyncWithArgFirstReturn": { + "type": "promise", + "value": 43, + }, + "promiseMultipleAsyncWithArgFirstReturnCalled1": 42, + "promiseMultipleAsyncWithArgLastReturn": { + "type": "promise", + "value": 44, + }, + "promiseMultipleAsyncWithArgLastReturnCalled1": 42, + "promiseMultipleAsyncWithArgLastReturnCalled2": 42, + "promiseMultipleAsyncWithArgNoReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleAsyncWithArgNoReturnCalled1": 42, + "promiseMultipleAsyncWithArgNoReturnCalled2": 42, + "promiseMultipleMixed1WithArg": { + "type": "promise", + "value": 43, + }, + "promiseMultipleMixed1WithArgCalled1": 42, + "promiseMultipleMixed2WithArg": { + "type": "promise", + "value": 43, + }, + "promiseMultipleMixed2WithArgCalled1": 42, + "promiseMultipleMixed3WithArg": { + "type": "promise", + "value": 43, + }, + "promiseMultipleMixed3WithArgCalled1": 42, + "promiseMultipleMixedError1WithArg": { + "type": "promise", + "value": 42, + }, + "promiseMultipleMixedError1WithArgCalled1": 42, + "promiseMultipleMixedError2WithArg": { + "type": "promise", + "value": 42, + }, + "promiseMultipleMixedError2WithArgCalled1": 42, + "promiseMultipleMixedError3WithArg": { + "error": "Error in async", + "type": "promise", + }, + "promiseMultipleMixedError3WithArgCalled1": 42, + "promiseMultipleMixedLateError": { + "error": "Error in async", + "type": "promise", + }, + "promiseMultipleMixedLateErrorCalled1": true, + "promiseMultiplePromiseEarlyError": { + "error": "Error in async2", + "type": "promise", + }, + "promiseMultiplePromiseEarlyErrorCalled1": true, + "promiseMultiplePromiseError": { + "error": "Error in async2", + "type": "promise", + }, + "promiseMultiplePromiseErrorCalled1": true, + "promiseMultiplePromiseLateError": { + "error": "Error in async2", + "type": "promise", + }, + "promiseMultiplePromiseLateErrorCalled1": true, + "promiseMultiplePromiseWithArg": { + "type": "promise", + "value": 43, + }, + "promiseMultiplePromiseWithArgCalled1": 42, + "promiseMultiplePromiseWithArgFirstReturn": { + "type": "promise", + "value": 43, + }, + "promiseMultiplePromiseWithArgFirstReturnCalled1": 42, + "promiseMultiplePromiseWithArgLastReturn": { + "type": "promise", + "value": 44, + }, + "promiseMultiplePromiseWithArgLastReturnCalled1": 42, + "promiseMultiplePromiseWithArgLastReturnCalled2": 42, + "promiseMultiplePromiseWithArgNoReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultiplePromiseWithArgNoReturnCalled1": 42, + "promiseMultiplePromiseWithArgNoReturnCalled2": 42, + "promiseMultipleSync": { + "type": "promise", + "value": 42, + }, + "promiseMultipleSyncCalled1": true, + "promiseMultipleSyncError": { + "error": "Error in sync2", + "type": "promise", + }, + "promiseMultipleSyncErrorCalled1": true, + "promiseMultipleSyncLastReturn": { + "type": "promise", + "value": 43, + }, + "promiseMultipleSyncLastReturnCalled1": true, + "promiseMultipleSyncLastReturnCalled2": true, + "promiseMultipleSyncNoReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncNoReturnCalled1": true, + "promiseMultipleSyncNoReturnCalled2": true, + "promiseMultipleSyncWithArg": { + "type": "promise", + "value": 43, + }, + "promiseMultipleSyncWithArgCalled1": 42, + "promiseMultipleSyncWithArgFirstReturn": { + "type": "promise", + "value": 43, + }, + "promiseMultipleSyncWithArgFirstReturnCalled1": 42, + "promiseMultipleSyncWithArgLastReturn": { + "type": "promise", + "value": 44, + }, + "promiseMultipleSyncWithArgLastReturnCalled1": 42, + "promiseMultipleSyncWithArgLastReturnCalled2": 42, + "promiseMultipleSyncWithArgNoReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncWithArgNoReturnCalled1": 42, + "promiseMultipleSyncWithArgNoReturnCalled2": 42, + "promiseNone": { + "type": "promise", + "value": undefined, + }, + "promiseNoneWithArg": { + "type": "promise", + "value": undefined, + }, + "promiseSingleAsyncWithArg": { + "type": "promise", + "value": 42, + }, + "promiseSingleAsyncWithArgCalled1": 42, + "promiseSinglePromiseWithArg": { + "type": "promise", + "value": 43, + }, + "promiseSinglePromiseWithArgCalled1": 42, + "promiseSingleSync": { + "type": "promise", + "value": 42, + }, + "promiseSingleSyncCalled1": true, + "promiseSingleSyncWithArg": { + "type": "promise", + "value": 43, + }, + "promiseSingleSyncWithArgCalled1": 42, + "promiseSingleSyncWithArgNoReturn": { + "type": "promise", + "value": undefined, + }, + "promiseSingleSyncWithArgNoReturnCalled1": 42, + }, + "intercept": { + "callAsyncIntercepted": { + "type": "async", + "value": 6, + }, + "callAsyncInterceptedCall1": [ + 1, + 2, + 3, + ], + "callAsyncInterceptedCall2": [ + 1, + 2, + 3, + ], + "callAsyncInterceptedResult1": 6, + "callAsyncInterceptedResult2": 6, + "callAsyncInterceptedTap1": { + "fn": 3, + "name": "sync", + "type": "sync", + }, + "callAsyncInterceptedTap2": { + "fn": 3, + "name": "sync", + "type": "sync", + }, + "promiseIntercepted": { + "type": "promise", + "value": 6, + }, + "promiseInterceptedCall1": [ + 1, + 2, + 3, + ], + "promiseInterceptedCall2": [ + 1, + 2, + 3, + ], + "promiseInterceptedResult1": 6, + "promiseInterceptedResult2": 6, + "promiseInterceptedTap1": { + "fn": 3, + "name": "sync", + "type": "sync", + }, + "promiseInterceptedTap2": { + "fn": 3, + "name": "sync", + "type": "sync", + }, + }, + "sync": { + "callAsyncIntercepted": { + "type": "async", + "value": 6, + }, + "callAsyncInterceptedCall1": [ + 1, + 2, + 3, + ], + "callAsyncInterceptedCall2": [ + 1, + 2, + 3, + ], + "callAsyncInterceptedTap1": { + "fn": 3, + "name": "sync1", + "type": "sync", + }, + "callAsyncInterceptedTap2": { + "fn": 3, + "name": "sync1", + "type": "sync", + }, + "callAsyncMultipleSync": { + "type": "async", + "value": 42, + }, + "callAsyncMultipleSyncCalled1": true, + "callAsyncMultipleSyncError": { + "error": "Error in sync2", + "type": "async", + }, + "callAsyncMultipleSyncErrorCalled1": true, + "callAsyncMultipleSyncErrorCalled2": true, + "callAsyncMultipleSyncWithArg": { + "type": "async", + "value": 84, + }, + "callAsyncMultipleSyncWithArgCalled1": 42, + "callAsyncMultipleSyncWithArgFirstReturn": { + "type": "async", + "value": 84, + }, + "callAsyncMultipleSyncWithArgFirstReturnCalled1": 42, + "callAsyncMultipleSyncWithArgLastReturn": { + "type": "async", + "value": 85, + }, + "callAsyncMultipleSyncWithArgLastReturnCalled1": 42, + "callAsyncMultipleSyncWithArgLastReturnCalled2": 42, + "callAsyncMultipleSyncWithArgNoReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncWithArgNoReturnCalled1": 42, + "callAsyncMultipleSyncWithArgNoReturnCalled2": 42, + "callAsyncMultipleSyncWithArgs": { + "type": "async", + "value": 129, + }, + "callAsyncMultipleSyncWithArgsCalled1": [ + 42, + 43, + 44, + ], + "callAsyncNone": { + "type": "async", + "value": undefined, + }, + "callAsyncNoneWithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncSingleSync": { + "type": "async", + "value": 42, + }, + "callAsyncSingleSyncCalled": true, + "callAsyncSingleSyncWithArg": { + "type": "async", + "value": 42, + }, + "callAsyncSingleSyncWithArgCalled": 42, + "promiseIntercepted": { + "type": "promise", + "value": 6, + }, + "promiseInterceptedCall1": [ + 1, + 2, + 3, + ], + "promiseInterceptedCall2": [ + 1, + 2, + 3, + ], + "promiseInterceptedTap1": { + "fn": 3, + "name": "sync1", + "type": "sync", + }, + "promiseInterceptedTap2": { + "fn": 3, + "name": "sync1", + "type": "sync", + }, + "promiseMultipleSync": { + "type": "promise", + "value": 42, + }, + "promiseMultipleSyncCalled1": true, + "promiseMultipleSyncError": { + "error": "Error in sync2", + "type": "promise", + }, + "promiseMultipleSyncErrorCalled1": true, + "promiseMultipleSyncErrorCalled2": true, + "promiseMultipleSyncWithArg": { + "type": "promise", + "value": 84, + }, + "promiseMultipleSyncWithArgCalled1": 42, + "promiseMultipleSyncWithArgFirstReturn": { + "type": "promise", + "value": 84, + }, + "promiseMultipleSyncWithArgFirstReturnCalled1": 42, + "promiseMultipleSyncWithArgLastReturn": { + "type": "promise", + "value": 85, + }, + "promiseMultipleSyncWithArgLastReturnCalled1": 42, + "promiseMultipleSyncWithArgLastReturnCalled2": 42, + "promiseMultipleSyncWithArgNoReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncWithArgNoReturnCalled1": 42, + "promiseMultipleSyncWithArgNoReturnCalled2": 42, + "promiseMultipleSyncWithArgs": { + "type": "promise", + "value": 129, + }, + "promiseMultipleSyncWithArgsCalled1": [ + 42, + 43, + 44, + ], + "promiseNone": { + "type": "promise", + "value": undefined, + }, + "promiseNoneWithArg": { + "type": "promise", + "value": undefined, + }, + "promiseSingleSync": { + "type": "promise", + "value": 42, + }, + "promiseSingleSyncCalled": true, + "promiseSingleSyncWithArg": { + "type": "promise", + "value": 42, + }, + "promiseSingleSyncWithArgCalled": 42, + }, +} +`; + +exports[`AsyncSeriesHook should have to correct behavior 1`] = ` +{ + "async": { + "callAsyncMultipleAsyncEarlyError": { + "error": "Error in async2", + "type": "async", + }, + "callAsyncMultipleAsyncEarlyErrorCalled1": true, + "callAsyncMultipleAsyncError": { + "error": "Error in async2", + "type": "async", + }, + "callAsyncMultipleAsyncErrorCalled1": true, + "callAsyncMultipleAsyncLateError": { + "error": "Error in async2", + "type": "async", + }, + "callAsyncMultipleAsyncLateErrorCalled1": true, + "callAsyncMultipleAsyncLateErrorEarlyResult1": { + "error": "Error in async2", + "type": "async", + }, + "callAsyncMultipleAsyncLateErrorEarlyResult1Called1": true, + "callAsyncMultipleAsyncLateErrorEarlyResult2": { + "error": "Error in async2", + "type": "async", + }, + "callAsyncMultipleAsyncLateErrorEarlyResult2Called1": true, + "callAsyncMultipleAsyncWithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleAsyncWithArgCalled1": 42, + "callAsyncMultipleAsyncWithArgCalled2": 42, + "callAsyncMultipleAsyncWithArgFirstReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleAsyncWithArgFirstReturnCalled1": 42, + "callAsyncMultipleAsyncWithArgFirstReturnCalled2": 42, + "callAsyncMultipleAsyncWithArgLastReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleAsyncWithArgLastReturnCalled1": 42, + "callAsyncMultipleAsyncWithArgLastReturnCalled2": 42, + "callAsyncMultipleAsyncWithArgNoReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleAsyncWithArgNoReturnCalled1": 42, + "callAsyncMultipleAsyncWithArgNoReturnCalled2": 42, + "callAsyncMultipleMixed1WithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleMixed1WithArgCalled1": 42, + "callAsyncMultipleMixed1WithArgCalled2": 42, + "callAsyncMultipleMixed1WithArgCalled3": 42, + "callAsyncMultipleMixed2WithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleMixed2WithArgCalled1": 42, + "callAsyncMultipleMixed2WithArgCalled2": 42, + "callAsyncMultipleMixed3WithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleMixed3WithArgCalled1": 42, + "callAsyncMultipleMixed3WithArgCalled2": 42, + "callAsyncMultipleMixed3WithArgCalled3": 42, + "callAsyncMultipleMixedError1WithArg": { + "error": "Error in sync", + "type": "async", + }, + "callAsyncMultipleMixedError1WithArgCalled1": 42, + "callAsyncMultipleMixedError1WithArgCalled2": 42, + "callAsyncMultipleMixedError1WithArgCalled3": 42, + "callAsyncMultipleMixedError2WithArg": { + "error": "Error in promise", + "type": "async", + }, + "callAsyncMultipleMixedError2WithArgCalled1": 42, + "callAsyncMultipleMixedError2WithArgCalled2": 42, + "callAsyncMultipleMixedError3WithArg": { + "error": "Error in async", + "type": "async", + }, + "callAsyncMultipleMixedError3WithArgCalled1": 42, + "callAsyncMultipleMixedLateError": { + "error": "Error in async", + "type": "async", + }, + "callAsyncMultipleMixedLateErrorCalled1": true, + "callAsyncMultiplePromiseEarlyError": { + "error": "Error in async2", + "type": "async", + }, + "callAsyncMultiplePromiseEarlyErrorCalled1": true, + "callAsyncMultiplePromiseError": { + "error": "Error in async2", + "type": "async", + }, + "callAsyncMultiplePromiseErrorCalled1": true, + "callAsyncMultiplePromiseLateError": { + "error": "Error in async2", + "type": "async", + }, + "callAsyncMultiplePromiseLateErrorCalled1": true, + "callAsyncMultiplePromiseWithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncMultiplePromiseWithArgCalled1": 42, + "callAsyncMultiplePromiseWithArgCalled2": 42, + "callAsyncMultiplePromiseWithArgFirstReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultiplePromiseWithArgFirstReturnCalled1": 42, + "callAsyncMultiplePromiseWithArgFirstReturnCalled2": 42, + "callAsyncMultiplePromiseWithArgLastReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultiplePromiseWithArgLastReturnCalled1": 42, + "callAsyncMultiplePromiseWithArgLastReturnCalled2": 42, + "callAsyncMultiplePromiseWithArgNoReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultiplePromiseWithArgNoReturnCalled1": 42, + "callAsyncMultiplePromiseWithArgNoReturnCalled2": 42, + "callAsyncMultipleSync": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncCalled1": true, + "callAsyncMultipleSyncCalled2": true, + "callAsyncMultipleSyncError": { + "error": "Error in sync2", + "type": "async", + }, + "callAsyncMultipleSyncErrorCalled1": true, + "callAsyncMultipleSyncLastReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncLastReturnCalled1": true, + "callAsyncMultipleSyncLastReturnCalled2": true, + "callAsyncMultipleSyncNoReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncNoReturnCalled1": true, + "callAsyncMultipleSyncNoReturnCalled2": true, + "callAsyncMultipleSyncWithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncWithArgCalled1": 42, + "callAsyncMultipleSyncWithArgCalled2": 42, + "callAsyncMultipleSyncWithArgFirstReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncWithArgFirstReturnCalled1": 42, + "callAsyncMultipleSyncWithArgFirstReturnCalled2": 42, + "callAsyncMultipleSyncWithArgLastReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncWithArgLastReturnCalled1": 42, + "callAsyncMultipleSyncWithArgLastReturnCalled2": 42, + "callAsyncMultipleSyncWithArgNoReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncWithArgNoReturnCalled1": 42, + "callAsyncMultipleSyncWithArgNoReturnCalled2": 42, + "callAsyncNone": { + "type": "async", + "value": undefined, + }, + "callAsyncNoneWithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncSingleAsyncWithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncSingleAsyncWithArgCalled1": 42, + "callAsyncSinglePromiseWithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncSinglePromiseWithArgCalled1": 42, + "callAsyncSingleSync": { + "type": "async", + "value": undefined, + }, + "callAsyncSingleSyncCalled1": true, + "callAsyncSingleSyncWithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncSingleSyncWithArgCalled1": 42, + "callAsyncSingleSyncWithArgNoReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncSingleSyncWithArgNoReturnCalled1": 42, + "promiseMultipleAsyncEarlyError": { + "error": "Error in async2", + "type": "promise", + }, + "promiseMultipleAsyncEarlyErrorCalled1": true, + "promiseMultipleAsyncError": { + "error": "Error in async2", + "type": "promise", + }, + "promiseMultipleAsyncErrorCalled1": true, + "promiseMultipleAsyncLateError": { + "error": "Error in async2", + "type": "promise", + }, + "promiseMultipleAsyncLateErrorCalled1": true, + "promiseMultipleAsyncLateErrorEarlyResult1": { + "error": "Error in async2", + "type": "promise", + }, + "promiseMultipleAsyncLateErrorEarlyResult1Called1": true, + "promiseMultipleAsyncLateErrorEarlyResult2": { + "error": "Error in async2", + "type": "promise", + }, + "promiseMultipleAsyncLateErrorEarlyResult2Called1": true, + "promiseMultipleAsyncWithArg": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleAsyncWithArgCalled1": 42, + "promiseMultipleAsyncWithArgCalled2": 42, + "promiseMultipleAsyncWithArgFirstReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleAsyncWithArgFirstReturnCalled1": 42, + "promiseMultipleAsyncWithArgFirstReturnCalled2": 42, + "promiseMultipleAsyncWithArgLastReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleAsyncWithArgLastReturnCalled1": 42, + "promiseMultipleAsyncWithArgLastReturnCalled2": 42, + "promiseMultipleAsyncWithArgNoReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleAsyncWithArgNoReturnCalled1": 42, + "promiseMultipleAsyncWithArgNoReturnCalled2": 42, + "promiseMultipleMixed1WithArg": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleMixed1WithArgCalled1": 42, + "promiseMultipleMixed1WithArgCalled2": 42, + "promiseMultipleMixed1WithArgCalled3": 42, + "promiseMultipleMixed2WithArg": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleMixed2WithArgCalled1": 42, + "promiseMultipleMixed2WithArgCalled2": 42, + "promiseMultipleMixed3WithArg": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleMixed3WithArgCalled1": 42, + "promiseMultipleMixed3WithArgCalled2": 42, + "promiseMultipleMixed3WithArgCalled3": 42, + "promiseMultipleMixedError1WithArg": { + "error": "Error in sync", + "type": "promise", + }, + "promiseMultipleMixedError1WithArgCalled1": 42, + "promiseMultipleMixedError1WithArgCalled2": 42, + "promiseMultipleMixedError1WithArgCalled3": 42, + "promiseMultipleMixedError2WithArg": { + "error": "Error in promise", + "type": "promise", + }, + "promiseMultipleMixedError2WithArgCalled1": 42, + "promiseMultipleMixedError2WithArgCalled2": 42, + "promiseMultipleMixedError3WithArg": { + "error": "Error in async", + "type": "promise", + }, + "promiseMultipleMixedError3WithArgCalled1": 42, + "promiseMultipleMixedLateError": { + "error": "Error in async", + "type": "promise", + }, + "promiseMultipleMixedLateErrorCalled1": true, + "promiseMultiplePromiseEarlyError": { + "error": "Error in async2", + "type": "promise", + }, + "promiseMultiplePromiseEarlyErrorCalled1": true, + "promiseMultiplePromiseError": { + "error": "Error in async2", + "type": "promise", + }, + "promiseMultiplePromiseErrorCalled1": true, + "promiseMultiplePromiseLateError": { + "error": "Error in async2", + "type": "promise", + }, + "promiseMultiplePromiseLateErrorCalled1": true, + "promiseMultiplePromiseWithArg": { + "type": "promise", + "value": undefined, + }, + "promiseMultiplePromiseWithArgCalled1": 42, + "promiseMultiplePromiseWithArgCalled2": 42, + "promiseMultiplePromiseWithArgFirstReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultiplePromiseWithArgFirstReturnCalled1": 42, + "promiseMultiplePromiseWithArgFirstReturnCalled2": 42, + "promiseMultiplePromiseWithArgLastReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultiplePromiseWithArgLastReturnCalled1": 42, + "promiseMultiplePromiseWithArgLastReturnCalled2": 42, + "promiseMultiplePromiseWithArgNoReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultiplePromiseWithArgNoReturnCalled1": 42, + "promiseMultiplePromiseWithArgNoReturnCalled2": 42, + "promiseMultipleSync": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncCalled1": true, + "promiseMultipleSyncCalled2": true, + "promiseMultipleSyncError": { + "error": "Error in sync2", + "type": "promise", + }, + "promiseMultipleSyncErrorCalled1": true, + "promiseMultipleSyncLastReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncLastReturnCalled1": true, + "promiseMultipleSyncLastReturnCalled2": true, + "promiseMultipleSyncNoReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncNoReturnCalled1": true, + "promiseMultipleSyncNoReturnCalled2": true, + "promiseMultipleSyncWithArg": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncWithArgCalled1": 42, + "promiseMultipleSyncWithArgCalled2": 42, + "promiseMultipleSyncWithArgFirstReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncWithArgFirstReturnCalled1": 42, + "promiseMultipleSyncWithArgFirstReturnCalled2": 42, + "promiseMultipleSyncWithArgLastReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncWithArgLastReturnCalled1": 42, + "promiseMultipleSyncWithArgLastReturnCalled2": 42, + "promiseMultipleSyncWithArgNoReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncWithArgNoReturnCalled1": 42, + "promiseMultipleSyncWithArgNoReturnCalled2": 42, + "promiseNone": { + "type": "promise", + "value": undefined, + }, + "promiseNoneWithArg": { + "type": "promise", + "value": undefined, + }, + "promiseSingleAsyncWithArg": { + "type": "promise", + "value": undefined, + }, + "promiseSingleAsyncWithArgCalled1": 42, + "promiseSinglePromiseWithArg": { + "type": "promise", + "value": undefined, + }, + "promiseSinglePromiseWithArgCalled1": 42, + "promiseSingleSync": { + "type": "promise", + "value": undefined, + }, + "promiseSingleSyncCalled1": true, + "promiseSingleSyncWithArg": { + "type": "promise", + "value": undefined, + }, + "promiseSingleSyncWithArgCalled1": 42, + "promiseSingleSyncWithArgNoReturn": { + "type": "promise", + "value": undefined, + }, + "promiseSingleSyncWithArgNoReturnCalled1": 42, + }, + "intercept": { + "callAsyncIntercepted": { + "type": "async", + "value": undefined, + }, + "callAsyncInterceptedCall1": [ + 1, + 2, + 3, + ], + "callAsyncInterceptedCall2": [ + 1, + 2, + 3, + ], + "callAsyncInterceptedDone1": true, + "callAsyncInterceptedDone2": true, + "callAsyncInterceptedTap1": { + "fn": 2, + "name": "promise", + "type": "promise", + }, + "callAsyncInterceptedTap2": { + "fn": 3, + "name": "sync", + "type": "sync", + }, + "promiseIntercepted": { + "type": "promise", + "value": undefined, + }, + "promiseInterceptedCall1": [ + 1, + 2, + 3, + ], + "promiseInterceptedCall2": [ + 1, + 2, + 3, + ], + "promiseInterceptedDone1": true, + "promiseInterceptedDone2": true, + "promiseInterceptedTap1": { + "fn": 2, + "name": "promise", + "type": "promise", + }, + "promiseInterceptedTap2": { + "fn": 3, + "name": "sync", + "type": "sync", + }, + }, + "sync": { + "callAsyncIntercepted": { + "type": "async", + "value": undefined, + }, + "callAsyncInterceptedCall1": [ + 1, + 2, + 3, + ], + "callAsyncInterceptedCall2": [ + 1, + 2, + 3, + ], + "callAsyncInterceptedTap1": { + "fn": 2, + "name": "sync2", + "type": "sync", + }, + "callAsyncInterceptedTap2": { + "fn": 3, + "name": "sync1", + "type": "sync", + }, + "callAsyncMultipleSync": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncCalled1": true, + "callAsyncMultipleSyncCalled2": true, + "callAsyncMultipleSyncError": { + "error": "Error in sync2", + "type": "async", + }, + "callAsyncMultipleSyncErrorCalled1": true, + "callAsyncMultipleSyncErrorCalled2": true, + "callAsyncMultipleSyncWithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncWithArgCalled1": 42, + "callAsyncMultipleSyncWithArgCalled2": 42, + "callAsyncMultipleSyncWithArgFirstReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncWithArgFirstReturnCalled1": 42, + "callAsyncMultipleSyncWithArgFirstReturnCalled2": 42, + "callAsyncMultipleSyncWithArgLastReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncWithArgLastReturnCalled1": 42, + "callAsyncMultipleSyncWithArgLastReturnCalled2": 42, + "callAsyncMultipleSyncWithArgNoReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncWithArgNoReturnCalled1": 42, + "callAsyncMultipleSyncWithArgNoReturnCalled2": 42, + "callAsyncMultipleSyncWithArgs": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncWithArgsCalled1": [ + 42, + 43, + 44, + ], + "callAsyncMultipleSyncWithArgsCalled2": [ + 42, + 43, + 44, + ], + "callAsyncNone": { + "type": "async", + "value": undefined, + }, + "callAsyncNoneWithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncSingleSync": { + "type": "async", + "value": undefined, + }, + "callAsyncSingleSyncCalled": true, + "callAsyncSingleSyncWithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncSingleSyncWithArgCalled": 42, + "promiseIntercepted": { + "type": "promise", + "value": undefined, + }, + "promiseInterceptedCall1": [ + 1, + 2, + 3, + ], + "promiseInterceptedCall2": [ + 1, + 2, + 3, + ], + "promiseInterceptedTap1": { + "fn": 2, + "name": "sync2", + "type": "sync", + }, + "promiseInterceptedTap2": { + "fn": 3, + "name": "sync1", + "type": "sync", + }, + "promiseMultipleSync": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncCalled1": true, + "promiseMultipleSyncCalled2": true, + "promiseMultipleSyncError": { + "error": "Error in sync2", + "type": "promise", + }, + "promiseMultipleSyncErrorCalled1": true, + "promiseMultipleSyncErrorCalled2": true, + "promiseMultipleSyncWithArg": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncWithArgCalled1": 42, + "promiseMultipleSyncWithArgCalled2": 42, + "promiseMultipleSyncWithArgFirstReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncWithArgFirstReturnCalled1": 42, + "promiseMultipleSyncWithArgFirstReturnCalled2": 42, + "promiseMultipleSyncWithArgLastReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncWithArgLastReturnCalled1": 42, + "promiseMultipleSyncWithArgLastReturnCalled2": 42, + "promiseMultipleSyncWithArgNoReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncWithArgNoReturnCalled1": 42, + "promiseMultipleSyncWithArgNoReturnCalled2": 42, + "promiseMultipleSyncWithArgs": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncWithArgsCalled1": [ + 42, + 43, + 44, + ], + "promiseMultipleSyncWithArgsCalled2": [ + 42, + 43, + 44, + ], + "promiseNone": { + "type": "promise", + "value": undefined, + }, + "promiseNoneWithArg": { + "type": "promise", + "value": undefined, + }, + "promiseSingleSync": { + "type": "promise", + "value": undefined, + }, + "promiseSingleSyncCalled": true, + "promiseSingleSyncWithArg": { + "type": "promise", + "value": undefined, + }, + "promiseSingleSyncWithArgCalled": 42, + }, +} +`; + +exports[`AsyncSeriesWaterfallHook should have to correct behavior 1`] = ` +{ + "async": { + "callAsyncMultipleAsyncEarlyError": { + "error": "Waterfall hooks must have at least one argument", + }, + "callAsyncMultipleAsyncError": { + "error": "Waterfall hooks must have at least one argument", + }, + "callAsyncMultipleAsyncLateError": { + "error": "Waterfall hooks must have at least one argument", + }, + "callAsyncMultipleAsyncLateErrorEarlyResult1": { + "error": "Waterfall hooks must have at least one argument", + }, + "callAsyncMultipleAsyncLateErrorEarlyResult2": { + "error": "Waterfall hooks must have at least one argument", + }, + "callAsyncMultipleAsyncWithArg": { + "type": "async", + "value": 45, + }, + "callAsyncMultipleAsyncWithArgCalled1": 42, + "callAsyncMultipleAsyncWithArgCalled2": 43, + "callAsyncMultipleAsyncWithArgFirstReturn": { + "type": "async", + "value": 43, + }, + "callAsyncMultipleAsyncWithArgFirstReturnCalled1": 42, + "callAsyncMultipleAsyncWithArgFirstReturnCalled2": 43, + "callAsyncMultipleAsyncWithArgLastReturn": { + "type": "async", + "value": 44, + }, + "callAsyncMultipleAsyncWithArgLastReturnCalled1": 42, + "callAsyncMultipleAsyncWithArgLastReturnCalled2": 42, + "callAsyncMultipleAsyncWithArgNoReturn": { + "type": "async", + "value": 42, + }, + "callAsyncMultipleAsyncWithArgNoReturnCalled1": 42, + "callAsyncMultipleAsyncWithArgNoReturnCalled2": 42, + "callAsyncMultipleMixed1WithArg": { + "type": "async", + "value": 48, + }, + "callAsyncMultipleMixed1WithArgCalled1": 42, + "callAsyncMultipleMixed1WithArgCalled2": 43, + "callAsyncMultipleMixed1WithArgCalled3": 45, + "callAsyncMultipleMixed2WithArg": { + "type": "async", + "value": 45, + }, + "callAsyncMultipleMixed2WithArgCalled1": 42, + "callAsyncMultipleMixed2WithArgCalled2": 43, + "callAsyncMultipleMixed3WithArg": { + "type": "async", + "value": 48, + }, + "callAsyncMultipleMixed3WithArgCalled1": 42, + "callAsyncMultipleMixed3WithArgCalled2": 43, + "callAsyncMultipleMixed3WithArgCalled3": 45, + "callAsyncMultipleMixedError1WithArg": { + "error": "Error in sync", + "type": "async", + }, + "callAsyncMultipleMixedError1WithArgCalled1": 42, + "callAsyncMultipleMixedError1WithArgCalled2": 42, + "callAsyncMultipleMixedError1WithArgCalled3": 43, + "callAsyncMultipleMixedError2WithArg": { + "error": "Error in promise", + "type": "async", + }, + "callAsyncMultipleMixedError2WithArgCalled1": 42, + "callAsyncMultipleMixedError2WithArgCalled2": 42, + "callAsyncMultipleMixedError3WithArg": { + "error": "Error in async", + "type": "async", + }, + "callAsyncMultipleMixedError3WithArgCalled1": 42, + "callAsyncMultipleMixedLateError": { + "error": "Waterfall hooks must have at least one argument", + }, + "callAsyncMultiplePromiseEarlyError": { + "error": "Waterfall hooks must have at least one argument", + }, + "callAsyncMultiplePromiseError": { + "error": "Waterfall hooks must have at least one argument", + }, + "callAsyncMultiplePromiseLateError": { + "error": "Waterfall hooks must have at least one argument", + }, + "callAsyncMultiplePromiseWithArg": { + "type": "async", + "value": 45, + }, + "callAsyncMultiplePromiseWithArgCalled1": 42, + "callAsyncMultiplePromiseWithArgCalled2": 43, + "callAsyncMultiplePromiseWithArgFirstReturn": { + "type": "async", + "value": 43, + }, + "callAsyncMultiplePromiseWithArgFirstReturnCalled1": 42, + "callAsyncMultiplePromiseWithArgFirstReturnCalled2": 43, + "callAsyncMultiplePromiseWithArgLastReturn": { + "type": "async", + "value": 44, + }, + "callAsyncMultiplePromiseWithArgLastReturnCalled1": 42, + "callAsyncMultiplePromiseWithArgLastReturnCalled2": 42, + "callAsyncMultiplePromiseWithArgNoReturn": { + "type": "async", + "value": 42, + }, + "callAsyncMultiplePromiseWithArgNoReturnCalled1": 42, + "callAsyncMultiplePromiseWithArgNoReturnCalled2": 42, + "callAsyncMultipleSync": { + "error": "Waterfall hooks must have at least one argument", + }, + "callAsyncMultipleSyncError": { + "error": "Waterfall hooks must have at least one argument", + }, + "callAsyncMultipleSyncLastReturn": { + "error": "Waterfall hooks must have at least one argument", + }, + "callAsyncMultipleSyncNoReturn": { + "error": "Waterfall hooks must have at least one argument", + }, + "callAsyncMultipleSyncWithArg": { + "type": "async", + "value": 45, + }, + "callAsyncMultipleSyncWithArgCalled1": 42, + "callAsyncMultipleSyncWithArgCalled2": 43, + "callAsyncMultipleSyncWithArgFirstReturn": { + "type": "async", + "value": 43, + }, + "callAsyncMultipleSyncWithArgFirstReturnCalled1": 42, + "callAsyncMultipleSyncWithArgFirstReturnCalled2": 43, + "callAsyncMultipleSyncWithArgLastReturn": { + "type": "async", + "value": 44, + }, + "callAsyncMultipleSyncWithArgLastReturnCalled1": 42, + "callAsyncMultipleSyncWithArgLastReturnCalled2": 42, + "callAsyncMultipleSyncWithArgNoReturn": { + "type": "async", + "value": 42, + }, + "callAsyncMultipleSyncWithArgNoReturnCalled1": 42, + "callAsyncMultipleSyncWithArgNoReturnCalled2": 42, + "callAsyncNone": { + "error": "Waterfall hooks must have at least one argument", + }, + "callAsyncNoneWithArg": { + "type": "async", + "value": 42, + }, + "callAsyncSingleAsyncWithArg": { + "type": "async", + "value": 42, + }, + "callAsyncSingleAsyncWithArgCalled1": 42, + "callAsyncSinglePromiseWithArg": { + "type": "async", + "value": 43, + }, + "callAsyncSinglePromiseWithArgCalled1": 42, + "callAsyncSingleSync": { + "error": "Waterfall hooks must have at least one argument", + }, + "callAsyncSingleSyncWithArg": { + "type": "async", + "value": 43, + }, + "callAsyncSingleSyncWithArgCalled1": 42, + "callAsyncSingleSyncWithArgNoReturn": { + "type": "async", + "value": 42, + }, + "callAsyncSingleSyncWithArgNoReturnCalled1": 42, + "promiseMultipleAsyncEarlyError": { + "error": "Waterfall hooks must have at least one argument", + }, + "promiseMultipleAsyncError": { + "error": "Waterfall hooks must have at least one argument", + }, + "promiseMultipleAsyncLateError": { + "error": "Waterfall hooks must have at least one argument", + }, + "promiseMultipleAsyncLateErrorEarlyResult1": { + "error": "Waterfall hooks must have at least one argument", + }, + "promiseMultipleAsyncLateErrorEarlyResult2": { + "error": "Waterfall hooks must have at least one argument", + }, + "promiseMultipleAsyncWithArg": { + "type": "promise", + "value": 45, + }, + "promiseMultipleAsyncWithArgCalled1": 42, + "promiseMultipleAsyncWithArgCalled2": 43, + "promiseMultipleAsyncWithArgFirstReturn": { + "type": "promise", + "value": 43, + }, + "promiseMultipleAsyncWithArgFirstReturnCalled1": 42, + "promiseMultipleAsyncWithArgFirstReturnCalled2": 43, + "promiseMultipleAsyncWithArgLastReturn": { + "type": "promise", + "value": 44, + }, + "promiseMultipleAsyncWithArgLastReturnCalled1": 42, + "promiseMultipleAsyncWithArgLastReturnCalled2": 42, + "promiseMultipleAsyncWithArgNoReturn": { + "type": "promise", + "value": 42, + }, + "promiseMultipleAsyncWithArgNoReturnCalled1": 42, + "promiseMultipleAsyncWithArgNoReturnCalled2": 42, + "promiseMultipleMixed1WithArg": { + "type": "promise", + "value": 48, + }, + "promiseMultipleMixed1WithArgCalled1": 42, + "promiseMultipleMixed1WithArgCalled2": 43, + "promiseMultipleMixed1WithArgCalled3": 45, + "promiseMultipleMixed2WithArg": { + "type": "promise", + "value": 45, + }, + "promiseMultipleMixed2WithArgCalled1": 42, + "promiseMultipleMixed2WithArgCalled2": 43, + "promiseMultipleMixed3WithArg": { + "type": "promise", + "value": 48, + }, + "promiseMultipleMixed3WithArgCalled1": 42, + "promiseMultipleMixed3WithArgCalled2": 43, + "promiseMultipleMixed3WithArgCalled3": 45, + "promiseMultipleMixedError1WithArg": { + "error": "Error in sync", + "type": "promise", + }, + "promiseMultipleMixedError1WithArgCalled1": 42, + "promiseMultipleMixedError1WithArgCalled2": 42, + "promiseMultipleMixedError1WithArgCalled3": 43, + "promiseMultipleMixedError2WithArg": { + "error": "Error in promise", + "type": "promise", + }, + "promiseMultipleMixedError2WithArgCalled1": 42, + "promiseMultipleMixedError2WithArgCalled2": 42, + "promiseMultipleMixedError3WithArg": { + "error": "Error in async", + "type": "promise", + }, + "promiseMultipleMixedError3WithArgCalled1": 42, + "promiseMultipleMixedLateError": { + "error": "Waterfall hooks must have at least one argument", + }, + "promiseMultiplePromiseEarlyError": { + "error": "Waterfall hooks must have at least one argument", + }, + "promiseMultiplePromiseError": { + "error": "Waterfall hooks must have at least one argument", + }, + "promiseMultiplePromiseLateError": { + "error": "Waterfall hooks must have at least one argument", + }, + "promiseMultiplePromiseWithArg": { + "type": "promise", + "value": 45, + }, + "promiseMultiplePromiseWithArgCalled1": 42, + "promiseMultiplePromiseWithArgCalled2": 43, + "promiseMultiplePromiseWithArgFirstReturn": { + "type": "promise", + "value": 43, + }, + "promiseMultiplePromiseWithArgFirstReturnCalled1": 42, + "promiseMultiplePromiseWithArgFirstReturnCalled2": 43, + "promiseMultiplePromiseWithArgLastReturn": { + "type": "promise", + "value": 44, + }, + "promiseMultiplePromiseWithArgLastReturnCalled1": 42, + "promiseMultiplePromiseWithArgLastReturnCalled2": 42, + "promiseMultiplePromiseWithArgNoReturn": { + "type": "promise", + "value": 42, + }, + "promiseMultiplePromiseWithArgNoReturnCalled1": 42, + "promiseMultiplePromiseWithArgNoReturnCalled2": 42, + "promiseMultipleSync": { + "error": "Waterfall hooks must have at least one argument", + }, + "promiseMultipleSyncError": { + "error": "Waterfall hooks must have at least one argument", + }, + "promiseMultipleSyncLastReturn": { + "error": "Waterfall hooks must have at least one argument", + }, + "promiseMultipleSyncNoReturn": { + "error": "Waterfall hooks must have at least one argument", + }, + "promiseMultipleSyncWithArg": { + "type": "promise", + "value": 45, + }, + "promiseMultipleSyncWithArgCalled1": 42, + "promiseMultipleSyncWithArgCalled2": 43, + "promiseMultipleSyncWithArgFirstReturn": { + "type": "promise", + "value": 43, + }, + "promiseMultipleSyncWithArgFirstReturnCalled1": 42, + "promiseMultipleSyncWithArgFirstReturnCalled2": 43, + "promiseMultipleSyncWithArgLastReturn": { + "type": "promise", + "value": 44, + }, + "promiseMultipleSyncWithArgLastReturnCalled1": 42, + "promiseMultipleSyncWithArgLastReturnCalled2": 42, + "promiseMultipleSyncWithArgNoReturn": { + "type": "promise", + "value": 42, + }, + "promiseMultipleSyncWithArgNoReturnCalled1": 42, + "promiseMultipleSyncWithArgNoReturnCalled2": 42, + "promiseNone": { + "error": "Waterfall hooks must have at least one argument", + }, + "promiseNoneWithArg": { + "type": "promise", + "value": 42, + }, + "promiseSingleAsyncWithArg": { + "type": "promise", + "value": 42, + }, + "promiseSingleAsyncWithArgCalled1": 42, + "promiseSinglePromiseWithArg": { + "type": "promise", + "value": 43, + }, + "promiseSinglePromiseWithArgCalled1": 42, + "promiseSingleSync": { + "error": "Waterfall hooks must have at least one argument", + }, + "promiseSingleSyncWithArg": { + "type": "promise", + "value": 43, + }, + "promiseSingleSyncWithArgCalled1": 42, + "promiseSingleSyncWithArgNoReturn": { + "type": "promise", + "value": 42, + }, + "promiseSingleSyncWithArgNoReturnCalled1": 42, + }, + "intercept": { + "callAsyncIntercepted": { + "type": "async", + "value": 9, + }, + "callAsyncInterceptedCall1": [ + 1, + 2, + 3, + ], + "callAsyncInterceptedCall2": [ + 1, + 2, + 3, + ], + "callAsyncInterceptedResult1": 9, + "callAsyncInterceptedResult2": 9, + "callAsyncInterceptedTap1": { + "fn": 2, + "name": "promise", + "type": "promise", + }, + "callAsyncInterceptedTap2": { + "fn": 3, + "name": "sync", + "type": "sync", + }, + "promiseIntercepted": { + "type": "promise", + "value": 9, + }, + "promiseInterceptedCall1": [ + 1, + 2, + 3, + ], + "promiseInterceptedCall2": [ + 1, + 2, + 3, + ], + "promiseInterceptedResult1": 9, + "promiseInterceptedResult2": 9, + "promiseInterceptedTap1": { + "fn": 2, + "name": "promise", + "type": "promise", + }, + "promiseInterceptedTap2": { + "fn": 3, + "name": "sync", + "type": "sync", + }, + }, + "sync": { + "callAsyncIntercepted": { + "type": "async", + "value": 9, + }, + "callAsyncInterceptedCall1": [ + 1, + 2, + 3, + ], + "callAsyncInterceptedCall2": [ + 1, + 2, + 3, + ], + "callAsyncInterceptedTap1": { + "fn": 2, + "name": "sync2", + "type": "sync", + }, + "callAsyncInterceptedTap2": { + "fn": 3, + "name": "sync1", + "type": "sync", + }, + "callAsyncMultipleSync": { + "error": "Waterfall hooks must have at least one argument", + }, + "callAsyncMultipleSyncError": { + "error": "Waterfall hooks must have at least one argument", + }, + "callAsyncMultipleSyncWithArg": { + "type": "async", + "value": 127, + }, + "callAsyncMultipleSyncWithArgCalled1": 42, + "callAsyncMultipleSyncWithArgCalled2": 84, + "callAsyncMultipleSyncWithArgFirstReturn": { + "type": "async", + "value": 84, + }, + "callAsyncMultipleSyncWithArgFirstReturnCalled1": 42, + "callAsyncMultipleSyncWithArgFirstReturnCalled2": 84, + "callAsyncMultipleSyncWithArgLastReturn": { + "type": "async", + "value": 85, + }, + "callAsyncMultipleSyncWithArgLastReturnCalled1": 42, + "callAsyncMultipleSyncWithArgLastReturnCalled2": 42, + "callAsyncMultipleSyncWithArgNoReturn": { + "type": "async", + "value": 42, + }, + "callAsyncMultipleSyncWithArgNoReturnCalled1": 42, + "callAsyncMultipleSyncWithArgNoReturnCalled2": 42, + "callAsyncMultipleSyncWithArgs": { + "type": "async", + "value": 217, + }, + "callAsyncMultipleSyncWithArgsCalled1": [ + 42, + 43, + 44, + ], + "callAsyncMultipleSyncWithArgsCalled2": [ + 129, + 43, + 44, + ], + "callAsyncNone": { + "error": "Waterfall hooks must have at least one argument", + }, + "callAsyncNoneWithArg": { + "type": "async", + "value": 42, + }, + "callAsyncSingleSync": { + "error": "Waterfall hooks must have at least one argument", + }, + "callAsyncSingleSyncWithArg": { + "type": "async", + "value": 42, + }, + "callAsyncSingleSyncWithArgCalled": 42, + "promiseIntercepted": { + "type": "promise", + "value": 9, + }, + "promiseInterceptedCall1": [ + 1, + 2, + 3, + ], + "promiseInterceptedCall2": [ + 1, + 2, + 3, + ], + "promiseInterceptedTap1": { + "fn": 2, + "name": "sync2", + "type": "sync", + }, + "promiseInterceptedTap2": { + "fn": 3, + "name": "sync1", + "type": "sync", + }, + "promiseMultipleSync": { + "error": "Waterfall hooks must have at least one argument", + }, + "promiseMultipleSyncError": { + "error": "Waterfall hooks must have at least one argument", + }, + "promiseMultipleSyncWithArg": { + "type": "promise", + "value": 127, + }, + "promiseMultipleSyncWithArgCalled1": 42, + "promiseMultipleSyncWithArgCalled2": 84, + "promiseMultipleSyncWithArgFirstReturn": { + "type": "promise", + "value": 84, + }, + "promiseMultipleSyncWithArgFirstReturnCalled1": 42, + "promiseMultipleSyncWithArgFirstReturnCalled2": 84, + "promiseMultipleSyncWithArgLastReturn": { + "type": "promise", + "value": 85, + }, + "promiseMultipleSyncWithArgLastReturnCalled1": 42, + "promiseMultipleSyncWithArgLastReturnCalled2": 42, + "promiseMultipleSyncWithArgNoReturn": { + "type": "promise", + "value": 42, + }, + "promiseMultipleSyncWithArgNoReturnCalled1": 42, + "promiseMultipleSyncWithArgNoReturnCalled2": 42, + "promiseMultipleSyncWithArgs": { + "type": "promise", + "value": 217, + }, + "promiseMultipleSyncWithArgsCalled1": [ + 42, + 43, + 44, + ], + "promiseMultipleSyncWithArgsCalled2": [ + 129, + 43, + 44, + ], + "promiseNone": { + "error": "Waterfall hooks must have at least one argument", + }, + "promiseNoneWithArg": { + "type": "promise", + "value": 42, + }, + "promiseSingleSync": { + "error": "Waterfall hooks must have at least one argument", + }, + "promiseSingleSyncWithArg": { + "type": "promise", + "value": 42, + }, + "promiseSingleSyncWithArgCalled": 42, + }, +} +`; diff --git a/test/__snapshots__/SyncHooks.test.js.snap b/test/__snapshots__/SyncHooks.test.js.snap new file mode 100644 index 0000000..085b8c1 --- /dev/null +++ b/test/__snapshots__/SyncHooks.test.js.snap @@ -0,0 +1,789 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`SyncBailHook should have to correct behavior 1`] = ` +{ + "async": {}, + "intercept": {}, + "sync": { + "callAsyncIntercepted": { + "type": "async", + "value": 6, + }, + "callAsyncInterceptedCall1": [ + 1, + 2, + 3, + ], + "callAsyncInterceptedCall2": [ + 1, + 2, + 3, + ], + "callAsyncInterceptedTap1": { + "fn": 3, + "name": "sync1", + "type": "sync", + }, + "callAsyncInterceptedTap2": { + "fn": 3, + "name": "sync1", + "type": "sync", + }, + "callAsyncMultipleSync": { + "type": "async", + "value": 42, + }, + "callAsyncMultipleSyncCalled1": true, + "callAsyncMultipleSyncError": { + "error": "Error in sync2", + "type": "async", + }, + "callAsyncMultipleSyncErrorCalled1": true, + "callAsyncMultipleSyncErrorCalled2": true, + "callAsyncMultipleSyncWithArg": { + "type": "async", + "value": 84, + }, + "callAsyncMultipleSyncWithArgCalled1": 42, + "callAsyncMultipleSyncWithArgFirstReturn": { + "type": "async", + "value": 84, + }, + "callAsyncMultipleSyncWithArgFirstReturnCalled1": 42, + "callAsyncMultipleSyncWithArgLastReturn": { + "type": "async", + "value": 85, + }, + "callAsyncMultipleSyncWithArgLastReturnCalled1": 42, + "callAsyncMultipleSyncWithArgLastReturnCalled2": 42, + "callAsyncMultipleSyncWithArgNoReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncWithArgNoReturnCalled1": 42, + "callAsyncMultipleSyncWithArgNoReturnCalled2": 42, + "callAsyncMultipleSyncWithArgs": { + "type": "async", + "value": 129, + }, + "callAsyncMultipleSyncWithArgsCalled1": [ + 42, + 43, + 44, + ], + "callAsyncNone": { + "type": "async", + "value": undefined, + }, + "callAsyncNoneWithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncSingleSync": { + "type": "async", + "value": 42, + }, + "callAsyncSingleSyncCalled": true, + "callAsyncSingleSyncWithArg": { + "type": "async", + "value": 42, + }, + "callAsyncSingleSyncWithArgCalled": 42, + "callIntercepted": { + "type": "return", + "value": 6, + }, + "callInterceptedCall1": [ + 1, + 2, + 3, + ], + "callInterceptedCall2": [ + 1, + 2, + 3, + ], + "callInterceptedTap1": { + "fn": 3, + "name": "sync1", + "type": "sync", + }, + "callInterceptedTap2": { + "fn": 3, + "name": "sync1", + "type": "sync", + }, + "callMultipleSync": { + "type": "return", + "value": 42, + }, + "callMultipleSyncCalled1": true, + "callMultipleSyncError": { + "error": "Error in sync2", + }, + "callMultipleSyncErrorCalled1": true, + "callMultipleSyncErrorCalled2": true, + "callMultipleSyncWithArg": { + "type": "return", + "value": 84, + }, + "callMultipleSyncWithArgCalled1": 42, + "callMultipleSyncWithArgFirstReturn": { + "type": "return", + "value": 84, + }, + "callMultipleSyncWithArgFirstReturnCalled1": 42, + "callMultipleSyncWithArgLastReturn": { + "type": "return", + "value": 85, + }, + "callMultipleSyncWithArgLastReturnCalled1": 42, + "callMultipleSyncWithArgLastReturnCalled2": 42, + "callMultipleSyncWithArgNoReturn": { + "type": "no result", + }, + "callMultipleSyncWithArgNoReturnCalled1": 42, + "callMultipleSyncWithArgNoReturnCalled2": 42, + "callMultipleSyncWithArgs": { + "type": "return", + "value": 129, + }, + "callMultipleSyncWithArgsCalled1": [ + 42, + 43, + 44, + ], + "callNone": { + "type": "no result", + }, + "callNoneWithArg": { + "type": "no result", + }, + "callSingleSync": { + "type": "return", + "value": 42, + }, + "callSingleSyncCalled": true, + "callSingleSyncWithArg": { + "type": "return", + "value": 42, + }, + "callSingleSyncWithArgCalled": 42, + "promiseIntercepted": { + "type": "promise", + "value": 6, + }, + "promiseInterceptedCall1": [ + 1, + 2, + 3, + ], + "promiseInterceptedCall2": [ + 1, + 2, + 3, + ], + "promiseInterceptedTap1": { + "fn": 3, + "name": "sync1", + "type": "sync", + }, + "promiseInterceptedTap2": { + "fn": 3, + "name": "sync1", + "type": "sync", + }, + "promiseMultipleSync": { + "type": "promise", + "value": 42, + }, + "promiseMultipleSyncCalled1": true, + "promiseMultipleSyncError": { + "error": "Error in sync2", + "type": "promise", + }, + "promiseMultipleSyncErrorCalled1": true, + "promiseMultipleSyncErrorCalled2": true, + "promiseMultipleSyncWithArg": { + "type": "promise", + "value": 84, + }, + "promiseMultipleSyncWithArgCalled1": 42, + "promiseMultipleSyncWithArgFirstReturn": { + "type": "promise", + "value": 84, + }, + "promiseMultipleSyncWithArgFirstReturnCalled1": 42, + "promiseMultipleSyncWithArgLastReturn": { + "type": "promise", + "value": 85, + }, + "promiseMultipleSyncWithArgLastReturnCalled1": 42, + "promiseMultipleSyncWithArgLastReturnCalled2": 42, + "promiseMultipleSyncWithArgNoReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncWithArgNoReturnCalled1": 42, + "promiseMultipleSyncWithArgNoReturnCalled2": 42, + "promiseMultipleSyncWithArgs": { + "type": "promise", + "value": 129, + }, + "promiseMultipleSyncWithArgsCalled1": [ + 42, + 43, + 44, + ], + "promiseNone": { + "type": "promise", + "value": undefined, + }, + "promiseNoneWithArg": { + "type": "promise", + "value": undefined, + }, + "promiseSingleSync": { + "type": "promise", + "value": 42, + }, + "promiseSingleSyncCalled": true, + "promiseSingleSyncWithArg": { + "type": "promise", + "value": 42, + }, + "promiseSingleSyncWithArgCalled": 42, + }, +} +`; + +exports[`SyncHook should have to correct behavior 1`] = ` +{ + "async": {}, + "intercept": {}, + "sync": { + "callAsyncIntercepted": { + "type": "async", + "value": undefined, + }, + "callAsyncInterceptedCall1": [ + 1, + 2, + 3, + ], + "callAsyncInterceptedCall2": [ + 1, + 2, + 3, + ], + "callAsyncInterceptedTap1": { + "fn": 2, + "name": "sync2", + "type": "sync", + }, + "callAsyncInterceptedTap2": { + "fn": 3, + "name": "sync1", + "type": "sync", + }, + "callAsyncMultipleSync": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncCalled1": true, + "callAsyncMultipleSyncCalled2": true, + "callAsyncMultipleSyncError": { + "error": "Error in sync2", + "type": "async", + }, + "callAsyncMultipleSyncErrorCalled1": true, + "callAsyncMultipleSyncErrorCalled2": true, + "callAsyncMultipleSyncWithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncWithArgCalled1": 42, + "callAsyncMultipleSyncWithArgCalled2": 42, + "callAsyncMultipleSyncWithArgFirstReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncWithArgFirstReturnCalled1": 42, + "callAsyncMultipleSyncWithArgFirstReturnCalled2": 42, + "callAsyncMultipleSyncWithArgLastReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncWithArgLastReturnCalled1": 42, + "callAsyncMultipleSyncWithArgLastReturnCalled2": 42, + "callAsyncMultipleSyncWithArgNoReturn": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncWithArgNoReturnCalled1": 42, + "callAsyncMultipleSyncWithArgNoReturnCalled2": 42, + "callAsyncMultipleSyncWithArgs": { + "type": "async", + "value": undefined, + }, + "callAsyncMultipleSyncWithArgsCalled1": [ + 42, + 43, + 44, + ], + "callAsyncMultipleSyncWithArgsCalled2": [ + 42, + 43, + 44, + ], + "callAsyncNone": { + "type": "async", + "value": undefined, + }, + "callAsyncNoneWithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncSingleSync": { + "type": "async", + "value": undefined, + }, + "callAsyncSingleSyncCalled": true, + "callAsyncSingleSyncWithArg": { + "type": "async", + "value": undefined, + }, + "callAsyncSingleSyncWithArgCalled": 42, + "callIntercepted": { + "type": "no result", + }, + "callInterceptedCall1": [ + 1, + 2, + 3, + ], + "callInterceptedCall2": [ + 1, + 2, + 3, + ], + "callInterceptedTap1": { + "fn": 2, + "name": "sync2", + "type": "sync", + }, + "callInterceptedTap2": { + "fn": 3, + "name": "sync1", + "type": "sync", + }, + "callMultipleSync": { + "type": "no result", + }, + "callMultipleSyncCalled1": true, + "callMultipleSyncCalled2": true, + "callMultipleSyncError": { + "error": "Error in sync2", + }, + "callMultipleSyncErrorCalled1": true, + "callMultipleSyncErrorCalled2": true, + "callMultipleSyncWithArg": { + "type": "no result", + }, + "callMultipleSyncWithArgCalled1": 42, + "callMultipleSyncWithArgCalled2": 42, + "callMultipleSyncWithArgFirstReturn": { + "type": "no result", + }, + "callMultipleSyncWithArgFirstReturnCalled1": 42, + "callMultipleSyncWithArgFirstReturnCalled2": 42, + "callMultipleSyncWithArgLastReturn": { + "type": "no result", + }, + "callMultipleSyncWithArgLastReturnCalled1": 42, + "callMultipleSyncWithArgLastReturnCalled2": 42, + "callMultipleSyncWithArgNoReturn": { + "type": "no result", + }, + "callMultipleSyncWithArgNoReturnCalled1": 42, + "callMultipleSyncWithArgNoReturnCalled2": 42, + "callMultipleSyncWithArgs": { + "type": "no result", + }, + "callMultipleSyncWithArgsCalled1": [ + 42, + 43, + 44, + ], + "callMultipleSyncWithArgsCalled2": [ + 42, + 43, + 44, + ], + "callNone": { + "type": "no result", + }, + "callNoneWithArg": { + "type": "no result", + }, + "callSingleSync": { + "type": "no result", + }, + "callSingleSyncCalled": true, + "callSingleSyncWithArg": { + "type": "no result", + }, + "callSingleSyncWithArgCalled": 42, + "promiseIntercepted": { + "type": "promise", + "value": undefined, + }, + "promiseInterceptedCall1": [ + 1, + 2, + 3, + ], + "promiseInterceptedCall2": [ + 1, + 2, + 3, + ], + "promiseInterceptedTap1": { + "fn": 2, + "name": "sync2", + "type": "sync", + }, + "promiseInterceptedTap2": { + "fn": 3, + "name": "sync1", + "type": "sync", + }, + "promiseMultipleSync": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncCalled1": true, + "promiseMultipleSyncCalled2": true, + "promiseMultipleSyncError": { + "error": "Error in sync2", + "type": "promise", + }, + "promiseMultipleSyncErrorCalled1": true, + "promiseMultipleSyncErrorCalled2": true, + "promiseMultipleSyncWithArg": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncWithArgCalled1": 42, + "promiseMultipleSyncWithArgCalled2": 42, + "promiseMultipleSyncWithArgFirstReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncWithArgFirstReturnCalled1": 42, + "promiseMultipleSyncWithArgFirstReturnCalled2": 42, + "promiseMultipleSyncWithArgLastReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncWithArgLastReturnCalled1": 42, + "promiseMultipleSyncWithArgLastReturnCalled2": 42, + "promiseMultipleSyncWithArgNoReturn": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncWithArgNoReturnCalled1": 42, + "promiseMultipleSyncWithArgNoReturnCalled2": 42, + "promiseMultipleSyncWithArgs": { + "type": "promise", + "value": undefined, + }, + "promiseMultipleSyncWithArgsCalled1": [ + 42, + 43, + 44, + ], + "promiseMultipleSyncWithArgsCalled2": [ + 42, + 43, + 44, + ], + "promiseNone": { + "type": "promise", + "value": undefined, + }, + "promiseNoneWithArg": { + "type": "promise", + "value": undefined, + }, + "promiseSingleSync": { + "type": "promise", + "value": undefined, + }, + "promiseSingleSyncCalled": true, + "promiseSingleSyncWithArg": { + "type": "promise", + "value": undefined, + }, + "promiseSingleSyncWithArgCalled": 42, + }, +} +`; + +exports[`SyncWaterfallHook should have to correct behavior 1`] = ` +{ + "async": {}, + "intercept": {}, + "sync": { + "callAsyncIntercepted": { + "type": "async", + "value": 9, + }, + "callAsyncInterceptedCall1": [ + 1, + 2, + 3, + ], + "callAsyncInterceptedCall2": [ + 1, + 2, + 3, + ], + "callAsyncInterceptedTap1": { + "fn": 2, + "name": "sync2", + "type": "sync", + }, + "callAsyncInterceptedTap2": { + "fn": 3, + "name": "sync1", + "type": "sync", + }, + "callAsyncMultipleSync": { + "error": "Waterfall hooks must have at least one argument", + }, + "callAsyncMultipleSyncError": { + "error": "Waterfall hooks must have at least one argument", + }, + "callAsyncMultipleSyncWithArg": { + "type": "async", + "value": 127, + }, + "callAsyncMultipleSyncWithArgCalled1": 42, + "callAsyncMultipleSyncWithArgCalled2": 84, + "callAsyncMultipleSyncWithArgFirstReturn": { + "type": "async", + "value": 84, + }, + "callAsyncMultipleSyncWithArgFirstReturnCalled1": 42, + "callAsyncMultipleSyncWithArgFirstReturnCalled2": 84, + "callAsyncMultipleSyncWithArgLastReturn": { + "type": "async", + "value": 85, + }, + "callAsyncMultipleSyncWithArgLastReturnCalled1": 42, + "callAsyncMultipleSyncWithArgLastReturnCalled2": 42, + "callAsyncMultipleSyncWithArgNoReturn": { + "type": "async", + "value": 42, + }, + "callAsyncMultipleSyncWithArgNoReturnCalled1": 42, + "callAsyncMultipleSyncWithArgNoReturnCalled2": 42, + "callAsyncMultipleSyncWithArgs": { + "type": "async", + "value": 217, + }, + "callAsyncMultipleSyncWithArgsCalled1": [ + 42, + 43, + 44, + ], + "callAsyncMultipleSyncWithArgsCalled2": [ + 129, + 43, + 44, + ], + "callAsyncNone": { + "error": "Waterfall hooks must have at least one argument", + }, + "callAsyncNoneWithArg": { + "type": "async", + "value": 42, + }, + "callAsyncSingleSync": { + "error": "Waterfall hooks must have at least one argument", + }, + "callAsyncSingleSyncWithArg": { + "type": "async", + "value": 42, + }, + "callAsyncSingleSyncWithArgCalled": 42, + "callIntercepted": { + "type": "return", + "value": 9, + }, + "callInterceptedCall1": [ + 1, + 2, + 3, + ], + "callInterceptedCall2": [ + 1, + 2, + 3, + ], + "callInterceptedTap1": { + "fn": 2, + "name": "sync2", + "type": "sync", + }, + "callInterceptedTap2": { + "fn": 3, + "name": "sync1", + "type": "sync", + }, + "callMultipleSync": { + "error": "Waterfall hooks must have at least one argument", + }, + "callMultipleSyncError": { + "error": "Waterfall hooks must have at least one argument", + }, + "callMultipleSyncWithArg": { + "type": "return", + "value": 127, + }, + "callMultipleSyncWithArgCalled1": 42, + "callMultipleSyncWithArgCalled2": 84, + "callMultipleSyncWithArgFirstReturn": { + "type": "return", + "value": 84, + }, + "callMultipleSyncWithArgFirstReturnCalled1": 42, + "callMultipleSyncWithArgFirstReturnCalled2": 84, + "callMultipleSyncWithArgLastReturn": { + "type": "return", + "value": 85, + }, + "callMultipleSyncWithArgLastReturnCalled1": 42, + "callMultipleSyncWithArgLastReturnCalled2": 42, + "callMultipleSyncWithArgNoReturn": { + "type": "return", + "value": 42, + }, + "callMultipleSyncWithArgNoReturnCalled1": 42, + "callMultipleSyncWithArgNoReturnCalled2": 42, + "callMultipleSyncWithArgs": { + "type": "return", + "value": 217, + }, + "callMultipleSyncWithArgsCalled1": [ + 42, + 43, + 44, + ], + "callMultipleSyncWithArgsCalled2": [ + 129, + 43, + 44, + ], + "callNone": { + "error": "Waterfall hooks must have at least one argument", + }, + "callNoneWithArg": { + "type": "return", + "value": 42, + }, + "callSingleSync": { + "error": "Waterfall hooks must have at least one argument", + }, + "callSingleSyncWithArg": { + "type": "return", + "value": 42, + }, + "callSingleSyncWithArgCalled": 42, + "promiseIntercepted": { + "type": "promise", + "value": 9, + }, + "promiseInterceptedCall1": [ + 1, + 2, + 3, + ], + "promiseInterceptedCall2": [ + 1, + 2, + 3, + ], + "promiseInterceptedTap1": { + "fn": 2, + "name": "sync2", + "type": "sync", + }, + "promiseInterceptedTap2": { + "fn": 3, + "name": "sync1", + "type": "sync", + }, + "promiseMultipleSync": { + "error": "Waterfall hooks must have at least one argument", + }, + "promiseMultipleSyncError": { + "error": "Waterfall hooks must have at least one argument", + }, + "promiseMultipleSyncWithArg": { + "type": "promise", + "value": 127, + }, + "promiseMultipleSyncWithArgCalled1": 42, + "promiseMultipleSyncWithArgCalled2": 84, + "promiseMultipleSyncWithArgFirstReturn": { + "type": "promise", + "value": 84, + }, + "promiseMultipleSyncWithArgFirstReturnCalled1": 42, + "promiseMultipleSyncWithArgFirstReturnCalled2": 84, + "promiseMultipleSyncWithArgLastReturn": { + "type": "promise", + "value": 85, + }, + "promiseMultipleSyncWithArgLastReturnCalled1": 42, + "promiseMultipleSyncWithArgLastReturnCalled2": 42, + "promiseMultipleSyncWithArgNoReturn": { + "type": "promise", + "value": 42, + }, + "promiseMultipleSyncWithArgNoReturnCalled1": 42, + "promiseMultipleSyncWithArgNoReturnCalled2": 42, + "promiseMultipleSyncWithArgs": { + "type": "promise", + "value": 217, + }, + "promiseMultipleSyncWithArgsCalled1": [ + 42, + 43, + 44, + ], + "promiseMultipleSyncWithArgsCalled2": [ + 129, + 43, + 44, + ], + "promiseNone": { + "error": "Waterfall hooks must have at least one argument", + }, + "promiseNoneWithArg": { + "type": "promise", + "value": 42, + }, + "promiseSingleSync": { + "error": "Waterfall hooks must have at least one argument", + }, + "promiseSingleSyncWithArg": { + "type": "promise", + "value": 42, + }, + "promiseSingleSyncWithArgCalled": 42, + }, +} +`; diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 0000000..7973b10 --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "sourceMap": false, + "declarationMap": false + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..e0e61d1 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "module": "NodeNext", + "moduleResolution": "NodeNext", + "target": "ES2021", + "esModuleInterop": true, + "declaration": true, + "isolatedModules": true, + "sourceMap": true, + "declarationMap": true, + "composite": true, + "forceConsistentCasingInFileNames": true, + "allowJs": true, + "checkJs": true, + "strict": true, + "skipLibCheck": true, + "noUnusedLocals": true, + "outDir": "dist", + "rootDir": "src" + }, + "ts-node": { + "transpileOnly": true + }, + "include": ["src"] +}