diff --git a/.npmrc b/.npmrc index 845e86b23..4e5f31bde 100644 --- a/.npmrc +++ b/.npmrc @@ -7,5 +7,3 @@ save-prefix="" # These next two lines are the default in pnpm public-hoist-pattern[]="*eslint*" public-hoist-pattern[]="*prettier*" -# This is installed by jest -public-hoist-pattern[]="@jest/globals" diff --git a/eslint.config.js b/eslint.config.js index c3829cb0c..ad2f7c9d1 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -176,10 +176,9 @@ export default typescriptEslint.config( { files: ['**/*.js', '**/*.mjs', '**/*.ts'], languageOptions: { - ecmaVersion: 2022, + ecmaVersion: 2024, globals: { ...globals.node, - ...globals.jest, }, sourceType: 'module', }, @@ -193,6 +192,7 @@ export default typescriptEslint.config( { files: ['**/__tests__/*.test.ts'], rules: { + '@typescript-eslint/no-floating-promises': 'off', '@typescript-eslint/no-unused-expressions': 'off', '@typescript-eslint/unbound-method': 'off', 'no-unused-expressions': 'off', diff --git a/package.json b/package.json index 39bca9ab9..b968228c1 100644 --- a/package.json +++ b/package.json @@ -50,10 +50,10 @@ "pretty": "prettier '**/*.{js,md,ts}' --write", "pretty:ci": "prettier '**/*.{js,md,ts}' --check", "release": "standard-version --infile docs/CHANGELOG.md", - "test": "jest", + "test": "node --experimental-test-module-mocks --import tsx --test **/__tests__/*.test.ts", "test:build": "./tests/run.sh", "test:types": "tsc", - "watch": "jest --watchAll", + "watch": "node --experimental-test-module-mocks --import tsx --watch --test **/__tests__/*.test.ts", "watch:types": "tsc --watch" }, "devDependencies": { @@ -64,7 +64,7 @@ "@commitlint/config-conventional": "19.5.0", "@eslint/eslintrc": "3.1.0", "@eslint/js": "9.14.0", - "@types/node": "20.16.13", + "@types/node": "22.9.0", "arg": "5.0.2", "docsify-cli": "4.4.4", "eslint": "9.14.0", @@ -73,9 +73,8 @@ "eslint-plugin-import": "2.31.0", "eslint-plugin-prettier": "5.2.1", "eslint-plugin-promise": "7.1.0", - "globals": "15.9.0", + "globals": "15.12.0", "husky": "9.1.4", - "jest": "29.7.0", "jsdoc-api": "9.3.4", "jsdoc-parse": "6.2.4", "lint-staged": "15.2.9", @@ -87,6 +86,7 @@ "standard-version": "9.5.0", "ts-expect": "1.3.0", "ts-node": "10.9.2", + "tsx": "4.19.2", "typescript": "5.6.2", "typescript-eslint": "8.14.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5cd4af1a3..c385b6d66 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,7 +19,7 @@ importers: version: 7.26.0(@babel/core@7.26.0) '@commitlint/cli': specifier: 19.5.0 - version: 19.5.0(@types/node@20.16.13)(typescript@5.6.2) + version: 19.5.0(@types/node@22.9.0)(typescript@5.6.2) '@commitlint/config-conventional': specifier: 19.5.0 version: 19.5.0 @@ -30,8 +30,8 @@ importers: specifier: 9.14.0 version: 9.14.0 '@types/node': - specifier: 20.16.13 - version: 20.16.13 + specifier: 22.9.0 + version: 22.9.0 arg: specifier: 5.0.2 version: 5.0.2 @@ -57,14 +57,11 @@ importers: specifier: 7.1.0 version: 7.1.0(eslint@9.14.0(jiti@1.20.0)) globals: - specifier: 15.9.0 - version: 15.9.0 + specifier: 15.12.0 + version: 15.12.0 husky: specifier: 9.1.4 version: 9.1.4 - jest: - specifier: 29.7.0 - version: 29.7.0(@types/node@20.16.13)(ts-node@10.9.2(@types/node@20.16.13)(typescript@5.6.2)) jsdoc-api: specifier: 9.3.4 version: 9.3.4 @@ -97,7 +94,10 @@ importers: version: 1.3.0 ts-node: specifier: 10.9.2 - version: 10.9.2(@types/node@20.16.13)(typescript@5.6.2) + version: 10.9.2(@types/node@22.9.0)(typescript@5.6.2) + tsx: + specifier: 4.19.2 + version: 4.19.2 typescript: specifier: 5.6.2 version: 5.6.2 @@ -263,21 +263,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@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-assertions@7.26.0': resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} engines: {node: '>=6.9.0'} @@ -290,58 +275,12 @@ packages: 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.25.9': resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} 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.25.9': resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} engines: {node: '>=6.9.0'} @@ -693,9 +632,6 @@ packages: resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} engines: {node: '>=6.9.0'} - '@bcoe/v8-coverage@0.2.3': - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@commitlint/cli@19.5.0': resolution: {integrity: sha512-gaGqSliGwB86MDmAAKAtV9SV1SHdmN8pnGq4EJU4+hLisQ7IFfx4jvU4s+pk6tl0+9bv6yT+CaZkufOinkSJIQ==} engines: {node: '>=v18'} @@ -769,6 +705,150 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -827,80 +907,6 @@ packages: resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} engines: {node: '>=6.9.0'} - '@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'} @@ -948,20 +954,10 @@ packages: '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@sindresorhus/is@0.14.0': resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} engines: {node: '>=6'} - '@sinonjs/commons@3.0.0': - resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} - - '@sinonjs/fake-timers@10.2.0': - resolution: {integrity: sha512-OPwQlEdg40HAj5KNF8WW6q2KG4Z+cBCZb3m4ninfTZKaBmbIJodviQsDBoYMPHkOyJJMHnOJo5j2+LKDOhOACg==} - deprecated: Use version 10.1.0. Version 10.2.0 has potential breaking issues - '@szmarczak/http-timer@1.1.2': resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} engines: {node: '>=6'} @@ -978,36 +974,12 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@types/babel__core@7.20.1': - resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} - - '@types/babel__generator@7.6.4': - resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} - - '@types/babel__template@7.4.1': - resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} - - '@types/babel__traverse@7.20.0': - resolution: {integrity: sha512-TBOjqAGf0hmaqRwpii5LLkJLg7c6OMm4nHLmpsUxwk9bBHtoTC6dAHdVWdGv4TBxj2CZOZY8Xfq8WmfoVi7n4Q==} - '@types/conventional-commits-parser@5.0.0': resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - '@types/graceful-fs@4.1.6': - resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} - - '@types/istanbul-lib-coverage@2.0.4': - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} - - '@types/istanbul-lib-report@3.0.0': - resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} - - '@types/istanbul-reports@3.0.1': - resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} - '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -1029,8 +1001,8 @@ packages: '@types/minimist@1.2.2': resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} - '@types/node@20.16.13': - resolution: {integrity: sha512-GjQ7im10B0labo8ZGXDGROUl9k0BNyDgzfGpb4g/cl+4yYDWVKcozANF4FGr4/p0O/rAkQClM6Wiwkije++1Tg==} + '@types/node@22.9.0': + resolution: {integrity: sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==} '@types/normalize-package-data@2.4.1': resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -1038,9 +1010,6 @@ packages: '@types/responselike@1.0.0': resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} - '@types/stack-utils@2.0.1': - resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} - '@types/webidl-conversions@7.0.0': resolution: {integrity: sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==} @@ -1050,12 +1019,6 @@ packages: '@types/whatwg-url@8.2.2': resolution: {integrity: sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==} - '@types/yargs-parser@21.0.0': - resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} - - '@types/yargs@17.0.24': - resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} - '@typescript-eslint/eslint-plugin@8.14.0': resolution: {integrity: sha512-tqp8H7UWFaZj0yNO6bycd5YjMwxa6wIHOLZvWPkidwbgLCsBMetQoGj7DPuAlWa2yGO3H48xmPwjhsSPPCGU5w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1151,10 +1114,6 @@ packages: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - ansi-escapes@7.0.0: resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} engines: {node: '>=18'} @@ -1183,10 +1142,6 @@ packages: 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'} @@ -1201,9 +1156,6 @@ packages: arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -1252,20 +1204,6 @@ packages: b4a@1.6.4: resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} - 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-plugin-polyfill-corejs2@0.4.10: resolution: {integrity: sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==} peerDependencies: @@ -1281,17 +1219,6 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.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==} @@ -1321,9 +1248,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - bson@5.5.0: resolution: {integrity: sha512-B+QB4YmDx9RStKv8LLSl/aVIEV3nYJc3cJNNTK2Cd1TL+7P+cNpw9mAPeCgc5K+j01Dv6sxUzcITXDx7ZU3F0w==} engines: {node: '>=14.20.1'} @@ -1398,10 +1322,6 @@ packages: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} - chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} @@ -1409,13 +1329,6 @@ packages: ci-info@2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} - ci-info@3.8.0: - resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} - engines: {node: '>=8'} - - cjs-module-lexer@1.2.2: - resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} - cli-boxes@2.2.1: resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} engines: {node: '>=6'} @@ -1441,13 +1354,6 @@ packages: clone-response@1.0.3: resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} - co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - - collect-v8-coverage@1.0.1: - resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} - color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -1579,9 +1485,6 @@ packages: engines: {node: '>=10'} hasBin: true - convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -1612,11 +1515,6 @@ packages: resolution: {integrity: sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw==} engines: {node: '>=8'} - create-jest@29.7.0: - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -1692,14 +1590,6 @@ packages: resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} engines: {node: '>=4'} - dedent@1.5.0: - resolution: {integrity: sha512-3sSQTYoWKGcRHmHl6Y6opLpRJH55bxeGQ0Y1LCI5pZzUXvokVkj0FC4bi7uEwazxA9FQZ0Nv067Zt5kSUvXxEA==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -1707,10 +1597,6 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - defer-to-connect@1.1.3: resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} @@ -1738,10 +1624,6 @@ packages: 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} - diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -1779,10 +1661,6 @@ packages: electron-to-chromium@1.5.32: resolution: {integrity: sha512-M+7ph0VGBQqqpTT2YrabjNKSQ2fEl9PVx6AK3N558gDH9NO8O6XN9SXXFWRo9u9PbEg/bWq+tjXQr+eXmxubCw==} - emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} - engines: {node: '>=12'} - emoji-regex@10.3.0: resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} @@ -1850,6 +1728,11 @@ packages: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} + hasBin: true + escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} @@ -1986,11 +1869,6 @@ packages: resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - esquery@1.5.0: resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} @@ -2014,22 +1892,10 @@ packages: eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} - 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==} @@ -2052,9 +1918,6 @@ packages: fastq@1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - figlet@1.6.0: resolution: {integrity: sha512-31EQGhCEITv6+hi2ORRPyn3bulaV9Fl4xOdR169cBzH/n1UqcxsiSB/noo6SJdD7Kfb1Ljit+IgR1USvF/XbdA==} engines: {node: '>= 0.4.0'} @@ -2145,9 +2008,6 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -2179,10 +2039,6 @@ packages: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} - get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - get-pkg-repo@4.2.1: resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} engines: {node: '>=6.9.0'} @@ -2200,10 +2056,6 @@ packages: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} @@ -2212,8 +2064,8 @@ packages: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} - get-tsconfig@4.7.0: - resolution: {integrity: sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==} + get-tsconfig@4.8.1: + resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} git-raw-commits@2.0.11: resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} @@ -2245,10 +2097,6 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - global-directory@4.0.1: resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} engines: {node: '>=18'} @@ -2265,8 +2113,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.9.0: - resolution: {integrity: sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==} + globals@15.12.0: + resolution: {integrity: sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==} engines: {node: '>=18'} globalthis@1.0.3: @@ -2340,9 +2188,6 @@ packages: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} - html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} @@ -2354,10 +2199,6 @@ packages: 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@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} @@ -2379,11 +2220,6 @@ packages: resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} engines: {node: '>=4'} - import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} - hasBin: true - import-meta-resolve@4.0.0: resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} @@ -2395,10 +2231,6 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -2473,10 +2305,6 @@ packages: resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} engines: {node: '>=18'} - is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -2521,10 +2349,6 @@ packages: resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} engines: {node: '>= 0.4'} - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2571,159 +2395,6 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - istanbul-lib-coverage@3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} - engines: {node: '>=8'} - - istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} - - istanbul-lib-instrument@6.0.0: - resolution: {integrity: sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==} - engines: {node: '>=10'} - - istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} - engines: {node: '>=8'} - - istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - - istanbul-reports@3.1.5: - resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} - engines: {node: '>=8'} - - 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-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@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 - jiti@1.20.0: resolution: {integrity: sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==} hasBin: true @@ -2731,10 +2402,6 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -2822,18 +2489,10 @@ packages: klaw@3.0.0: resolution: {integrity: sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==} - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - latest-version@5.1.0: resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==} engines: {node: '>=8'} - leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -2954,9 +2613,6 @@ packages: make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - map-obj@1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} engines: {node: '>=0.10.0'} @@ -3018,10 +2674,6 @@ packages: engines: {node: '>=4'} hasBin: true - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} @@ -3163,9 +2815,6 @@ packages: encoding: optional: true - node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - node-releases@2.0.18: resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} @@ -3184,10 +2833,6 @@ packages: resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} engines: {node: '>=8'} - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - npm-run-path@5.1.0: resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3230,10 +2875,6 @@ packages: 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'} - onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} @@ -3353,10 +2994,6 @@ packages: resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - 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'} @@ -3400,10 +3037,6 @@ packages: engines: {node: '>=12.0.0'} hasBin: true - pirates@4.0.5: - resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} - engines: {node: '>= 6'} - pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -3429,10 +3062,6 @@ packages: engines: {node: '>=14'} hasBin: true - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - prismjs@1.29.0: resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} engines: {node: '>=6'} @@ -3440,10 +3069,6 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} @@ -3459,15 +3084,11 @@ packages: resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==} engines: {node: '>=8'} - pure-rand@6.0.2: - resolution: {integrity: sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==} - q@1.5.1: resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} deprecated: |- You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. - (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) queue-microtask@1.2.3: @@ -3488,9 +3109,6 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - read-pkg-up@3.0.0: resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} engines: {node: '>=4'} @@ -3572,10 +3190,6 @@ packages: requizzle@0.2.4: resolution: {integrity: sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==} - resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} - resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -3590,10 +3204,6 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - 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 @@ -3689,13 +3299,6 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - slice-ansi@5.0.0: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} @@ -3721,9 +3324,6 @@ packages: '@75lb/nature': optional: true - source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} - source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -3753,13 +3353,6 @@ packages: split@1.0.1: resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - standard-version@9.5.0: resolution: {integrity: sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==} engines: {node: '>=10'} @@ -3780,10 +3373,6 @@ packages: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} - 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'} @@ -3829,14 +3418,6 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} @@ -3865,10 +3446,6 @@ packages: 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'} @@ -3888,10 +3465,6 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - text-extensions@1.9.0: resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} engines: {node: '>=0.10'} @@ -3919,9 +3492,6 @@ packages: tinyexec@0.3.0: resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} - tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - to-readable-stream@1.0.0: resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} engines: {node: '>=6'} @@ -3978,6 +3548,11 @@ packages: tslib@2.8.0: resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==} + tsx@4.19.2: + resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} + engines: {node: '>=18.0.0'} + hasBin: true + tweezer.js@1.5.0: resolution: {integrity: sha512-aSiJz7rGWNAQq7hjMK9ZYDuEawXupcCWgl3woQQSoDP2Oh8O4srWb/uO1PzzHIsrPEOqrjJ2sUb9FERfzuBabQ==} @@ -3985,18 +3560,10 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - type-fest@0.18.1: resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} engines: {node: '>=10'} - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - type-fest@0.6.0: resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} engines: {node: '>=8'} @@ -4121,10 +3688,6 @@ packages: v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - v8-to-istanbul@9.1.0: - resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} - engines: {node: '>=10.12.0'} - validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -4132,9 +3695,6 @@ packages: resolution: {integrity: sha512-e/FRLDVdZQWFrAzU6Hdvpm7D7m2ina833gIKLptQykRK49mmCYHLHq7UqjPDbxbKLZkTkW1rFqbengdE3sLfdw==} engines: {node: '>=12.17'} - walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -4193,10 +3753,6 @@ packages: write-file-atomic@3.0.3: resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} - 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@7.5.10: resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} engines: {node: '>=8.3.0'} @@ -4499,21 +4055,6 @@ snapshots: dependencies: '@babel/core': 7.26.0 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -4524,56 +4065,11 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -5039,13 +4535,11 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@bcoe/v8-coverage@0.2.3': {} - - '@commitlint/cli@19.5.0(@types/node@20.16.13)(typescript@5.6.2)': + '@commitlint/cli@19.5.0(@types/node@22.9.0)(typescript@5.6.2)': dependencies: '@commitlint/format': 19.5.0 '@commitlint/lint': 19.5.0 - '@commitlint/load': 19.5.0(@types/node@20.16.13)(typescript@5.6.2) + '@commitlint/load': 19.5.0(@types/node@22.9.0)(typescript@5.6.2) '@commitlint/read': 19.5.0 '@commitlint/types': 19.5.0 tinyexec: 0.3.0 @@ -5092,7 +4586,7 @@ snapshots: '@commitlint/rules': 19.5.0 '@commitlint/types': 19.5.0 - '@commitlint/load@19.5.0(@types/node@20.16.13)(typescript@5.6.2)': + '@commitlint/load@19.5.0(@types/node@22.9.0)(typescript@5.6.2)': dependencies: '@commitlint/config-validator': 19.5.0 '@commitlint/execute-rule': 19.5.0 @@ -5100,7 +4594,7 @@ snapshots: '@commitlint/types': 19.5.0 chalk: 5.3.0 cosmiconfig: 9.0.0(typescript@5.6.2) - cosmiconfig-typescript-loader: 5.0.0(@types/node@20.16.13)(cosmiconfig@9.0.0(typescript@5.6.2))(typescript@5.6.2) + cosmiconfig-typescript-loader: 5.0.0(@types/node@22.9.0)(cosmiconfig@9.0.0(typescript@5.6.2))(typescript@5.6.2) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -5155,6 +4649,78 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 + '@esbuild/aix-ppc64@0.23.1': + optional: true + + '@esbuild/android-arm64@0.23.1': + optional: true + + '@esbuild/android-arm@0.23.1': + optional: true + + '@esbuild/android-x64@0.23.1': + optional: true + + '@esbuild/darwin-arm64@0.23.1': + optional: true + + '@esbuild/darwin-x64@0.23.1': + optional: true + + '@esbuild/freebsd-arm64@0.23.1': + optional: true + + '@esbuild/freebsd-x64@0.23.1': + optional: true + + '@esbuild/linux-arm64@0.23.1': + optional: true + + '@esbuild/linux-arm@0.23.1': + optional: true + + '@esbuild/linux-ia32@0.23.1': + optional: true + + '@esbuild/linux-loong64@0.23.1': + optional: true + + '@esbuild/linux-mips64el@0.23.1': + optional: true + + '@esbuild/linux-ppc64@0.23.1': + optional: true + + '@esbuild/linux-riscv64@0.23.1': + optional: true + + '@esbuild/linux-s390x@0.23.1': + optional: true + + '@esbuild/linux-x64@0.23.1': + optional: true + + '@esbuild/netbsd-x64@0.23.1': + optional: true + + '@esbuild/openbsd-arm64@0.23.1': + optional: true + + '@esbuild/openbsd-x64@0.23.1': + optional: true + + '@esbuild/sunos-x64@0.23.1': + optional: true + + '@esbuild/win32-arm64@0.23.1': + optional: true + + '@esbuild/win32-ia32@0.23.1': + optional: true + + '@esbuild/win32-x64@0.23.1': + optional: true + '@eslint-community/eslint-utils@4.4.0(eslint@9.14.0(jiti@1.20.0))': dependencies: eslint: 9.14.0(jiti@1.20.0) @@ -5209,178 +4775,6 @@ snapshots: '@hutson/parse-repository-url@3.0.2': {} - '@istanbuljs/load-nyc-config@1.1.0': - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 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.16.13 - chalk: 4.1.2 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - - '@jest/core@29.7.0(ts-node@10.9.2(@types/node@20.16.13)(typescript@5.6.2))': - 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.16.13 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.8.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.16.13)(ts-node@10.9.2(@types/node@20.16.13)(typescript@5.6.2)) - 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.8 - 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.16.13 - 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.2.0 - '@types/node': 20.16.13 - 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.16.13 - chalk: 4.1.2 - collect-v8-coverage: 1.0.1 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 6.0.0 - istanbul-lib-report: 3.0.0 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.5 - 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.1.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.4 - collect-v8-coverage: 1.0.1 - - '@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.26.0 - '@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.8 - pirates: 4.0.5 - 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.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 20.16.13 - '@types/yargs': 17.0.24 - chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 @@ -5427,18 +4821,8 @@ snapshots: '@rtsao/scc@1.1.0': {} - '@sinclair/typebox@0.27.8': {} - '@sindresorhus/is@0.14.0': {} - '@sinonjs/commons@3.0.0': - dependencies: - type-detect: 4.0.8 - - '@sinonjs/fake-timers@10.2.0': - dependencies: - '@sinonjs/commons': 3.0.0 - '@szmarczak/http-timer@1.1.2': dependencies: defer-to-connect: 1.1.3 @@ -5451,54 +4835,19 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@types/babel__core@7.20.1': - dependencies: - '@babel/parser': 7.26.1 - '@babel/types': 7.26.0 - '@types/babel__generator': 7.6.4 - '@types/babel__template': 7.4.1 - '@types/babel__traverse': 7.20.0 - - '@types/babel__generator@7.6.4': - dependencies: - '@babel/types': 7.26.0 - - '@types/babel__template@7.4.1': - dependencies: - '@babel/parser': 7.26.1 - '@babel/types': 7.26.0 - - '@types/babel__traverse@7.20.0': - dependencies: - '@babel/types': 7.26.0 - '@types/conventional-commits-parser@5.0.0': dependencies: - '@types/node': 20.16.13 + '@types/node': 22.9.0 '@types/estree@1.0.6': {} - '@types/graceful-fs@4.1.6': - dependencies: - '@types/node': 20.16.13 - - '@types/istanbul-lib-coverage@2.0.4': {} - - '@types/istanbul-lib-report@3.0.0': - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - - '@types/istanbul-reports@3.0.1': - dependencies: - '@types/istanbul-lib-report': 3.0.0 - '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} '@types/keyv@3.1.4': dependencies: - '@types/node': 20.16.13 + '@types/node': 22.9.0 '@types/linkify-it@5.0.0': {} @@ -5511,7 +4860,7 @@ snapshots: '@types/minimist@1.2.2': {} - '@types/node@20.16.13': + '@types/node@22.9.0': dependencies: undici-types: 6.19.8 @@ -5519,9 +4868,7 @@ snapshots: '@types/responselike@1.0.0': dependencies: - '@types/node': 20.16.13 - - '@types/stack-utils@2.0.1': {} + '@types/node': 22.9.0 '@types/webidl-conversions@7.0.0': {} @@ -5531,15 +4878,9 @@ snapshots: '@types/whatwg-url@8.2.2': dependencies: - '@types/node': 20.16.13 + '@types/node': 22.9.0 '@types/webidl-conversions': 7.0.0 - '@types/yargs-parser@21.0.0': {} - - '@types/yargs@17.0.24': - dependencies: - '@types/yargs-parser': 21.0.0 - '@typescript-eslint/eslint-plugin@8.14.0(@typescript-eslint/parser@8.14.0(eslint@9.14.0(jiti@1.20.0))(typescript@5.6.2))(eslint@9.14.0(jiti@1.20.0))(typescript@5.6.2)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -5662,10 +5003,6 @@ snapshots: ansi-colors@4.1.3: {} - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - ansi-escapes@7.0.0: dependencies: environment: 1.1.0 @@ -5686,8 +5023,6 @@ snapshots: dependencies: color-convert: 2.0.1 - ansi-styles@5.2.0: {} - ansi-styles@6.2.1: {} anymatch@3.1.3: @@ -5699,10 +5034,6 @@ snapshots: arg@5.0.2: {} - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - argparse@2.0.1: {} array-back@6.2.2: {} @@ -5769,36 +5100,6 @@ snapshots: b4a@1.6.4: {} - babel-jest@29.7.0(@babel/core@7.26.0): - dependencies: - '@babel/core': 7.26.0 - '@jest/transform': 29.7.0 - '@types/babel__core': 7.20.1 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.26.0) - 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.25.9 - '@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.9 - '@babel/types': 7.26.0 - '@types/babel__core': 7.20.1 - '@types/babel__traverse': 7.20.0 - babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.26.0): dependencies: '@babel/compat-data': 7.26.0 @@ -5823,28 +5124,6 @@ snapshots: transitivePeerDependencies: - supports-color - babel-preset-current-node-syntax@1.0.1(@babel/core@7.26.0): - dependencies: - '@babel/core': 7.26.0 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.0) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.0) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.0) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.0) - - babel-preset-jest@29.6.3(@babel/core@7.26.0): - dependencies: - '@babel/core': 7.26.0 - babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.26.0) - balanced-match@1.0.2: {} binary-extensions@2.2.0: {} @@ -5880,11 +5159,7 @@ snapshots: caniuse-lite: 1.0.30001667 electron-to-chromium: 1.5.32 node-releases: 2.0.18 - update-browserslist-db: 1.1.0(browserslist@4.24.0) - - bser@2.1.1: - dependencies: - node-int64: 0.4.0 + update-browserslist-db: 1.1.0(browserslist@4.24.0) bson@5.5.0: {} @@ -5960,8 +5235,6 @@ snapshots: chalk@5.3.0: {} - char-regex@1.0.2: {} - chokidar@3.5.3: dependencies: anymatch: 3.1.3 @@ -5976,10 +5249,6 @@ snapshots: ci-info@2.0.0: {} - ci-info@3.8.0: {} - - cjs-module-lexer@1.2.2: {} - cli-boxes@2.2.1: {} cli-cursor@5.0.0: @@ -6013,10 +5282,6 @@ snapshots: dependencies: mimic-response: 1.0.1 - co@4.6.0: {} - - collect-v8-coverage@1.0.1: {} - color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -6198,8 +5463,6 @@ snapshots: meow: 8.1.2 q: 1.5.1 - convert-source-map@1.9.0: {} - convert-source-map@2.0.0: {} core-js-compat@3.38.1: @@ -6208,9 +5471,9 @@ snapshots: core-util-is@1.0.3: {} - cosmiconfig-typescript-loader@5.0.0(@types/node@20.16.13)(cosmiconfig@9.0.0(typescript@5.6.2))(typescript@5.6.2): + cosmiconfig-typescript-loader@5.0.0(@types/node@22.9.0)(cosmiconfig@9.0.0(typescript@5.6.2))(typescript@5.6.2): dependencies: - '@types/node': 20.16.13 + '@types/node': 22.9.0 cosmiconfig: 9.0.0(typescript@5.6.2) jiti: 1.20.0 typescript: 5.6.2 @@ -6231,21 +5494,6 @@ snapshots: nested-error-stacks: 2.1.1 p-event: 4.2.0 - create-jest@29.7.0(@types/node@20.16.13)(ts-node@10.9.2(@types/node@20.16.13)(typescript@5.6.2)): - 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.16.13)(ts-node@10.9.2(@types/node@20.16.13)(typescript@5.6.2)) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - create-require@1.1.1: {} cross-spawn@7.0.3: @@ -6305,14 +5553,10 @@ snapshots: dependencies: mimic-response: 1.0.1 - dedent@1.5.0: {} - deep-extend@0.6.0: {} deep-is@0.1.4: {} - deepmerge@4.3.1: {} - defer-to-connect@1.1.3: {} define-data-property@1.1.4: @@ -6335,8 +5579,6 @@ snapshots: detect-newline@3.1.0: {} - diff-sequences@29.6.3: {} - diff@4.0.2: {} docsify-cli@4.4.4: @@ -6403,8 +5645,6 @@ snapshots: electron-to-chromium@1.5.32: {} - emittery@0.13.1: {} - emoji-regex@10.3.0: {} emoji-regex@8.0.0: {} @@ -6511,6 +5751,33 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 + esbuild@0.23.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + escalade@3.1.2: {} escape-goat@2.1.1: {} @@ -6598,8 +5865,8 @@ snapshots: enhanced-resolve: 5.16.0 eslint: 9.14.0(jiti@1.20.0) eslint-plugin-es-x: 7.5.0(eslint@9.14.0(jiti@1.20.0)) - get-tsconfig: 4.7.0 - globals: 15.9.0 + get-tsconfig: 4.8.1 + globals: 15.12.0 ignore: 5.3.1 minimatch: 9.0.4 semver: 7.6.3 @@ -6674,8 +5941,6 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 4.2.0 - esprima@4.0.1: {} - esquery@1.5.0: dependencies: estraverse: 5.3.0 @@ -6692,18 +5957,6 @@ snapshots: eventemitter3@5.0.1: {} - 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@8.0.1: dependencies: cross-spawn: 7.0.3 @@ -6716,16 +5969,6 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 - 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-diff@1.3.0: {} @@ -6748,10 +5991,6 @@ snapshots: dependencies: reusify: 1.0.4 - fb-watchman@2.0.2: - dependencies: - bser: 2.1.1 - figlet@1.6.0: {} figures@3.2.0: @@ -6838,8 +6077,6 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 - fs.realpath@1.0.0: {} - fsevents@2.3.3: optional: true @@ -6868,8 +6105,6 @@ snapshots: has-symbols: 1.0.3 hasown: 2.0.2 - get-package-type@0.1.0: {} - get-pkg-repo@4.2.1: dependencies: '@hutson/parse-repository-url': 3.0.2 @@ -6887,8 +6122,6 @@ snapshots: dependencies: pump: 3.0.0 - get-stream@6.0.1: {} - get-stream@8.0.1: {} get-symbol-description@1.0.2: @@ -6897,7 +6130,7 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.2.4 - get-tsconfig@4.7.0: + get-tsconfig@4.8.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -6937,15 +6170,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - global-directory@4.0.1: dependencies: ini: 4.1.1 @@ -6958,7 +6182,7 @@ snapshots: globals@14.0.0: {} - globals@15.9.0: {} + globals@15.12.0: {} globalthis@1.0.3: dependencies: @@ -7033,8 +6257,6 @@ snapshots: dependencies: lru-cache: 6.0.0 - html-escaper@2.0.2: {} - http-cache-semantics@4.1.1: {} http-errors@2.0.0: @@ -7052,8 +6274,6 @@ snapshots: transitivePeerDependencies: - supports-color - human-signals@2.1.0: {} - human-signals@5.0.0: {} husky@9.1.4: {} @@ -7067,22 +6287,12 @@ snapshots: import-lazy@2.1.0: {} - import-local@3.1.0: - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - import-meta-resolve@4.0.0: {} imurmurhash@0.1.4: {} indent-string@4.0.0: {} - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - inherits@2.0.4: {} ini@1.3.7: {} @@ -7147,8 +6357,6 @@ snapshots: dependencies: get-east-asian-width: 1.2.0 - is-generator-fn@2.1.0: {} - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -7183,8 +6391,6 @@ snapshots: dependencies: call-bind: 1.0.7 - is-stream@2.0.1: {} - is-stream@3.0.0: {} is-string@1.0.7: @@ -7223,365 +6429,10 @@ snapshots: isexe@2.0.0: {} - istanbul-lib-coverage@3.2.0: {} - - istanbul-lib-instrument@5.2.1: - dependencies: - '@babel/core': 7.26.0 - '@babel/parser': 7.26.1 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - istanbul-lib-instrument@6.0.0: - dependencies: - '@babel/core': 7.26.0 - '@babel/parser': 7.26.1 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 7.6.3 - transitivePeerDependencies: - - supports-color - - istanbul-lib-report@3.0.0: - dependencies: - istanbul-lib-coverage: 3.2.0 - make-dir: 3.1.0 - supports-color: 7.2.0 - - istanbul-lib-source-maps@4.0.1: - dependencies: - debug: 4.3.7 - istanbul-lib-coverage: 3.2.0 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - - istanbul-reports@3.1.5: - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.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.16.13 - chalk: 4.1.2 - co: 4.6.0 - dedent: 1.5.0 - 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.0.2 - slash: 3.0.0 - stack-utils: 2.0.6 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-cli@29.7.0(@types/node@20.16.13)(ts-node@10.9.2(@types/node@20.16.13)(typescript@5.6.2)): - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.16.13)(typescript@5.6.2)) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.16.13)(ts-node@10.9.2(@types/node@20.16.13)(typescript@5.6.2)) - exit: 0.1.2 - import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.16.13)(ts-node@10.9.2(@types/node@20.16.13)(typescript@5.6.2)) - 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.16.13)(ts-node@10.9.2(@types/node@20.16.13)(typescript@5.6.2)): - dependencies: - '@babel/core': 7.26.0 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.0) - chalk: 4.1.2 - ci-info: 3.8.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.8 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 20.16.13 - ts-node: 10.9.2(@types/node@20.16.13)(typescript@5.6.2) - 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.16.13 - 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.6 - '@types/node': 20.16.13 - 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.8 - 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.26.0 - '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.1 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.8 - 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.16.13 - 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.16.13 - 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.16.13 - chalk: 4.1.2 - cjs-module-lexer: 1.2.2 - collect-v8-coverage: 1.0.1 - 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-snapshot@29.7.0: - dependencies: - '@babel/core': 7.26.0 - '@babel/generator': 7.26.0 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) - '@babel/types': 7.26.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.26.0) - 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.16.13 - chalk: 4.1.2 - ci-info: 3.8.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.16.13 - 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@29.7.0: - dependencies: - '@types/node': 20.16.13 - jest-util: 29.7.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 - - jest@29.7.0(@types/node@20.16.13)(ts-node@10.9.2(@types/node@20.16.13)(typescript@5.6.2)): - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.16.13)(typescript@5.6.2)) - '@jest/types': 29.6.3 - import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.16.13)(ts-node@10.9.2(@types/node@20.16.13)(typescript@5.6.2)) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - jiti@1.20.0: {} js-tokens@4.0.0: {} - js-yaml@3.14.1: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - js-yaml@4.1.0: dependencies: argparse: 2.0.1 @@ -7673,14 +6524,10 @@ snapshots: dependencies: graceful-fs: 4.2.11 - kleur@3.0.3: {} - latest-version@5.1.0: dependencies: package-json: 6.5.0 - leven@3.1.0: {} - levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -7811,10 +6658,6 @@ snapshots: make-error@1.3.6: {} - makeerror@1.0.12: - dependencies: - tmpl: 1.0.5 - map-obj@1.0.1: {} map-obj@4.3.0: {} @@ -7870,8 +6713,6 @@ snapshots: mime@1.6.0: {} - mimic-fn@2.1.0: {} - mimic-fn@4.0.0: {} mimic-function@5.0.1: {} @@ -8009,8 +6850,6 @@ snapshots: dependencies: whatwg-url: 5.0.0 - node-int64@0.4.0: {} - node-releases@2.0.18: {} normalize-package-data@2.5.0: @@ -8031,10 +6870,6 @@ snapshots: normalize-url@4.5.1: {} - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - npm-run-path@5.1.0: dependencies: path-key: 4.0.0 @@ -8083,10 +6918,6 @@ snapshots: dependencies: wrappy: 1.0.2 - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - onetime@6.0.0: dependencies: mimic-fn: 4.0.0 @@ -8197,8 +7028,6 @@ snapshots: path-exists@5.0.0: {} - path-is-absolute@1.0.1: {} - path-key@3.1.1: {} path-key@4.0.0: {} @@ -8223,8 +7052,6 @@ snapshots: pinst@3.0.0: {} - pirates@4.0.5: {} - pkg-dir@4.2.0: dependencies: find-up: 4.1.0 @@ -8241,21 +7068,10 @@ snapshots: prettier@3.3.2: {} - pretty-format@29.7.0: - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.2.0 - prismjs@1.29.0: {} process-nextick-args@2.0.1: {} - prompts@2.4.2: - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - pump@3.0.0: dependencies: end-of-stream: 1.4.4 @@ -8269,8 +7085,6 @@ snapshots: dependencies: escape-goat: 2.1.1 - pure-rand@6.0.2: {} - q@1.5.1: {} queue-microtask@1.2.3: {} @@ -8288,8 +7102,6 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-is@18.2.0: {} - read-pkg-up@3.0.0: dependencies: find-up: 2.1.0 @@ -8391,10 +7203,6 @@ snapshots: dependencies: lodash: 4.17.21 - resolve-cwd@3.0.0: - dependencies: - resolve-from: 5.0.0 - resolve-from@4.0.0: {} resolve-from@5.0.0: {} @@ -8403,8 +7211,6 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve.exports@2.0.2: {} - resolve@1.22.8: dependencies: is-core-module: 2.15.1 @@ -8519,10 +7325,6 @@ snapshots: signal-exit@4.1.0: {} - sisteransi@1.0.5: {} - - slash@3.0.0: {} - slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.1 @@ -8545,11 +7347,6 @@ snapshots: array-back: 6.2.2 typical: 7.2.0 - source-map-support@0.5.13: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - source-map@0.6.1: {} sparse-bitfield@3.0.3: @@ -8580,12 +7377,6 @@ snapshots: dependencies: through: 2.3.8 - sprintf-js@1.0.3: {} - - stack-utils@2.0.6: - dependencies: - escape-string-regexp: 2.0.0 - standard-version@9.5.0: dependencies: chalk: 2.4.2 @@ -8614,11 +7405,6 @@ snapshots: string-argv@0.3.2: {} - 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 @@ -8674,10 +7460,6 @@ snapshots: strip-bom@3.0.0: {} - strip-bom@4.0.0: {} - - strip-final-newline@2.0.0: {} - strip-final-newline@3.0.0: {} strip-indent@3.0.0: @@ -8698,10 +7480,6 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - supports-preserve-symlinks-flag@1.0.0: {} synckit@0.9.1: @@ -8719,12 +7497,6 @@ snapshots: term-size@2.2.1: {} - test-exclude@6.0.0: - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - text-extensions@1.9.0: {} text-extensions@2.4.0: {} @@ -8746,8 +7518,6 @@ snapshots: tinyexec@0.3.0: {} - tmpl@1.0.5: {} - to-readable-stream@1.0.0: {} to-regex-range@5.0.1: @@ -8774,14 +7544,14 @@ snapshots: ts-expect@1.3.0: {} - ts-node@10.9.2(@types/node@20.16.13)(typescript@5.6.2): + ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.16.13 + '@types/node': 22.9.0 acorn: 8.14.0 acorn-walk: 8.2.0 arg: 4.1.3 @@ -8801,18 +7571,21 @@ snapshots: tslib@2.8.0: {} + tsx@4.19.2: + dependencies: + esbuild: 0.23.1 + get-tsconfig: 4.8.1 + optionalDependencies: + fsevents: 2.3.3 + tweezer.js@1.5.0: {} type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - type-detect@4.0.8: {} - type-fest@0.18.1: {} - type-fest@0.21.3: {} - type-fest@0.6.0: {} type-fest@0.8.1: {} @@ -8943,12 +7716,6 @@ snapshots: v8-compile-cache-lib@3.0.1: {} - v8-to-istanbul@9.1.0: - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - '@types/istanbul-lib-coverage': 2.0.4 - convert-source-map: 1.9.0 - validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 @@ -8956,10 +7723,6 @@ snapshots: walk-back@5.1.1: {} - walker@1.0.8: - dependencies: - makeerror: 1.0.12 - webidl-conversions@3.0.1: {} webidl-conversions@7.0.0: {} @@ -9034,11 +7797,6 @@ snapshots: signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 - write-file-atomic@4.0.2: - dependencies: - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - ws@7.5.10: {} xdg-basedir@4.0.0: {} diff --git a/src/__tests__/DeepPick.test.ts b/src/__tests__/DeepPick.test.ts index 093224675..fde2f5949 100644 --- a/src/__tests__/DeepPick.test.ts +++ b/src/__tests__/DeepPick.test.ts @@ -1,4 +1,3 @@ -import { test } from '@jest/globals'; import type { ObjectId } from 'mongodb'; import { expectType, TypeEqual } from 'ts-expect'; @@ -30,7 +29,3 @@ expectType, { a: { b: 0 }[] // custom primitives expectType, { a: Date }>>(true); expectType, { a: ObjectId }>>(true); - -test('ignore empty test for jest', () => { - // ignore -}); diff --git a/src/__tests__/TupleItems.test.ts b/src/__tests__/TupleItems.test.ts index 7d405b4f9..99855736f 100644 --- a/src/__tests__/TupleItems.test.ts +++ b/src/__tests__/TupleItems.test.ts @@ -1,4 +1,4 @@ -import { test } from '@jest/globals'; +import { test } from 'node:test'; import { expectType, TypeEqual } from 'ts-expect'; import type { TupleItems } from '../TupleItems'; diff --git a/src/__tests__/assert.ts b/src/__tests__/assert.ts new file mode 100644 index 000000000..176b03cfc --- /dev/null +++ b/src/__tests__/assert.ts @@ -0,0 +1,11 @@ +import { deepStrictEqual, strictEqual } from 'assert/strict'; +import { Mock } from 'node:test'; + +// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type +export function expectToBeCalledOnceWith( + fn: Mock, + args: Mock['mock']['calls'][number]['arguments'] +): void { + strictEqual(fn.mock.callCount(), 1); + deepStrictEqual(fn.mock.calls[0].arguments, args); +} diff --git a/src/__tests__/index.test.ts b/src/__tests__/index.test.ts index 8137f4b85..2f1c8d2a2 100644 --- a/src/__tests__/index.test.ts +++ b/src/__tests__/index.test.ts @@ -1,38 +1,31 @@ -import { afterEach, beforeEach, describe, expect, jest, test } from '@jest/globals'; +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/no-unsafe-assignment */ +/* eslint-disable @typescript-eslint/no-unsafe-call */ +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ + +import { strictEqual } from 'node:assert'; +import { after, before, beforeEach, describe, Mock, mock, test } from 'node:test'; import { Collection, Db } from 'mongodb'; -import Papr from '../index'; -import * as model from '../model'; import { schema } from '../schema'; import types from '../types'; -import { VALIDATION_ACTIONS, VALIDATION_LEVEL } from '../utils'; +import { expectToBeCalledOnceWith } from './assert'; describe('index', () => { - let db: Db; + let db: Omit & { + collection: Mock; + collections: Mock; + command: Mock; + createCollection: Mock; + }; let collection: Collection; const COLLECTION = 'testcollection'; - const COLLECTION_OTHER = 'testcollection2'; - const DEFAULTS = { - foo: 'bar', - }; const testSchema1 = schema({ foo: types.string({ required: true }), }); - const testSchema2 = schema( - { - foo: types.string({ required: true }), - }, - { - defaults: DEFAULTS, - validationAction: VALIDATION_ACTIONS.WARN, - validationLevel: VALIDATION_LEVEL.MODERATE, - } - ); beforeEach(() => { - jest.resetAllMocks(); - // @ts-expect-error Ignore mock collection collection = { collectionName: COLLECTION, @@ -40,194 +33,68 @@ describe('index', () => { db = { // @ts-expect-error Ignore mocked function type - collection: jest.fn().mockReturnValue(collection), + collection: mock.fn(() => collection), // @ts-expect-error Ignore mocked function type - collections: jest.fn().mockResolvedValue([]), + collections: mock.fn(() => []), // @ts-expect-error Ignore mocked function type - command: jest.fn(), + command: mock.fn(() => {}), // @ts-expect-error Ignore mocked function type - createCollection: jest.fn().mockReturnValue(collection), + createCollection: mock.fn(() => collection), }; }); describe('initialize and model', () => { - beforeEach(() => { - jest.spyOn(model, 'build').mockReturnValue(undefined); + // Module mocking in node.js is experimental and the types are not yet available + let modelMock: any; // MockModuleContext + let Papr: any; + let model: any; + + before(async () => { + modelMock = mock.module('../model', { + namedExports: { + abstract: mock.fn(() => ({ _abstract: true })), + build: mock.fn(() => undefined), + }, + }); + console.log('modelMock', modelMock); + + Papr = (await import('../index')).default; + model = await import('../model'); }); - afterEach(() => { - jest.restoreAllMocks(); + after(() => { + modelMock.restore(); }); - test('initialize with no models registered', () => { + test('initialize with no models registered', async (t) => { const papr = new Papr(); papr.initialize(db); - expect(model.build).not.toHaveBeenCalled(); + strictEqual(model.build.mock.callCount(), 0); }); - test('define model without db', () => { - jest.spyOn(model, 'build').mockReturnValue(undefined); - + test('define model without db', async () => { const papr = new Papr(); papr.model('testcollection', testSchema1); - expect(model.build).not.toHaveBeenCalled(); + strictEqual(model.build.mock.callCount(), 0); }); test('register model and initialize afterwards', () => { - jest.spyOn(model, 'build').mockReturnValue(undefined); - const options = { maxTime: 1000 }; const papr = new Papr(options); papr.model(COLLECTION, testSchema1); papr.initialize(db); - expect(model.build).toHaveBeenCalledTimes(1); - expect(model.build).toHaveBeenCalledWith( + expectToBeCalledOnceWith(model.build, [ testSchema1, - expect.any(Object), + { _abstract: true }, collection, - options - ); - }); - }); - - describe('updateSchema', () => { - test('no db', async () => { - const papr = new Papr(); - - const testModel = papr.model(COLLECTION, testSchema1); - - return expect(papr.updateSchema(testModel)).rejects.toThrow('DB'); - }); - - test('no collection on model', async () => { - const papr = new Papr(); - - const testModel = papr.model(COLLECTION, testSchema1); - - papr.db = db; - - return expect(papr.updateSchema(testModel)).rejects.toThrow('collection'); - }); - - test('new collection', async () => { - const papr = new Papr(); - - const testModel = papr.model(COLLECTION, testSchema1); - papr.initialize(db); - - await papr.updateSchema(testModel); - - expect(db.createCollection).toHaveBeenCalledWith(COLLECTION, { - validationAction: 'error', - validationLevel: 'strict', - validator: { - $jsonSchema: { - additionalProperties: false, - properties: { - _id: { - bsonType: 'objectId', - }, - foo: { - type: 'string', - }, - }, - required: ['_id', 'foo'], - type: 'object', - }, - }, - }); - }); - - test('existing collection', async () => { - (db.collections as jest.Mocked).mockResolvedValue([collection]); - - const papr = new Papr(); - - const testModel = papr.model(COLLECTION, testSchema2); - papr.initialize(db); - - await papr.updateSchema(testModel); - - expect(db.command).toHaveBeenCalledWith({ - collMod: COLLECTION, - validationAction: 'warn', - validationLevel: 'moderate', - validator: { - $jsonSchema: { - additionalProperties: false, - properties: { - _id: { - bsonType: 'objectId', - }, - foo: { - type: 'string', - }, - }, - required: ['_id', 'foo'], - type: 'object', - }, - }, - }); - }); - }); - - test('updateSchemas', async () => { - (db.collection as jest.Mocked) - .mockReturnValueOnce(collection) - // @ts-expect-error Ignore collection type - .mockReturnValueOnce({ collectionName: COLLECTION_OTHER }); - - const papr = new Papr(); - - papr.model(COLLECTION, testSchema1); - papr.model(COLLECTION_OTHER, testSchema2); - papr.initialize(db); - - await papr.updateSchemas(); - - expect(db.createCollection).toHaveBeenCalledWith(COLLECTION, { - validationAction: 'error', - validationLevel: 'strict', - validator: { - $jsonSchema: { - additionalProperties: false, - properties: { - _id: { - bsonType: 'objectId', - }, - foo: { - type: 'string', - }, - }, - required: ['_id', 'foo'], - type: 'object', - }, - }, - }); - expect(db.createCollection).toHaveBeenCalledWith(COLLECTION_OTHER, { - validationAction: 'warn', - validationLevel: 'moderate', - validator: { - $jsonSchema: { - additionalProperties: false, - properties: { - _id: { - bsonType: 'objectId', - }, - foo: { - type: 'string', - }, - }, - required: ['_id', 'foo'], - type: 'object', - }, - }, + options, + ]); }); }); }); diff --git a/src/__tests__/indexSchemas.test.ts b/src/__tests__/indexSchemas.test.ts new file mode 100644 index 000000000..6565ae8a2 --- /dev/null +++ b/src/__tests__/indexSchemas.test.ts @@ -0,0 +1,215 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/no-unsafe-call */ +/* eslint-disable @typescript-eslint/no-unsafe-assignment */ +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ + +import { deepStrictEqual, rejects, strictEqual } from 'node:assert'; +import { before, beforeEach, describe, Mock, mock, test } from 'node:test'; +import { Collection, Db } from 'mongodb'; +import { schema } from '../schema'; +import types from '../types'; +import { VALIDATION_ACTIONS, VALIDATION_LEVEL } from '../utils'; +import { expectToBeCalledOnceWith } from './assert'; + +describe('index', () => { + let db: Omit & { + collection: Mock; + collections: Mock; + command: Mock; + createCollection: Mock; + }; + let collection: Collection; + + const COLLECTION = 'testcollection'; + const COLLECTION_OTHER = 'testcollection2'; + const DEFAULTS = { + foo: 'bar', + }; + + const testSchema1 = schema({ + foo: types.string({ required: true }), + }); + const testSchema2 = schema( + { + foo: types.string({ required: true }), + }, + { + defaults: DEFAULTS, + validationAction: VALIDATION_ACTIONS.WARN, + validationLevel: VALIDATION_LEVEL.MODERATE, + } + ); + + beforeEach(() => { + // @ts-expect-error Ignore mock collection + collection = { + collectionName: COLLECTION, + }; + + db = { + // @ts-expect-error Ignore mocked function type + collection: mock.fn(() => collection), + // @ts-expect-error Ignore mocked function type + collections: mock.fn(() => []), + // @ts-expect-error Ignore mocked function type + command: mock.fn(() => {}), + // @ts-expect-error Ignore mocked function type + createCollection: mock.fn(() => collection), + }; + }); + + describe('updateSchema', () => { + let Papr: any; + + before(async () => { + Papr = (await import('../index')).default; + }); + + test('no db', async () => { + const papr = new Papr(); + + const testModel = papr.model(COLLECTION, testSchema1); + + await rejects(papr.updateSchema(testModel), /DB/); + }); + + test('no collection on model', async () => { + const papr = new Papr(); + + const testModel = papr.model(COLLECTION, testSchema1); + + papr.db = db; + + return rejects(papr.updateSchema(testModel), /collection/); + }); + + test.only('new collection', async () => { + const papr = new Papr(); + + const testModel = papr.model(COLLECTION, testSchema1); + papr.initialize(db); + + await papr.updateSchema(testModel); + + expectToBeCalledOnceWith(db.createCollection, [ + COLLECTION, + { + validationAction: 'error', + validationLevel: 'strict', + validator: { + $jsonSchema: { + additionalProperties: false, + properties: { + _id: { + bsonType: 'objectId', + }, + foo: { + type: 'string', + }, + }, + required: ['_id', 'foo'], + type: 'object', + }, + }, + }, + ]); + }); + + test('existing collection', async () => { + db.collections = mock.fn(() => Promise.resolve([collection])); + + const papr = new Papr(); + + const testModel = papr.model(COLLECTION, testSchema2); + papr.initialize(db); + + await papr.updateSchema(testModel); + + expectToBeCalledOnceWith(db.command, [ + { + collMod: COLLECTION, + validationAction: 'warn', + validationLevel: 'moderate', + validator: { + $jsonSchema: { + additionalProperties: false, + properties: { + _id: { + bsonType: 'objectId', + }, + foo: { + type: 'string', + }, + }, + required: ['_id', 'foo'], + type: 'object', + }, + }, + }, + ]); + }); + + test('updateSchemas', async () => { + // @ts-expect-error Ignore mock types mismatch + db.collection = mock.fn( + mock.fn(() => ({ collectionName: COLLECTION_OTHER })), + () => collection, + { times: 1 } + ); + + const papr = new Papr(); + + papr.model(COLLECTION, testSchema1); + papr.model(COLLECTION_OTHER, testSchema2); + papr.initialize(db); + + await papr.updateSchemas(); + + strictEqual(db.createCollection.mock.callCount(), 2); + deepStrictEqual(db.createCollection.mock.calls[0].arguments, [ + COLLECTION, + { + validationAction: 'error', + validationLevel: 'strict', + validator: { + $jsonSchema: { + additionalProperties: false, + properties: { + _id: { + bsonType: 'objectId', + }, + foo: { + type: 'string', + }, + }, + required: ['_id', 'foo'], + type: 'object', + }, + }, + }, + ]); + deepStrictEqual(db.createCollection.mock.calls[1].arguments, [ + COLLECTION_OTHER, + { + validationAction: 'warn', + validationLevel: 'moderate', + validator: { + $jsonSchema: { + additionalProperties: false, + properties: { + _id: { + bsonType: 'objectId', + }, + foo: { + type: 'string', + }, + }, + required: ['_id', 'foo'], + type: 'object', + }, + }, + }, + ]); + }); + }); +}); diff --git a/src/__tests__/model.test.ts b/src/__tests__/model.test.ts index f5146a8e4..072a09182 100644 --- a/src/__tests__/model.test.ts +++ b/src/__tests__/model.test.ts @@ -1,4 +1,6 @@ -import { beforeEach, describe, expect, jest, test } from '@jest/globals'; +// import { expect } from 'expect'; +import { deepStrictEqual, rejects, strictEqual } from 'node:assert'; +import { afterEach, beforeEach, describe, Mock, mock, test } from 'node:test'; import { Collection, FindCursor, MongoError, ObjectId } from 'mongodb'; import { expectType } from 'ts-expect'; import { Hooks } from '../hooks'; @@ -6,9 +8,35 @@ import { abstract, build, Model } from '../model'; import { PaprBulkWriteOperation } from '../mongodbTypes'; import { schema } from '../schema'; import Types from '../types'; +import { expectToBeCalledOnceWith } from './assert'; + +const MOCK_DATE = new Date(1234567890000); describe('model', () => { - let collection: Collection; + let collection: Omit< + Collection, + | 'aggregate' + | 'bulkWrite' + | 'distinct' + | 'find' + | 'findOneAndDelete' + | 'findOneAndUpdate' + | 'insertMany' + | 'insertOne' + | 'updateMany' + | 'updateOne' + > & { + aggregate: Mock; + bulkWrite: Mock; + distinct: Mock; + find: Mock; + findOneAndDelete: Mock; + findOneAndUpdate: Mock; + insertOne: Mock; + insertMany: Mock; + updateMany: Mock; + updateOne: Mock; + }; const projection = { foo: 1, @@ -136,55 +164,59 @@ describe('model', () => { collection = { // @ts-expect-error Ignore mock function - aggregate: jest.fn().mockReturnValue({ - // @ts-expect-error Ignore mock function - toArray: jest.fn().mockResolvedValue(docs), - }), + aggregate: mock.fn(() => ({ + toArray: mock.fn(() => Promise.resolve(docs)), + })), // @ts-expect-error Ignore mock function - bulkWrite: jest.fn().mockResolvedValue({ - result: true, - }), + bulkWrite: mock.fn(() => + Promise.resolve({ + result: true, + }) + ), collectionName: 'testcollection', + distinct: mock.fn(() => Promise.resolve(['FOO', 'BAR'])), // @ts-expect-error Ignore mock function - distinct: jest.fn().mockResolvedValue(['FOO', 'BAR']), - // @ts-expect-error Ignore mock function - find: jest.fn().mockReturnValue({ - // @ts-expect-error Ignore mock function - toArray: jest.fn().mockResolvedValue(docs), - }), - // @ts-expect-error Ignore mock function - findOne: jest.fn().mockResolvedValue(doc), - // @ts-expect-error Ignore mock function - findOneAndDelete: jest.fn().mockResolvedValue(doc), + find: mock.fn(() => ({ + toArray: mock.fn(() => Promise.resolve(docs)), + })), + findOne: mock.fn(() => Promise.resolve(doc)), // @ts-expect-error Ignore mock function - findOneAndUpdate: jest.fn().mockResolvedValue(doc), - // @ts-expect-error Ignore mock function - insertMany: jest.fn().mockResolvedValue({ - acknowledged: true, - insertedCount: 2, - insertedIds: [new ObjectId(), new ObjectId()], - }), + findOneAndDelete: mock.fn(() => Promise.resolve(doc)), // @ts-expect-error Ignore mock function - insertOne: jest.fn().mockResolvedValue({ - acknowledged: true, - insertedId: new ObjectId(), - }), + findOneAndUpdate: mock.fn(() => Promise.resolve(doc)), + insertMany: mock.fn(() => + Promise.resolve({ + acknowledged: true, + insertedCount: 2, + insertedIds: [new ObjectId(), new ObjectId()], + }) + ), + insertOne: mock.fn(() => + Promise.resolve({ + acknowledged: true, + insertedId: new ObjectId(), + }) + ), // @ts-expect-error Ignore mock function - updateMany: jest.fn().mockResolvedValue({ - modifiedCount: 1, - result: { - n: 1, - ok: 1, - }, - }), + updateMany: mock.fn(() => + Promise.resolve({ + modifiedCount: 1, + result: { + n: 1, + ok: 1, + }, + }) + ), // @ts-expect-error Ignore mock function - updateOne: jest.fn().mockResolvedValue({ - modifiedCount: 1, - result: { - n: 1, - ok: 1, - }, - }), + updateOne: mock.fn(() => + Promise.resolve({ + modifiedCount: 1, + result: { + n: 1, + ok: 1, + }, + }) + ), }; // @ts-expect-error Ignore abstract assignment @@ -211,6 +243,15 @@ describe('model', () => { dynamicDefaultsModel = abstract(dynamicDefaultsSchema); // @ts-expect-error Ignore schema types build(dynamicDefaultsSchema, dynamicDefaultsModel, collection); + + mock.timers.enable({ + apis: ['Date'], + now: 1234567890000, + }); + }); + + afterEach(() => { + mock.timers.reset(); }); describe('aggregate', () => { @@ -243,7 +284,7 @@ describe('model', () => { describe('bulkWrite', () => { test('simple schema', async () => { - const operations: PaprBulkWriteOperation[] = [ + const operations: readonly PaprBulkWriteOperation[] = [ { insertOne: { document: { @@ -291,9 +332,8 @@ describe('model', () => { await simpleModel.bulkWrite(operations); - expect(collection.bulkWrite).toHaveBeenCalledWith(operations, { - ignoreUndefined: true, - }); + // @ts-expect-error `operations` type is more restricted in Papr + expectToBeCalledOnceWith(collection.bulkWrite, [operations, { ignoreUndefined: true }]); }); test('simple schema with inline operations', async () => { @@ -308,7 +348,7 @@ describe('model', () => { }, ]); - expect(collection.bulkWrite).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.bulkWrite, [ [ { insertOne: { @@ -321,8 +361,8 @@ describe('model', () => { ], { ignoreUndefined: true, - } - ); + }, + ]); }); test('simple schema with readonly operations', async () => { @@ -376,9 +416,12 @@ describe('model', () => { await simpleModel.bulkWrite(operations); - expect(collection.bulkWrite).toHaveBeenCalledWith(operations, { - ignoreUndefined: true, - }); + expectToBeCalledOnceWith(collection.bulkWrite, [ + operations, + { + ignoreUndefined: true, + }, + ]); }); test('schema with defaults', async () => { @@ -462,7 +505,7 @@ describe('model', () => { await simpleModel.bulkWrite(operations); - expect(collection.bulkWrite).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.bulkWrite, [ [ { insertOne: { @@ -544,13 +587,11 @@ describe('model', () => { }, }, ], - { ignoreUndefined: true } - ); + { ignoreUndefined: true }, + ]); }); test('schema with dynamic defaults', async () => { - jest.useFakeTimers({ now: 123456 }); - const operations: PaprBulkWriteOperation[] = [ { @@ -630,7 +671,7 @@ describe('model', () => { await dynamicDefaultsModel.bulkWrite(operations); - expect(collection.bulkWrite).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.bulkWrite, [ [ { insertOne: { @@ -643,7 +684,7 @@ describe('model', () => { { insertOne: { document: { - bar: 123456, + bar: 1234567890000, foo: 'foo', }, }, @@ -705,15 +746,15 @@ describe('model', () => { foo: 'foo', }, $setOnInsert: { - bar: 123456, + bar: 1234567890000, }, }, upsert: true, }, }, ], - { ignoreUndefined: true } - ); + { ignoreUndefined: true }, + ]); }); test('timestamps schema', async () => { @@ -796,25 +837,20 @@ describe('model', () => { }, ]); - expect(collection.bulkWrite).toHaveBeenCalledTimes(1); - expect( - (collection.bulkWrite as jest.Mocked).mock.calls[0][1] - ).toEqual({ - ignoreUndefined: true, - }); + strictEqual(collection.bulkWrite.mock.callCount(), 1); + deepStrictEqual(collection.bulkWrite.mock.calls[0].arguments[1], { ignoreUndefined: true }); - const operations = (collection.bulkWrite as jest.Mocked).mock - .calls[0][0]; + const [operations] = collection.bulkWrite.mock.calls[0].arguments; - expect(operations).toHaveLength(10); - expect(operations).toEqual([ + strictEqual(operations.length, 10); + deepStrictEqual(operations, [ { insertOne: { document: { bar: 123, - createdAt: expect.any(Date), + createdAt: MOCK_DATE, foo: 'foo', - updatedAt: expect.any(Date), + updatedAt: MOCK_DATE, }, }, }, @@ -824,7 +860,7 @@ describe('model', () => { update: { $currentDate: { updatedAt: true }, $set: { bar: 123 }, - $setOnInsert: { createdAt: expect.any(Date) }, + $setOnInsert: { createdAt: MOCK_DATE }, }, }, }, @@ -834,7 +870,7 @@ describe('model', () => { update: { $currentDate: { updatedAt: true }, $set: { bar: 123 }, - $setOnInsert: { createdAt: expect.any(Date) }, + $setOnInsert: { createdAt: MOCK_DATE }, }, }, }, @@ -843,9 +879,9 @@ describe('model', () => { filter: { foo: 'foo' }, replacement: { bar: 123, - createdAt: expect.any(Date), + createdAt: MOCK_DATE, foo: 'foo', - updatedAt: expect.any(Date), + updatedAt: MOCK_DATE, }, }, }, @@ -864,7 +900,7 @@ describe('model', () => { filter: { foo: 'createdAt in $set' }, update: { $currentDate: { updatedAt: true }, - $set: { createdAt: expect.any(Date) }, + $set: { createdAt: MOCK_DATE }, }, }, }, @@ -881,7 +917,7 @@ describe('model', () => { updateOne: { filter: { foo: 'updatedAt in $unset' }, update: { - $setOnInsert: { createdAt: expect.any(Date) }, + $setOnInsert: { createdAt: MOCK_DATE }, $unset: { updatedAt: 1 }, }, }, @@ -890,8 +926,8 @@ describe('model', () => { updateMany: { filter: { foo: 'updatedAt in $set' }, update: { - $set: { updatedAt: expect.any(Date) }, - $setOnInsert: { createdAt: expect.any(Date) }, + $set: { updatedAt: MOCK_DATE }, + $setOnInsert: { createdAt: MOCK_DATE }, }, }, }, @@ -978,23 +1014,18 @@ describe('model', () => { }, ]); - expect(collection.bulkWrite).toHaveBeenCalledTimes(1); - expect( - (collection.bulkWrite as jest.Mocked).mock.calls[0][1] - ).toEqual({ - ignoreUndefined: true, - }); + strictEqual(collection.bulkWrite.mock.callCount(), 1); + deepStrictEqual(collection.bulkWrite.mock.calls[0].arguments[1], { ignoreUndefined: true }); - const operations = (collection.bulkWrite as jest.Mocked).mock - .calls[0][0]; + const [operations] = collection.bulkWrite.mock.calls[0].arguments; - expect(operations).toHaveLength(10); - expect(operations).toEqual([ + strictEqual(operations.length, 10); + deepStrictEqual(operations, [ { insertOne: { document: { - _createdDate: expect.any(Date), - _updatedDate: expect.any(Date), + _createdDate: MOCK_DATE, + _updatedDate: MOCK_DATE, bar: 123, foo: 'foo', }, @@ -1006,7 +1037,7 @@ describe('model', () => { update: { $currentDate: { _updatedDate: true }, $set: { bar: 123 }, - $setOnInsert: { _createdDate: expect.any(Date) }, + $setOnInsert: { _createdDate: MOCK_DATE }, }, }, }, @@ -1016,7 +1047,7 @@ describe('model', () => { update: { $currentDate: { _updatedDate: true }, $set: { bar: 123 }, - $setOnInsert: { _createdDate: expect.any(Date) }, + $setOnInsert: { _createdDate: MOCK_DATE }, }, }, }, @@ -1024,8 +1055,8 @@ describe('model', () => { replaceOne: { filter: { foo: 'foo' }, replacement: { - _createdDate: expect.any(Date), - _updatedDate: expect.any(Date), + _createdDate: MOCK_DATE, + _updatedDate: MOCK_DATE, bar: 123, foo: 'foo', }, @@ -1046,7 +1077,7 @@ describe('model', () => { filter: { foo: '_createdDate in $set' }, update: { $currentDate: { _updatedDate: true }, - $set: { _createdDate: expect.any(Date) }, + $set: { _createdDate: MOCK_DATE }, }, }, }, @@ -1063,7 +1094,7 @@ describe('model', () => { updateOne: { filter: { foo: '_updatedDate in $unset' }, update: { - $setOnInsert: { _createdDate: expect.any(Date) }, + $setOnInsert: { _createdDate: MOCK_DATE }, $unset: { _updatedDate: 1 }, }, }, @@ -1072,8 +1103,8 @@ describe('model', () => { updateMany: { filter: { foo: '_updatedDate in $set' }, update: { - $set: { _updatedDate: expect.any(Date) }, - $setOnInsert: { _createdDate: expect.any(Date) }, + $set: { _updatedDate: MOCK_DATE }, + $setOnInsert: { _createdDate: MOCK_DATE }, }, }, }, @@ -1083,7 +1114,7 @@ describe('model', () => { test('with empty operations array', async () => { await simpleModel.bulkWrite([]); - expect(collection.bulkWrite).toHaveBeenCalledTimes(0); + strictEqual(collection.bulkWrite.mock.calls.length, 0); }); }); @@ -1092,7 +1123,7 @@ describe('model', () => { const results = await simpleModel.distinct('foo', {}); expectType(results); - expect(results).toEqual(['FOO', 'BAR']); + deepStrictEqual(results, ['FOO', 'BAR']); if (results.length) { expectType(results[0]); @@ -1288,7 +1319,6 @@ describe('model', () => { test('simple schema', async () => { const result = await simpleModel.findOneAndDelete({ foo: 'bar' }); - expect(result).toBe(doc); expectType(result); if (result) { @@ -1300,12 +1330,13 @@ describe('model', () => { // @ts-expect-error `updatedAt` is undefined here result.updatedAt; } + + deepStrictEqual(result, doc); }); test('with projection', async () => { const result = await simpleModel.findOneAndDelete({ foo: 'bar' }, { projection }); - expect(result).toBe(doc); expectType<{ _id: ObjectId; foo: string; @@ -1318,16 +1349,16 @@ describe('model', () => { result.bar; expectType(result.ham); } + + deepStrictEqual(result, doc); }); test('throws error on failure', async () => { - ( - collection.findOneAndDelete as jest.Mocked - ).mockRejectedValueOnce(new Error('findOneAndDelete failed')); + collection.findOneAndDelete = mock.fn(() => { + throw new Error('findOneAndDelete failed'); + }); - await expect(simpleModel.findOneAndDelete({ foo: 'bar' })).rejects.toThrow( - 'findOneAndDelete failed' - ); + await rejects(simpleModel.findOneAndDelete({ foo: 'bar' }), /findOneAndDelete failed/); }); }); @@ -1335,7 +1366,7 @@ describe('model', () => { test('simple schema', async () => { const result = await simpleModel.findOneAndUpdate({ foo: 'bar' }, { $set: { bar: 123 } }); - expect(result).toBe(doc); + deepStrictEqual(result, doc); expectType(result); if (result) { @@ -1356,29 +1387,30 @@ describe('model', () => { { projection } ); - expect(result).toBe(doc); expectType<{ _id: ObjectId; foo: string; ham?: Date; } | null>(result); - if (result) { expectType(result.foo); // @ts-expect-error `bar` is undefined here result.bar; expectType(result.ham); } + + deepStrictEqual(result, doc); }); test('throws error on failure', async () => { - ( - collection.findOneAndUpdate as jest.Mocked - ).mockRejectedValueOnce(new Error('findOneAndUpdate failed')); + collection.findOneAndUpdate = mock.fn(() => { + throw new Error('findOneAndUpdate failed'); + }); - await expect( - simpleModel.findOneAndUpdate({ foo: 'bar' }, { $set: { bar: 123 } }) - ).rejects.toThrow('findOneAndUpdate failed'); + await rejects( + simpleModel.findOneAndUpdate({ foo: 'bar' }, { $set: { bar: 123 } }), + /findOneAndUpdate failed/ + ); }); test('timestamps schema', async () => { @@ -1390,7 +1422,8 @@ describe('model', () => { } ); - expect(collection.findOneAndUpdate).toHaveBeenCalledWith( + // @ts-expect-error Args are not inferred correctly here + expectToBeCalledOnceWith(collection.findOneAndUpdate, [ { foo: 'bar', }, @@ -1402,8 +1435,8 @@ describe('model', () => { { ignoreUndefined: true, returnDocument: 'after', - } - ); + }, + ]); expectType(result); @@ -1426,7 +1459,8 @@ describe('model', () => { } ); - expect(collection.findOneAndUpdate).toHaveBeenCalledWith( + // @ts-expect-error Args are not inferred correctly here + expectToBeCalledOnceWith(collection.findOneAndUpdate, [ { foo: 'bar', }, @@ -1438,8 +1472,8 @@ describe('model', () => { { ignoreUndefined: true, returnDocument: 'after', - } - ); + }, + ]); expectType(result); @@ -1462,7 +1496,8 @@ describe('model', () => { } ); - expect(collection.findOneAndUpdate).toHaveBeenCalledWith( + // @ts-expect-error Args are not inferred correctly here + expectToBeCalledOnceWith(collection.findOneAndUpdate, [ { foo: 'bar', }, @@ -1474,8 +1509,8 @@ describe('model', () => { { ignoreUndefined: true, returnDocument: 'after', - } - ); + }, + ]); expectType(result); @@ -1492,7 +1527,8 @@ describe('model', () => { test('simple schema empty update', async () => { const result = await simpleModel.findOneAndUpdate({ foo: 'bar' }, {}); - expect(collection.findOneAndUpdate).toHaveBeenCalledWith( + // @ts-expect-error Args are not inferred correctly here + expectToBeCalledOnceWith(collection.findOneAndUpdate, [ { foo: 'bar', }, @@ -1500,8 +1536,8 @@ describe('model', () => { { ignoreUndefined: true, returnDocument: 'after', - } - ); + }, + ]); expectType(result); @@ -1523,7 +1559,8 @@ describe('model', () => { expectType(result); - expect(collection.findOneAndUpdate).toHaveBeenCalledWith( + // @ts-expect-error Args are not inferred correctly here + expectToBeCalledOnceWith(collection.findOneAndUpdate, [ { foo: 'foo' }, { $set: { foo: 'bar' }, @@ -1533,8 +1570,8 @@ describe('model', () => { ignoreUndefined: true, returnDocument: 'after', upsert: true, - } - ); + }, + ]); }); test('simple schema, upsert skips defaults that are present in $set', async () => { @@ -1546,7 +1583,8 @@ describe('model', () => { expectType(result); - expect(collection.findOneAndUpdate).toHaveBeenCalledWith( + // @ts-expect-error Args are not inferred correctly here + expectToBeCalledOnceWith(collection.findOneAndUpdate, [ { foo: 'foo' }, { $set: { bar: 123 }, @@ -1555,8 +1593,8 @@ describe('model', () => { ignoreUndefined: true, returnDocument: 'after', upsert: true, - } - ); + }, + ]); }); test('simple schema, skips defaults that are present in $inc', async () => { @@ -1568,7 +1606,8 @@ describe('model', () => { expectType(result); - expect(collection.findOneAndUpdate).toHaveBeenCalledWith( + // @ts-expect-error Args are not inferred correctly here + expectToBeCalledOnceWith(collection.findOneAndUpdate, [ { foo: 'foo' }, { $inc: { bar: 1 }, @@ -1577,8 +1616,8 @@ describe('model', () => { ignoreUndefined: true, returnDocument: 'after', upsert: true, - } - ); + }, + ]); }); test('simple schema, skips defaults that are present in $unset', async () => { @@ -1590,7 +1629,8 @@ describe('model', () => { expectType(result); - expect(collection.findOneAndUpdate).toHaveBeenCalledWith( + // @ts-expect-error Args are not inferred correctly here + expectToBeCalledOnceWith(collection.findOneAndUpdate, [ { foo: 'foo' }, { $unset: { bar: 1 }, @@ -1599,8 +1639,8 @@ describe('model', () => { ignoreUndefined: true, returnDocument: 'after', upsert: true, - } - ); + }, + ]); }); test('timestamps schema', async () => { @@ -1621,19 +1661,20 @@ describe('model', () => { expectType(result.updatedAt); } - expect(collection.findOneAndUpdate).toHaveBeenCalledWith( + // @ts-expect-error Args are not inferred correctly here + expectToBeCalledOnceWith(collection.findOneAndUpdate, [ { foo: 'foo' }, { $currentDate: { updatedAt: true }, $set: { bar: 123 }, - $setOnInsert: { createdAt: expect.any(Date) }, + $setOnInsert: { createdAt: MOCK_DATE }, }, { ignoreUndefined: true, returnDocument: 'after', upsert: true, - } - ); + }, + ]); }); test('timestamps schema, without $set', async () => { @@ -1654,7 +1695,8 @@ describe('model', () => { expectType(result.updatedAt); } - expect(collection.findOneAndUpdate).toHaveBeenCalledWith( + // @ts-expect-error Args are not inferred correctly here + expectToBeCalledOnceWith(collection.findOneAndUpdate, [ { foo: 'foo' }, { $currentDate: { @@ -1663,15 +1705,15 @@ describe('model', () => { }, $setOnInsert: { bar: 123456, - createdAt: expect.any(Date), + createdAt: MOCK_DATE, }, }, { ignoreUndefined: true, returnDocument: 'after', upsert: true, - } - ); + }, + ]); }); test('timestamp config schema', async () => { @@ -1692,19 +1734,20 @@ describe('model', () => { expectType(result._updatedDate); } - expect(collection.findOneAndUpdate).toHaveBeenCalledWith( + // @ts-expect-error Args are not inferred correctly here + expectToBeCalledOnceWith(collection.findOneAndUpdate, [ { foo: 'foo' }, { $currentDate: { _updatedDate: true }, $set: { bar: 123 }, - $setOnInsert: { _createdDate: expect.any(Date) }, + $setOnInsert: { _createdDate: MOCK_DATE }, }, { ignoreUndefined: true, returnDocument: 'after', upsert: true, - } - ); + }, + ]); }); }); }); @@ -1715,9 +1758,10 @@ describe('model', () => { beforeEach(() => { hooks = { - after: [jest.fn(() => Promise.resolve())], + after: [mock.fn(() => Promise.resolve())], before: [ - jest.fn(({ args, collectionName, context, error, methodName }) => { + mock.fn(({ args, collectionName, context, error, methodName }) => { + // @ts-expect-error Ignore mock type context.id = 'mock'; return Promise.resolve(); }), @@ -1735,61 +1779,71 @@ describe('model', () => { expectType(results); - expect(hooks.before?.[0]).toHaveBeenCalledTimes(1); // The context is actually populated in `before` hook calls, // but since we're checking it afterwards we need to list it here as the input argument - expect(hooks.before?.[0]).toHaveBeenCalledWith({ - args: [{ foo: 'bar' }], - collectionName: 'testcollection', - context: { - id: 'mock', + // @ts-expect-error Ignore type mismatch between Hook & Mock + expectToBeCalledOnceWith(hooks.before?.[0], [ + { + args: [{ foo: 'bar' }], + collectionName: 'testcollection', + context: { + id: 'mock', + }, + methodName: 'find', }, - methodName: 'find', - }); + ]); - expect(hooks.after?.[0]).toHaveBeenCalledTimes(1); - expect(hooks.after?.[0]).toHaveBeenCalledWith({ - args: [{ foo: 'bar' }], - collectionName: 'testcollection', - context: { - id: 'mock', + // @ts-expect-error Ignore type mismatch between Hook & Mock + expectToBeCalledOnceWith(hooks.after?.[0], [ + { + args: [{ foo: 'bar' }], + collectionName: 'testcollection', + context: { + id: 'mock', + }, + methodName: 'find', + result: results, }, - methodName: 'find', - result: results, - }); + ]); }); test('find throws error', async () => { const err = new Error('Test'); - (collection.find as jest.Mocked).mockReturnValue({ - // @ts-expect-error Ignore mock function - toArray: jest.fn().mockRejectedValue(err), - }); + // @ts-expect-error Ignore mock function + collection.find = mock.fn(() => ({ + toArray: mock.fn(() => { + throw err; + }), + })); - await expect(hooksModel.find({ foo: 'bar' })).rejects.toThrow('Test'); + await rejects(hooksModel.find({ foo: 'bar' }), /Test/); - expect(hooks.before?.[0]).toHaveBeenCalledTimes(1); // The context is actually populated in `before` hook calls, // but since we're checking it afterwards we need to list it here as the input argument - expect(hooks.before?.[0]).toHaveBeenCalledWith({ - args: [{ foo: 'bar' }], - collectionName: 'testcollection', - context: { - id: 'mock', + // @ts-expect-error Ignore type mismatch between Hook & Mock + expectToBeCalledOnceWith(hooks.before?.[0], [ + { + args: [{ foo: 'bar' }], + collectionName: 'testcollection', + context: { + id: 'mock', + }, + methodName: 'find', }, - methodName: 'find', - }); + ]); - expect(hooks.after?.[0]).toHaveBeenCalledTimes(1); - expect(hooks.after?.[0]).toHaveBeenCalledWith({ - args: [{ foo: 'bar' }], - collectionName: 'testcollection', - context: { - id: 'mock', + // @ts-expect-error Ignore type mismatch between Hook & Mock + expectToBeCalledOnceWith(hooks.after?.[0], [ + { + args: [{ foo: 'bar' }], + collectionName: 'testcollection', + context: { + id: 'mock', + }, + error: err, + methodName: 'find', }, - error: err, - methodName: 'find', - }); + ]); }); }); @@ -1800,13 +1854,13 @@ describe('model', () => { foo: 'foo', }); - expect(collection.insertOne).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.insertOne, [ { bar: 123, foo: 'foo', }, - { ignoreUndefined: true } - ); + { ignoreUndefined: true }, + ]); expectType(result); @@ -1825,13 +1879,13 @@ describe('model', () => { foo: 'foo', }); - expect(collection.insertOne).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.insertOne, [ { bar: 123456, foo: 'foo', }, - { ignoreUndefined: true } - ); + { ignoreUndefined: true }, + ]); expectType(result); @@ -1861,15 +1915,15 @@ describe('model', () => { foo: 'foo', }); - expect(collection.insertOne).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.insertOne, [ { bar: 123, - createdAt: expect.any(Date), + createdAt: MOCK_DATE, foo: 'foo', - updatedAt: expect.any(Date), + updatedAt: MOCK_DATE, }, - { ignoreUndefined: true } - ); + { ignoreUndefined: true }, + ]); expectType(result); @@ -1891,15 +1945,15 @@ describe('model', () => { updatedAt: date, }); - expect(collection.insertOne).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.insertOne, [ { bar: 123, createdAt: date, foo: 'foo', updatedAt: date, }, - { ignoreUndefined: true } - ); + { ignoreUndefined: true }, + ]); expectType(result); @@ -1917,15 +1971,15 @@ describe('model', () => { foo: 'foo', }); - expect(collection.insertOne).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.insertOne, [ { - _createdDate: expect.any(Date), - _updatedDate: expect.any(Date), + _createdDate: MOCK_DATE, + _updatedDate: MOCK_DATE, bar: 123, foo: 'foo', }, - { ignoreUndefined: true } - ); + { ignoreUndefined: true }, + ]); expectType(result); @@ -1947,15 +2001,15 @@ describe('model', () => { foo: 'foo', }); - expect(collection.insertOne).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.insertOne, [ { _createdDate: date, _updatedDate: date, bar: 123, foo: 'foo', }, - { ignoreUndefined: true } - ); + { ignoreUndefined: true }, + ]); expectType(result); @@ -1968,19 +2022,17 @@ describe('model', () => { }); test('dynamic defaults schema, inserts defaults', async () => { - jest.useFakeTimers({ now: 123456 }); - const result = await dynamicDefaultsModel.insertOne({ foo: 'foo', }); - expect(collection.insertOne).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.insertOne, [ { - bar: 123456, + bar: 1234567890000, foo: 'foo', }, - { ignoreUndefined: true } - ); + { ignoreUndefined: true }, + ]); expectType(result); @@ -1995,30 +2047,32 @@ describe('model', () => { }); test('throws error on not acknowledged result', async () => { - (collection.insertOne as jest.Mocked).mockResolvedValue({ - acknowledged: false, - insertedId: new ObjectId(), - }); + collection.insertOne = mock.fn(() => + Promise.resolve({ + acknowledged: false, + insertedId: new ObjectId(), + }) + ); - await expect( + await rejects( simpleModel.insertOne({ bar: 123, foo: 'foo', - }) - ).rejects.toThrow('insertOne failed'); + }), + /insertOne failed/ + ); }); test('throws error on failure', async () => { - (collection.insertOne as jest.Mocked).mockRejectedValue( - new Error('Test error') - ); + collection.insertOne = mock.fn(() => Promise.reject(new Error('Test error'))); - await expect( + await rejects( simpleModel.insertOne({ bar: 123, foo: 'foo', - }) - ).rejects.toThrow('Test error'); + }), + /Test error/ + ); }); }); @@ -2035,7 +2089,7 @@ describe('model', () => { }, ]); - expect(collection.insertMany).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.insertMany, [ [ { bar: 123, @@ -2046,8 +2100,8 @@ describe('model', () => { foo: 'bar', }, ], - { ignoreUndefined: true } - ); + { ignoreUndefined: true }, + ]); expectType(result); @@ -2073,7 +2127,7 @@ describe('model', () => { }, ]); - expect(collection.insertMany).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.insertMany, [ [ { bar: 123456, @@ -2084,8 +2138,8 @@ describe('model', () => { foo: 'bar', }, ], - { ignoreUndefined: true } - ); + { ignoreUndefined: true }, + ]); expectType(result); @@ -2107,11 +2161,13 @@ describe('model', () => { }); test('timestamps schema', async () => { - (collection.insertMany as jest.Mocked).mockResolvedValue({ - acknowledged: true, - insertedCount: 3, - insertedIds: [new ObjectId(), new ObjectId(), new ObjectId()], - }); + collection.insertMany = mock.fn(() => + Promise.resolve({ + acknowledged: true, + insertedCount: 3, + insertedIds: [new ObjectId(), new ObjectId(), new ObjectId()], + }) + ); const date = new Date('2020-01-01T12:00:00'); const result = await timestampsModel.insertMany([ @@ -2132,19 +2188,19 @@ describe('model', () => { }, ]); - expect(collection.insertMany).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.insertMany, [ [ { bar: 123, - createdAt: expect.any(Date), + createdAt: MOCK_DATE, foo: 'foo', - updatedAt: expect.any(Date), + updatedAt: MOCK_DATE, }, { bar: 456, createdAt: date, foo: 'bar', - updatedAt: expect.any(Date), + updatedAt: MOCK_DATE, }, { bar: 789, @@ -2153,8 +2209,8 @@ describe('model', () => { updatedAt: date, }, ], - { ignoreUndefined: true } - ); + { ignoreUndefined: true }, + ]); expectType(result); @@ -2169,11 +2225,13 @@ describe('model', () => { }); test('timestamp config schema', async () => { - (collection.insertMany as jest.Mocked).mockResolvedValue({ - acknowledged: true, - insertedCount: 3, - insertedIds: [new ObjectId(), new ObjectId(), new ObjectId()], - }); + collection.insertMany = mock.fn(() => + Promise.resolve({ + acknowledged: true, + insertedCount: 3, + insertedIds: [new ObjectId(), new ObjectId(), new ObjectId()], + }) + ); const date = new Date('2020-01-01T12:00:00'); const result = await timestampConfigModel.insertMany([ @@ -2194,17 +2252,17 @@ describe('model', () => { }, ]); - expect(collection.insertMany).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.insertMany, [ [ { - _createdDate: expect.any(Date), - _updatedDate: expect.any(Date), + _createdDate: MOCK_DATE, + _updatedDate: MOCK_DATE, bar: 123, foo: 'foo', }, { _createdDate: date, - _updatedDate: expect.any(Date), + _updatedDate: MOCK_DATE, bar: 456, foo: 'bar', }, @@ -2215,8 +2273,8 @@ describe('model', () => { foo: 'ham', }, ], - { ignoreUndefined: true } - ); + { ignoreUndefined: true }, + ]); expectType(result); @@ -2231,8 +2289,6 @@ describe('model', () => { }); test('dynamic defaults schema, inserts defaults', async () => { - jest.useFakeTimers({ now: 123456 }); - const result = await dynamicDefaultsModel.insertMany([ { foo: 'foo', @@ -2242,19 +2298,19 @@ describe('model', () => { }, ]); - expect(collection.insertMany).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.insertMany, [ [ { - bar: 123456, + bar: 1234567890000, foo: 'foo', }, { - bar: 123456, + bar: 1234567890000, foo: 'bar', }, ], - { ignoreUndefined: true } - ); + { ignoreUndefined: true }, + ]); expectType(result); @@ -2271,35 +2327,37 @@ describe('model', () => { }); test('throws error on not acknowledged result', async () => { - (collection.insertMany as jest.Mocked).mockResolvedValue({ - acknowledged: false, - insertedCount: 0, - insertedIds: [], - }); + collection.insertMany = mock.fn(() => + Promise.resolve({ + acknowledged: false, + insertedCount: 0, + insertedIds: [], + }) + ); - await expect( + await rejects( simpleModel.insertMany([ { bar: 123, foo: 'foo', }, - ]) - ).rejects.toThrow('insertMany failed'); + ]), + /insertMany failed/ + ); }); test('throws error on failure', async () => { - (collection.insertMany as jest.Mocked).mockRejectedValue( - new Error('Test error') - ); + collection.insertMany = mock.fn(() => Promise.reject(new Error('Test error'))); - await expect( + await rejects( simpleModel.insertMany([ { bar: 123, foo: 'foo', }, - ]) - ).rejects.toThrow('Test error'); + ]), + /Test error/ + ); }); }); @@ -2316,7 +2374,7 @@ describe('model', () => { test('insertOne', async () => { await maxTimeModel.insertOne({ foo: 'bar' }); - expect(collection.insertOne).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.insertOne, [ { bar: 123456, foo: 'bar', @@ -2324,33 +2382,36 @@ describe('model', () => { { ignoreUndefined: true, maxTimeMS: 1000, - } - ); + }, + ]); }); test('find with projection', async () => { await maxTimeModel.find({ foo: 'bar' }, { projection: { bar: 1 } }); - expect(collection.find).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.find, [ { foo: 'bar' }, { ignoreUndefined: true, maxTimeMS: 1000, projection: { bar: 1 }, - } - ); + }, + ]); }); test('find error on maxTimeMS', async () => { const err = new MongoError('Test error'); err.code = 50; - (collection.find as jest.Mocked).mockReturnValue({ - // @ts-expect-error Ignore mock function - toArray: jest.fn().mockRejectedValue(err), - }); - - await expect(simpleModel.find({ foo: 'bar' })).rejects.toThrowError( - `Query exceeded maxTime: testcollection.find({ foo: 'bar' })` + // @ts-expect-error Ignore mock function + collection.find = mock.fn(() => ({ + toArray: mock.fn(() => { + throw err; + }), + })); + + await rejects( + simpleModel.find({ foo: 'bar' }), + /Query exceeded maxTime: testcollection.find\({ foo: 'bar' }\)/ ); }); }); @@ -2359,25 +2420,25 @@ describe('model', () => { test('simple schema', async () => { await simpleModel.updateMany({ foo: 'foo' }, { $set: { bar: 123 } }); - expect(collection.updateMany).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.updateMany, [ { foo: 'foo' }, { $set: { bar: 123 }, }, - { ignoreUndefined: true } - ); + { ignoreUndefined: true }, + ]); }); test('simple schema, without $set', async () => { await simpleModel.updateMany({ foo: 'foo' }, { $inc: { bar: 123 } }); - expect(collection.updateMany).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.updateMany, [ { foo: 'foo' }, { $inc: { bar: 123 }, }, - { ignoreUndefined: true } - ); + { ignoreUndefined: true }, + ]); }); test.todo('simple schema, uses defaults'); @@ -2385,64 +2446,69 @@ describe('model', () => { test('timestamps schema', async () => { await timestampsModel.updateMany({ foo: 'foo' }, { $set: { bar: 123 } }); - expect(collection.updateMany).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.updateMany, [ { foo: 'foo' }, { $currentDate: { updatedAt: true }, $set: { bar: 123 }, }, - { ignoreUndefined: true } - ); + { ignoreUndefined: true }, + ]); }); test('timestamps schema, without $set', async () => { await timestampsModel.updateMany({ foo: 'foo' }, { $inc: { bar: 123 } }); - expect(collection.updateMany).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.updateMany, [ { foo: 'foo' }, { $currentDate: { updatedAt: true }, $inc: { bar: 123 }, }, - { ignoreUndefined: true } - ); + { ignoreUndefined: true }, + ]); }); test('timestamps schema, updatedAt in $set', async () => { - await timestampsModel.updateMany({ foo: 'foo' }, { $set: { updatedAt: new Date() } }); + await timestampsModel.updateMany( + { foo: 'foo' }, + { + $set: { updatedAt: new Date() }, + } + ); - expect(collection.updateMany).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.updateMany, [ { foo: 'foo' }, { - $set: { updatedAt: expect.any(Date) }, + $set: { updatedAt: MOCK_DATE }, }, - { ignoreUndefined: true } - ); + { ignoreUndefined: true }, + ]); }); test('timestamps schema, updatedAt in $unset', async () => { await timestampsModel.updateMany({ foo: 'foo' }, { $unset: { updatedAt: 1 } }); - expect(collection.updateMany).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.updateMany, [ { foo: 'foo' }, { $unset: { updatedAt: 1 }, }, - { ignoreUndefined: true } - ); + { ignoreUndefined: true }, + ]); }); test('timestamp config schema', async () => { await timestampConfigModel.updateMany({ foo: 'foo' }, { $set: { bar: 123 } }); - expect(collection.updateMany).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.updateMany, [ { foo: 'foo' }, { $currentDate: { _updatedDate: true }, $set: { bar: 123 }, }, - { ignoreUndefined: true } - ); + { ignoreUndefined: true }, + ]); }); }); @@ -2450,25 +2516,25 @@ describe('model', () => { test('simple schema', async () => { await simpleModel.updateOne({ foo: 'foo' }, { $set: { bar: 123 } }); - expect(collection.updateOne).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.updateOne, [ { foo: 'foo' }, { $set: { bar: 123 }, }, - { ignoreUndefined: true } - ); + { ignoreUndefined: true }, + ]); }); test('simple schema, without $set', async () => { await simpleModel.updateOne({ foo: 'foo' }, { $inc: { bar: 123 } }); - expect(collection.updateOne).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.updateOne, [ { foo: 'foo' }, { $inc: { bar: 123 }, }, - { ignoreUndefined: true } - ); + { ignoreUndefined: true }, + ]); }); test.todo('simple schema, uses defaults'); @@ -2476,64 +2542,69 @@ describe('model', () => { test('timestamps schema', async () => { await timestampsModel.updateOne({ foo: 'foo' }, { $set: { bar: 123 } }); - expect(collection.updateOne).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.updateOne, [ { foo: 'foo' }, { $currentDate: { updatedAt: true }, $set: { bar: 123 }, }, - { ignoreUndefined: true } - ); + { ignoreUndefined: true }, + ]); }); test('timestamps schema, without $set', async () => { await timestampsModel.updateOne({ foo: 'foo' }, { $inc: { bar: 123 } }); - expect(collection.updateOne).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.updateOne, [ { foo: 'foo' }, { $currentDate: { updatedAt: true }, $inc: { bar: 123 }, }, - { ignoreUndefined: true } - ); + { ignoreUndefined: true }, + ]); }); test('timestamps schema, updatedAt in $set', async () => { - await timestampsModel.updateOne({ foo: 'foo' }, { $set: { updatedAt: new Date() } }); + await timestampsModel.updateOne( + { foo: 'foo' }, + { + $set: { updatedAt: new Date() }, + } + ); - expect(collection.updateOne).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.updateOne, [ { foo: 'foo' }, { - $set: { updatedAt: expect.any(Date) }, + $set: { updatedAt: MOCK_DATE }, }, - { ignoreUndefined: true } - ); + { ignoreUndefined: true }, + ]); }); test('timestamps schema, updatedAt in $unset', async () => { await timestampsModel.updateOne({ foo: 'foo' }, { $unset: { updatedAt: 1 } }); - expect(collection.updateOne).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.updateOne, [ { foo: 'foo' }, { $unset: { updatedAt: 1 }, }, - { ignoreUndefined: true } - ); + { ignoreUndefined: true }, + ]); }); test('timestamp config schema', async () => { await timestampConfigModel.updateOne({ foo: 'foo' }, { $set: { bar: 123 } }); - expect(collection.updateOne).toHaveBeenCalledWith( + expectToBeCalledOnceWith(collection.updateOne, [ { foo: 'foo' }, { $currentDate: { _updatedDate: true }, $set: { bar: 123 }, }, - { ignoreUndefined: true } - ); + { ignoreUndefined: true }, + ]); }); }); @@ -2553,7 +2624,8 @@ describe('model', () => { // @ts-expect-error `updatedAt` is undefined here result.updatedAt; - expect(collection.findOneAndUpdate).toHaveBeenCalledWith( + // @ts-expect-error Args are not inferred correctly here + expectToBeCalledOnceWith(collection.findOneAndUpdate, [ { foo: 'foo' }, { $set: { ham: date }, @@ -2563,13 +2635,11 @@ describe('model', () => { ignoreUndefined: true, returnDocument: 'after', upsert: true, - } - ); + }, + ]); }); test('dynamic defaults', async () => { - jest.useFakeTimers({ now: 123456 }); - const date = new Date(); const result = await dynamicDefaultsModel.upsert({ foo: 'foo' }, { $set: { ham: date } }); @@ -2584,18 +2654,19 @@ describe('model', () => { // @ts-expect-error `updatedAt` is undefined here result.updatedAt; - expect(collection.findOneAndUpdate).toHaveBeenCalledWith( + // @ts-expect-error Args are not inferred correctly here + expectToBeCalledOnceWith(collection.findOneAndUpdate, [ { foo: 'foo' }, { $set: { ham: date }, - $setOnInsert: { bar: 123456 }, + $setOnInsert: { bar: 1234567890000 }, }, { ignoreUndefined: true, returnDocument: 'after', upsert: true, - } - ); + }, + ]); }); test('with projection', async () => { @@ -2606,7 +2677,6 @@ describe('model', () => { { projection } ); - expect(result).toBe(doc); expectType<{ _id: ObjectId; foo: string; @@ -2618,7 +2688,10 @@ describe('model', () => { result.bar; expectType(result.ham); - expect(collection.findOneAndUpdate).toHaveBeenCalledWith( + deepStrictEqual(result, doc); + + // @ts-expect-error Args are not inferred correctly here + expectToBeCalledOnceWith(collection.findOneAndUpdate, [ { foo: 'foo' }, { $set: { ham: date }, @@ -2629,18 +2702,14 @@ describe('model', () => { projection, returnDocument: 'after', upsert: true, - } - ); + }, + ]); }); test('throws error on failure', async () => { - ( - collection.findOneAndUpdate as jest.Mocked - ).mockRejectedValueOnce(new Error('findOneAndUpdate failed')); - - await expect(simpleModel.upsert({ foo: 'foo' }, { $set: { bar: 123 } })).rejects.toThrow( - 'findOneAndUpdate failed' - ); + collection.findOneAndUpdate = mock.fn(() => { + throw new Error('findOneAndUpdate failed'); + }); }); }); }); diff --git a/src/__tests__/mongodbTypes.test.ts b/src/__tests__/mongodbTypes.test.ts index ce1596463..b524777ab 100644 --- a/src/__tests__/mongodbTypes.test.ts +++ b/src/__tests__/mongodbTypes.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from '@jest/globals'; +import { describe, test } from 'node:test'; import { Binary, BSONSymbol, @@ -69,8 +69,6 @@ describe('mongodb types', () => { describe('PaprFilter', () => { describe('existing top-level keys', () => { test('valid types', () => { - expect(true).toBeTruthy(); - expectType>({ _id: new ObjectId() }); expectType>({ foo: 'foo' }); @@ -109,8 +107,6 @@ describe('mongodb types', () => { }); test('invalid types', () => { - expect(true).toBeTruthy(); - // @ts-expect-error Type mismatch expectType>({ _id: '577fa2d90c4cc47e31cf4b6f' }); @@ -275,8 +271,6 @@ describe('mongodb types', () => { describe('filter operators', () => { describe('logical filter operators', () => { test('valid types on existing top-level keys', () => { - expect(true).toBeTruthy(); - expectType>({ _id: { $in: [new ObjectId()] } }); expectType>({ foo: { $eq: 'foo' } }); diff --git a/src/__tests__/schema.test.ts b/src/__tests__/schema.test.ts index bab6e8c32..d1549bf30 100644 --- a/src/__tests__/schema.test.ts +++ b/src/__tests__/schema.test.ts @@ -1,4 +1,5 @@ -import { describe, expect, test } from '@jest/globals'; +import { deepStrictEqual } from 'node:assert/strict'; +import { describe, test } from 'node:test'; import { ObjectId, Binary, Decimal128 } from 'mongodb'; import { expectType } from 'ts-expect'; import { schema } from '../schema'; @@ -18,7 +19,7 @@ describe('schema', () => { foo: types.boolean(), }); - expect(value).toEqual({ + deepStrictEqual(value, { $validationAction: 'error', $validationLevel: 'strict', additionalProperties: false, @@ -72,7 +73,7 @@ describe('schema', () => { } ); - expect(value).toEqual({ + deepStrictEqual(value, { $defaults: { foo: true }, $validationAction: 'error', $validationLevel: 'strict', @@ -135,7 +136,7 @@ describe('schema', () => { } ); - expect(value).toEqual({ + deepStrictEqual(value, { $defaults: { enumConstOptional: 'ham', enumConstRequired: 'baz', @@ -208,7 +209,7 @@ describe('schema', () => { } ); - expect(value).toEqual({ + deepStrictEqual(value, { $timestamps: true, $validationAction: 'error', $validationLevel: 'strict', @@ -264,7 +265,7 @@ describe('schema', () => { } ); - expect(value).toEqual({ + deepStrictEqual(value, { $validationAction: 'error', $validationLevel: 'strict', additionalProperties: false, @@ -312,7 +313,7 @@ describe('schema', () => { } ); - expect(value).toEqual({ + deepStrictEqual(value, { $timestamps: { createdAt: '_createdDate', updatedAt: '_updatedDate', @@ -382,7 +383,7 @@ describe('schema', () => { } ); - expect(value).toEqual({ + deepStrictEqual(value, { $timestamps: { createdAt: '_createdDate', }, @@ -443,7 +444,7 @@ describe('schema', () => { foo: types.number({ required: true }), }); - expect(value).toEqual({ + deepStrictEqual(value, { $validationAction: 'error', $validationLevel: 'strict', additionalProperties: false, @@ -486,7 +487,7 @@ describe('schema', () => { foo: types.string({ required: true }), }); - expect(value).toEqual({ + deepStrictEqual(value, { $validationAction: 'error', $validationLevel: 'strict', additionalProperties: false, @@ -583,7 +584,7 @@ describe('schema', () => { } ); - expect(value).toEqual({ + deepStrictEqual(value, { $defaults: { stringOptional: 'foo' }, $timestamps: true, $validationAction: 'warn', @@ -866,7 +867,7 @@ describe('schema', () => { foo: types.boolean({ required: false }), }); - expect(value).toEqual({ + deepStrictEqual(value, { $validationAction: 'error', $validationLevel: 'strict', additionalProperties: false, @@ -963,7 +964,7 @@ describe('schema', () => { } ); - expect(value).toEqual({ + deepStrictEqual(value, { $defaults: { stringOptional: 'foo' }, $timestamps: true, $validationAction: 'warn', diff --git a/src/__tests__/types.test.ts b/src/__tests__/types.test.ts index 334af9b5d..85b20776e 100644 --- a/src/__tests__/types.test.ts +++ b/src/__tests__/types.test.ts @@ -1,4 +1,5 @@ -import { describe, expect, test } from '@jest/globals'; +import { deepStrictEqual } from 'node:assert'; +import { describe, test } from 'node:test'; import { ObjectId, Binary, Decimal128 } from 'mongodb'; import { expectType } from 'ts-expect'; import types from '../types'; @@ -14,23 +15,25 @@ describe('types', () => { test('default', () => { const value = types.boolean(); - expect(value).toEqual({ - type: 'boolean', - }); expectType(value); expectType(undefined); + + deepStrictEqual(value, { + type: 'boolean', + }); }); test('required', () => { const value = types.boolean({ required: true }); - expect(value).toEqual({ - $required: true, - type: 'boolean', - }); expectType(value); // @ts-expect-error `value` should not be undefined expectType(undefined); + + deepStrictEqual(value, { + $required: true, + type: 'boolean', + }); }); test('options', () => { @@ -45,23 +48,25 @@ describe('types', () => { test('default', () => { const value = types.date(); - expect(value).toEqual({ - bsonType: 'date', - }); expectType(value); expectType(undefined); + + deepStrictEqual(value, { + bsonType: 'date', + }); }); test('required', () => { const value = types.date({ required: true }); - expect(value).toEqual({ - $required: true, - bsonType: 'date', - }); expectType(value); // @ts-expect-error `value` should not be undefined expectType(undefined); + + deepStrictEqual(value, { + $required: true, + bsonType: 'date', + }); }); test('options', () => { @@ -76,23 +81,25 @@ describe('types', () => { test('default', () => { const value = types.decimal(); - expect(value).toEqual({ - bsonType: 'decimal', - }); expectType(value); expectType(undefined); + + deepStrictEqual(value, { + bsonType: 'decimal', + }); }); test('required', () => { const value = types.decimal({ required: true }); - expect(value).toEqual({ - $required: true, - bsonType: 'decimal', - }); expectType(value); // @ts-expect-error `value` should not be undefined expectType(undefined); + + deepStrictEqual(value, { + $required: true, + bsonType: 'decimal', + }); }); test('options', () => { @@ -105,23 +112,25 @@ describe('types', () => { test('default', () => { const value = types.null(); - expect(value).toEqual({ - type: 'null', - }); expectType(value); expectType(undefined); + + deepStrictEqual(value, { + type: 'null', + }); }); test('required', () => { const value = types.null({ required: true }); - expect(value).toEqual({ - $required: true, - type: 'null', - }); expectType(value); // @ts-expect-error `value` should not be undefined expectType(undefined); + + deepStrictEqual(value, { + $required: true, + type: 'null', + }); }); test('options', () => { @@ -136,23 +145,25 @@ describe('types', () => { test('default', () => { const value = types.number(); - expect(value).toEqual({ - type: 'number', - }); expectType(value); expectType(undefined); + + deepStrictEqual(value, { + type: 'number', + }); }); test('required', () => { const value = types.number({ required: true }); - expect(value).toEqual({ - $required: true, - type: 'number', - }); expectType(value); // @ts-expect-error `value` should not be undefined expectType(undefined); + + deepStrictEqual(value, { + $required: true, + type: 'number', + }); }); test('options', () => { @@ -171,26 +182,28 @@ describe('types', () => { test('default', () => { const value = types.enum(Object.values(TEST_ENUM)); - expect(value).toEqual({ - enum: ['foo', 'bar'], - }); expectType(value); expectType(TEST_ENUM.FOO); expectType(undefined); + + deepStrictEqual(value, { + enum: ['foo', 'bar'], + }); }); test('required', () => { const value = types.enum([...Object.values(TEST_ENUM), null], { required: true }); - expect(value).toEqual({ - $required: true, - enum: ['foo', 'bar', null], - }); expectType(value); expectType(TEST_ENUM.FOO); expectType(null); // @ts-expect-error `value` should not be undefined expectType(undefined); + + deepStrictEqual(value, { + $required: true, + enum: ['foo', 'bar', null], + }); }); test('options', () => { @@ -203,13 +216,14 @@ describe('types', () => { test('const array', () => { const value = types.enum(['a', 'b'] as const); - expect(value).toEqual({ - enum: ['a', 'b'], - }); expectType('a'); // @ts-expect-error `value` can not be c expectType('c'); expectType(undefined); + + deepStrictEqual(value, { + enum: ['a', 'b'], + }); }); }); @@ -217,23 +231,25 @@ describe('types', () => { test('default', () => { const value = types.objectId(); - expect(value).toEqual({ - bsonType: 'objectId', - }); expectType(value); expectType(undefined); + + deepStrictEqual(value, { + bsonType: 'objectId', + }); }); test('required', () => { const value = types.objectId({ required: true }); - expect(value).toEqual({ - $required: true, - bsonType: 'objectId', - }); expectType(value); // @ts-expect-error `value` should not be undefined expectType(undefined); + + deepStrictEqual(value, { + $required: true, + bsonType: 'objectId', + }); }); test('options', () => { @@ -246,23 +262,25 @@ describe('types', () => { test('default', () => { const value = types.binary(); - expect(value).toEqual({ - bsonType: 'binData', - }); expectType(value); expectType(undefined); + + deepStrictEqual(value, { + bsonType: 'binData', + }); }); test('required', () => { const value = types.binary({ required: true }); - expect(value).toEqual({ - $required: true, - bsonType: 'binData', - }); expectType(value); // @ts-expect-error `value` should not be undefined expectType(undefined); + + deepStrictEqual(value, { + $required: true, + bsonType: 'binData', + }); }); test('options', () => { @@ -275,34 +293,37 @@ describe('types', () => { test('default', () => { const value = types.string(); - expect(value).toEqual({ - type: 'string', - }); expectType(value); expectType(undefined); + + deepStrictEqual(value, { + type: 'string', + }); }); test('pattern', () => { const value = types.string({ pattern: '^foo' }); - expect(value).toEqual({ + expectType(value); + expectType(undefined); + + deepStrictEqual(value, { pattern: '^foo', type: 'string', }); - expectType(value); - expectType(undefined); }); test('required', () => { const value = types.string({ required: true }); - expect(value).toEqual({ - $required: true, - type: 'string', - }); expectType(value); // @ts-expect-error `value` should not be undefined expectType(undefined); + + deepStrictEqual(value, { + $required: true, + type: 'string', + }); }); test('options', () => { @@ -324,7 +345,13 @@ describe('types', () => { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment const value = types.any(); - expect(value).toEqual({ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + expectType(value); + expectType(undefined); + expectType('foo'); + expectType(123); + + deepStrictEqual(value, { bsonType: [ 'array', 'binData', @@ -338,18 +365,19 @@ describe('types', () => { 'string', ], }); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - expectType(value); - expectType(undefined); - expectType('foo'); - expectType(123); }); test('required', () => { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment const value = types.any({ required: true }); - expect(value).toEqual({ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + expectType(value); + expectType(undefined); + expectType('foo'); + expectType(123); + + deepStrictEqual(value, { $required: true, bsonType: [ 'array', @@ -364,11 +392,6 @@ describe('types', () => { 'string', ], }); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - expectType(value); - expectType(undefined); - expectType('foo'); - expectType(123); }); test('options', () => { @@ -383,30 +406,32 @@ describe('types', () => { test('default', () => { const value = types.array(types.boolean({ required: true })); - expect(value).toEqual({ + expectType(value); + expectType(undefined); + + deepStrictEqual(value, { items: { $required: true, type: 'boolean', }, type: 'array', }); - expectType(value); - expectType(undefined); }); test('required', () => { const value = types.array(types.string(), { required: true }); - expect(value).toEqual({ + expectType<(string | undefined)[]>(value); + // @ts-expect-error `value` should not be undefined + expectType(undefined); + + deepStrictEqual(value, { $required: true, items: { type: 'string', }, type: 'array', }); - expectType<(string | undefined)[]>(value); - // @ts-expect-error `value` should not be undefined - expectType(undefined); }); test('options', () => { @@ -415,7 +440,9 @@ describe('types', () => { minItems: 1, }); - expect(value).toEqual({ + expectType<(number | undefined)[] | undefined>(value); + + deepStrictEqual(value, { items: { type: 'number', }, @@ -423,7 +450,6 @@ describe('types', () => { minItems: 1, type: 'array', }); - expectType<(number | undefined)[] | undefined>(value); }); test('with object items', () => { @@ -437,7 +463,9 @@ describe('types', () => { { required: true } ); - expect(value).toEqual({ + expectType<{ foo?: string }[]>(value); + + deepStrictEqual(value, { $required: true, items: { $required: true, @@ -451,7 +479,6 @@ describe('types', () => { }, type: 'array', }); - expectType<{ foo?: string }[]>(value); }); }); @@ -459,22 +486,24 @@ describe('types', () => { test('default', () => { const value = types.constant('foo' as const); - expect(value).toEqual({ + expectType<'foo' | undefined>(value); + + deepStrictEqual(value, { enum: ['foo'], }); - expectType<'foo' | undefined>(value); }); test('required', () => { const value = types.constant('foo' as const, { required: true }); - expect(value).toEqual({ - $required: true, - enum: ['foo'], - }); expectType<'foo'>(value); // @ts-expect-error `value` should not be undefined expectType(undefined); + + deepStrictEqual(value, { + $required: true, + enum: ['foo'], + }); }); }); @@ -485,22 +514,6 @@ describe('types', () => { foo: types.boolean(), }); - expect(value).toEqual( - expect.objectContaining({ - additionalProperties: false, - properties: { - bar: { - $required: true, - type: 'number', - }, - foo: { - type: 'boolean', - }, - }, - required: ['bar'], - type: 'object', - }) - ); expectType< | { foo?: boolean; @@ -517,6 +530,21 @@ describe('types', () => { bar: 123, }); expectType(undefined); + + deepStrictEqual(value, { + additionalProperties: false, + properties: { + bar: { + $required: true, + type: 'number', + }, + foo: { + type: 'boolean', + }, + }, + required: ['bar'], + type: 'object', + }); }); test('required', () => { @@ -527,21 +555,20 @@ describe('types', () => { { required: true } ); - expect(value).toEqual( - expect.objectContaining({ - $required: true, - additionalProperties: false, - properties: { - foo: { - type: 'boolean', - }, - }, - type: 'object', - }) - ); expectType<{ foo?: boolean }>(value); // @ts-expect-error `value` should not be undefined expectType(undefined); + + deepStrictEqual(value, { + $required: true, + additionalProperties: false, + properties: { + foo: { + type: 'boolean', + }, + }, + type: 'object', + }); }); test('options', () => { @@ -556,25 +583,24 @@ describe('types', () => { } ); - expect(value).toEqual( - expect.objectContaining({ - additionalProperties: true, - maxProperties: 3, - minProperties: 1, - properties: { - foo: { - type: 'boolean', - }, - }, - type: 'object', - }) - ); expectType< | { foo?: boolean; } | undefined >(value); + + deepStrictEqual(value, { + additionalProperties: true, + maxProperties: 3, + minProperties: 1, + properties: { + foo: { + type: 'boolean', + }, + }, + type: 'object', + }); }); }); @@ -590,29 +616,6 @@ describe('types', () => { ) ); - expect(value).toEqual( - expect.objectContaining({ - additionalProperties: false, - patternProperties: { - '.+': { - $required: true, - additionalProperties: false, - properties: { - bar: { - $required: true, - type: 'number', - }, - foo: { - type: 'boolean', - }, - }, - required: ['bar'], - type: 'object', - }, - }, - type: 'object', - }) - ); expectType< | Record< string, @@ -634,26 +637,47 @@ describe('types', () => { bar: 123, }); expectType(undefined); + + deepStrictEqual(value, { + additionalProperties: false, + patternProperties: { + '.+': { + $required: true, + additionalProperties: false, + properties: { + bar: { + $required: true, + type: 'number', + }, + foo: { + type: 'boolean', + }, + }, + required: ['bar'], + type: 'object', + }, + }, + type: 'object', + }); }); test('required', () => { const value = types.objectGeneric(types.number(), '^(foo|bar)$', { required: true }); - expect(value).toEqual( - expect.objectContaining({ - $required: true, - additionalProperties: false, - patternProperties: { - '^(foo|bar)$': { - type: 'number', - }, - }, - type: 'object', - }) - ); expectType>(value); // @ts-expect-error `value` should not be undefined expectType(undefined); + + deepStrictEqual(value, { + $required: true, + additionalProperties: false, + patternProperties: { + '^(foo|bar)$': { + type: 'number', + }, + }, + type: 'object', + }); }); test('options', () => { @@ -663,20 +687,19 @@ describe('types', () => { minProperties: 1, }); - expect(value).toEqual( - expect.objectContaining({ - additionalProperties: true, - maxProperties: 3, - minProperties: 1, - patternProperties: { - '.+': { - type: 'boolean', - }, - }, - type: 'object', - }) - ); expectType | undefined>(value); + + deepStrictEqual(value, { + additionalProperties: true, + maxProperties: 3, + minProperties: 1, + patternProperties: { + '.+': { + type: 'boolean', + }, + }, + type: 'object', + }); }); }); @@ -690,7 +713,18 @@ describe('types', () => { types.date(), ] as const); - expect(value).toEqual({ + expectType< + | [] + | [string, number, boolean, ObjectId, Date] + | [string, number, boolean, ObjectId] + | [string, number, boolean] + | [string, number] + | [string] + | undefined + >(value); + expectType(undefined); + + deepStrictEqual(value, { additionalItems: false, items: [ { @@ -712,16 +746,6 @@ describe('types', () => { minItems: 0, type: 'array', }); - expectType< - | [] - | [string, number, boolean, ObjectId, Date] - | [string, number, boolean, ObjectId] - | [string, number, boolean] - | [string, number] - | [string] - | undefined - >(value); - expectType(undefined); }); test('required', () => { @@ -736,7 +760,18 @@ describe('types', () => { { required: true } ); - expect(value).toEqual({ + expectType< + | [] + | [string, number, boolean, ObjectId, Date] + | [string, number, boolean, ObjectId] + | [string, number, boolean] + | [string, number] + | [string] + >(value); + // @ts-expect-error `value` should not be undefined + expectType(undefined); + + deepStrictEqual(value, { $required: true, additionalItems: false, items: [ @@ -759,16 +794,6 @@ describe('types', () => { minItems: 0, type: 'array', }); - expectType< - | [] - | [string, number, boolean, ObjectId, Date] - | [string, number, boolean, ObjectId] - | [string, number, boolean] - | [string, number] - | [string] - >(value); - // @ts-expect-error `value` should not be undefined - expectType(undefined); }); test('with required properties', () => { @@ -783,7 +808,13 @@ describe('types', () => { { required: true } ); - expect(value).toEqual({ + expectType< + | [string, number, boolean, ObjectId, Date] + | [string, number, boolean, ObjectId] + | [string, number, boolean] + >(value); + + deepStrictEqual(value, { $required: true, additionalItems: false, items: [ @@ -800,11 +831,6 @@ describe('types', () => { minItems: 3, type: 'array', }); - expectType< - | [string, number, boolean, ObjectId, Date] - | [string, number, boolean, ObjectId] - | [string, number, boolean] - >(value); }); test('with required properties and preceding optional properties', () => { @@ -819,7 +845,11 @@ describe('types', () => { { required: true } ); - expect(value).toEqual({ + expectType<[string, number, boolean, ObjectId, Date] | [string, number, boolean, ObjectId]>( + value + ); + + deepStrictEqual(value, { $required: true, additionalItems: false, items: [ @@ -840,9 +870,6 @@ describe('types', () => { minItems: 4, type: 'array', }); - expectType<[string, number, boolean, ObjectId, Date] | [string, number, boolean, ObjectId]>( - value - ); }); }); @@ -850,7 +877,12 @@ describe('types', () => { test('default', () => { const value = types.unknown(); - expect(value).toEqual({ + expectType(value); + expectType(undefined); + expectType('foo'); + expectType(123); + + deepStrictEqual(value, { bsonType: [ 'array', 'binData', @@ -864,17 +896,17 @@ describe('types', () => { 'string', ], }); + }); + + test('required', () => { + const value = types.unknown({ required: true }); expectType(value); expectType(undefined); expectType('foo'); expectType(123); - }); - - test('required', () => { - const value = types.unknown({ required: true }); - expect(value).toEqual({ + deepStrictEqual(value, { $required: true, bsonType: [ 'array', @@ -889,11 +921,6 @@ describe('types', () => { 'string', ], }); - - expectType(value); - expectType(undefined); - expectType('foo'); - expectType(123); }); test('options', () => { @@ -910,44 +937,28 @@ describe('types', () => { test('default', () => { const value = types.oneOf([types.number(), types.string()]); - expect(value).toEqual( - expect.objectContaining({ - oneOf: [ - { - type: 'number', - }, - { - type: 'string', - }, - ], - }) - ); expectType(value); // @ts-expect-error `value` should not be `boolean` expectType(value); expectType(123); expectType('foo'); expectType(undefined); + + deepStrictEqual(value, { + oneOf: [ + { + type: 'number', + }, + { + type: 'string', + }, + ], + }); }); test('required', () => { const value = types.oneOf([types.boolean(), types.string()], { required: true }); - expect(value).toEqual( - expect.objectContaining({ - $required: true, - oneOf: [ - { - $required: true, - type: 'boolean', - }, - { - $required: true, - type: 'string', - }, - ], - }) - ); expectType(value); // @ts-expect-error `value` should not be `number` expectType(value); @@ -955,27 +966,25 @@ describe('types', () => { expectType(value); expectType(true); expectType('foo'); + + deepStrictEqual(value, { + $required: true, + oneOf: [ + { + $required: true, + type: 'boolean', + }, + { + $required: true, + type: 'string', + }, + ], + }); }); test('nullable', () => { const value = types.oneOf([types.string(), types.null()], { required: true }); - expect(value).toEqual( - expect.objectContaining({ - $required: true, - oneOf: [ - { - $required: true, - type: 'string', - }, - { - $required: true, - type: 'null', - }, - ], - }) - ); - expectType(value); // @ts-expect-error `value` should not be `number` expectType(value); @@ -983,6 +992,20 @@ describe('types', () => { expectType(value); expectType('foo'); expectType(null); + + deepStrictEqual(value, { + $required: true, + oneOf: [ + { + $required: true, + type: 'string', + }, + { + $required: true, + type: 'null', + }, + ], + }); }); }); }); diff --git a/src/__tests__/utils.test.ts b/src/__tests__/utils.test.ts index f28cbf00f..e67278d1d 100644 --- a/src/__tests__/utils.test.ts +++ b/src/__tests__/utils.test.ts @@ -1,4 +1,5 @@ -import { describe, expect, test } from '@jest/globals'; +import { deepStrictEqual, equal, ok } from 'node:assert/strict'; +import { describe, test } from 'node:test'; import { ObjectId } from 'mongodb'; import { expectType } from 'ts-expect'; import { DefaultsOption } from '../schema'; @@ -334,8 +335,10 @@ describe('utils', () => { }; const result = await getDefaultValues(defaults); + expectType>(result); - expect(result).toStrictEqual(defaults); + + deepStrictEqual(result, defaults); }); test('dynamic values', async () => { @@ -346,8 +349,10 @@ describe('utils', () => { }); const result = await getDefaultValues(defaults); + expectType>(result); - expect(result.ham instanceof Date).toBeTruthy(); + + ok(result.ham instanceof Date); }); test('dynamic values with async function', async () => { @@ -366,27 +371,28 @@ describe('utils', () => { }); const result = await getDefaultValues(defaults); + expectType>(result); - expect(result.ham instanceof Date).toBeTruthy(); + + ok(result.ham instanceof Date); }); }); describe('getIds', () => { - test.each([ - ['strings', ['123456789012345678900001', '123456789012345678900002']], - [ - 'objectIds', - [new ObjectId('123456789012345678900001'), new ObjectId('123456789012345678900002')], - ], - ['mixed', ['123456789012345678900001', new ObjectId('123456789012345678900002')]], - ])('%s', (_name, input) => { - const result = getIds(input); - - expect(result).toHaveLength(2); - expect(result[0] instanceof ObjectId).toBeTruthy(); - expect(result[0].toHexString()).toBe('123456789012345678900001'); - expect(result[1] instanceof ObjectId).toBeTruthy(); - expect(result[1].toHexString()).toBe('123456789012345678900002'); - }); + for (const input of [ + ['123456789012345678900001', '123456789012345678900002'], + [new ObjectId('123456789012345678900001'), new ObjectId('123456789012345678900002')], + ['123456789012345678900001', new ObjectId('123456789012345678900002')], + ]) { + test('case', () => { + const result = getIds(input); + + equal(result.length, 2); + ok(result[0] instanceof ObjectId); + equal(result[0].toHexString(), '123456789012345678900001'); + ok(result[1] instanceof ObjectId); + equal(result[1].toHexString(), '123456789012345678900002'); + }); + } }); }); diff --git a/tests/cjs/index.js b/tests/cjs/index.js index 9de347775..bcf84305c 100644 --- a/tests/cjs/index.js +++ b/tests/cjs/index.js @@ -1,6 +1,3 @@ -// This test does not use Jest because we want to test -// that the output of the build process works under native Node.js ESM syntax -// At this moment Jest does not support ESM syntax without transpiling const assert = require('assert'); const { MongoClient, ObjectId } = require('mongodb'); const { MongoMemoryServer } = require('mongodb-memory-server'); diff --git a/tests/esm/index.js b/tests/esm/index.js index c3a7c8393..f3a062d7c 100644 --- a/tests/esm/index.js +++ b/tests/esm/index.js @@ -1,6 +1,3 @@ -// This test does not use Jest because we want to test -// that the output of the build process works under native Node.js ESM syntax -// On May 2023, Jest (29.5.0) does not support ESM syntax without transpiling import assert from 'assert'; import { MongoClient, ObjectId } from 'mongodb'; import { MongoMemoryServer } from 'mongodb-memory-server'; diff --git a/tests/ts-nodenext/index.ts b/tests/ts-nodenext/index.ts index d5a841925..23290569f 100644 --- a/tests/ts-nodenext/index.ts +++ b/tests/ts-nodenext/index.ts @@ -1,6 +1,3 @@ -// This test does not use Jest because we want to test -// that the output of the build process works under native Node.js ESM syntax -// On May 2023, Jest (29.5.0) does not support ESM syntax without transpiling import assert from 'assert'; import { MongoClient, ObjectId } from 'mongodb'; import { MongoMemoryServer } from 'mongodb-memory-server'; diff --git a/tests/ts/index.ts b/tests/ts/index.ts index 82482d68e..4878c0e97 100644 --- a/tests/ts/index.ts +++ b/tests/ts/index.ts @@ -1,6 +1,4 @@ -// This test does not use Jest because we want to test -// that the output of the build process works under native Node.js ESM syntax -// On May 2023, Jest (29.5.0) does not support ESM syntax without transpiling +/* eslint-disable @typescript-eslint/no-unsafe-call */ import assert from 'assert'; import { MongoClient, ObjectId } from 'mongodb'; import { MongoMemoryServer } from 'mongodb-memory-server'; diff --git a/tsconfig.json b/tsconfig.json index 9e04fd14d..2f2afa22e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,7 +5,7 @@ "module": "ESNext", "moduleResolution": "Node", "noEmit": true, - "noErrorTruncation": false, + "noErrorTruncation": true, "noImplicitReturns": false, "noUnusedLocals": false, "noUnusedParameters": false, @@ -13,7 +13,7 @@ "strict": true, "strictFunctionTypes": false, "target": "ESNext", - "types": ["node", "jest"] + "types": ["node"] }, "include": ["./example", "./src"] }