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/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"]
+}