diff --git a/.eslintrc.js b/.eslintrc.js index 4e79b48f8e..d52332ee0d 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -2,7 +2,6 @@ module.exports = { "env": { "browser": true, "es6": true, - "mocha": true, "node": true }, "extends": [ diff --git a/.mocharc.json b/.mocharc.json deleted file mode 100644 index afb61cb4d6..0000000000 --- a/.mocharc.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "timeout": 30000, - "require": ["ts-node/register", "source-map-support/register"], - "reporter": "Dot", - "extension": ".test.ts", - "exit": true -} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..f85e374f25 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "search.exclude": { + "**/node_modules": true, + "**/package-lock.json": true, + "**/pnpm-lock.yaml": true, + "**/dist": true, + } +} \ No newline at end of file diff --git a/LICENSE b/LICENSE index 887338c4f0..7712f870f3 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2023 Feathers Contributors +Copyright (c) 2024 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index a299b003de..928289a63a 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,6 @@ npm test # License -Copyright (c) 2023 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/docs/cookbook/general/client-test.md b/docs/cookbook/general/client-test.md index 46085fa7c8..7721f1941d 100644 --- a/docs/cookbook/general/client-test.md +++ b/docs/cookbook/general/client-test.md @@ -28,7 +28,7 @@ describe('\'users\' service - client', function () { let server; let client; - before(async () => { + beforeAll(async () => { await app.service('users').create({ email, password }); server = app.listen(port); @@ -40,7 +40,7 @@ describe('\'users\' service - client', function () { client = await makeClient(host, port, email, password); }); - after(() => { + afterAll(() => { client.logout(); server.close(); }); diff --git a/package-lock.json b/package-lock.json index 613869c8e4..baf15e4363 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,16 +12,17 @@ ], "devDependencies": { "@featherscloud/pinion": "^0.5.3", - "@typescript-eslint/eslint-plugin": "^7.2.0", - "@typescript-eslint/parser": "^7.2.0", + "@typescript-eslint/eslint-plugin": "^7.3.1", + "@typescript-eslint/parser": "^7.3.1", "c8": "^9.1.0", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.1.3", "lerna": "^8.1.2", - "npm-check-updates": "^16.14.15", + "npm-check-updates": "^16.14.17", "prettier": "^3.2.5", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "engines": { "node": ">= 20" @@ -261,16 +262,6 @@ "node": ">=6.0.0" } }, - "node_modules/@ampproject/remapping/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/@antfu/install-pkg": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.1.1.tgz", @@ -335,118 +326,130 @@ } }, "node_modules/@azure/core-auth": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.6.0.tgz", - "integrity": "sha512-3X9wzaaGgRaBCwhLQZDtFp5uLIXCPrGbwJNWPPugvL4xbIGgScv77YzzxToKGLAKvG9amDoofMoP+9hsH1vs1w==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.7.1.tgz", + "integrity": "sha512-dyeQwvgthqs/SlPVQbZQetpslXceHd4i5a7M/7z/lGEAVwnSluabnQOjF2/dk/hhWgMISusv1Ytp4mQ8JNy62A==", "dev": true, "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-util": "^1.1.0", - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@azure/core-auth/node_modules/@azure/abort-controller": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.0.0.tgz", - "integrity": "sha512-RP/mR/WJchR+g+nQFJGOec+nzeN/VvjlwbinccoqfhTsTHbb8X5+mLDp48kHT0ueyum0BNSwGm0kX0UZuIqTGg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.1.tgz", + "integrity": "sha512-NhzeNm5zu2fPlwGXPUjzsRCRuPx5demaZyNcyNYJDqpa/Sbxzvo/RYt9IwUaAOnDW5+r7J9UOE6f22TQnb9nhQ==", "dev": true, "dependencies": { - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@azure/core-client": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.8.0.tgz", - "integrity": "sha512-+gHS3gEzPlhyQBMoqVPOTeNH031R5DM/xpCvz72y38C09rg4Hui/1sJS/ujoisDZbbSHyuRLVWdFlwL0pIFwbg==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.1.tgz", + "integrity": "sha512-hHYFx9lz0ZpbO5W+iotU9tmIX1jPcoIjYUEUaWGuMi1628LCQ/z05TUR4P+NRtMgyoHQuyVYyGQiD3PC47kaIA==", "dev": true, "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-auth": "^1.4.0", "@azure/core-rest-pipeline": "^1.9.1", "@azure/core-tracing": "^1.0.0", - "@azure/core-util": "^1.0.0", + "@azure/core-util": "^1.6.1", "@azure/logger": "^1.0.0", - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@azure/core-client/node_modules/@azure/abort-controller": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.0.0.tgz", - "integrity": "sha512-RP/mR/WJchR+g+nQFJGOec+nzeN/VvjlwbinccoqfhTsTHbb8X5+mLDp48kHT0ueyum0BNSwGm0kX0UZuIqTGg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.1.tgz", + "integrity": "sha512-NhzeNm5zu2fPlwGXPUjzsRCRuPx5demaZyNcyNYJDqpa/Sbxzvo/RYt9IwUaAOnDW5+r7J9UOE6f22TQnb9nhQ==", "dev": true, "dependencies": { - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@azure/core-http-compat": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.0.1.tgz", - "integrity": "sha512-xpQZz/q7E0jSW4rckrTo2mDFDQgo6I69hBU4voMQi7REi6JRW5a+KfVkbJCFCWnkFmP6cAJ0IbuudTdf/MEBOQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.1.1.tgz", + "integrity": "sha512-QGSDBkKpDbVOmbqlVPdlPE1JalHWmJjLyZhL+9zZN9gj4X1pTksEbDR77P+qWCJ5NGaSWyKvAW+3Q6hNX8/W+Q==", "dev": true, "dependencies": { - "@azure/abort-controller": "^1.0.4", + "@azure/abort-controller": "^2.0.0", "@azure/core-client": "^1.3.0", "@azure/core-rest-pipeline": "^1.3.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-http-compat/node_modules/@azure/abort-controller": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.1.tgz", + "integrity": "sha512-NhzeNm5zu2fPlwGXPUjzsRCRuPx5demaZyNcyNYJDqpa/Sbxzvo/RYt9IwUaAOnDW5+r7J9UOE6f22TQnb9nhQ==", + "dev": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@azure/core-lro": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.6.0.tgz", - "integrity": "sha512-PyRNcaIOfMgoUC01/24NoG+k8O81VrKxYARnDlo+Q2xji0/0/j2nIt8BwQh294pb1c5QnXTDPbNR4KzoDKXEoQ==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.7.1.tgz", + "integrity": "sha512-kXSlrNHOCTVZMxpXNRqzgh9/j4cnNXU5Hf2YjMyjddRhCXFiFRzmNaqwN+XO9rGTsCOIaaG7M67zZdyliXZG9g==", "dev": true, "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-util": "^1.2.0", "@azure/logger": "^1.0.0", - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@azure/core-lro/node_modules/@azure/abort-controller": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.0.0.tgz", - "integrity": "sha512-RP/mR/WJchR+g+nQFJGOec+nzeN/VvjlwbinccoqfhTsTHbb8X5+mLDp48kHT0ueyum0BNSwGm0kX0UZuIqTGg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.1.tgz", + "integrity": "sha512-NhzeNm5zu2fPlwGXPUjzsRCRuPx5demaZyNcyNYJDqpa/Sbxzvo/RYt9IwUaAOnDW5+r7J9UOE6f22TQnb9nhQ==", "dev": true, "dependencies": { - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@azure/core-paging": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.5.0.tgz", - "integrity": "sha512-zqWdVIt+2Z+3wqxEOGzR5hXFZ8MGKK52x4vFLw8n58pR6ZfKRx3EXYTxTaYxYHc/PexPUTyimcTWFJbji9Z6Iw==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.6.1.tgz", + "integrity": "sha512-3tKIQXSU3mlN+ITz0m2pXLnKK3oQ6/EVcW8ud011Iq+M0rx6Wnm7NUEpoMeOAEedeKlPtemrQzO6YWoDR71O5w==", "dev": true, "dependencies": { - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@azure/core-rest-pipeline": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.14.0.tgz", - "integrity": "sha512-Tp4M6NsjCmn9L5p7HsW98eSOS7A0ibl3e5ntZglozT0XuD/0y6i36iW829ZbBq0qihlGgfaeFpkLjZ418KDm1Q==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.15.1.tgz", + "integrity": "sha512-ZxS6i3eHxh86u+1eWZJiYywoN2vxvsSoAUx60Mny8cZ4nTwvt7UzVVBJO+m2PW2KIJfNiXMt59xBa59htOWL4g==", "dev": true, "dependencies": { "@azure/abort-controller": "^2.0.0", @@ -454,97 +457,58 @@ "@azure/core-tracing": "^1.0.1", "@azure/core-util": "^1.3.0", "@azure/logger": "^1.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "tslib": "^2.2.0" + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@azure/core-rest-pipeline/node_modules/@azure/abort-controller": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.0.0.tgz", - "integrity": "sha512-RP/mR/WJchR+g+nQFJGOec+nzeN/VvjlwbinccoqfhTsTHbb8X5+mLDp48kHT0ueyum0BNSwGm0kX0UZuIqTGg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.1.tgz", + "integrity": "sha512-NhzeNm5zu2fPlwGXPUjzsRCRuPx5demaZyNcyNYJDqpa/Sbxzvo/RYt9IwUaAOnDW5+r7J9UOE6f22TQnb9nhQ==", "dev": true, "dependencies": { - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@azure/core-rest-pipeline/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/@azure/core-rest-pipeline/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@azure/core-rest-pipeline/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/@azure/core-tracing": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", - "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.1.1.tgz", + "integrity": "sha512-qPbYhN1pE5XQ2jPKIHP33x8l3oBu1UqIWnYqZZ3OYnYjzY0xqIHjn49C+ptsPD9yC7uyWI9Zm7iZUZLs2R4DhQ==", "dev": true, "dependencies": { - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=12.0.0" + "node": ">=18.0.0" } }, "node_modules/@azure/core-util": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.7.0.tgz", - "integrity": "sha512-Zq2i3QO6k9DA8vnm29mYM4G8IE9u1mhF1GUabVEqPNX8Lj833gdxQ2NAFxt2BZsfAL+e9cT8SyVN7dFVJ/Hf0g==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.8.1.tgz", + "integrity": "sha512-L3voj0StUdJ+YKomvwnTv7gHzguJO+a6h30pmmZdRprJCM+RJlGMPxzuh4R7lhQu1jNmEtaHX5wvTgWLDAmbGQ==", "dev": true, "dependencies": { "@azure/abort-controller": "^2.0.0", - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@azure/core-util/node_modules/@azure/abort-controller": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.0.0.tgz", - "integrity": "sha512-RP/mR/WJchR+g+nQFJGOec+nzeN/VvjlwbinccoqfhTsTHbb8X5+mLDp48kHT0ueyum0BNSwGm0kX0UZuIqTGg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.1.tgz", + "integrity": "sha512-NhzeNm5zu2fPlwGXPUjzsRCRuPx5demaZyNcyNYJDqpa/Sbxzvo/RYt9IwUaAOnDW5+r7J9UOE6f22TQnb9nhQ==", "dev": true, "dependencies": { - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" @@ -598,45 +562,45 @@ } }, "node_modules/@azure/logger": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.4.tgz", - "integrity": "sha512-ustrPY8MryhloQj7OWGe+HrYx+aoiOxzbXTtgblbV3xwCqpzUK36phH3XNHQKj3EPonyFUuDTfR3qFhTEAuZEg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.1.1.tgz", + "integrity": "sha512-/+4TtokaGgC+MnThdf6HyIH9Wrjp+CnCn3Nx3ggevN7FFjjNyjqg0yLlc2i9S+Z2uAzI8GYOo35Nzb1MhQ89MA==", "dev": true, "dependencies": { - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@azure/msal-browser": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.10.0.tgz", - "integrity": "sha512-mnmi8dCXVNZI+AGRq0jKQ3YiodlIC4W9npr6FCB9WN6NQT+6rq+cIlxgUb//BjLyzKsnYo+i4LROGeMyU+6v1A==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.11.0.tgz", + "integrity": "sha512-Xc0g1gdB2gdscPeuUGKmlGMgP1L/AWDeuxaToWkeautPdZqKvzeE82ggqLMctKZ0yq6e7F1XfGhUDCcUo7Db9w==", "dev": true, "dependencies": { - "@azure/msal-common": "14.7.1" + "@azure/msal-common": "14.8.0" }, "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-common": { - "version": "14.7.1", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.7.1.tgz", - "integrity": "sha512-v96btzjM7KrAu4NSEdOkhQSTGOuNUIIsUdB8wlyB9cdgl5KqEKnTonHUZ8+khvZ6Ap542FCErbnTyDWl8lZ2rA==", + "version": "14.8.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.8.0.tgz", + "integrity": "sha512-FIghuAzpgmc5ZAW2rCTAHKdhGcCRqg/UyroidTgGgSRrG1gOsEbUTW+7lmEFTz84ttCv5RnjOAUUi/SQjUTw0w==", "dev": true, "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-node": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.6.4.tgz", - "integrity": "sha512-nNvEPx009/80UATCToF+29NZYocn01uKrB91xtFr7bSqkqO1PuQGXRyYwryWRztUrYZ1YsSbw9A+LmwOhpVvcg==", + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.6.5.tgz", + "integrity": "sha512-cVyQqKW75RnAd2ew31STlMOHa+g9su1Fddno7h86B9nEvJjkIhiGBKkS5VVR/3WeSbLzBLGKInTunW6gEY+yDg==", "dev": true, "dependencies": { - "@azure/msal-common": "14.7.1", + "@azure/msal-common": "14.8.0", "jsonwebtoken": "^9.0.0", "uuid": "^8.3.0" }, @@ -654,98 +618,42 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", + "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", - "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", + "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.1", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.0", - "@babel/parser": "^7.24.0", + "@babel/helpers": "^7.24.1", + "@babel/parser": "^7.24.1", "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", + "@babel/traverse": "^7.24.1", "@babel/types": "^7.24.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -771,30 +679,20 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", + "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", "dev": true, "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", @@ -835,15 +733,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -853,16 +742,10 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.0.tgz", - "integrity": "sha512-QAH+vfvts51BCsNZ2PhY6HAggnlS6omLLFTsIpeqZk/MmJ6cW7tgz5yRv0fMJThcr6FmbMrENh1RgrWPTYA76g==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz", + "integrity": "sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -870,7 +753,7 @@ "@babel/helper-function-name": "^7.23.0", "@babel/helper-member-expression-to-functions": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "semver": "^6.3.1" @@ -980,12 +863,12 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1049,13 +932,13 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", + "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-member-expression-to-functions": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { @@ -1102,9 +985,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -1143,13 +1026,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", - "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", + "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", "dev": true, "dependencies": { "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", + "@babel/traverse": "^7.24.1", "@babel/types": "^7.24.0" }, "engines": { @@ -1157,14 +1040,15 @@ } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -1227,9 +1111,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", - "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", + "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1238,12 +1122,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", + "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1253,14 +1137,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", + "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" + "@babel/plugin-transform-optional-chaining": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -1270,13 +1154,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", - "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", + "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1361,12 +1245,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", + "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1376,12 +1260,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", + "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1415,12 +1299,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", + "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1532,12 +1416,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", + "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1563,12 +1447,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", + "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1578,13 +1462,13 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", - "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", + "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-remap-async-to-generator": "^7.22.20", "@babel/plugin-syntax-async-generators": "^7.8.4" }, @@ -1596,13 +1480,13 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", - "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", + "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-module-imports": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-remap-async-to-generator": "^7.22.20" }, "engines": { @@ -1613,12 +1497,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", + "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1628,12 +1512,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz", + "integrity": "sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1643,13 +1527,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", + "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1659,13 +1543,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", - "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.1.tgz", + "integrity": "sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -1676,17 +1560,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", - "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", + "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, @@ -1707,13 +1591,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", + "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/template": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1723,12 +1607,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", + "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1738,13 +1622,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", + "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1754,12 +1638,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", + "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1769,12 +1653,12 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", - "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", + "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -1785,13 +1669,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", + "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", "dev": true, "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1801,12 +1685,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", - "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", + "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1817,12 +1701,12 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", - "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", + "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { @@ -1833,14 +1717,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", + "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1850,12 +1734,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", - "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", + "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -1866,12 +1750,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", + "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1881,12 +1765,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", - "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", + "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -1897,12 +1781,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", + "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1912,13 +1796,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", + "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1928,13 +1812,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", + "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-simple-access": "^7.22.5" }, "engines": { @@ -1945,14 +1829,14 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", - "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", + "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { @@ -1963,13 +1847,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", + "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1995,12 +1879,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", + "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2010,12 +1894,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", - "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", + "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -2026,12 +1910,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", - "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", + "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -2042,16 +1926,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.0.tgz", - "integrity": "sha512-y/yKMm7buHpFFXfxVFS4Vk1ToRJDilIa6fKRioB9Vjichv58TDGXTvqV0dN7plobAmTW5eSEGXDngE+Mm+uO+w==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", + "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.5", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" + "@babel/plugin-transform-parameters": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -2061,13 +1944,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", + "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -2077,12 +1960,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", - "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", + "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -2093,12 +1976,12 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", + "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -2110,12 +1993,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", + "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2125,13 +2008,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", + "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2141,14 +2024,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", - "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", + "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -2159,12 +2042,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", + "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2174,12 +2057,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", + "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "regenerator-transform": "^0.15.2" }, "engines": { @@ -2190,12 +2073,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", + "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2205,12 +2088,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", + "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2220,12 +2103,12 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", + "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { @@ -2236,12 +2119,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", + "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2251,12 +2134,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", + "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2266,12 +2149,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", + "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2281,15 +2164,15 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", - "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.1.tgz", + "integrity": "sha512-liYSESjX2fZ7JyBFkYG78nfvHlMKE6IpNdTVnxmlYUR+j5ZLsitFbaAE+eJSK2zPPkNWNw4mXL51rQ8WrvdK0w==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.23.3" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-typescript": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -2299,12 +2182,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", + "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2314,13 +2197,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", + "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2330,13 +2213,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", + "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2346,13 +2229,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", + "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2362,26 +2245,26 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.0.tgz", - "integrity": "sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.3.tgz", + "integrity": "sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.5", + "@babel/compat-data": "^7.24.1", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.23.3", - "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-assertions": "^7.24.1", + "@babel/plugin-syntax-import-attributes": "^7.24.1", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -2393,58 +2276,58 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.9", - "@babel/plugin-transform-async-to-generator": "^7.23.3", - "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-block-scoping": "^7.23.4", - "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.4", - "@babel/plugin-transform-classes": "^7.23.8", - "@babel/plugin-transform-computed-properties": "^7.23.3", - "@babel/plugin-transform-destructuring": "^7.23.3", - "@babel/plugin-transform-dotall-regex": "^7.23.3", - "@babel/plugin-transform-duplicate-keys": "^7.23.3", - "@babel/plugin-transform-dynamic-import": "^7.23.4", - "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.4", - "@babel/plugin-transform-for-of": "^7.23.6", - "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-json-strings": "^7.23.4", - "@babel/plugin-transform-literals": "^7.23.3", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", - "@babel/plugin-transform-member-expression-literals": "^7.23.3", - "@babel/plugin-transform-modules-amd": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.9", - "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-arrow-functions": "^7.24.1", + "@babel/plugin-transform-async-generator-functions": "^7.24.3", + "@babel/plugin-transform-async-to-generator": "^7.24.1", + "@babel/plugin-transform-block-scoped-functions": "^7.24.1", + "@babel/plugin-transform-block-scoping": "^7.24.1", + "@babel/plugin-transform-class-properties": "^7.24.1", + "@babel/plugin-transform-class-static-block": "^7.24.1", + "@babel/plugin-transform-classes": "^7.24.1", + "@babel/plugin-transform-computed-properties": "^7.24.1", + "@babel/plugin-transform-destructuring": "^7.24.1", + "@babel/plugin-transform-dotall-regex": "^7.24.1", + "@babel/plugin-transform-duplicate-keys": "^7.24.1", + "@babel/plugin-transform-dynamic-import": "^7.24.1", + "@babel/plugin-transform-exponentiation-operator": "^7.24.1", + "@babel/plugin-transform-export-namespace-from": "^7.24.1", + "@babel/plugin-transform-for-of": "^7.24.1", + "@babel/plugin-transform-function-name": "^7.24.1", + "@babel/plugin-transform-json-strings": "^7.24.1", + "@babel/plugin-transform-literals": "^7.24.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", + "@babel/plugin-transform-member-expression-literals": "^7.24.1", + "@babel/plugin-transform-modules-amd": "^7.24.1", + "@babel/plugin-transform-modules-commonjs": "^7.24.1", + "@babel/plugin-transform-modules-systemjs": "^7.24.1", + "@babel/plugin-transform-modules-umd": "^7.24.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", - "@babel/plugin-transform-numeric-separator": "^7.23.4", - "@babel/plugin-transform-object-rest-spread": "^7.24.0", - "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-optional-catch-binding": "^7.23.4", - "@babel/plugin-transform-optional-chaining": "^7.23.4", - "@babel/plugin-transform-parameters": "^7.23.3", - "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/plugin-transform-private-property-in-object": "^7.23.4", - "@babel/plugin-transform-property-literals": "^7.23.3", - "@babel/plugin-transform-regenerator": "^7.23.3", - "@babel/plugin-transform-reserved-words": "^7.23.3", - "@babel/plugin-transform-shorthand-properties": "^7.23.3", - "@babel/plugin-transform-spread": "^7.23.3", - "@babel/plugin-transform-sticky-regex": "^7.23.3", - "@babel/plugin-transform-template-literals": "^7.23.3", - "@babel/plugin-transform-typeof-symbol": "^7.23.3", - "@babel/plugin-transform-unicode-escapes": "^7.23.3", - "@babel/plugin-transform-unicode-property-regex": "^7.23.3", - "@babel/plugin-transform-unicode-regex": "^7.23.3", - "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/plugin-transform-new-target": "^7.24.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", + "@babel/plugin-transform-numeric-separator": "^7.24.1", + "@babel/plugin-transform-object-rest-spread": "^7.24.1", + "@babel/plugin-transform-object-super": "^7.24.1", + "@babel/plugin-transform-optional-catch-binding": "^7.24.1", + "@babel/plugin-transform-optional-chaining": "^7.24.1", + "@babel/plugin-transform-parameters": "^7.24.1", + "@babel/plugin-transform-private-methods": "^7.24.1", + "@babel/plugin-transform-private-property-in-object": "^7.24.1", + "@babel/plugin-transform-property-literals": "^7.24.1", + "@babel/plugin-transform-regenerator": "^7.24.1", + "@babel/plugin-transform-reserved-words": "^7.24.1", + "@babel/plugin-transform-shorthand-properties": "^7.24.1", + "@babel/plugin-transform-spread": "^7.24.1", + "@babel/plugin-transform-sticky-regex": "^7.24.1", + "@babel/plugin-transform-template-literals": "^7.24.1", + "@babel/plugin-transform-typeof-symbol": "^7.24.1", + "@babel/plugin-transform-unicode-escapes": "^7.24.1", + "@babel/plugin-transform-unicode-property-regex": "^7.24.1", + "@babel/plugin-transform-unicode-regex": "^7.24.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.8", - "babel-plugin-polyfill-corejs3": "^0.9.0", - "babel-plugin-polyfill-regenerator": "^0.5.5", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-regenerator": "^0.6.1", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -2479,16 +2362,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", - "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz", + "integrity": "sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-typescript": "^7.23.3" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-syntax-jsx": "^7.24.1", + "@babel/plugin-transform-modules-commonjs": "^7.24.1", + "@babel/plugin-transform-typescript": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -2504,9 +2387,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", - "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", + "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -2529,18 +2412,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", - "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.0", + "@babel/parser": "^7.24.1", "@babel/types": "^7.24.0", "debug": "^4.3.1", "globals": "^11.1.0" @@ -2600,6 +2483,16 @@ "node": ">=12" } }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@ctrl/tinycolor": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", @@ -3126,6 +3019,10 @@ "resolved": "packages/adapter-tests", "link": true }, + "node_modules/@feathersjs/adapter-tests-vitest": { + "resolved": "packages/adapter-tests-vitest", + "link": true + }, "node_modules/@feathersjs/authentication": { "resolved": "packages/authentication", "link": true @@ -3218,6 +3115,10 @@ "resolved": "packages/tests", "link": true }, + "node_modules/@feathersjs/tests-vitest": { + "resolved": "packages/tests-vitest", + "link": true + }, "node_modules/@feathersjs/transport-commons": { "resolved": "packages/transport-commons", "link": true @@ -3479,16 +3380,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -3517,35 +3408,25 @@ "@jridgewell/trace-mapping": "^0.3.25" } }, - "node_modules/@jridgewell/source-map/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@js-joda/core": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.6.1.tgz", - "integrity": "sha512-Xla/d7ZMMR6+zRd6lTio0wRZECfcfFJP7GGe9A9L4tDOlD5CX4YcZ4YZle9w58bBYzssojVapI84RraKWDQZRg==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.6.2.tgz", + "integrity": "sha512-ow4R+7C24xeTjiMTTZ4k6lvxj7MRBqvqLCQjThQff3RjOmIMokMP20LNYVFhGafJtUx/Xo2Qp4qU8eNoTVH0SA==", "dev": true }, "node_modules/@koa/cors": { @@ -4147,21 +4028,21 @@ } }, "node_modules/@nrwl/devkit": { - "version": "18.0.8", - "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-18.0.8.tgz", - "integrity": "sha512-cKtXq2I/3y/t1I+jMn8XVfhtSjGxJHKGSmxStMdRPMcUim8iaS2V3fDUdF2CGrXrtbmDtYwBC8413YY+nVh0Gw==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-18.1.3.tgz", + "integrity": "sha512-qIP/RrOfPBqSPgMHKe13/YXnOxasL64Pv+i/aDdY/Fk5zvQIxe+qOizSus7przTwdpu6Jm+JWrYXrwIj4Tmy6g==", "dev": true, "dependencies": { - "@nx/devkit": "18.0.8" + "@nx/devkit": "18.1.3" } }, "node_modules/@nrwl/tao": { - "version": "18.0.8", - "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-18.0.8.tgz", - "integrity": "sha512-zBzdv9mGBaWtBbujbLCVzG7ZI5npUg9fnUz8VtjN6jydAQEL/Uqj5mPlFYQPPBAw2xwF8TL9ZX/rOoAWHnJtjw==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-18.1.3.tgz", + "integrity": "sha512-cRs5kDRhiYVZ9SLQ2ol+2+zltgPemDtsHKz2h2whazHF+d39zsPLYbFm1ZJuDKpZp6TJJercqSH1UQCdOXEkdQ==", "dev": true, "dependencies": { - "nx": "18.0.8", + "nx": "18.1.3", "tslib": "^2.3.0" }, "bin": { @@ -4169,12 +4050,12 @@ } }, "node_modules/@nx/devkit": { - "version": "18.0.8", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-18.0.8.tgz", - "integrity": "sha512-df56bzmhF8yhVCCChe0ATjCsc9r9SNcpks5/bABGqR91vHVGfsz0H33RYO7P2jrPwFBRYnf+aWWFY1d6NpEdxw==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-18.1.3.tgz", + "integrity": "sha512-/LA1VTcSOHun06bsLFREFsy3K2XvRIZKPhUgXbrPAjwVZzH91a+9jUYoCwrxXrp21c2Ndh6y3zq3qPfjJr7DzQ==", "dev": true, "dependencies": { - "@nrwl/devkit": "18.0.8", + "@nrwl/devkit": "18.1.3", "ejs": "^3.1.7", "enquirer": "~2.3.6", "ignore": "^5.0.4", @@ -4197,9 +4078,9 @@ } }, "node_modules/@nx/nx-darwin-arm64": { - "version": "18.0.8", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-18.0.8.tgz", - "integrity": "sha512-B2vX90j1Ex9Mki/Fai45UJ0r7mPc/xLBzQYQ9MFI2XoUXKhYl5BVBfJ+EbJ2PBcIXAnp44qY0wyxEpp+8Glxcg==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-18.1.3.tgz", + "integrity": "sha512-h3/1ywpLa56RwBnz8Lr9yyUvPvfGvKFxIo8LNptc8fMoONuuIOeZTAmaBxKBOaKtL7g64/LKDs0Ts+mSXzmbqA==", "cpu": [ "arm64" ], @@ -4213,9 +4094,9 @@ } }, "node_modules/@nx/nx-darwin-x64": { - "version": "18.0.8", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-18.0.8.tgz", - "integrity": "sha512-nC172j4LwOqc22BtJGsrjPYGhZ6EFXhYi0ceb6yzEA1Z32Wl98OXbAcbbhyEcuL3iYI9VrZgzAAzIUo7l4injw==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-18.1.3.tgz", + "integrity": "sha512-6LHe7MYrKlztLlKhYfGV3CtFPhEqcc2ZgwGVWYiAmS/glcN+Wai7RFQX/cZiJ+TbDRFzvETPPGNRP/aSAOkRnQ==", "cpu": [ "x64" ], @@ -4229,9 +4110,9 @@ } }, "node_modules/@nx/nx-freebsd-x64": { - "version": "18.0.8", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-18.0.8.tgz", - "integrity": "sha512-Qoz668WMB6nxdMFG5X88B7W72+d5K/95XEFKY2022EPm88DQFFcJAfdkMrRkeO3yBJtwLAAK+Jyni9uAfOXzGQ==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-18.1.3.tgz", + "integrity": "sha512-ppSkJJVKnfDWYJBKqjEM/p4qdMZsZVV++dkFN/n50p6uwHstv0Kth7dNdsu3ZyPqmg6+IYUZql7JSTeNqKne5A==", "cpu": [ "x64" ], @@ -4245,9 +4126,9 @@ } }, "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "18.0.8", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-18.0.8.tgz", - "integrity": "sha512-0RTuJTaAmE7Xjc0P0DIbbYEhPGBILCii2nOz6vwTEzIqxSMgXW4T1g1zSDKCiUUyS6HVffGvCTNvuHuoYY2DMg==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-18.1.3.tgz", + "integrity": "sha512-1vflQE4gscHq2GJeu2L48Z8rQFcdu+gcprG1cMEf3CIDxh/nJei66bdVJYYYxPNi6rYaeONPJgBjbIih8ce8nQ==", "cpu": [ "arm" ], @@ -4261,9 +4142,9 @@ } }, "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "18.0.8", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-18.0.8.tgz", - "integrity": "sha512-fmwsrDeeY44f6cCnfrXNuvFEzqvD/A5yg3TVwZoKldWRAG5gexj4AWpBHqgGTcCj6ky1NGxnlaktKC5geGhJhA==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-18.1.3.tgz", + "integrity": "sha512-7B5YXjDzzFdEMUzhFifXgsg741Afp3v7vNdPL2joQ7xrERKYEge7eXCjp5/GYhl9J4y5BmdeV2Joqr4WQ6R7Pg==", "cpu": [ "arm64" ], @@ -4277,9 +4158,9 @@ } }, "node_modules/@nx/nx-linux-arm64-musl": { - "version": "18.0.8", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-18.0.8.tgz", - "integrity": "sha512-jz1dzQlrfZteJdsEJ1MbjI7m2jkBLhLe5y9x+96/KgmJbCV7LD9RLevWIzz7FDuhfJziMOoSrGdaW47G13p/Fw==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-18.1.3.tgz", + "integrity": "sha512-OaAVjUli44JUTlGPmtxZDO2U88yK6/cwt1LTbTHGeabupbXR295RDn1TkR1/1oNo8grRaOi/V9DWEg9RRmGvOw==", "cpu": [ "arm64" ], @@ -4293,9 +4174,9 @@ } }, "node_modules/@nx/nx-linux-x64-gnu": { - "version": "18.0.8", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-18.0.8.tgz", - "integrity": "sha512-eq2AAZN4fsjhABtU76eroFHcNK6QWo4eMAH7tcZUoGLwfBAo+wPYggxm9LNZ5weKVxwqySHavlXd5rNA26WrbA==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-18.1.3.tgz", + "integrity": "sha512-qDinHpGZ9FhoOtdfO23pwN7pBCu25ElJ1InLCeCarl9CQYS1CDZNimrcSOFl20DAZqINQamPqBFJ7nKeDRBy7g==", "cpu": [ "x64" ], @@ -4309,9 +4190,9 @@ } }, "node_modules/@nx/nx-linux-x64-musl": { - "version": "18.0.8", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-18.0.8.tgz", - "integrity": "sha512-FBHVJ0DtBqQynbQImg1kc9/WfRGSvbRNzaqI2rO/zO0j2BeT9BQ8byTn2EiMBxz72LSbqEmtQtqe5w50hAsKcA==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-18.1.3.tgz", + "integrity": "sha512-E28Q0v9N7LrV+0uu4ytrcCHfF1MPYwNL2NLZN3yCPgulGHe3NwCuMnbC974+uOZ+MTqua7KnVOQ5VYA5sL1LIw==", "cpu": [ "x64" ], @@ -4325,9 +4206,9 @@ } }, "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "18.0.8", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-18.0.8.tgz", - "integrity": "sha512-qphQIIfwAR03s7ifPVc0XhjdOeep2hOoZN2jN5ShG1QD/DIipNnMrRK21M6JcoP7soRPpkJFlI5Yaleh9/EJhg==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-18.1.3.tgz", + "integrity": "sha512-EYHPIcanVn6ZWkELnW4wW+gl8Itulmpi7f7s83CFrYxRW0U8SAG2sW4JrlvZgrK2CMyluiCGqZGHDUJZST4CVA==", "cpu": [ "arm64" ], @@ -4341,9 +4222,9 @@ } }, "node_modules/@nx/nx-win32-x64-msvc": { - "version": "18.0.8", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-18.0.8.tgz", - "integrity": "sha512-XP8hle+cPNH5n18iTM7l0q07zEdvoPcHYVr5IoYOA54Ke9ZUxau4owUeok2HhLr61o2u0CTwf1vWoV+Y1AUAdg==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-18.1.3.tgz", + "integrity": "sha512-1tBViAG9VQ3arKoKFOrkBzYUAGgGsVqYbifng+stb5TPWOj0jjhQpwbsk0u3ROmEBw9crWRwzRt1qh/ZE7SfQQ==", "cpu": [ "x64" ], @@ -4634,6 +4515,12 @@ } } }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.13.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz", @@ -4804,17 +4691,17 @@ ] }, "node_modules/@shikijs/core": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.1.7.tgz", - "integrity": "sha512-gTYLUIuD1UbZp/11qozD3fWpUTuMqPSf3svDMMrL0UmlGU7D9dPw/V1FonwAorCUJBltaaESxq90jrSjQyGixg==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.2.0.tgz", + "integrity": "sha512-OlFvx+nyr5C8zpcMBnSGir0YPD6K11uYhouqhNmm1qLiis4GA7SsGtu07r9gKS9omks8RtQqHrJL4S+lqWK01A==" }, "node_modules/@shikijs/transformers": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.1.7.tgz", - "integrity": "sha512-lXz011ao4+rvweps/9h3CchBfzb1U5OtP5D51Tqc9lQYdLblWMIxQxH6Ybe1GeGINcEVM4goMyPrI0JvlIp4UQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.2.0.tgz", + "integrity": "sha512-xKn7DtA65DQV4FOfYsrvqM80xOy2xuXnxWWKsZmHv1VII/IOuDUDsWDu3KnpeLH6wqNJWp1GRoNUsHR1aw/VhQ==", "dev": true, "dependencies": { - "shiki": "1.1.7" + "shiki": "1.2.0" } }, "node_modules/@sigstore/bundle": { @@ -4830,9 +4717,9 @@ } }, "node_modules/@sigstore/core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.0.0.tgz", - "integrity": "sha512-dW2qjbWLRKGu6MIDUTBuJwXCnR8zivcSpf5inUzk7y84zqy/dji0/uahppoIgMoKeR+6pUZucrwHfkQQtiG9Rw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz", + "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==", "dev": true, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -4896,28 +4783,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@sigstore/sign/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@sigstore/sign/node_modules/http-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", @@ -5039,6 +4904,12 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/@sigstore/sign/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@sigstore/tuf": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", @@ -5053,13 +4924,13 @@ } }, "node_modules/@sigstore/verify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.1.0.tgz", - "integrity": "sha512-1fTqnqyTBWvV7cftUUFtDcHPdSox0N3Ub7C0lRyReYx4zZUlNTZjCV+HPy4Lre+r45dV7Qx5JLKvqqsgxuyYfg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.1.1.tgz", + "integrity": "sha512-BNANJms49rw9Q5J+fJjrDqOQSzjXDcOq/pgKDaVdDoIvQwqIfaoUriy+fQfh8sBX04hr4bkkrwu3EbhQqoQH7A==", "dev": true, "dependencies": { "@sigstore/bundle": "^2.2.0", - "@sigstore/core": "^1.0.0", + "@sigstore/core": "^1.1.0", "@sigstore/protobuf-specs": "^0.3.0" }, "engines": { @@ -5159,9 +5030,9 @@ } }, "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.10.tgz", + "integrity": "sha512-PiaIWIoPvO6qm6t114ropMCagj6YAF24j9OkCA2mJDXFnlionEwhsBCJ8yek4aib575BI3OkART/90WsgHgLWw==", "dev": true }, "node_modules/@tsconfig/node12": { @@ -5245,9 +5116,9 @@ } }, "node_modules/@types/config": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@types/config/-/config-3.3.3.tgz", - "integrity": "sha512-BB8DBAud88EgiAKlz8WQStzI771Kb6F3j4dioRJ4GD+tP4tzcZyMlz86aXuZT4s9hyesFORehMQE6eqtA5O+Vg==" + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@types/config/-/config-3.3.4.tgz", + "integrity": "sha512-qFiTLnWy+TdPSMIXFHP+87lFXFRM4SXjRS+CSB66+56TrpLNw003y1sh7DGaaC1NGesxgKoT5FDy6dyA1Xju/g==" }, "node_modules/@types/connect": { "version": "3.4.38", @@ -5308,9 +5179,9 @@ "dev": true }, "node_modules/@types/eslint": { - "version": "8.56.5", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.5.tgz", - "integrity": "sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==", + "version": "8.56.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.6.tgz", + "integrity": "sha512-ymwc+qb1XkjT/gfoQwxIeHZ6ixH23A+tCT2ADSA/DPVKzAjwYkTXBMCQ/f6fe4wEa85Lhp26VPeUxI7wMhAi7A==", "dev": true, "dependencies": { "@types/estree": "*", @@ -5547,20 +5418,10 @@ "integrity": "sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==", "dev": true }, - "node_modules/@types/mongodb": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-4.0.7.tgz", - "integrity": "sha512-lPUYPpzA43baXqnd36cZ9xxorprybxXDzteVKCPAdp14ppHtFJHnXYvNpmBvtMUTb5fKXVv6sVbzo1LHkWhJlw==", - "deprecated": "mongodb provides its own types. @types/mongodb is no longer needed.", - "dev": true, - "dependencies": { - "mongodb": "*" - } - }, "node_modules/@types/node": { - "version": "20.11.27", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.27.tgz", - "integrity": "sha512-qyUZfMnCg1KEz57r7pzFtSGt49f6RPkPBis3Vo4PbS7roQEDn22hiHzl/Lo1q4i4hDEgBJmBF/NTNg2XR0HbFg==", + "version": "20.11.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", + "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", "dependencies": { "undici-types": "~5.26.4" } @@ -5588,9 +5449,9 @@ "dev": true }, "node_modules/@types/qs": { - "version": "6.9.12", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.12.tgz", - "integrity": "sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==" + "version": "6.9.14", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.14.tgz", + "integrity": "sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==" }, "node_modules/@types/range-parser": { "version": "1.2.7", @@ -5598,21 +5459,15 @@ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" }, "node_modules/@types/readable-stream": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.10.tgz", - "integrity": "sha512-AbUKBjcC8SHmImNi4yK2bbjogQlkFSg7shZCcicxPQapniOlajG8GCc39lvXzCWX4lLRRs7DM3VAeSlqmEVZUA==", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.11.tgz", + "integrity": "sha512-R3eUMUTTKoIoaz7UpYLxvZCrOmCRPRbAmoDDHKcimTEySltaJhF8hLzj4+EzyDifiX5eK6oDQGSfmNnXjxZzYQ==", "dev": true, "dependencies": { "@types/node": "*", "safe-buffer": "~5.1.1" } }, - "node_modules/@types/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, "node_modules/@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -5637,6 +5492,12 @@ "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, + "node_modules/@types/semver-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@types/semver-utils/-/semver-utils-1.1.3.tgz", + "integrity": "sha512-T+YwkslhsM+CeuhYUxyAjWm7mJ5am/K10UX40RuA6k6Lc7eGtq8iY2xOzy7Vq0GOqhl/xZl5l2FwURZMTPTUww==", + "dev": true + }, "node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", @@ -5657,9 +5518,9 @@ } }, "node_modules/@types/superagent": { - "version": "8.1.4", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.4.tgz", - "integrity": "sha512-uzSBYwrpal8y2X2Pul5ZSWpzRiDha2FLcquaN95qUPnOjYgm/zQ5LIdqeJpQJTRWNTN+Rhm0aC8H06Ds2rqCYw==", + "version": "8.1.6", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.6.tgz", + "integrity": "sha512-yzBOv+6meEHSzV2NThYYOA6RtqvPr3Hbob9ZLp3i07SH27CrYVfm8CrF7ydTmidtelsFiKx2I4gZAiAOamGgvQ==", "dependencies": { "@types/cookiejar": "^2.1.5", "@types/methods": "^1.1.4", @@ -5711,16 +5572,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.2.0.tgz", - "integrity": "sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.4.0.tgz", + "integrity": "sha512-yHMQ/oFaM7HZdVrVm/M2WHaNPgyuJH4WelkSVEWSSsir34kxW2kDJCxlXRhhGWEsMN0WAW/vLpKfKVcm8k+MPw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/type-utils": "7.2.0", - "@typescript-eslint/utils": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", + "@typescript-eslint/scope-manager": "7.4.0", + "@typescript-eslint/type-utils": "7.4.0", + "@typescript-eslint/utils": "7.4.0", + "@typescript-eslint/visitor-keys": "7.4.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -5729,7 +5590,7 @@ "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -5746,19 +5607,19 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", - "integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.4.0.tgz", + "integrity": "sha512-ZvKHxHLusweEUVwrGRXXUVzFgnWhigo4JurEj0dGF1tbcGh6buL+ejDdjxOQxv6ytcY1uhun1p2sm8iWStlgLQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", + "@typescript-eslint/scope-manager": "7.4.0", + "@typescript-eslint/types": "7.4.0", + "@typescript-eslint/typescript-estree": "7.4.0", + "@typescript-eslint/visitor-keys": "7.4.0", "debug": "^4.3.4" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -5774,16 +5635,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", - "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.4.0.tgz", + "integrity": "sha512-68VqENG5HK27ypafqLVs8qO+RkNc7TezCduYrx8YJpXq2QGZ30vmNZGJJJC48+MVn4G2dCV8m5ZTVnzRexTVtw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" + "@typescript-eslint/types": "7.4.0", + "@typescript-eslint/visitor-keys": "7.4.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -5791,18 +5652,18 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.2.0.tgz", - "integrity": "sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.4.0.tgz", + "integrity": "sha512-247ETeHgr9WTRMqHbbQdzwzhuyaJ8dPTuyuUEMANqzMRB1rj/9qFIuIXK7l0FX9i9FXbHeBQl/4uz6mYuCE7Aw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/utils": "7.2.0", + "@typescript-eslint/typescript-estree": "7.4.0", + "@typescript-eslint/utils": "7.4.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -5818,12 +5679,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.4.0.tgz", + "integrity": "sha512-mjQopsbffzJskos5B4HmbsadSJQWaRK0UxqQ7GuNA9Ga4bEKeiO6b2DnB6cM6bpc8lemaPseh0H9B/wyg+J7rw==", "dev": true, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -5831,13 +5692,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.4.0.tgz", + "integrity": "sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", + "@typescript-eslint/types": "7.4.0", + "@typescript-eslint/visitor-keys": "7.4.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -5846,7 +5707,7 @@ "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -5859,21 +5720,21 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.2.0.tgz", - "integrity": "sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.4.0.tgz", + "integrity": "sha512-NQt9QLM4Tt8qrlBVY9lkMYzfYtNz8/6qwZg8pI3cMGlPnj6mOpRxxAm7BMJN9K0AiY+1BwJ5lVC650YJqYOuNg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/scope-manager": "7.4.0", + "@typescript-eslint/types": "7.4.0", + "@typescript-eslint/typescript-estree": "7.4.0", "semver": "^7.5.4" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -5884,16 +5745,16 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.4.0.tgz", + "integrity": "sha512-0zkC7YM0iX5Y41homUUeW1CHtZR01K3ybjM1l6QczoMuay0XKtrb93kv95AxUGwdjGr64nNqnOCwmEl616N8CA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/types": "7.4.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -5907,14 +5768,14 @@ "dev": true }, "node_modules/@unocss/astro": { - "version": "0.58.5", - "resolved": "https://registry.npmjs.org/@unocss/astro/-/astro-0.58.5.tgz", - "integrity": "sha512-LtuVnj8oFAK9663OVhQO8KpdJFiOyyPsYfnOZlDCOFK3gHb/2WMrzdBwr1w8LoQF3bDedkFMKirVF7gWjyZiaw==", + "version": "0.58.6", + "resolved": "https://registry.npmjs.org/@unocss/astro/-/astro-0.58.6.tgz", + "integrity": "sha512-0BvbhEp5Ln6wFNnhISusB2hcfycWkdgnjlFMcLT69efvj4G39MzB6JYT/1qiidLfpj35HcqkpBz7TfZ4bUmOAw==", "dev": true, "dependencies": { - "@unocss/core": "0.58.5", - "@unocss/reset": "0.58.5", - "@unocss/vite": "0.58.5" + "@unocss/core": "0.58.6", + "@unocss/reset": "0.58.6", + "@unocss/vite": "0.58.6" }, "funding": { "url": "https://github.com/sponsors/antfu" @@ -5929,22 +5790,22 @@ } }, "node_modules/@unocss/cli": { - "version": "0.58.5", - "resolved": "https://registry.npmjs.org/@unocss/cli/-/cli-0.58.5.tgz", - "integrity": "sha512-FzVVXO9ghsGtJpu9uR4o7JeM9gUfWNbVZZ/IfH+0WbDJuyx4rO/jwN55z0yA5QDkhvOz9DvzwPCBzLpTJ5q+Lw==", + "version": "0.58.6", + "resolved": "https://registry.npmjs.org/@unocss/cli/-/cli-0.58.6.tgz", + "integrity": "sha512-cfJBiEAKElo9vcA4ZU1WTXeUha5qVBtn3+ZjgdgOvveSX0oY0gOheG+DD2LaEjwWzjCstFU38lblUHWzHRv0sQ==", "dev": true, "dependencies": { - "@ampproject/remapping": "^2.2.1", + "@ampproject/remapping": "^2.3.0", "@rollup/pluginutils": "^5.1.0", - "@unocss/config": "0.58.5", - "@unocss/core": "0.58.5", - "@unocss/preset-uno": "0.58.5", + "@unocss/config": "0.58.6", + "@unocss/core": "0.58.6", + "@unocss/preset-uno": "0.58.6", "cac": "^6.7.14", - "chokidar": "^3.5.3", + "chokidar": "^3.6.0", "colorette": "^2.0.20", "consola": "^3.2.3", "fast-glob": "^3.3.2", - "magic-string": "^0.30.6", + "magic-string": "^0.30.8", "pathe": "^1.1.2", "perfect-debounce": "^1.0.0" }, @@ -5958,19 +5819,49 @@ "url": "https://github.com/sponsors/antfu" } }, - "node_modules/@unocss/cli/node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true + "node_modules/@unocss/cli/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/@unocss/cli/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } }, "node_modules/@unocss/config": { - "version": "0.58.5", - "resolved": "https://registry.npmjs.org/@unocss/config/-/config-0.58.5.tgz", - "integrity": "sha512-O1pLSeNXfG11QHaLSVwS9rJKvE4b9304IQ3UvOdbYN+7SAT4YTZ7JDU4ngO1KWyOFBO6RD0WspCR95pgqOqJiQ==", + "version": "0.58.6", + "resolved": "https://registry.npmjs.org/@unocss/config/-/config-0.58.6.tgz", + "integrity": "sha512-YyywfigaEzGkDJ0ztp/tvruD+0xfdCcMZUvaGH4IElAwZDdcSsuaHdR1HW3EixCETOyFHBcuFk6sJwfLPIZLTw==", "dev": true, "dependencies": { - "@unocss/core": "0.58.5", + "@unocss/core": "0.58.6", "unconfig": "^0.3.11" }, "engines": { @@ -5981,34 +5872,34 @@ } }, "node_modules/@unocss/core": { - "version": "0.58.5", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-0.58.5.tgz", - "integrity": "sha512-qbPqL+46hf1/UelQOwUwpAuvm6buoss43DPYHOPdfNJ+NTWkSpATQMF0JKT04QE0QRQbHNSHdMe9ariG+IIlCw==", + "version": "0.58.6", + "resolved": "https://registry.npmjs.org/@unocss/core/-/core-0.58.6.tgz", + "integrity": "sha512-m87iuENM/PLqLKnfE2mJbpfzj7NQ99LP2go0r+x5X4kXKppyGRJNQg6RIW3AqTS22jup1YPgd62UNXvvRtHtww==", "dev": true, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/extractor-arbitrary-variants": { - "version": "0.58.5", - "resolved": "https://registry.npmjs.org/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-0.58.5.tgz", - "integrity": "sha512-KJQX0OJKzy4YjJo09h2la2Q+cn5IJ1JdyPVJJkzovHnv7jSBWzsfct+bj/6a+SJ4p4JBIqEJz3M/qxHv4EPJyA==", + "version": "0.58.6", + "resolved": "https://registry.npmjs.org/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-0.58.6.tgz", + "integrity": "sha512-iSrjLEM+dtcpCmJ8myttPZ/0Dg4HKYVYpM71rNTybrX1HB/cfRsGwIHobjsvvRnve+LAxC4Hmdi8EXRd8V1xPg==", "dev": true, "dependencies": { - "@unocss/core": "0.58.5" + "@unocss/core": "0.58.6" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/inspector": { - "version": "0.58.5", - "resolved": "https://registry.npmjs.org/@unocss/inspector/-/inspector-0.58.5.tgz", - "integrity": "sha512-cbJlIHEZ14puTtttf7sl+VZFDscV1DJiSseh9sSe0xJ/1NVBT9Bvkm09/1tnpLYAgF5gfa1CaCcjKmURgYzKrA==", + "version": "0.58.6", + "resolved": "https://registry.npmjs.org/@unocss/inspector/-/inspector-0.58.6.tgz", + "integrity": "sha512-JCcnIwSofdIdpR/GYTZ78d4dMZP8Z2oF/g9f9MlPG96LLLwqXSmYtR83vC34fUWm1hz7FZyTLK5OqTV7VfUb+w==", "dev": true, "dependencies": { - "@unocss/core": "0.58.5", - "@unocss/rule-utils": "0.58.5", + "@unocss/core": "0.58.6", + "@unocss/rule-utils": "0.58.6", "gzip-size": "^6.0.0", "sirv": "^2.0.4" }, @@ -6017,18 +5908,18 @@ } }, "node_modules/@unocss/postcss": { - "version": "0.58.5", - "resolved": "https://registry.npmjs.org/@unocss/postcss/-/postcss-0.58.5.tgz", - "integrity": "sha512-m4L2YRdYfT6CV306Kl2VwEwbqa/92EpW4GE2Kqak1RuJyFJXBnWEEMJV4Uy6B1jWKLlCEWkuVUW33JUg7X6BxQ==", + "version": "0.58.6", + "resolved": "https://registry.npmjs.org/@unocss/postcss/-/postcss-0.58.6.tgz", + "integrity": "sha512-jTwu7llhRm7luscsk0JekCeo6RS2W98CXiCJRE1H6IDQnjGQQ/9uRAqW4wuLsv7OQ1ThF8m9NKEj0wFJv7ePNg==", "dev": true, "dependencies": { - "@unocss/config": "0.58.5", - "@unocss/core": "0.58.5", - "@unocss/rule-utils": "0.58.5", + "@unocss/config": "0.58.6", + "@unocss/core": "0.58.6", + "@unocss/rule-utils": "0.58.6", "css-tree": "^2.3.1", "fast-glob": "^3.3.2", - "magic-string": "^0.30.6", - "postcss": "^8.4.33" + "magic-string": "^0.30.8", + "postcss": "^8.4.35" }, "engines": { "node": ">=14" @@ -6041,25 +5932,25 @@ } }, "node_modules/@unocss/preset-attributify": { - "version": "0.58.5", - "resolved": "https://registry.npmjs.org/@unocss/preset-attributify/-/preset-attributify-0.58.5.tgz", - "integrity": "sha512-OR4gUHamHCb4/LB/zZHlibaraTyILfFvRIzgmJnEb6lITGApQUl86qaJcTbTyfTfLVRufLG/JVeuz2HLUBPRXw==", + "version": "0.58.6", + "resolved": "https://registry.npmjs.org/@unocss/preset-attributify/-/preset-attributify-0.58.6.tgz", + "integrity": "sha512-IW2aIBH0RiYsP50VckgxXhMwjDk/XVZykUUklgko9aT+gNC2xDBm3936RWLVLmHdBHG1Vnnjc71BG6aUAqrtEA==", "dev": true, "dependencies": { - "@unocss/core": "0.58.5" + "@unocss/core": "0.58.6" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/preset-icons": { - "version": "0.58.5", - "resolved": "https://registry.npmjs.org/@unocss/preset-icons/-/preset-icons-0.58.5.tgz", - "integrity": "sha512-LDNXavHtWaIvMvBezT9O8yiqHJChVCEfTRO6YFVY0yy+wo5jHiuMh6iKeHVcwbYdn3NqHYmpi7b/hrXPMtODzA==", + "version": "0.58.6", + "resolved": "https://registry.npmjs.org/@unocss/preset-icons/-/preset-icons-0.58.6.tgz", + "integrity": "sha512-20P1ISxEX2J5mhyNkMm0nKp2p0qJfmDArolC10Fjyl+GUTCsojDNFfonzQEkHeIIJwzgRcubdtNaotTgYSKSRg==", "dev": true, "dependencies": { "@iconify/utils": "^2.1.22", - "@unocss/core": "0.58.5", + "@unocss/core": "0.58.6", "ofetch": "^1.3.3" }, "funding": { @@ -6067,63 +5958,63 @@ } }, "node_modules/@unocss/preset-mini": { - "version": "0.58.5", - "resolved": "https://registry.npmjs.org/@unocss/preset-mini/-/preset-mini-0.58.5.tgz", - "integrity": "sha512-WqD31fKUAN28OCUOyi1uremmLk0eTMqtCizjbbXsY/DP6RKYUT7trFAtppTcHWFhSQcknb4FURfAZppACsTVQQ==", + "version": "0.58.6", + "resolved": "https://registry.npmjs.org/@unocss/preset-mini/-/preset-mini-0.58.6.tgz", + "integrity": "sha512-COaM/04Z6/gawzrFcCwoyD6t0FCpuKRyljKKs3VxitoGxsN9BHKiFE3U/cPSQarpG789rmZg8D/wmLHCChSXvg==", "dev": true, "dependencies": { - "@unocss/core": "0.58.5", - "@unocss/extractor-arbitrary-variants": "0.58.5", - "@unocss/rule-utils": "0.58.5" + "@unocss/core": "0.58.6", + "@unocss/extractor-arbitrary-variants": "0.58.6", + "@unocss/rule-utils": "0.58.6" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/preset-tagify": { - "version": "0.58.5", - "resolved": "https://registry.npmjs.org/@unocss/preset-tagify/-/preset-tagify-0.58.5.tgz", - "integrity": "sha512-UB9IXi8vA/SzmmRLMWR7bzeBpxpiRo7y9xk3ruvDddYlsyiwIeDIMwG23YtcA6q41FDQvkrmvTxUEH9LFlv6aA==", + "version": "0.58.6", + "resolved": "https://registry.npmjs.org/@unocss/preset-tagify/-/preset-tagify-0.58.6.tgz", + "integrity": "sha512-xhpHMz8KLrFlLXaOCeShu0/yVpe6J8bd2WcOTd5VuU5W1uCsplcaagpfTRkBpaH1tJt/MTTU5e4cQLa20l0JZQ==", "dev": true, "dependencies": { - "@unocss/core": "0.58.5" + "@unocss/core": "0.58.6" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/preset-typography": { - "version": "0.58.5", - "resolved": "https://registry.npmjs.org/@unocss/preset-typography/-/preset-typography-0.58.5.tgz", - "integrity": "sha512-rFny4a9yxgY34XOom5euCqQaOLV8PpbTg0Pn+5FelUMG4OfMevTwBCe9JttFJcUc3cNTL2enkzIdMa3l66114g==", + "version": "0.58.6", + "resolved": "https://registry.npmjs.org/@unocss/preset-typography/-/preset-typography-0.58.6.tgz", + "integrity": "sha512-s4SSw3SK/JjAqYlga51XnxzPc7jF+TmkEkW09IkYYLPrmqJ76U4i5Po2N7HzyjpVGWnmIp1fQ5mCvbhj4tNyNQ==", "dev": true, "dependencies": { - "@unocss/core": "0.58.5", - "@unocss/preset-mini": "0.58.5" + "@unocss/core": "0.58.6", + "@unocss/preset-mini": "0.58.6" } }, "node_modules/@unocss/preset-uno": { - "version": "0.58.5", - "resolved": "https://registry.npmjs.org/@unocss/preset-uno/-/preset-uno-0.58.5.tgz", - "integrity": "sha512-vgq/R4f7RDmdROy+pX+PeE38I3SgYKd4LL7Wb1HJUaVwz7PkF0XHCynOTbwrPXnK1kp1cnZYYEww7/RiYp+IQQ==", + "version": "0.58.6", + "resolved": "https://registry.npmjs.org/@unocss/preset-uno/-/preset-uno-0.58.6.tgz", + "integrity": "sha512-QFbgvxCvTFqKIA/VGcPM+XcfPGDgbmaiXKbnh7hIbkER6TRxjt4DIGapPt150w/kQT+zC/jerWditSdyn+s3xQ==", "dev": true, "dependencies": { - "@unocss/core": "0.58.5", - "@unocss/preset-mini": "0.58.5", - "@unocss/preset-wind": "0.58.5", - "@unocss/rule-utils": "0.58.5" + "@unocss/core": "0.58.6", + "@unocss/preset-mini": "0.58.6", + "@unocss/preset-wind": "0.58.6", + "@unocss/rule-utils": "0.58.6" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/preset-web-fonts": { - "version": "0.58.5", - "resolved": "https://registry.npmjs.org/@unocss/preset-web-fonts/-/preset-web-fonts-0.58.5.tgz", - "integrity": "sha512-WKZ5raSClFXhqzfAhApef3+fuMq6cjKBxvhJ1FBIxFKcSOvN8e2czty2iGQVl02yMsxBWMv0Bpfm7np+cCoI1w==", + "version": "0.58.6", + "resolved": "https://registry.npmjs.org/@unocss/preset-web-fonts/-/preset-web-fonts-0.58.6.tgz", + "integrity": "sha512-W/8102vurABwfnb9QQyp9GBKP80kpy/IADSM7hbqLNaqmgxHASELXkjhqqt+et39Zn2tnXpIHNVWoqG6QNWBwQ==", "dev": true, "dependencies": { - "@unocss/core": "0.58.5", + "@unocss/core": "0.58.6", "ofetch": "^1.3.3" }, "funding": { @@ -6131,36 +6022,36 @@ } }, "node_modules/@unocss/preset-wind": { - "version": "0.58.5", - "resolved": "https://registry.npmjs.org/@unocss/preset-wind/-/preset-wind-0.58.5.tgz", - "integrity": "sha512-54RkjLmlqMUlC8o8nDCVzB25D1zzK4eth+/3uQzt739qU0U92NxuZKY21ADj9Rp/mVhKBV5FKuXPjmYc6yTQRQ==", + "version": "0.58.6", + "resolved": "https://registry.npmjs.org/@unocss/preset-wind/-/preset-wind-0.58.6.tgz", + "integrity": "sha512-zs41CpFVvLB8CutroUeI1iqxzPsztiur9ei0QjRshxpYerPSsTSgdTkF+eul5D1q3BcsebLebzqtCSqnpFOuOA==", "dev": true, "dependencies": { - "@unocss/core": "0.58.5", - "@unocss/preset-mini": "0.58.5", - "@unocss/rule-utils": "0.58.5" + "@unocss/core": "0.58.6", + "@unocss/preset-mini": "0.58.6", + "@unocss/rule-utils": "0.58.6" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/reset": { - "version": "0.58.5", - "resolved": "https://registry.npmjs.org/@unocss/reset/-/reset-0.58.5.tgz", - "integrity": "sha512-2wMrkCj3SSb5hrx9TKs5jZa34QIRkHv9FotbJutAPo7o8hx+XXn56ogzdoUrcFPJZJUx2R2nyOVbSlGMIjtFtw==", + "version": "0.58.6", + "resolved": "https://registry.npmjs.org/@unocss/reset/-/reset-0.58.6.tgz", + "integrity": "sha512-mYyOe5QDRHc1BBRff+G97j3SGGC8s3Vk7cCcXc/l48FvPHKtLCphMZaBS+KkGkzWqwAtxv0QRbGhTixJCVDRug==", "dev": true, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/rule-utils": { - "version": "0.58.5", - "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-0.58.5.tgz", - "integrity": "sha512-w0sGJoeUGwMWLVFLEE9PDiv/fQcQqZnTIIQLYNCjTdqXDRlwTp9ACW0h47x/hAAIXdOtEOOBuTfjGD79GznUmA==", + "version": "0.58.6", + "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-0.58.6.tgz", + "integrity": "sha512-qbVDeyKzExFY/YeoIbMw/lu8PXEGJzSHrFXRumNHX5lvTu8ggAjH6p9xyvYa/YnuNU0+pFKuYxG8LNK2F8f1EQ==", "dev": true, "dependencies": { - "@unocss/core": "^0.58.5", - "magic-string": "^0.30.6" + "@unocss/core": "^0.58.6", + "magic-string": "^0.30.8" }, "engines": { "node": ">=14" @@ -6170,89 +6061,89 @@ } }, "node_modules/@unocss/scope": { - "version": "0.58.5", - "resolved": "https://registry.npmjs.org/@unocss/scope/-/scope-0.58.5.tgz", - "integrity": "sha512-vSentagAwYTnThGRCjzZ6eNSSRuzdWBl21L1BbvVNM91Ss/FugQnZ1hd0m3TrVvvStYXnFVHMQ/MjCAEJ4cMYg==", + "version": "0.58.6", + "resolved": "https://registry.npmjs.org/@unocss/scope/-/scope-0.58.6.tgz", + "integrity": "sha512-22BDrZPOkfEKuXY4NROhY+J25TAXN+GIxZpE4IbT1Wh+dkjnMXyC85VKGzOAuY/0v0zbaj12dYkmtndueQ/04w==", "dev": true }, "node_modules/@unocss/transformer-attributify-jsx": { - "version": "0.58.5", - "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx/-/transformer-attributify-jsx-0.58.5.tgz", - "integrity": "sha512-sItEALyvAt3PZLd9Q1tlIATjaj3kWbS/qI3otUVsYBdZjP4UudzJ3D1fcWNL2WPlgz8KtlVzRUuxob8TQ4ibZg==", + "version": "0.58.6", + "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx/-/transformer-attributify-jsx-0.58.6.tgz", + "integrity": "sha512-S+mTR5qwMsEaq8nYtqUgYdYIIRAA4oltxfGMYGj3Gxy9V0uteyo56QNp7IOjlYxAB8Dq9jQ8GLYEQe5JlffO1A==", "dev": true, "dependencies": { - "@unocss/core": "0.58.5" + "@unocss/core": "0.58.6" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/transformer-attributify-jsx-babel": { - "version": "0.58.5", - "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx-babel/-/transformer-attributify-jsx-babel-0.58.5.tgz", - "integrity": "sha512-IAWSSKN3V0D87DE8bqaaPrZBWOdWQ06QNfi9vRuQJfRWOui87ezi9+NffjcnQw/ap9xMk1O6z74/WOW3zo6uYA==", + "version": "0.58.6", + "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx-babel/-/transformer-attributify-jsx-babel-0.58.6.tgz", + "integrity": "sha512-IVU/ZozKTFhP9z1I9ZgSKiEx3WfDFDNXbTYTqwNW2SHPmAj5Qf99kn6o7br7Kd1dnxSjKFXOmNfNGkW9AMDraA==", "dev": true, "dependencies": { - "@babel/core": "^7.23.9", + "@babel/core": "^7.24.0", "@babel/plugin-syntax-jsx": "^7.23.3", "@babel/preset-typescript": "^7.23.3", - "@unocss/core": "0.58.5" + "@unocss/core": "0.58.6" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/transformer-compile-class": { - "version": "0.58.5", - "resolved": "https://registry.npmjs.org/@unocss/transformer-compile-class/-/transformer-compile-class-0.58.5.tgz", - "integrity": "sha512-4MaxjaZo1rf5uHvDGa2mbnXxAYVYoj1+oRNpL4fE3FoExS1Ka2CiNGQn/S4bHMF51vmXMSWtOzurJpPD4BaJUQ==", + "version": "0.58.6", + "resolved": "https://registry.npmjs.org/@unocss/transformer-compile-class/-/transformer-compile-class-0.58.6.tgz", + "integrity": "sha512-iung3cPA+IpBHoP6dTs9gkPN/wEVujqMZYxf6FQLjRH+v70rPxqTgaeGDyuQZAYikfDhdUZF8PJ4IUMOxEFsmw==", "dev": true, "dependencies": { - "@unocss/core": "0.58.5" + "@unocss/core": "0.58.6" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/transformer-directives": { - "version": "0.58.5", - "resolved": "https://registry.npmjs.org/@unocss/transformer-directives/-/transformer-directives-0.58.5.tgz", - "integrity": "sha512-allspF5TlT1B2bJSZ1houHScXOTaTPlatLiEmgQKzr/m93rCvktokaO5J6qeN2VXQdpTIsxdA5B8//7UkfTuIA==", + "version": "0.58.6", + "resolved": "https://registry.npmjs.org/@unocss/transformer-directives/-/transformer-directives-0.58.6.tgz", + "integrity": "sha512-8/+KGRmRnlkAJCRt4VqcYK16SnEr9wf1q7D9OCM2kZhk33Sx5SlsO6vjNZ1IH4c67/WviwNV6+KeS4elnQY8bA==", "dev": true, "dependencies": { - "@unocss/core": "0.58.5", - "@unocss/rule-utils": "0.58.5", + "@unocss/core": "0.58.6", + "@unocss/rule-utils": "0.58.6", "css-tree": "^2.3.1" } }, "node_modules/@unocss/transformer-variant-group": { - "version": "0.58.5", - "resolved": "https://registry.npmjs.org/@unocss/transformer-variant-group/-/transformer-variant-group-0.58.5.tgz", - "integrity": "sha512-SjUwGzKK5CVqn7Gg+3v3hV47ZUll7GcGu0vR3RCLO4gqEfFlZWMTHml1Sl2sY1WAca2iVcDRu+dp0RLxRG/dUA==", + "version": "0.58.6", + "resolved": "https://registry.npmjs.org/@unocss/transformer-variant-group/-/transformer-variant-group-0.58.6.tgz", + "integrity": "sha512-6IFmfzketh4j+Mc/ik4nU+Oec0cptNR+aVfZZkGb4wd2h1lH+teAT2Y/Vz2xY8rDExOrbjY5y5FgRGd16LY2Rw==", "dev": true, "dependencies": { - "@unocss/core": "0.58.5" + "@unocss/core": "0.58.6" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/vite": { - "version": "0.58.5", - "resolved": "https://registry.npmjs.org/@unocss/vite/-/vite-0.58.5.tgz", - "integrity": "sha512-p4o1XNX1rvjmoUqSSdua8XyWNg/d+YUChDd2L/xEty+6j2qv0wUaohs3UQ87vWlv632/UmgdX+2MbrgtqthCtw==", + "version": "0.58.6", + "resolved": "https://registry.npmjs.org/@unocss/vite/-/vite-0.58.6.tgz", + "integrity": "sha512-DPXCoYU/Ozqc/Jeptd41XvtW8MSgVxmtTyhpMAsm/hJuBfwIV7Fy3TZquf4V9BpaTb4ao1LVXzgXmVUmj2HXpA==", "dev": true, "dependencies": { - "@ampproject/remapping": "^2.2.1", + "@ampproject/remapping": "^2.3.0", "@rollup/pluginutils": "^5.1.0", - "@unocss/config": "0.58.5", - "@unocss/core": "0.58.5", - "@unocss/inspector": "0.58.5", - "@unocss/scope": "0.58.5", - "@unocss/transformer-directives": "0.58.5", - "chokidar": "^3.5.3", + "@unocss/config": "0.58.6", + "@unocss/core": "0.58.6", + "@unocss/inspector": "0.58.6", + "@unocss/scope": "0.58.6", + "@unocss/transformer-directives": "0.58.6", + "chokidar": "^3.6.0", "fast-glob": "^3.3.2", - "magic-string": "^0.30.6" + "magic-string": "^0.30.8" }, "funding": { "url": "https://github.com/sponsors/antfu" @@ -6261,23 +6152,155 @@ "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0" } }, - "node_modules/@vitejs/plugin-vue": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz", - "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==", + "node_modules/@unocss/vite/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": ">= 8.10.0" }, - "peerDependencies": { - "vite": "^5.0.0", - "vue": "^3.2.25" + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/@vue/compiler-core": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.21.tgz", - "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==", + "node_modules/@unocss/vite/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz", + "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==", + "dev": true, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitest/expect": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.4.0.tgz", + "integrity": "sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA==", + "dev": true, + "dependencies": { + "@vitest/spy": "1.4.0", + "@vitest/utils": "1.4.0", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.4.0.tgz", + "integrity": "sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg==", + "dev": true, + "dependencies": { + "@vitest/utils": "1.4.0", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.4.0.tgz", + "integrity": "sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==", + "dev": true, + "dependencies": { + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.4.0.tgz", + "integrity": "sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q==", + "dev": true, + "dependencies": { + "tinyspy": "^2.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.4.0.tgz", + "integrity": "sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg==", + "dev": true, + "dependencies": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.21.tgz", + "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==", "dependencies": { "@babel/parser": "^7.23.9", "@vue/shared": "3.4.21", @@ -6286,6 +6309,11 @@ "source-map-js": "^1.0.2" } }, + "node_modules/@vue/compiler-core/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, "node_modules/@vue/compiler-dom": { "version": "3.4.21", "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz", @@ -6311,6 +6339,11 @@ "source-map-js": "^1.0.2" } }, + "node_modules/@vue/compiler-sfc/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, "node_modules/@vue/compiler-ssr": { "version": "3.4.21", "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz", @@ -6321,21 +6354,21 @@ } }, "node_modules/@vue/devtools-api": { - "version": "7.0.17", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.0.17.tgz", - "integrity": "sha512-UWU9tqzUBv+ttUxYLaQcL5IxSSdF+i6yheFiEtz7mh88YZUYkxpEmT43iKBs3YsC54ROwPD2iZIndnju6PWfOQ==", + "version": "7.0.21", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.0.21.tgz", + "integrity": "sha512-hIkqpU3I9BM/qNUGhb/RAfEkRtFZTM4QFrBBH5gxGYubBIRctqgQk4ukLAkhaW+VmOw5DAPxQHXH4W6Oh36L6g==", "dev": true, "dependencies": { - "@vue/devtools-kit": "^7.0.17" + "@vue/devtools-kit": "^7.0.21" } }, "node_modules/@vue/devtools-kit": { - "version": "7.0.17", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.0.17.tgz", - "integrity": "sha512-znPLSOoTP3RnR9fvkq5M+nnpEA+WocybzOo5ID73vYkE0/n0VcfU8Ld0j4AHQjV/omTdAzh6QLpPlUYdIHXg+w==", + "version": "7.0.21", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.0.21.tgz", + "integrity": "sha512-tNDtcQkPHfLDH1wtZuSZ2ZfE+r/aGswkBmKmXjwfpZTsOTk/YXsgrMnBKtHOL6dpsG3GyP09gIgNkCkA5lBIPQ==", "dev": true, "dependencies": { - "@vue/devtools-shared": "^7.0.17", + "@vue/devtools-shared": "^7.0.21", "hookable": "^5.5.3", "mitt": "^3.0.1", "perfect-debounce": "^1.0.0", @@ -6346,9 +6379,9 @@ } }, "node_modules/@vue/devtools-shared": { - "version": "7.0.17", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.0.17.tgz", - "integrity": "sha512-QNg2TMQBFFffRbTKE9NjytXBywGR77p2UMi/gJ0ow58S+1jkAvL8ikU/JnSs9ePvsVtspHX32m2cdfe4DJ4ygw==", + "version": "7.0.21", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.0.21.tgz", + "integrity": "sha512-wuIakRkSqwsk9+Y4z5QTdsmhTJRAt4aX0ROXyOOEPL+ROrN26YsPbXyqlzroU5uoOoAvx81iObIlmwZWtZztgw==", "dev": true, "dependencies": { "rfdc": "^1.3.1" @@ -7137,9 +7170,9 @@ } }, "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true }, "node_modules/argparse": { @@ -7241,6 +7274,15 @@ "safer-buffer": "^2.1.0" } }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/async": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", @@ -7291,11 +7333,11 @@ } }, "node_modules/axios": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", - "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", "dependencies": { - "follow-redirects": "^1.15.4", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -7347,57 +7389,25 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", - "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.5.0", - "core-js-compat": "^3.34.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3/node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", - "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", + "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" + "@babel/helper-define-polyfill-provider": "^0.6.1", + "core-js-compat": "^3.36.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", - "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.5.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator/node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", - "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", + "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" + "@babel/helper-define-polyfill-provider": "^0.6.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -7410,9 +7420,9 @@ "dev": true }, "node_modules/bare-events": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.1.tgz", - "integrity": "sha512-9GYPpsPFvrWBkelIhOhTWtkeZxVxZOdb3VnFTCzlOo3OjvmTvzLoZFUT8kNFACx0vJej6QPney1Cf9BvzCNE/A==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.2.tgz", + "integrity": "sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==", "dev": true, "optional": true }, @@ -7464,12 +7474,15 @@ } }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bindings": { @@ -7900,28 +7913,6 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/cacache/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/cacache/node_modules/lru-cache": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", @@ -8048,9 +8039,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001597", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz", - "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==", + "version": "1.0.30001600", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", + "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", "dev": true, "funding": [ { @@ -8067,6 +8058,24 @@ } ] }, + "node_modules/chai": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/chalk": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", @@ -8083,6 +8092,18 @@ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -8199,9 +8220,9 @@ } }, "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.4.tgz", + "integrity": "sha512-Lm3L0p+/npIQWNIiyF/nAn7T5dnOwR3xNTHXYEBFBFVPXzCVNZ5lqEC/1eo/EVfpDsQ1I+TX4ORPQgp+UI0CRw==", "dev": true, "dependencies": { "string-width": "^4.2.0" @@ -8373,9 +8394,9 @@ } }, "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "node_modules/columnify": { @@ -8491,11 +8512,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -8616,6 +8632,25 @@ "node": ">= 0.6" } }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/content-type": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", @@ -8747,9 +8782,9 @@ "dev": true }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "engines": { "node": ">= 0.6" } @@ -8776,6 +8811,25 @@ "ms": "^2.1.1" } }, + "node_modules/cookie-session/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -8800,12 +8854,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.36.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.0.tgz", - "integrity": "sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==", + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", + "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", "dev": true, "dependencies": { - "browserslist": "^4.22.3" + "browserslist": "^4.23.0" }, "funding": { "type": "opencollective", @@ -8941,22 +8995,73 @@ "node": ">=8" } }, - "node_modules/date-fns": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.4.0.tgz", - "integrity": "sha512-Akz4R8J9MXBsOgF1QeWeCsbv6pntT5KCPjU0Q9prBxVmWJYPLhwAIsNg3b0QAdr0ttiozYLD3L/af7Ra0jqYXw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, "engines": { - "node": "*" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true, + "engines": { + "node": "*" } }, "node_modules/dayjs": { @@ -9055,6 +9160,18 @@ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/deep-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", @@ -9204,9 +9321,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "dev": true, "engines": { "node": ">=8" @@ -9347,15 +9464,15 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.703", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.703.tgz", - "integrity": "sha512-094ZZC4nHXPKl/OwPinSMtLN9+hoFkdfQGKnvXbY+3WEAYtVDpz9UhJIViiY6Zb8agvqxiaJzNG9M+pRZWvSZw==", + "version": "1.4.716", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.716.tgz", + "integrity": "sha512-t/MXMzFKQC3UfMDpw7V5wdB/UAB8dWx4hEsy+fpPYJWW3gqh3u5T1uXp6vR+H6dGCPBxkRo+YBcapBLvbGQHRw==", "dev": true }, "node_modules/element-plus": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.6.1.tgz", - "integrity": "sha512-6VRpLjwtIVdtUuITJPPKtpOH1NM6nuAkRE3q5O4Lrx0N1bYMhTkiqb2Jy7zfQuDPbOIkkF2OABTzegpNnzgsnQ==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.6.2.tgz", + "integrity": "sha512-WFMv1v83l437Xu+GeeM+ytxd9VUQpR4418BowvTVIPYItsoj6yK0ITIuSv19iCesF405FbAOaCIHXhJch0ilFA==", "dependencies": { "@ctrl/tinycolor": "^3.4.1", "@element-plus/icons-vue": "^2.3.1", @@ -9647,17 +9764,21 @@ } }, "node_modules/es-abstract": { - "version": "1.22.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", - "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", + "version": "1.23.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.2.tgz", + "integrity": "sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", "es-define-property": "^1.0.0", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", @@ -9668,10 +9789,11 @@ "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "hasown": "^2.0.1", + "hasown": "^2.0.2", "internal-slot": "^1.0.7", "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.3", @@ -9682,17 +9804,17 @@ "object-keys": "^1.1.1", "object.assign": "^4.1.5", "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.0", + "safe-array-concat": "^1.1.2", "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", "string.prototype.trimstart": "^1.0.7", "typed-array-buffer": "^1.0.2", "typed-array-byte-length": "^1.0.1", "typed-array-byte-offset": "^1.0.2", "typed-array-length": "^1.0.5", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -9702,19 +9824,19 @@ } }, "node_modules/es-aggregate-error": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/es-aggregate-error/-/es-aggregate-error-1.0.12.tgz", - "integrity": "sha512-j0PupcmELoVbYS2NNrsn5zcLLEsryQwP02x8fRawh7c2eEaPHwJFAxltZsqV7HJjsF57+SMpYyVRWgbVLfOagg==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/es-aggregate-error/-/es-aggregate-error-1.0.13.tgz", + "integrity": "sha512-KkzhUUuD2CUMqEc8JEqsXEMDHzDPE8RCjZeUBitsnB1eNcAJWQPiciKsMXe3Yytj4Flw1XLl46Qcf9OxvZha7A==", "dev": true, "dependencies": { - "define-data-property": "^1.1.1", + "define-data-property": "^1.1.4", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.1.0", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.1", - "set-function-name": "^2.0.1" + "has-property-descriptors": "^1.0.2", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -9743,11 +9865,23 @@ } }, "node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.2.tgz", + "integrity": "sha512-7nOqkomXZEaxUDJw21XZNtRk739QvrPSoZoRtbsEfcii00vdzZUh6zh1CQwHhrib8MdEtJfv5rJiGeb4KuV/vw==", "dev": true }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", @@ -10135,9 +10269,13 @@ } }, "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } }, "node_modules/esutils": { "version": "2.0.3", @@ -10224,16 +10362,16 @@ "dev": true }, "node_modules/express": { - "version": "4.18.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", - "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -10291,6 +10429,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -10530,103 +10687,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-cache-dir/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/find-cache-dir/node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "dev": true, - "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -10688,9 +10748,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -10921,6 +10981,15 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", @@ -11220,19 +11289,22 @@ "dev": true }, "node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=12" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -11256,18 +11328,6 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, - "node_modules/glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/global-dirs": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", @@ -11427,6 +11487,15 @@ "jws": "^4.0.0" } }, + "node_modules/grant/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "optional": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/grant/node_modules/cookie-signature": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.1.tgz", @@ -11642,6 +11711,24 @@ "node": ">=10" } }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", @@ -11669,12 +11756,6 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, "node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -11965,7 +12046,71 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/imurmurhash": { + "node_modules/import-local/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", @@ -12244,6 +12389,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -13239,6 +13399,12 @@ } } }, + "node_modules/knex/node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, "node_modules/knex/node_modules/commander": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", @@ -13279,9 +13445,9 @@ } }, "node_modules/koa": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.0.tgz", - "integrity": "sha512-KEL/vU1knsoUvfP4MC4/GthpQrY/p6dzwaaGI6Rt4NQuFqkw3qrvsdYF5pz3wOfi7IGTvMPHC9aZIcUKYFNxsw==", + "version": "2.15.2", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.2.tgz", + "integrity": "sha512-MXTeZH3M6AJ8ukW2QZ8wqO3Dcdfh2WRRmjCBkEP+NhKNCiqlO5RDqHmSnsyNrbRJrdjyvIGSJho4vQiWgQJSVA==", "dependencies": { "accepts": "^1.3.5", "cache-content-type": "^1.0.0", @@ -14191,6 +14357,15 @@ "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", "integrity": "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==" }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.1" + } + }, "node_modules/lowercase-keys": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", @@ -14204,14 +14379,12 @@ } }, "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "yallist": "^3.0.2" } }, "node_modules/magic-string": { @@ -14299,9 +14472,9 @@ "dev": true }, "node_modules/markdown-it": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.0.0.tgz", - "integrity": "sha512-seFjF0FIcPt4P9U39Bq1JYblX0KZCjDLFFQPHpL5AzHpqPEKtosxmdq/LTVZnjfH7tjt9BxStm+wXcDBNuYmzw==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, "dependencies": { "argparse": "^2.0.1", @@ -14309,7 +14482,7 @@ "linkify-it": "^5.0.0", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", - "uc.micro": "^2.0.0" + "uc.micro": "^2.1.0" }, "bin": { "markdown-it": "bin/markdown-it.mjs" @@ -14732,6 +14905,12 @@ "node": ">=8" } }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/minipass-json-stream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", @@ -14754,6 +14933,12 @@ "node": ">=8" } }, + "node_modules/minipass-json-stream/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/minipass-pipeline": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", @@ -14778,6 +14963,12 @@ "node": ">=8" } }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/minipass-sized": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", @@ -14802,6 +14993,12 @@ "node": ">=8" } }, + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/minisearch": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.3.0.tgz", @@ -14833,6 +15030,12 @@ "node": ">=8" } }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", @@ -14957,6 +15160,25 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/mocha/node_modules/minimatch": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", @@ -14975,6 +15197,15 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/mocha/node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, "node_modules/mocha/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -15213,6 +15444,31 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, + "node_modules/mongodb-memory-server-core/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mongodb-memory-server-core/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/mongodb-memory-server-core/node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -15288,6 +15544,45 @@ "whatwg-url": "^11.0.0" } }, + "node_modules/mongodb-memory-server-core/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mongodb-memory-server-core/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mongodb-memory-server-core/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/mongodb-memory-server-core/node_modules/tar-stream": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", @@ -15455,12 +15750,6 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/mysql/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, "node_modules/mysql/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -15579,15 +15868,15 @@ } }, "node_modules/node-fetch-native": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.2.tgz", - "integrity": "sha512-69mtXOFZ6hSkYiXAVB5SqaRvrbITC/NPyqv7yuu/qw0nmgPyYbIMYYNIDhNtwPrzk0ptrimrLz/hhjvm4w5Z+w==", + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz", + "integrity": "sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==", "dev": true }, "node_modules/node-gyp": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.0.1.tgz", - "integrity": "sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.1.0.tgz", + "integrity": "sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA==", "dev": true, "dependencies": { "env-paths": "^2.2.0", @@ -15608,28 +15897,6 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/node-gyp/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/node-gyp/node_modules/isexe": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", @@ -15732,11 +15999,12 @@ } }, "node_modules/npm-check-updates": { - "version": "16.14.15", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.15.tgz", - "integrity": "sha512-WH0wJ9j6CP7Azl+LLCxWAYqroT2IX02kRIzgK/fg0rPpMbETgHITWBdOPtrv521xmA3JMgeNsQ62zvVtS/nCmQ==", + "version": "16.14.18", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.18.tgz", + "integrity": "sha512-9iaRe9ohx9ykdbLjPRIYcq1A0RkrPYUx9HmQK1JIXhfxtJCNE/+497H9Z4PGH6GWRALbz5KF+1iZoySK2uSEpQ==", "dev": true, "dependencies": { + "@types/semver-utils": "^1.1.1", "chalk": "^5.3.0", "cli-table3": "^0.6.3", "commander": "^10.0.1", @@ -15897,28 +16165,6 @@ "node": ">=14" } }, - "node_modules/npm-check-updates/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/npm-check-updates/node_modules/hosted-git-info": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", @@ -16525,6 +16771,12 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/npm-check-updates/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/npm-install-checks": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", @@ -16575,15 +16827,33 @@ "node": ">=10" } }, - "node_modules/npm-package-arg/node_modules/validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "node_modules/npm-package-arg/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-package-arg/node_modules/validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", "dev": true, "dependencies": { "builtins": "^1.0.3" } }, + "node_modules/npm-package-arg/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/npm-packlist": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.1.tgz", @@ -16602,6 +16872,37 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/npm-packlist/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm-packlist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/npm-pick-manifest": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.0.0.tgz", @@ -16724,28 +17025,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/npm-registry-fetch/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/npm-registry-fetch/node_modules/hosted-git-info": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", @@ -16903,6 +17182,12 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/npm-registry-fetch/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -16931,13 +17216,13 @@ } }, "node_modules/nx": { - "version": "18.0.8", - "resolved": "https://registry.npmjs.org/nx/-/nx-18.0.8.tgz", - "integrity": "sha512-IhzRLCZaiR9zKGJ3Jm79bhi8nOdyRORQkFc/YDO6xubLSQ5mLPAeg789Q/SlGRzU5oMwLhm5D/gvvMJCAvUmXQ==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/nx/-/nx-18.1.3.tgz", + "integrity": "sha512-Ade/BZxK8kf98pBPHVJXRkxRTpBYJceL1YD9LBMP5TwmsVdG5ZbmmpTkCBorCGmCZ8L5WZN3gwoikvPKGs8q5w==", "dev": true, "hasInstallScript": true, "dependencies": { - "@nrwl/tao": "18.0.8", + "@nrwl/tao": "18.1.3", "@yarnpkg/lockfile": "^1.1.0", "@yarnpkg/parsers": "3.0.0-rc.46", "@zkochan/js-yaml": "0.0.6", @@ -16977,16 +17262,16 @@ "nx-cloud": "bin/nx-cloud.js" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "18.0.8", - "@nx/nx-darwin-x64": "18.0.8", - "@nx/nx-freebsd-x64": "18.0.8", - "@nx/nx-linux-arm-gnueabihf": "18.0.8", - "@nx/nx-linux-arm64-gnu": "18.0.8", - "@nx/nx-linux-arm64-musl": "18.0.8", - "@nx/nx-linux-x64-gnu": "18.0.8", - "@nx/nx-linux-x64-musl": "18.0.8", - "@nx/nx-win32-arm64-msvc": "18.0.8", - "@nx/nx-win32-x64-msvc": "18.0.8" + "@nx/nx-darwin-arm64": "18.1.3", + "@nx/nx-darwin-x64": "18.1.3", + "@nx/nx-freebsd-x64": "18.1.3", + "@nx/nx-linux-arm-gnueabihf": "18.1.3", + "@nx/nx-linux-arm64-gnu": "18.1.3", + "@nx/nx-linux-arm64-musl": "18.1.3", + "@nx/nx-linux-x64-gnu": "18.1.3", + "@nx/nx-linux-x64-musl": "18.1.3", + "@nx/nx-win32-arm64-msvc": "18.1.3", + "@nx/nx-win32-x64-msvc": "18.1.3" }, "peerDependencies": { "@swc-node/register": "^1.8.0", @@ -17139,14 +17424,14 @@ "dev": true }, "node_modules/ofetch": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.3.3.tgz", - "integrity": "sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.3.4.tgz", + "integrity": "sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==", "dev": true, "dependencies": { - "destr": "^2.0.1", - "node-fetch-native": "^1.4.0", - "ufo": "^1.3.0" + "destr": "^2.0.3", + "node-fetch-native": "^1.6.3", + "ufo": "^1.5.3" } }, "node_modules/on-finished": { @@ -17542,9 +17827,9 @@ } }, "node_modules/pacote/node_modules/@sigstore/tuf": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.1.tgz", - "integrity": "sha512-9Iv40z652td/QbV0o5n/x25H9w6IYRt2pIGbTX55yFDYlApDQn/6YZomjz6+KBx69rXHLzHcbtTS586mDdFD+Q==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.2.tgz", + "integrity": "sha512-mwbY1VrEGU4CO55t+Kl6I7WZzIl+ysSzEYdA1Nv/FTrl2bkeaPXo5PnWZAVfcY2zSdhOpsUTJW67/M2zHXGn5w==", "dev": true, "dependencies": { "@sigstore/protobuf-specs": "^0.3.0", @@ -17576,28 +17861,6 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/pacote/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/pacote/node_modules/hosted-git-info": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", @@ -17918,6 +18181,15 @@ "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "dev": true }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -18060,67 +18332,100 @@ } }, "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", "dev": true, "dependencies": { - "find-up": "^4.0.0" + "find-up": "^6.3.0" }, "engines": { - "node": ">=8" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, "dependencies": { - "p-locate": "^4.1.0" + "p-locate": "^6.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">=6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, "dependencies": { - "p-limit": "^2.2.0" + "p-limit": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/pkg-dir/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/pkg-types": { @@ -18144,9 +18449,9 @@ } }, "node_modules/postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "funding": [ { "type": "opencollective", @@ -18164,7 +18469,7 @@ "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" @@ -18210,9 +18515,9 @@ } }, "node_modules/preact": { - "version": "10.19.6", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.19.6.tgz", - "integrity": "sha512-gympg+T2Z1fG1unB8NH29yHJwnEaCH37Z32diPDku316OTnRPeMbiRV9kTrfZpocXjdfnWuFUl/Mj4BHaf6gnw==", + "version": "10.20.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.20.1.tgz", + "integrity": "sha512-JIFjgFg9B2qnOoGiYMVBtrcFxHqn+dNXbq76bVmcaHYJFYR4lW67AOcXgAYQQTDYXDOg/kTZrKPNCdRgJ2UJmw==", "dev": true, "funding": { "type": "opencollective", @@ -18679,28 +18984,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/read-package-json/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/read-package-json/node_modules/hosted-git-info": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", @@ -19483,23 +19766,9 @@ "dev": true }, "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/safe-regex-test": { "version": "1.0.3", @@ -19524,9 +19793,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass": { - "version": "1.71.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.71.1.tgz", - "integrity": "sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==", + "version": "1.72.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.72.0.tgz", + "integrity": "sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -19653,6 +19922,22 @@ "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==", "dev": true }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -19695,9 +19980,9 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "dependencies": { "randombytes": "^2.1.0" @@ -19852,11 +20137,11 @@ } }, "node_modules/shiki": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.1.7.tgz", - "integrity": "sha512-9kUTMjZtcPH3i7vHunA6EraTPpPOITYTdA5uMrvsJRexktqP0s7P3s9HVK80b4pP42FRVe03D7fT3NmJv2yYhw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.2.0.tgz", + "integrity": "sha512-xLhiTMOIUXCv5DqJ4I70GgQCtdlzsTqFLZWcMHHG3TAieBUbvEGthdrlPDlX4mL/Wszx9C6rEcxU6kMlg4YlxA==", "dependencies": { - "@shikijs/core": "1.1.7" + "@shikijs/core": "1.2.0" } }, "node_modules/shx": { @@ -19897,6 +20182,12 @@ "resolved": "https://registry.npmjs.org/sift/-/sift-17.0.1.tgz", "integrity": "sha512-10rmPF5nuz5UdKuhhxgfS7Vz1aIRGmb+kn5Zy6bntCgNwkbZc0a7Z2dUw2Y9wSoRrBzf7Oim81SUsYdOkVnI8Q==" }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -19963,28 +20254,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/sigstore/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/sigstore/node_modules/http-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", @@ -20106,6 +20375,12 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/sigstore/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", @@ -20196,12 +20471,6 @@ "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", "dev": true }, - "node_modules/sitemap/node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -20222,9 +20491,9 @@ } }, "node_modules/socket.io": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.4.tgz", - "integrity": "sha512-DcotgfP1Zg9iP/dH9zvAQcWrE0TtbMVwXmlV4T4mqsvY+gw+LqUGPfx2AoVyRk0FLME+GQhufDMyacFmw7ksqw==", + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", + "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", @@ -20248,9 +20517,9 @@ } }, "node_modules/socket.io-client": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.4.tgz", - "integrity": "sha512-wh+OkeF0rAVCrABWQBaEjLfb7DVPotMbu0cgWgyR0v6eA4EoVnAwcIeIbcdTE3GT/H3kbdLl7OoH2+asoDRIIg==", + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.5.tgz", + "integrity": "sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==", "dev": true, "dependencies": { "@socket.io/component-emitter": "~3.1.0", @@ -20324,9 +20593,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "engines": { "node": ">=0.10.0" } @@ -20661,6 +20930,19 @@ "node": ">= 6" } }, + "node_modules/sqlite3/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/sqlite3/node_modules/make-fetch-happen": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", @@ -20835,6 +21117,13 @@ "imurmurhash": "^0.1.4" } }, + "node_modules/sqlite3/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "optional": true + }, "node_modules/sqlstring": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", @@ -20868,6 +21157,18 @@ "node": ">=8" } }, + "node_modules/ssri/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -20876,6 +21177,12 @@ "node": ">= 0.8" } }, + "node_modules/std-env": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", + "dev": true + }, "node_modules/stoppable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", @@ -20907,6 +21214,25 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -20936,34 +21262,41 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -20973,28 +21306,31 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -21099,17 +21435,23 @@ } }, "node_modules/strip-literal": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", - "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.0.0.tgz", + "integrity": "sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==", "dev": true, "dependencies": { - "acorn": "^8.10.0" + "js-tokens": "^8.0.2" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.3.tgz", + "integrity": "sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==", + "dev": true + }, "node_modules/strong-log-transformer": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", @@ -21289,6 +21631,12 @@ "node": ">=8" } }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/tarn": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", @@ -21454,9 +21802,9 @@ } }, "node_modules/terser": { - "version": "5.29.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.1.tgz", - "integrity": "sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==", + "version": "5.29.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.2.tgz", + "integrity": "sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -21505,16 +21853,6 @@ } } }, - "node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", @@ -21533,15 +21871,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -21650,12 +21979,6 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/through2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, "node_modules/through2/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -21674,6 +21997,30 @@ "node": ">=8" } }, + "node_modules/tinybench": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.6.0.tgz", + "integrity": "sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==", + "dev": true + }, + "node_modules/tinypool": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.3.tgz", + "integrity": "sha512-Ud7uepAklqRH1bvwy22ynrliC7Dljz7Tm8M/0RBUW+YRa4YHhZ6e4PpgE+fu1zr/WqB1kbeuVrdfeuyIBpy4tw==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", + "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -21900,6 +22247,12 @@ } } }, + "node_modules/ts-node/node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "node_modules/ts-node/node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -22012,28 +22365,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/tuf-js/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/tuf-js/node_modules/http-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", @@ -22155,6 +22486,12 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/tuf-js/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -22179,10 +22516,19 @@ "node": ">= 0.8.0" } }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/type-fest": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.12.0.tgz", - "integrity": "sha512-5Y2/pp2wtJk8o08G0CMkuFPCO354FGwk/vbidxrdhRGZfd0tFnb4Qb8anp9XxXriwBgVPjdWbKpGl4J9lJY2jQ==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.14.0.tgz", + "integrity": "sha512-on5/Cw89wwqGZQu+yWO0gGMGu8VNxsaW9SB2HE8yJjllEk7IDTwnSN1dUVldYILhYPN5HzD7WAaw2cc/jBfn0Q==", "dev": true, "engines": { "node": ">=16" @@ -22257,9 +22603,9 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", - "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "dependencies": { "call-bind": "^1.0.7", @@ -22292,9 +22638,9 @@ } }, "node_modules/typescript": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", - "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", + "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", "devOptional": true, "bin": { "tsc": "bin/tsc", @@ -22311,9 +22657,9 @@ "dev": true }, "node_modules/ufo": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.4.0.tgz", - "integrity": "sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", + "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", "dev": true }, "node_modules/uglify-js": { @@ -22436,13 +22782,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/unimport/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "node_modules/unimport/node_modules/strip-literal": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", + "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", "dev": true, "dependencies": { - "@types/estree": "^1.0.0" + "acorn": "^8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" } }, "node_modules/unique-filename": { @@ -22500,31 +22849,31 @@ } }, "node_modules/unocss": { - "version": "0.58.5", - "resolved": "https://registry.npmjs.org/unocss/-/unocss-0.58.5.tgz", - "integrity": "sha512-0g4P6jLgRRNnhscxw7nQ9RHGrKJ1UPPiHPet+YT3TXUcmy4mTiYgo9+kGQf5bjyrzsELJ10cT6Qz2y6g9Tls4g==", - "dev": true, - "dependencies": { - "@unocss/astro": "0.58.5", - "@unocss/cli": "0.58.5", - "@unocss/core": "0.58.5", - "@unocss/extractor-arbitrary-variants": "0.58.5", - "@unocss/postcss": "0.58.5", - "@unocss/preset-attributify": "0.58.5", - "@unocss/preset-icons": "0.58.5", - "@unocss/preset-mini": "0.58.5", - "@unocss/preset-tagify": "0.58.5", - "@unocss/preset-typography": "0.58.5", - "@unocss/preset-uno": "0.58.5", - "@unocss/preset-web-fonts": "0.58.5", - "@unocss/preset-wind": "0.58.5", - "@unocss/reset": "0.58.5", - "@unocss/transformer-attributify-jsx": "0.58.5", - "@unocss/transformer-attributify-jsx-babel": "0.58.5", - "@unocss/transformer-compile-class": "0.58.5", - "@unocss/transformer-directives": "0.58.5", - "@unocss/transformer-variant-group": "0.58.5", - "@unocss/vite": "0.58.5" + "version": "0.58.6", + "resolved": "https://registry.npmjs.org/unocss/-/unocss-0.58.6.tgz", + "integrity": "sha512-HBstDtC6KKD5yCYh5hHpPdHGZai0B/iLlDwkOIK+xfQYrvl8tNBvKfRz3xgiaI5MJ+fLmEOxbfXQIjleU1A0iA==", + "dev": true, + "dependencies": { + "@unocss/astro": "0.58.6", + "@unocss/cli": "0.58.6", + "@unocss/core": "0.58.6", + "@unocss/extractor-arbitrary-variants": "0.58.6", + "@unocss/postcss": "0.58.6", + "@unocss/preset-attributify": "0.58.6", + "@unocss/preset-icons": "0.58.6", + "@unocss/preset-mini": "0.58.6", + "@unocss/preset-tagify": "0.58.6", + "@unocss/preset-typography": "0.58.6", + "@unocss/preset-uno": "0.58.6", + "@unocss/preset-web-fonts": "0.58.6", + "@unocss/preset-wind": "0.58.6", + "@unocss/reset": "0.58.6", + "@unocss/transformer-attributify-jsx": "0.58.6", + "@unocss/transformer-attributify-jsx-babel": "0.58.6", + "@unocss/transformer-compile-class": "0.58.6", + "@unocss/transformer-directives": "0.58.6", + "@unocss/transformer-variant-group": "0.58.6", + "@unocss/vite": "0.58.6" }, "engines": { "node": ">=14" @@ -22533,7 +22882,7 @@ "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { - "@unocss/webpack": "0.58.5", + "@unocss/webpack": "0.58.6", "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0" }, "peerDependenciesMeta": { @@ -22827,16 +23176,6 @@ "node": ">=10.12.0" } }, - "node_modules/v8-to-istanbul/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -22868,14 +23207,14 @@ } }, "node_modules/vite": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.6.tgz", - "integrity": "sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.6.tgz", + "integrity": "sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==", "dev": true, "dependencies": { - "esbuild": "^0.19.3", - "postcss": "^8.4.35", - "rollup": "^4.2.0" + "esbuild": "^0.20.1", + "postcss": "^8.4.36", + "rollup": "^4.13.0" }, "bin": { "vite": "bin/vite.js" @@ -22922,10 +23261,32 @@ } } }, + "node_modules/vite-node": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.4.0.tgz", + "integrity": "sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/vite-plugin-pwa": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.19.2.tgz", - "integrity": "sha512-LSQJFPxCAQYbRuSyc9EbRLRqLpaBA9onIZuQFomfUYjWSgHuQLonahetDlPSC9zsxmkSEhQH8dXZN8yL978h3w==", + "version": "0.19.7", + "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.19.7.tgz", + "integrity": "sha512-18TECxoGPQE7tVZzKxbf5Icrl5688n1JGMPSgGotTsh89vLDxevY7ICfD3CFVfonZXh8ckuyJXg0NXE5+FAl2A==", "dev": true, "dependencies": { "debug": "^4.3.4", @@ -22952,43 +23313,449 @@ } } }, - "node_modules/vitepress": { - "version": "1.0.0-rc.45", - "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.0-rc.45.tgz", - "integrity": "sha512-/OiYsu5UKpQKA2c0BAZkfyywjfauDjvXyv6Mo4Ra57m5n4Bxg1HgUGoth1CLH2vwUbR/BHvDA9zOM0RDvgeSVQ==", + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "@docsearch/css": "^3.5.2", - "@docsearch/js": "^3.5.2", - "@shikijs/core": "^1.1.5", - "@shikijs/transformers": "^1.1.5", - "@types/markdown-it": "^13.0.7", - "@vitejs/plugin-vue": "^5.0.4", - "@vue/devtools-api": "^7.0.14", - "@vueuse/core": "^10.7.2", - "@vueuse/integrations": "^10.7.2", - "focus-trap": "^7.5.4", - "mark.js": "8.11.1", - "minisearch": "^6.3.0", - "shiki": "^1.1.5", - "vite": "^5.1.3", - "vue": "^3.4.19" - }, - "bin": { - "vitepress": "bin/vitepress.js" - }, - "peerDependencies": { - "markdown-it-mathjax3": "^4.3.2", - "postcss": "^8.4.35" - }, - "peerDependenciesMeta": { - "markdown-it-mathjax3": { - "optional": true - }, - "postcss": { - "optional": true - } - } + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/vitepress": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.1.tgz", + "integrity": "sha512-eNr5pOBppYUUjEhv8S0S2t9Tv95LQ6mMeHj6ivaGwfHxpov70Vduuwl/QQMDRznKDSaP0WKV7a82Pb4JVOaqEw==", + "dev": true, + "dependencies": { + "@docsearch/css": "^3.6.0", + "@docsearch/js": "^3.6.0", + "@shikijs/core": "^1.2.0", + "@shikijs/transformers": "^1.2.0", + "@types/markdown-it": "^13.0.7", + "@vitejs/plugin-vue": "^5.0.4", + "@vue/devtools-api": "^7.0.16", + "@vueuse/core": "^10.9.0", + "@vueuse/integrations": "^10.9.0", + "focus-trap": "^7.5.4", + "mark.js": "8.11.1", + "minisearch": "^6.3.0", + "shiki": "^1.2.0", + "vite": "^5.2.2", + "vue": "^3.4.21" + }, + "bin": { + "vitepress": "bin/vitepress.js" + }, + "peerDependencies": { + "markdown-it-mathjax3": "^4", + "postcss": "^8" + }, + "peerDependenciesMeta": { + "markdown-it-mathjax3": { + "optional": true + }, + "postcss": { + "optional": true + } + } }, "node_modules/vitepress-plugin-google-analytics": { "version": "1.0.2", @@ -23047,34 +23814,221 @@ "uc.micro": "^1.0.1" } }, - "node_modules/vitepress-plugin-search/node_modules/markdown-it": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.2.tgz", - "integrity": "sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==", + "node_modules/vitepress-plugin-search/node_modules/markdown-it": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.2.tgz", + "integrity": "sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1", + "entities": "~3.0.1", + "linkify-it": "^4.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/vitepress-plugin-search/node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "dev": true + }, + "node_modules/vitepress-plugin-search/node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "node_modules/vitest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.4.0.tgz", + "integrity": "sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==", + "dev": true, + "dependencies": { + "@vitest/expect": "1.4.0", + "@vitest/runner": "1.4.0", + "@vitest/snapshot": "1.4.0", + "@vitest/spy": "1.4.0", + "@vitest/utils": "1.4.0", + "acorn-walk": "^8.3.2", + "chai": "^4.3.10", + "debug": "^4.3.4", + "execa": "^8.0.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "tinybench": "^2.5.1", + "tinypool": "^0.8.2", + "vite": "^5.0.0", + "vite-node": "1.4.0", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "1.4.0", + "@vitest/ui": "1.4.0", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/vitest/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/vitest/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, - "dependencies": { - "argparse": "^2.0.1", - "entities": "~3.0.1", - "linkify-it": "^4.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" + "engines": { + "node": ">=12" }, - "bin": { - "markdown-it": "bin/markdown-it.js" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vitepress-plugin-search/node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", - "dev": true - }, - "node_modules/vitepress-plugin-search/node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true - }, "node_modules/vue": { "version": "3.4.21", "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.21.tgz", @@ -23132,26 +24086,26 @@ "dev": true }, "node_modules/webpack": { - "version": "5.90.3", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz", - "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==", + "version": "5.91.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", + "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", "acorn-import-assertions": "^1.9.0", "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.16.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", @@ -23159,7 +24113,7 @@ "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.0", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -23382,6 +24336,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -24230,9 +25200,10 @@ } }, "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true }, "node_modules/yargs": { "version": "17.7.2", @@ -24366,14 +25337,11 @@ "@feathersjs/feathers": "^5.0.24" }, "devDependencies": { - "@types/mocha": "^10.0.6", - "@types/mongodb": "^4.0.6", - "@types/node": "^20.11.26", - "mocha": "^10.3.0", + "@types/node": "^20.11.30", "mongodb": "^6.5.0", "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "engines": { "node": ">= 12" @@ -24389,11 +25357,33 @@ "license": "MIT", "devDependencies": { "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", + "@types/node": "^20.11.30", "mocha": "^10.3.0", "shx": "^0.3.4", "ts-node": "^10.9.2", + "typescript": "^5.4.3" + }, + "engines": { + "node": ">= 12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/feathers" + }, + "peerDependencies": { + "mocha": "^10.3.0", "typescript": "^5.4.2" + } + }, + "packages/adapter-tests-vitest": { + "name": "@feathersjs/adapter-tests-vitest", + "version": "5.0.24", + "license": "MIT", + "devDependencies": { + "@types/node": "^20.11.30", + "shx": "^0.3.4", + "typescript": "^5.4.3", + "vitest": "^1.1.1" }, "engines": { "node": ">= 12" @@ -24401,6 +25391,9 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/feathers" + }, + "peerDependencies": { + "vitest": "^1.4.0" } }, "packages/authentication": { @@ -24423,13 +25416,11 @@ "devDependencies": { "@feathersjs/memory": "^5.0.24", "@types/lodash": "^4.17.0", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", + "@types/node": "^20.11.30", "@types/uuid": "^9.0.8", - "mocha": "^10.3.0", "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "engines": { "node": ">= 12" @@ -24456,13 +25447,12 @@ "@feathersjs/rest-client": "^5.0.24", "@feathersjs/socketio": "^5.0.24", "@feathersjs/socketio-client": "^5.0.24", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", - "axios": "^1.6.7", - "mocha": "^10.3.0", + "@types/node": "^20.11.30", + "axios": "^1.6.8", + "get-port": "^7.1.0", "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "engines": { "node": ">= 12" @@ -24472,6 +25462,18 @@ "url": "https://github.com/sponsors/daffl" } }, + "packages/authentication-client/node_modules/get-port": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.1.0.tgz", + "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "packages/authentication-local": { "name": "@feathersjs/authentication-local", "version": "5.0.24", @@ -24489,12 +25491,10 @@ "@feathersjs/schema": "^5.0.24", "@types/bcryptjs": "^2.4.6", "@types/lodash": "^4.17.0", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", - "mocha": "^10.3.0", + "@types/node": "^20.11.30", "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "engines": { "node": ">= 12" @@ -24528,15 +25528,14 @@ "@types/express": "^4.17.21", "@types/koa-session": "^6.4.5", "@types/lodash": "^4.17.0", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", + "@types/node": "^20.11.30", "@types/tough-cookie": "^4.0.5", - "axios": "^1.6.7", - "mocha": "^10.3.0", + "axios": "^1.6.8", "shx": "^0.3.4", "tough-cookie": "^4.1.3", "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "engines": { "node": ">= 12" @@ -24576,15 +25575,13 @@ "@feathersjs/socketio": "^5.0.24", "@feathersjs/transport-commons": "^5.0.24", "@feathersjs/typebox": "^5.0.24", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", + "@types/node": "^20.11.30", "@types/prettier": "^2.7.3", - "axios": "^1.6.7", - "mocha": "^10.3.0", + "axios": "^1.6.8", "shx": "^0.3.4", - "ts-node": "^10.9.2", - "type-fest": "^4.12.0", - "typescript": "^5.4.2" + "type-fest": "^4.13.1", + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "engines": { "node": ">= 14" @@ -24614,21 +25611,22 @@ "@feathersjs/socketio-client": "^5.0.24" }, "devDependencies": { - "@babel/core": "^7.24.0", - "@babel/preset-env": "^7.24.0", + "@babel/core": "^7.24.3", + "@babel/preset-env": "^7.24.3", "@feathersjs/express": "^5.0.24", "@feathersjs/memory": "^5.0.24", "@feathersjs/socketio": "^5.0.24", - "@feathersjs/tests": "^5.0.24", + "@feathersjs/tests-vitest": "^5.0.24", "babel-loader": "^9.1.3", - "mocha": "^10.3.0", + "get-port": "^7.1.0", "node-fetch": "^2.6.1", "shx": "^0.3.4", - "socket.io-client": "^4.7.4", + "socket.io-client": "^4.7.5", "superagent": "^8.1.2", "ts-loader": "^9.5.1", - "typescript": "^5.4.2", - "webpack": "^5.90.3", + "typescript": "^5.4.3", + "vitest": "^1.4.0", + "webpack": "^5.91.0", "webpack-cli": "^5.1.4", "webpack-merge": "^5.10.0" }, @@ -24640,17 +25638,27 @@ "url": "https://github.com/sponsors/daffl" } }, + "packages/client/node_modules/get-port": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.1.0.tgz", + "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "packages/commons": { "name": "@feathersjs/commons", "version": "5.0.24", "license": "MIT", "devDependencies": { - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", - "mocha": "^10.3.0", + "@types/node": "^20.11.30", "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "engines": { "node": ">= 12" @@ -24668,16 +25676,14 @@ "@feathersjs/commons": "^5.0.24", "@feathersjs/feathers": "^5.0.24", "@feathersjs/schema": "^5.0.24", - "@types/config": "^3.3.3", + "@types/config": "^3.3.4", "config": "^3.3.11" }, "devDependencies": { - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", - "mocha": "^10.3.0", + "@types/node": "^20.11.30", "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "engines": { "node": ">= 12" @@ -24710,12 +25716,10 @@ "license": "MIT", "devDependencies": { "@feathersjs/feathers": "^5.0.24", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", - "mocha": "^10.3.0", + "@types/node": "^20.11.30", "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "engines": { "node": ">= 12" @@ -24737,20 +25741,19 @@ "@types/express-serve-static-core": "^4.17.43", "compression": "^1.7.4", "cors": "^2.8.5", - "express": "^4.18.3" + "express": "^4.19.1" }, "devDependencies": { "@feathersjs/authentication-local": "^5.0.24", - "@feathersjs/tests": "^5.0.24", + "@feathersjs/tests-vitest": "^5.0.24", "@types/lodash": "^4.17.0", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", - "axios": "^1.6.7", + "@types/node": "^20.11.30", + "axios": "^1.6.8", + "get-port": "^7.1.0", "lodash": "^4.17.21", - "mocha": "^10.3.0", "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "engines": { "node": ">= 12" @@ -24760,6 +25763,18 @@ "url": "https://github.com/sponsors/daffl" } }, + "packages/express/node_modules/get-port": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.1.0.tgz", + "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "packages/feathers": { "name": "@feathersjs/feathers", "version": "5.0.24", @@ -24770,12 +25785,10 @@ "events": "^3.3.0" }, "devDependencies": { - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", - "mocha": "^10.3.0", + "@types/node": "^20.11.30", "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "engines": { "node": ">= 12" @@ -24794,7 +25807,8 @@ "chalk": "^5.3.0", "lodash": "^4.17.21", "prettier": "^3.2.5", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "devDependencies": { "@feathersjs/adapter-commons": "^5.0.24", @@ -24814,21 +25828,19 @@ "@feathersjs/socketio": "^5.0.24", "@feathersjs/transport-commons": "^5.0.24", "@feathersjs/typebox": "^5.0.24", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", + "@types/node": "^20.11.30", "@types/prettier": "^2.7.3", - "axios": "^1.6.7", + "axios": "^1.6.8", "knex": "^3.1.0", - "mocha": "^10.3.0", "mongodb": "^6.5.0", "mssql": "^10.0.2", "mysql": "^2.18.1", "pg": "^8.11.3", "shx": "^0.3.4", "sqlite3": "^5.1.7", - "tsx": "^4.7.1", - "type-fest": "^4.12.0", - "typescript": "^5.4.2" + "type-fest": "^4.13.1", + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "engines": { "node": ">= 16" @@ -24850,15 +25862,15 @@ }, "devDependencies": { "@feathersjs/adapter-tests": "^5.0.24", + "@feathersjs/adapter-tests-vitest": "^5.0.24", "@feathersjs/schema": "^5.0.24", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", - "knex": "^3.1.0", - "mocha": "^10.3.0", + "@types/node": "^20.11.30", + "knex": "^3.0.1", "pg": "^8.11.3", "shx": "^0.3.4", "sqlite3": "^5.1.7", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "engines": { "node": ">= 14" @@ -24886,7 +25898,7 @@ "@types/koa__cors": "^5.0.0", "@types/koa-qs": "^2.0.3", "@types/koa-static": "^4.0.4", - "koa": "^2.15.0", + "koa": "^2.15.2", "koa-body": "^6.0.1", "koa-compose": "^4.1.0", "koa-qs": "^3.0.0", @@ -24896,19 +25908,31 @@ "@feathersjs/authentication-local": "^5.0.24", "@feathersjs/memory": "^5.0.24", "@feathersjs/tests": "^5.0.24", + "@feathersjs/tests-vitest": "^5.0.24", "@types/koa-compose": "^3.2.8", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", - "axios": "^1.6.7", - "mocha": "^10.3.0", + "@types/node": "^20.11.30", + "axios": "^1.6.8", + "get-port": "^7.1.0", "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "engines": { "node": ">= 14" } }, + "packages/koa/node_modules/get-port": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.1.0.tgz", + "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "packages/memory": { "name": "@feathersjs/memory", "version": "5.0.24", @@ -24921,13 +25945,12 @@ }, "devDependencies": { "@feathersjs/adapter-tests": "^5.0.24", + "@feathersjs/adapter-tests-vitest": "^5.0.24", "@feathersjs/feathers": "^5.0.24", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", - "mocha": "^10.3.0", + "@types/node": "^20.11.30", "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "engines": { "node": ">= 12" @@ -24945,13 +25968,13 @@ }, "devDependencies": { "@feathersjs/adapter-tests": "^5.0.24", + "@feathersjs/adapter-tests-vitest": "^5.0.24", "@feathersjs/schema": "^5.0.24", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", - "mocha": "^10.3.0", + "@types/node": "^20.11.30", "mongodb-memory-server": "^9.1.7", "shx": "^0.3.4", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "engines": { "node": ">= 14" @@ -24972,25 +25995,25 @@ "@feathersjs/commons": "^5.0.24", "@feathersjs/errors": "^5.0.24", "@feathersjs/feathers": "^5.0.24", - "@types/superagent": "^8.1.4", + "@types/superagent": "^8.1.6", "qs": "^6.12.0" }, "devDependencies": { "@feathersjs/express": "^5.0.24", "@feathersjs/memory": "^5.0.24", "@feathersjs/tests": "^5.0.24", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", + "@feathersjs/tests-vitest": "^5.0.24", + "@types/node": "^20.11.30", "@types/node-fetch": "^2.6.11", - "@types/qs": "^6.9.12", - "axios": "^1.6.7", - "mocha": "^10.3.0", + "@types/qs": "^6.9.14", + "axios": "^1.6.8", + "get-port": "^7.1.0", "node-fetch": "^2.6.1", "rxjs": "^7.8.1", "shx": "^0.3.4", "superagent": "^8.1.2", - "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "engines": { "node": ">= 12" @@ -25000,6 +26023,18 @@ "url": "https://github.com/sponsors/daffl" } }, + "packages/rest-client/node_modules/get-port": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.1.0.tgz", + "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "packages/schema": { "name": "@feathersjs/schema", "version": "5.0.24", @@ -25017,12 +26052,11 @@ }, "devDependencies": { "@feathersjs/memory": "^5.0.24", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", + "@types/node": "^20.11.30", "ajv-formats": "^2.1.1", - "mocha": "^10.3.0", "shx": "^0.3.4", - "typescript": "^5.3.2" + "typescript": "^5.3.2", + "vitest": "^1.4.0" }, "engines": { "node": ">= 12" @@ -25063,19 +26097,20 @@ "@feathersjs/commons": "^5.0.24", "@feathersjs/feathers": "^5.0.24", "@feathersjs/transport-commons": "^5.0.24", - "socket.io": "^4.7.4" + "socket.io": "^4.7.5" }, "devDependencies": { "@feathersjs/express": "^5.0.24", "@feathersjs/memory": "^5.0.24", "@feathersjs/tests": "^5.0.24", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", + "@feathersjs/tests-vitest": "^5.0.24", + "@types/node": "^20.11.30", + "get-port": "^7.1.0", "lodash": "^4.17.21", - "mocha": "^10.3.0", "shx": "^0.3.4", - "socket.io-client": "^4.7.4", - "typescript": "^5.4.2" + "socket.io-client": "^4.7.5", + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "engines": { "node": ">= 12" @@ -25098,13 +26133,12 @@ "@feathersjs/memory": "^5.0.24", "@feathersjs/socketio": "^5.0.24", "@feathersjs/tests": "^5.0.24", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", - "mocha": "^10.3.0", + "@feathersjs/tests-vitest": "^5.0.24", + "@types/node": "^20.11.30", "shx": "^0.3.4", - "socket.io-client": "^4.7.4", - "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "socket.io-client": "^4.7.5", + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "engines": { "node": ">= 12" @@ -25114,23 +26148,63 @@ "url": "https://github.com/sponsors/daffl" } }, + "packages/socketio/node_modules/get-port": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.1.0.tgz", + "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "packages/tests": { "name": "@feathersjs/tests", "version": "5.0.24", "license": "MIT", "dependencies": { "@types/lodash": "^4.17.0", - "axios": "^1.6.7", + "axios": "^1.6.8", "lodash": "^4.17.21" }, "devDependencies": { "@feathersjs/feathers": "^5.0.24", "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", + "@types/node": "^20.11.30", "mocha": "^10.3.0", "shx": "^0.3.4", "ts-node": "^10.9.2", + "typescript": "^5.4.3" + }, + "engines": { + "node": ">= 12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/daffl" + }, + "peerDependencies": { + "mocha": "^10.3.0", "typescript": "^5.4.2" + } + }, + "packages/tests-vitest": { + "name": "@feathersjs/tests-vitest", + "version": "5.0.24", + "license": "MIT", + "dependencies": { + "@types/lodash": "^4.17.0", + "axios": "^1.6.8", + "lodash": "^4.17.21" + }, + "devDependencies": { + "@feathersjs/feathers": "^5.0.24", + "@types/node": "^20.11.30", + "shx": "^0.3.4", + "typescript": "^5.4.3", + "vitest": "^1.1.1" }, "engines": { "node": ">= 12" @@ -25138,6 +26212,9 @@ "funding": { "type": "github", "url": "https://github.com/sponsors/daffl" + }, + "peerDependencies": { + "vitest": "^1.4.0" } }, "packages/transport-commons": { @@ -25154,12 +26231,10 @@ "devDependencies": { "@types/encodeurl": "^1.0.2", "@types/lodash": "^4.17.0", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", - "mocha": "^10.3.0", + "@types/node": "^20.11.30", "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "engines": { "node": ">= 12" @@ -25178,11 +26253,10 @@ "@sinclair/typebox": "^0.25.0" }, "devDependencies": { - "@types/mocha": "^10.0.6", "@types/node": "^20.11.26", - "mocha": "^10.3.0", "shx": "^0.3.4", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "engines": { "node": ">= 12" diff --git a/package.json b/package.json index 792d0fd8f4..8e03cc7a6d 100644 --- a/package.json +++ b/package.json @@ -42,19 +42,21 @@ "clean": "find . -name node_modules -exec rm -rf '{}' + && find . -name package-lock.json -exec rm -rf '{}' +", "test:deno": "deno test --config deno/tsconfig.json deno/test.ts", "test": "npm run lint && npm run compile && c8 lerna run test --ignore @feathersjs/tests", + "vitest": "vitest run", "generate:package": "pinion run generators/package.ts" }, "devDependencies": { "@featherscloud/pinion": "^0.5.3", - "@typescript-eslint/eslint-plugin": "^7.2.0", - "@typescript-eslint/parser": "^7.2.0", + "@typescript-eslint/eslint-plugin": "^7.3.1", + "@typescript-eslint/parser": "^7.3.1", "c8": "^9.1.0", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.1.3", "lerna": "^8.1.2", - "npm-check-updates": "^16.14.15", + "npm-check-updates": "^16.14.17", "prettier": "^3.2.5", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" } } diff --git a/packages/adapter-commons/LICENSE b/packages/adapter-commons/LICENSE index 887338c4f0..7712f870f3 100644 --- a/packages/adapter-commons/LICENSE +++ b/packages/adapter-commons/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2023 Feathers Contributors +Copyright (c) 2024 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/adapter-commons/README.md b/packages/adapter-commons/README.md index d20789a7ea..4e9d263c6f 100644 --- a/packages/adapter-commons/README.md +++ b/packages/adapter-commons/README.md @@ -22,6 +22,6 @@ Refer to the [Feathers database adapter documentation](https://feathersjs.com/ap ## License -Copyright (c) 2023 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/adapter-commons/package.json b/packages/adapter-commons/package.json index 5d0df7d2ed..b7b9cd1b92 100644 --- a/packages/adapter-commons/package.json +++ b/packages/adapter-commons/package.json @@ -34,7 +34,7 @@ "prepublish": "npm run compile", "pack": "npm pack --pack-destination ../generators/test/build", "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" + "test": "vitest run" }, "directories": { "lib": "lib" @@ -55,14 +55,11 @@ "@feathersjs/feathers": "^5.0.24" }, "devDependencies": { - "@types/mocha": "^10.0.6", - "@types/mongodb": "^4.0.6", - "@types/node": "^20.11.26", - "mocha": "^10.3.0", + "@types/node": "^20.11.30", "mongodb": "^6.5.0", "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" } diff --git a/packages/adapter-commons/test/service.test.ts b/packages/adapter-commons/test/service.test.ts index ed5cc4a4c6..d8e553706c 100644 --- a/packages/adapter-commons/test/service.test.ts +++ b/packages/adapter-commons/test/service.test.ts @@ -168,7 +168,7 @@ describe('@feathersjs/adapter-commons/service', () => { }) it('allowsMulti', () => { - context('with true', () => { + describe('with true', () => { const service = new MethodService({ multi: true }) it('does return true for multiple methodes', () => { @@ -184,7 +184,7 @@ describe('@feathersjs/adapter-commons/service', () => { }) }) - context('with false', () => { + describe('with false', () => { const service = new MethodService({ multi: false }) it('does return false for multiple methodes', () => { @@ -200,7 +200,7 @@ describe('@feathersjs/adapter-commons/service', () => { }) }) - context('with array', () => { + describe('with array', () => { const service = new MethodService({ multi: ['create', 'get', 'other'] }) it('does return true for specified multiple methodes', () => { diff --git a/packages/adapter-commons/vite.config.ts b/packages/adapter-commons/vite.config.ts new file mode 100644 index 0000000000..5381f73f70 --- /dev/null +++ b/packages/adapter-commons/vite.config.ts @@ -0,0 +1,3 @@ +import vitest from '../../vitest.config.template' + +export default vitest diff --git a/packages/adapter-tests-vitest/CHANGELOG.md b/packages/adapter-tests-vitest/CHANGELOG.md new file mode 100644 index 0000000000..d88ebec677 --- /dev/null +++ b/packages/adapter-tests-vitest/CHANGELOG.md @@ -0,0 +1,409 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [5.0.11](https://github.com/feathersjs/feathers/compare/v5.0.10...v5.0.11) (2023-10-11) + +### Bug Fixes + +- **knex:** Update all dependencies and Knex peer ([#3308](https://github.com/feathersjs/feathers/issues/3308)) ([d2f9860](https://github.com/feathersjs/feathers/commit/d2f986036c4741cce2339d8abbcc6b2eb037a12a)) + +## [5.0.10](https://github.com/feathersjs/feathers/compare/v5.0.9...v5.0.10) (2023-10-03) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +## [5.0.9](https://github.com/feathersjs/feathers/compare/v5.0.8...v5.0.9) (2023-09-27) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +## [5.0.8](https://github.com/feathersjs/feathers/compare/v5.0.7...v5.0.8) (2023-07-19) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +## [5.0.7](https://github.com/feathersjs/feathers/compare/v5.0.6...v5.0.7) (2023-07-14) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +## [5.0.6](https://github.com/feathersjs/feathers/compare/v5.0.5...v5.0.6) (2023-06-15) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +## [5.0.5](https://github.com/feathersjs/feathers/compare/v5.0.4...v5.0.5) (2023-04-28) + +### Bug Fixes + +- **typebox:** Revert to TypeBox 0.25 ([#3183](https://github.com/feathersjs/feathers/issues/3183)) ([cacedf5](https://github.com/feathersjs/feathers/commit/cacedf59e3d2df836777f0cd06ab1b2484ed87c5)) + +## [5.0.4](https://github.com/feathersjs/feathers/compare/v5.0.3...v5.0.4) (2023-04-12) + +### Bug Fixes + +- **adapter-commons:** Support non-default import to ease use with ESM projects ([d06f2cf](https://github.com/feathersjs/feathers/commit/d06f2cfcadda7dc23f0e2bec44f64e6be8500d02)) + +## [5.0.3](https://github.com/feathersjs/feathers/compare/v5.0.2...v5.0.3) (2023-04-05) + +### Bug Fixes + +- **dependencies:** Update all dependencies ([#3139](https://github.com/feathersjs/feathers/issues/3139)) ([f24276e](https://github.com/feathersjs/feathers/commit/f24276e9a909e2e58a0730c730258ce1f70f4028)) + +## [5.0.1](https://github.com/feathersjs/feathers/compare/v5.0.0...v5.0.1) (2023-03-15) + +### Bug Fixes + +- **memory/mongodb:** $select as only property & force 'id' in '$select' ([#3081](https://github.com/feathersjs/feathers/issues/3081)) ([fbe3cf5](https://github.com/feathersjs/feathers/commit/fbe3cf5199e102b5aeda2ae33828d5034df3d105)) + +# [5.0.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.38...v5.0.0) (2023-02-24) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [5.0.0-pre.38](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.37...v5.0.0-pre.38) (2023-02-17) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [5.0.0-pre.37](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.36...v5.0.0-pre.37) (2023-02-09) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) + +### Bug Fixes + +- **databases:** Improve documentation for adapters and allow dynamic Knex adapter options ([#3019](https://github.com/feathersjs/feathers/issues/3019)) ([66c4b5e](https://github.com/feathersjs/feathers/commit/66c4b5e72000dd03acb57fca1cad4737c85c9c9e)) + +### Features + +- **database:** Add and to the query syntax ([#3021](https://github.com/feathersjs/feathers/issues/3021)) ([00cb0d9](https://github.com/feathersjs/feathers/commit/00cb0d9c302ae951ae007d3d6ceba33e254edd9c)) + +# [5.0.0-pre.35](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.34...v5.0.0-pre.35) (2023-01-12) + +### Features + +- **generators:** Move core code generators to shared generators package ([#2982](https://github.com/feathersjs/feathers/issues/2982)) ([0328d22](https://github.com/feathersjs/feathers/commit/0328d2292153870bc43958f73d2c6f288a8cec17)) + +# [5.0.0-pre.34](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.33...v5.0.0-pre.34) (2022-12-14) + +### Features + +- **adapter:** Add patch data type to adapters and refactor AdapterBase usage ([#2906](https://github.com/feathersjs/feathers/issues/2906)) ([9ddc2e6](https://github.com/feathersjs/feathers/commit/9ddc2e6b028f026f939d6af68125847e5c6734b4)) + +# [5.0.0-pre.33](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.32...v5.0.0-pre.33) (2022-11-08) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [5.0.0-pre.30](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.29...v5.0.0-pre.30) (2022-10-07) + +### Features + +- **core:** Allow to unregister services at runtime ([#2756](https://github.com/feathersjs/feathers/issues/2756)) ([d16601f](https://github.com/feathersjs/feathers/commit/d16601f2277dca5357866ffdefba2a611f6dc7fa)) + +# [5.0.0-pre.29](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.28...v5.0.0-pre.29) (2022-09-16) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [5.0.0-pre.28](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.27...v5.0.0-pre.28) (2022-08-03) + +### Bug Fixes + +- **cli:** Improve generated application and client ([#2701](https://github.com/feathersjs/feathers/issues/2701)) ([bd55ffb](https://github.com/feathersjs/feathers/commit/bd55ffb812e89bf215f4515e7f137656ea888c3f)) + +# [5.0.0-pre.27](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.26...v5.0.0-pre.27) (2022-07-13) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [5.0.0-pre.26](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.25...v5.0.0-pre.26) (2022-06-22) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [5.0.0-pre.25](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.24...v5.0.0-pre.25) (2022-06-22) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [5.0.0-pre.23](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.22...v5.0.0-pre.23) (2022-06-06) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [5.0.0-pre.22](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.21...v5.0.0-pre.22) (2022-05-24) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [5.0.0-pre.20](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.19...v5.0.0-pre.20) (2022-05-04) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [5.0.0-pre.19](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.18...v5.0.0-pre.19) (2022-05-01) + +### Bug Fixes + +- **adapter-commons:** Clarify adapter query filtering ([#2607](https://github.com/feathersjs/feathers/issues/2607)) ([2dac771](https://github.com/feathersjs/feathers/commit/2dac771b0a3298d6dd25994d05186701b0617718)) +- **adapter-tests:** Ensure multi tests can run standalone ([#2608](https://github.com/feathersjs/feathers/issues/2608)) ([d7243f2](https://github.com/feathersjs/feathers/commit/d7243f20e84d9dde428ad8dfc7f48388ca569e6e)) + +### BREAKING CHANGES + +- **adapter-commons:** Changes the common adapter base class to use `sanitizeQuery` and `sanitizeData` + +# [5.0.0-pre.18](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.17...v5.0.0-pre.18) (2022-04-11) + +### Bug Fixes + +- **adapter-tests:** Add tests for pagination in multi updates ([#2472](https://github.com/feathersjs/feathers/issues/2472)) ([98a811a](https://github.com/feathersjs/feathers/commit/98a811ac605575ff812a08d0504729a5efe7a69c)) + +# [5.0.0-pre.17](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.16...v5.0.0-pre.17) (2022-02-15) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [5.0.0-pre.16](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.15...v5.0.0-pre.16) (2022-01-12) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) + +### Bug Fixes + +- **typescript:** Overall typing improvements ([#2478](https://github.com/feathersjs/feathers/issues/2478)) ([b8eb804](https://github.com/feathersjs/feathers/commit/b8eb804158556d9651a8607e3c3fda15e0bfd110)) + +# [5.0.0-pre.14](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.13...v5.0.0-pre.14) (2021-10-13) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [5.0.0-pre.13](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.12...v5.0.0-pre.13) (2021-10-13) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [5.0.0-pre.12](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.11...v5.0.0-pre.12) (2021-10-12) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [5.0.0-pre.11](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.10...v5.0.0-pre.11) (2021-10-06) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [5.0.0-pre.10](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.9...v5.0.0-pre.10) (2021-09-19) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [5.0.0-pre.9](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.8...v5.0.0-pre.9) (2021-08-09) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [5.0.0-pre.8](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.7...v5.0.0-pre.8) (2021-08-09) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [5.0.0-pre.7](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.6...v5.0.0-pre.7) (2021-08-09) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [5.0.0-pre.6](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.5...v5.0.0-pre.6) (2021-08-08) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) + +### Bug Fixes + +- Update database adapter common repository urls ([#2380](https://github.com/feathersjs/feathers/issues/2380)) ([3f4db68](https://github.com/feathersjs/feathers/commit/3f4db68d6700c7d9023ecd17d0d39893f75a19fd)) + +### Features + +- **adapter-commons:** Add support for params.adapter option and move memory adapter to @feathersjs/memory ([#2367](https://github.com/feathersjs/feathers/issues/2367)) ([a43e7da](https://github.com/feathersjs/feathers/commit/a43e7da22b6b981a96d1321736ea9a0cb924fb4f)) + +# [5.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.3...v5.0.0-pre.4) (2021-05-13) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [5.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.2...v5.0.0-pre.3) (2021-04-21) + +### Bug Fixes + +- **typescript:** Improve TypeScript backwards compatibility ([#2310](https://github.com/feathersjs/feathers/issues/2310)) ([f33be73](https://github.com/feathersjs/feathers/commit/f33be73fc46a533efb15df9aab0658e3240d3897)) + +# [5.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.1...v5.0.0-pre.2) (2021-04-06) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [5.0.0-beta.1](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.0...v5.0.0-beta.1) (2021-04-03) + +### Bug Fixes + +- **adapter-tests:** Add test that verified paginated total ([#2273](https://github.com/feathersjs/feathers/issues/2273)) ([879bd6b](https://github.com/feathersjs/feathers/commit/879bd6b24f42e04eeeeba110ddddda3e1e1dea34)) + +# [5.0.0-beta.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.1...v5.0.0-beta.0) (2021-03-28) + +### Features + +- **core:** Remove Uberproto ([#2178](https://github.com/feathersjs/feathers/issues/2178)) ([ddf8821](https://github.com/feathersjs/feathers/commit/ddf8821f53317e6a378657f7d66acb03a037ee47)) + +### BREAKING CHANGES + +- **core:** Services no longer extend Uberproto objects and + `service.mixin()` is no longer available. + +# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) + +### Features + +- **memory:** Move feathers-memory into @feathersjs/memory ([#2153](https://github.com/feathersjs/feathers/issues/2153)) ([dd61fe3](https://github.com/feathersjs/feathers/commit/dd61fe371fb0502f78b8ccbe1f45a030e31ecff6)) + +## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-09-27) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +## 4.5.3 (2020-09-24) + +### Bug Fixes + +- **adapter-tests:** Update multi patch + query tests ([#5](https://github.com/feathersjs/databases/issues/5)) ([84f1fe4](https://github.com/feathersjs/databases/commit/84f1fe4f13dc3a26891e43b965f75d08243f6c6f)) + +## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) + +### Bug Fixes + +- Fix feathers-memory dependency that did not get updated ([9422b13](https://github.com/feathersjs/feathers/commit/9422b13)) + +# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) + +### Bug Fixes + +- Update dependencies and fix tests ([#1373](https://github.com/feathersjs/feathers/issues/1373)) ([d743a7f](https://github.com/feathersjs/feathers/commit/d743a7f)) + +# [4.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.1...v4.0.0-pre.2) (2019-05-15) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [4.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.0...v4.0.0-pre.1) (2019-05-08) + +**Note:** Version bump only for package @feathersjs/adapter-tests + +# [4.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v3.2.0-pre.1...v4.0.0-pre.0) (2019-04-21) + +### Bug Fixes + +- Add test to make sure different id in adapter query works ([#1165](https://github.com/feathersjs/feathers/issues/1165)) ([0ba4580](https://github.com/feathersjs/feathers/commit/0ba4580)) +- Update adapter tests to not rely on error instance ([#1202](https://github.com/feathersjs/feathers/issues/1202)) ([6885e0e](https://github.com/feathersjs/feathers/commit/6885e0e)) +- Update all dependencies to latest ([#1206](https://github.com/feathersjs/feathers/issues/1206)) ([e51e0f6](https://github.com/feathersjs/feathers/commit/e51e0f6)) + +### chore + +- **package:** Move adapter tests into their own module ([#1164](https://github.com/feathersjs/feathers/issues/1164)) ([dcc1e6b](https://github.com/feathersjs/feathers/commit/dcc1e6b)) + +### Features + +- Add TypeScript definitions ([#1275](https://github.com/feathersjs/feathers/issues/1275)) ([9dd6713](https://github.com/feathersjs/feathers/commit/9dd6713)) +- Authentication v3 core server implementation ([#1205](https://github.com/feathersjs/feathers/issues/1205)) ([1bd7591](https://github.com/feathersjs/feathers/commit/1bd7591)) + +### BREAKING CHANGES + +- **package:** Removes adapter tests from @feathersjs/adapter-commons + +## [1.0.1](https://github.com/feathersjs/feathers/compare/@feathersjs/adapter-tests@1.0.0...@feathersjs/adapter-tests@1.0.1) (2019-01-10) + +### Bug Fixes + +- Add test to make sure different id in adapter query works ([#1165](https://github.com/feathersjs/feathers/issues/1165)) ([0ba4580](https://github.com/feathersjs/feathers/commit/0ba4580)) + +# 1.0.0 (2019-01-10) + +### chore + +- **package:** Move adapter tests into their own module ([#1164](https://github.com/feathersjs/feathers/issues/1164)) ([dcc1e6b](https://github.com/feathersjs/feathers/commit/dcc1e6b)) + +### BREAKING CHANGES + +- **package:** Removes adapter tests from @feathersjs/adapter-commons diff --git a/packages/adapter-tests-vitest/LICENSE b/packages/adapter-tests-vitest/LICENSE new file mode 100644 index 0000000000..7712f870f3 --- /dev/null +++ b/packages/adapter-tests-vitest/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2024 Feathers Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/packages/adapter-tests-vitest/README.md b/packages/adapter-tests-vitest/README.md new file mode 100644 index 0000000000..468b711164 --- /dev/null +++ b/packages/adapter-tests-vitest/README.md @@ -0,0 +1,21 @@ +# Feathers Adapter Tests for vitest + +[![CI](https://github.com/feathersjs/feathers/workflows/Node.js%20CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3A%22Node.js+CI%22) +[![Download Status](https://img.shields.io/npm/dm/@feathersjs/adapter-tests-vitest.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/adapter-tests-vitest) +[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) + +> Feathers shared database adapter test suite + +## About + +This is a repository that contains the test suite for the common database adapter syntax. See the [API documentation](https://docs.feathersjs.com/api/databases/common.html) for more information. + +## Authors + +[Feathers contributors](https://github.com/feathersjs/adapter-tests/graphs/contributors) + +## License + +Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) + +Licensed under the [MIT license](LICENSE). diff --git a/packages/adapter-tests-vitest/package.json b/packages/adapter-tests-vitest/package.json new file mode 100644 index 0000000000..e87633943b --- /dev/null +++ b/packages/adapter-tests-vitest/package.json @@ -0,0 +1,62 @@ +{ + "name": "@feathersjs/adapter-tests-vitest", + "version": "5.0.24", + "description": "Feathers shared database adapter test suite with vitest", + "homepage": "https://feathersjs.com", + "keywords": [ + "feathers" + ], + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/feathers" + }, + "repository": { + "type": "git", + "url": "git://github.com/feathersjs/feathers.git", + "directory": "packages/adapter-tests-vitest" + }, + "author": { + "name": "Feathers contributor", + "email": "hello@feathersjs.com", + "url": "https://feathersjs.com" + }, + "contributors": [], + "bugs": { + "url": "https://github.com/feathersjs/feathers/issues" + }, + "engines": { + "node": ">= 12" + }, + "main": "lib/", + "types": "lib/", + "scripts": { + "prepublish": "npm run compile", + "pack": "npm pack --pack-destination ../generators/test/build", + "compile": "shx rm -rf lib/ && tsc && npm run pack", + "test": "vitest run" + }, + "directories": { + "lib": "lib" + }, + "files": [ + "CHANGELOG.md", + "LICENSE", + "README.md", + "src/**", + "lib/**" + ], + "publishConfig": { + "access": "public" + }, + "devDependencies": { + "@types/node": "^20.11.30", + "shx": "^0.3.4", + "typescript": "^5.4.3", + "vitest": "^1.1.1" + }, + "peerDependencies": { + "vitest": "^1.4.0" + }, + "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" +} diff --git a/packages/adapter-tests-vitest/src/basic.ts b/packages/adapter-tests-vitest/src/basic.ts new file mode 100644 index 0000000000..c19ad64a76 --- /dev/null +++ b/packages/adapter-tests-vitest/src/basic.ts @@ -0,0 +1,50 @@ +import assert from 'assert' +import { AdapterBasicTest } from './declarations' + +export default (test: AdapterBasicTest, app: any, _errors: any, serviceName: string, idProp: string) => { + describe('Basic Functionality', () => { + let service: any + + beforeEach(() => { + service = app.service(serviceName) + }) + + it('.id', () => { + assert.strictEqual(service.id, idProp, 'id property is set to expected name') + }) + + test('.options', () => { + assert.ok(service.options, 'Options are available in service.options') + }) + + test('.events', () => { + assert.ok(service.events.includes('testing'), 'service.events is set and includes "testing"') + }) + + describe('Raw Methods', () => { + test('._get', () => { + assert.strictEqual(typeof service._get, 'function') + }) + + test('._find', () => { + assert.strictEqual(typeof service._find, 'function') + }) + + test('._create', () => { + assert.strictEqual(typeof service._create, 'function') + }) + + test('._update', () => { + assert.strictEqual(typeof service._update, 'function') + }) + + test('._patch', () => { + assert.strictEqual(typeof service._patch, 'function') + }) + + test('._remove', () => { + assert.strictEqual(typeof service._remove, 'function') + }) + }) + }) +} diff --git a/packages/adapter-tests-vitest/src/declarations.ts b/packages/adapter-tests-vitest/src/declarations.ts new file mode 100644 index 0000000000..3268d46fed --- /dev/null +++ b/packages/adapter-tests-vitest/src/declarations.ts @@ -0,0 +1,93 @@ +export type AdapterTest = (name: AdapterTestName, runner: any) => void + +export type AdapterBasicTest = (name: AdapterBasicTestName, runner: any) => void +export type AdapterMethodsTest = (name: AdapterMethodsTestName, runner: any) => void +export type AdapterSyntaxTest = (name: AdapterSyntaxTestName, runner: any) => void + +export type AdapterTestName = AdapterBasicTestName | AdapterMethodsTestName | AdapterSyntaxTestName + +export type AdapterBasicTestName = + | '.id' + | '.options' + | '.events' + | '._get' + | '._find' + | '._create' + | '._update' + | '._patch' + | '._remove' + | '.$get' + | '.$find' + | '.$create' + | '.$update' + | '.$patch' + | '.$remove' + +export type AdapterMethodsTestName = + | '.get' + | '.get + $select' + | '.get + id + query' + | '.get + NotFound' + | '.get + id + query id' + | '.find' + | '.remove' + | '.remove + $select' + | '.remove + id + query' + | '.remove + multi' + | '.remove + multi no pagination' + | '.remove + id + query id' + | '.update' + | '.update + $select' + | '.update + id + query' + | '.update + NotFound' + | '.update + query + NotFound' + | '.update + id + query id' + | '.patch' + | '.patch + $select' + | '.patch + id + query' + | '.patch multiple' + | '.patch multiple no pagination' + | '.patch multi query same' + | '.patch multi query changed' + | '.patch + NotFound' + | '.patch + query + NotFound' + | '.patch + id + query id' + | '.create' + | '.create + $select' + | '.create multi' + | '.create ignores query' + | 'internal .find' + | 'internal .get' + | 'internal .create' + | 'internal .update' + | 'internal .patch' + | 'internal .remove' + +export type AdapterSyntaxTestName = + | '.find + equal' + | '.find + equal multiple' + | '.find + $sort' + | '.find + $sort + string' + | '.find + $limit' + | '.find + $limit 0' + | '.find + $skip' + | '.find + $select' + | '.find + $or' + | '.find + $in' + | '.find + $nin' + | '.find + $lt' + | '.find + $lte' + | '.find + $gt' + | '.find + $gte' + | '.find + $ne' + | '.find + $gt + $lt + $sort' + | '.find + $or nested + $sort' + | '.find + $and' + | '.find + $and + $or' + | 'params.adapter + paginate' + | 'params.adapter + multi' + | '.find + paginate' + | '.find + paginate + query' + | '.find + paginate + $limit + $skip' + | '.find + paginate + $limit 0' + | '.find + paginate + params' diff --git a/packages/adapter-tests-vitest/src/index.ts b/packages/adapter-tests-vitest/src/index.ts new file mode 100644 index 0000000000..87fb41465d --- /dev/null +++ b/packages/adapter-tests-vitest/src/index.ts @@ -0,0 +1,57 @@ +/* eslint-disable no-console */ +import basicTests from './basic' +import { AdapterTestName } from './declarations' +import methodTests from './methods' +import syntaxTests from './syntax' + +export const adapterTests = (testNames: AdapterTestName[]) => { + return (app: any, errors: any, serviceName: any, idProp = 'id') => { + if (!serviceName) { + throw new Error('You must pass a service name') + } + + const skippedTests: AdapterTestName[] = [] + const allTests: AdapterTestName[] = [] + + const test = (name: AdapterTestName, runner: any) => { + const skip = !testNames.includes(name) + const its = skip ? it.skip : it + + if (skip) { + skippedTests.push(name) + } + + allTests.push(name) + + its(name, runner) + } + + describe(`Adapter tests for '${serviceName}' service with '${idProp}' id property`, () => { + afterAll(() => { + testNames.forEach((name) => { + if (!allTests.includes(name)) { + console.error(`WARNING: '${name}' test is not part of the test suite`) + } + }) + if (skippedTests.length) { + console.log( + `\nSkipped the following ${skippedTests.length} Feathers adapter test(s) out of ${allTests.length} total:` + ) + console.log(JSON.stringify(skippedTests, null, ' ')) + } + }) + + basicTests(test, app, errors, serviceName, idProp) + methodTests(test, app, errors, serviceName, idProp) + syntaxTests(test, app, errors, serviceName, idProp) + }) + } +} + +export * from './declarations' + +export default adapterTests + +if (typeof module !== 'undefined') { + module.exports = Object.assign(adapterTests, module.exports) +} diff --git a/packages/adapter-tests-vitest/src/methods.ts b/packages/adapter-tests-vitest/src/methods.ts new file mode 100644 index 0000000000..27ca294cf6 --- /dev/null +++ b/packages/adapter-tests-vitest/src/methods.ts @@ -0,0 +1,724 @@ +import assert from 'assert' +import { AdapterMethodsTest } from './declarations' + +export default (test: AdapterMethodsTest, app: any, _errors: any, serviceName: string, idProp: string) => { + describe(' Methods', () => { + let doug: any + let service: any + + beforeEach(async () => { + service = app.service(serviceName) + doug = await app.service(serviceName).create({ + name: 'Doug', + age: 32 + }) + }) + + afterEach(async () => { + try { + await app.service(serviceName).remove(doug[idProp]) + } catch (error: any) {} + }) + + describe('get', () => { + test('.get', async () => { + const data = await service.get(doug[idProp]) + + assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id matches`) + assert.strictEqual(data.name, 'Doug', 'data.name matches') + assert.strictEqual(data.age, 32, 'data.age matches') + }) + + test('.get + $select', async () => { + const data = await service.get(doug[idProp], { + query: { $select: ['name'] } + }) + + assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id property matches`) + assert.strictEqual(data.name, 'Doug', 'data.name matches') + assert.ok(!data.age, 'data.age is falsy') + }) + + test('.get + id + query', async () => { + try { + await service.get(doug[idProp], { + query: { name: 'Tester' } + }) + throw new Error('Should never get here') + } catch (error: any) { + assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error') + } + }) + + test('.get + NotFound', async () => { + try { + await service.get('568225fbfe21222432e836ff') + throw new Error('Should never get here') + } catch (error: any) { + assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error') + } + }) + + test('.get + id + query id', async () => { + const alice = await service.create({ + name: 'Alice', + age: 12 + }) + + try { + await service.get(doug[idProp], { + query: { [idProp]: alice[idProp] } + }) + throw new Error('Should never get here') + } catch (error: any) { + assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error') + } + + await service.remove(alice[idProp]) + }) + }) + + describe('find', () => { + test('.find', async () => { + const data = await service.find() + + assert.ok(Array.isArray(data), 'Data is an array') + assert.strictEqual(data.length, 1, 'Got one entry') + }) + }) + + describe('remove', () => { + test('.remove', async () => { + const data = await service.remove(doug[idProp]) + + assert.strictEqual(data.name, 'Doug', 'data.name matches') + }) + + test('.remove + $select', async () => { + const data = await service.remove(doug[idProp], { + query: { $select: ['name'] } + }) + + assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id property matches`) + assert.strictEqual(data.name, 'Doug', 'data.name matches') + assert.ok(!data.age, 'data.age is falsy') + }) + + test('.remove + id + query', async () => { + try { + await service.remove(doug[idProp], { + query: { name: 'Tester' } + }) + throw new Error('Should never get here') + } catch (error: any) { + assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error') + } + }) + + test('.remove + multi', async () => { + try { + await service.remove(null) + throw new Error('Should never get here') + } catch (error: any) { + assert.strictEqual( + error.name, + 'MethodNotAllowed', + 'Removing multiple without option set throws MethodNotAllowed' + ) + } + + service.options.multi = ['remove'] + + await service.create({ name: 'Dave', age: 29, created: true }) + await service.create({ + name: 'David', + age: 3, + created: true + }) + + const data = await service.remove(null, { + query: { created: true } + }) + + assert.strictEqual(data.length, 2) + + const names = data.map((person: any) => person.name) + + assert.ok(names.includes('Dave'), 'Dave removed') + assert.ok(names.includes('David'), 'David removed') + }) + + test('.remove + multi no pagination', async () => { + try { + await service.remove(doug[idProp]) + } catch (error: any) {} + + const count = 14 + const defaultPaginate = 10 + + assert.ok(count > defaultPaginate, 'count is bigger than default pagination') + + const multiBefore = service.options.multi + const paginateBefore = service.options.paginate + + try { + service.options.multi = true + service.options.paginate = { + default: defaultPaginate, + max: 100 + } + + const emptyItems = await service.find({ paginate: false }) + assert.strictEqual(emptyItems.length, 0, 'no items before') + + const createdItems = await service.create( + Array.from(Array(count)).map((_, i) => ({ + name: `name-${i}`, + age: 3, + created: true + })) + ) + assert.strictEqual(createdItems.length, count, `created ${count} items`) + + const foundItems = await service.find({ paginate: false }) + assert.strictEqual(foundItems.length, count, `created ${count} items`) + + const foundPaginatedItems = await service.find({}) + assert.strictEqual(foundPaginatedItems.data.length, defaultPaginate, 'found paginated items') + + const allItems = await service.remove(null, { + query: { created: true } + }) + + assert.strictEqual(allItems.length, count, `removed all ${count} items`) + } finally { + await service.remove(null, { + query: { created: true }, + paginate: false + }) + + service.options.multi = multiBefore + service.options.paginate = paginateBefore + } + }) + + test('.remove + id + query id', async () => { + const alice = await service.create({ + name: 'Alice', + age: 12 + }) + + try { + await service.remove(doug[idProp], { + query: { [idProp]: alice[idProp] } + }) + throw new Error('Should never get here') + } catch (error: any) { + assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error') + } + + await service.remove(alice[idProp]) + }) + }) + + describe('update', () => { + test('.update', async () => { + const originalData = { [idProp]: doug[idProp], name: 'Dougler' } + const originalCopy = Object.assign({}, originalData) + + const data = await service.update(doug[idProp], originalData) + + assert.deepStrictEqual(originalData, originalCopy, 'data was not modified') + assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id matches`) + assert.strictEqual(data.name, 'Dougler', 'data.name matches') + assert.ok(!data.age, 'data.age is falsy') + }) + + test('.update + $select', async () => { + const originalData = { + [idProp]: doug[idProp], + name: 'Dougler', + age: 10 + } + + const data = await service.update(doug[idProp], originalData, { + query: { $select: ['name'] } + }) + + assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id property matches`) + assert.strictEqual(data.name, 'Dougler', 'data.name matches') + assert.ok(!data.age, 'data.age is falsy') + }) + + test('.update + id + query', async () => { + try { + await service.update( + doug[idProp], + { + name: 'Dougler' + }, + { + query: { name: 'Tester' } + } + ) + throw new Error('Should never get here') + } catch (error: any) { + assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error') + } + }) + + test('.update + NotFound', async () => { + try { + await service.update('568225fbfe21222432e836ff', { + name: 'NotFound' + }) + throw new Error('Should never get here') + } catch (error: any) { + assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error') + } + }) + + test('.update + query + NotFound', async () => { + const dave = await service.create({ name: 'Dave' }) + try { + await service.update(dave[idProp], { name: 'UpdatedDave' }, { query: { name: 'NotDave' } }) + throw new Error('Should never get here') + } catch (error: any) { + assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error') + } + await service.remove(dave[idProp]) + }) + + test('.update + id + query id', async () => { + const alice = await service.create({ + name: 'Alice', + age: 12 + }) + + try { + await service.update( + doug[idProp], + { + name: 'Dougler', + age: 33 + }, + { + query: { [idProp]: alice[idProp] } + } + ) + throw new Error('Should never get here') + } catch (error: any) { + assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error') + } + + await service.remove(alice[idProp]) + }) + }) + + describe('patch', () => { + test('.patch', async () => { + const originalData = { [idProp]: doug[idProp], name: 'PatchDoug' } + const originalCopy = Object.assign({}, originalData) + + const data = await service.patch(doug[idProp], originalData) + + assert.deepStrictEqual(originalData, originalCopy, 'original data was not modified') + assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id matches`) + assert.strictEqual(data.name, 'PatchDoug', 'data.name matches') + assert.strictEqual(data.age, 32, 'data.age matches') + }) + + test('.patch + $select', async () => { + const originalData = { [idProp]: doug[idProp], name: 'PatchDoug' } + + const data = await service.patch(doug[idProp], originalData, { + query: { $select: ['name'] } + }) + + assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id property matches`) + assert.strictEqual(data.name, 'PatchDoug', 'data.name matches') + assert.ok(!data.age, 'data.age is falsy') + }) + + test('.patch + id + query', async () => { + try { + await service.patch( + doug[idProp], + { + name: 'id patched doug' + }, + { + query: { name: 'Tester' } + } + ) + throw new Error('Should never get here') + } catch (error: any) { + assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error') + } + }) + + test('.patch multiple', async () => { + try { + await service.patch(null, {}) + throw new Error('Should never get here') + } catch (error: any) { + assert.strictEqual( + error.name, + 'MethodNotAllowed', + 'Removing multiple without option set throws MethodNotAllowed' + ) + } + + const params = { + query: { created: true } + } + const dave = await service.create({ + name: 'Dave', + age: 29, + created: true + }) + const david = await service.create({ + name: 'David', + age: 3, + created: true + }) + + service.options.multi = ['patch'] + + const data = await service.patch( + null, + { + age: 2 + }, + params + ) + + assert.strictEqual(data.length, 2, 'returned two entries') + assert.strictEqual(data[0].age, 2, 'First entry age was updated') + assert.strictEqual(data[1].age, 2, 'Second entry age was updated') + + await service.remove(dave[idProp]) + await service.remove(david[idProp]) + }) + + test('.patch multiple no pagination', async () => { + try { + await service.remove(doug[idProp]) + } catch (error: any) {} + + const count = 14 + const defaultPaginate = 10 + + assert.ok(count > defaultPaginate, 'count is bigger than default pagination') + + const multiBefore = service.options.multi + const paginateBefore = service.options.paginate + + let ids: any[] + + try { + service.options.multi = true + service.options.paginate = { + default: defaultPaginate, + max: 100 + } + + const emptyItems = await service.find({ paginate: false }) + assert.strictEqual(emptyItems.length, 0, 'no items before') + + const createdItems = await service.create( + Array.from(Array(count)).map((_, i) => ({ + name: `name-${i}`, + age: 3, + created: true + })) + ) + assert.strictEqual(createdItems.length, count, `created ${count} items`) + ids = createdItems.map((item: any) => item[idProp]) + + const foundItems = await service.find({ paginate: false }) + assert.strictEqual(foundItems.length, count, `created ${count} items`) + + const foundPaginatedItems = await service.find({}) + assert.strictEqual(foundPaginatedItems.data.length, defaultPaginate, 'found paginated data') + + const allItems = await service.patch(null, { age: 4 }, { query: { created: true } }) + + assert.strictEqual(allItems.length, count, `patched all ${count} items`) + } finally { + service.options.multi = multiBefore + service.options.paginate = paginateBefore + if (ids) { + await Promise.all(ids.map((id) => service.remove(id))) + } + } + }) + + test('.patch multi query same', async () => { + const service = app.service(serviceName) + const multiBefore = service.options.multi + + service.options.multi = true + + const params = { + query: { age: { $lt: 10 } } + } + const dave = await service.create({ + name: 'Dave', + age: 8, + created: true + }) + const david = await service.create({ + name: 'David', + age: 4, + created: true + }) + + const data = await service.patch( + null, + { + age: 2 + }, + params + ) + + assert.strictEqual(data.length, 2, 'returned two entries') + assert.strictEqual(data[0].age, 2, 'First entry age was updated') + assert.strictEqual(data[1].age, 2, 'Second entry age was updated') + + await service.remove(dave[idProp]) + await service.remove(david[idProp]) + + service.options.multi = multiBefore + }) + + test('.patch multi query changed', async () => { + const service = app.service(serviceName) + const multiBefore = service.options.multi + + service.options.multi = true + + const params = { + query: { age: 10 } + } + const dave = await service.create({ + name: 'Dave', + age: 10, + created: true + }) + const david = await service.create({ + name: 'David', + age: 10, + created: true + }) + + const data = await service.patch( + null, + { + age: 2 + }, + params + ) + + assert.strictEqual(data.length, 2, 'returned two entries') + assert.strictEqual(data[0].age, 2, 'First entry age was updated') + assert.strictEqual(data[1].age, 2, 'Second entry age was updated') + + await service.remove(dave[idProp]) + await service.remove(david[idProp]) + + service.options.multi = multiBefore + }) + + test('.patch + NotFound', async () => { + try { + await service.patch('568225fbfe21222432e836ff', { + name: 'PatchDoug' + }) + throw new Error('Should never get here') + } catch (error: any) { + assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error') + } + }) + + test('.patch + query + NotFound', async () => { + const dave = await service.create({ name: 'Dave' }) + try { + await service.patch(dave[idProp], { name: 'PatchedDave' }, { query: { name: 'NotDave' } }) + throw new Error('Should never get here') + } catch (error: any) { + assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error') + } + await service.remove(dave[idProp]) + }) + + test('.patch + id + query id', async () => { + const alice = await service.create({ + name: 'Alice', + age: 12 + }) + + try { + await service.patch( + doug[idProp], + { + age: 33 + }, + { + query: { [idProp]: alice[idProp] } + } + ) + throw new Error('Should never get here') + } catch (error: any) { + assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error') + } + + await service.remove(alice[idProp]) + }) + }) + + describe('create', () => { + test('.create', async () => { + const originalData = { + name: 'Bill', + age: 40 + } + const originalCopy = Object.assign({}, originalData) + + const data = await service.create(originalData) + + assert.deepStrictEqual(originalData, originalCopy, 'original data was not modified') + assert.ok(data instanceof Object, 'data is an object') + assert.strictEqual(data.name, 'Bill', 'data.name matches') + + await service.remove(data[idProp]) + }) + + test('.create ignores query', async () => { + const originalData = { + name: 'Billy', + age: 42 + } + const data = await service.create(originalData, { + query: { + name: 'Dave' + } + }) + + assert.strictEqual(data.name, 'Billy', 'data.name matches') + + await service.remove(data[idProp]) + }) + + test('.create + $select', async () => { + const originalData = { + name: 'William', + age: 23 + } + + const data = await service.create(originalData, { + query: { $select: ['name'] } + }) + + assert.ok(idProp in data, 'data has id') + assert.strictEqual(data.name, 'William', 'data.name matches') + assert.ok(!data.age, 'data.age is falsy') + + await service.remove(data[idProp]) + }) + + test('.create multi', async () => { + try { + await service.create([], {}) + throw new Error('Should never get here') + } catch (error: any) { + assert.strictEqual( + error.name, + 'MethodNotAllowed', + 'Removing multiple without option set throws MethodNotAllowed' + ) + } + + const items = [ + { + name: 'Gerald', + age: 18 + }, + { + name: 'Herald', + age: 18 + } + ] + + service.options.multi = ['create', 'patch'] + + const data = await service.create(items) + + assert.ok(Array.isArray(data), 'data is an array') + assert.ok(typeof data[0][idProp] !== 'undefined', 'id is set') + assert.strictEqual(data[0].name, 'Gerald', 'first name matches') + assert.ok(typeof data[1][idProp] !== 'undefined', 'id is set') + assert.strictEqual(data[1].name, 'Herald', 'second name macthes') + + await service.remove(data[0][idProp]) + await service.remove(data[1][idProp]) + }) + }) + + describe("doesn't call public methods internally", () => { + let throwing: any + + beforeAll(() => { + throwing = Object.assign(Object.create(app.service(serviceName)), { + get store() { + return app.service(serviceName).store + }, + + find() { + throw new Error('find method called') + }, + get() { + throw new Error('get method called') + }, + create() { + throw new Error('create method called') + }, + update() { + throw new Error('update method called') + }, + patch() { + throw new Error('patch method called') + }, + remove() { + throw new Error('remove method called') + } + }) + }) + + test('internal .find', () => app.service(serviceName).find.call(throwing)) + + test('internal .get', () => service.get.call(throwing, doug[idProp])) + + test('internal .create', async () => { + const bob = await service.create.call(throwing, { + name: 'Bob', + age: 25 + }) + + await service.remove(bob[idProp]) + }) + + test('internal .update', () => + service.update.call(throwing, doug[idProp], { + name: 'Dougler' + })) + + test('internal .patch', () => + service.patch.call(throwing, doug[idProp], { + name: 'PatchDoug' + })) + + test('internal .remove', () => service.remove.call(throwing, doug[idProp])) + }) + }) +} diff --git a/packages/adapter-tests-vitest/src/syntax.ts b/packages/adapter-tests-vitest/src/syntax.ts new file mode 100644 index 0000000000..e559d394c2 --- /dev/null +++ b/packages/adapter-tests-vitest/src/syntax.ts @@ -0,0 +1,423 @@ +import assert from 'assert' +import { AdapterSyntaxTest } from './declarations' + +export default (test: AdapterSyntaxTest, app: any, _errors: any, serviceName: string, idProp: string) => { + describe('Query Syntax', () => { + let bob: any + let alice: any + let doug: any + let service: any + + beforeEach(async () => { + service = app.service(serviceName) + bob = await app.service(serviceName).create({ + name: 'Bob', + age: 25 + }) + doug = await app.service(serviceName).create({ + name: 'Doug', + age: 32 + }) + alice = await app.service(serviceName).create({ + name: 'Alice', + age: 19 + }) + }) + + afterEach(async () => { + await service.remove(bob[idProp]) + await service.remove(alice[idProp]) + await service.remove(doug[idProp]) + }) + + test('.find + equal', async () => { + const params = { query: { name: 'Alice' } } + const data = await service.find(params) + + assert.ok(Array.isArray(data)) + assert.strictEqual(data.length, 1) + assert.strictEqual(data[0].name, 'Alice') + }) + + test('.find + equal multiple', async () => { + const data = await service.find({ + query: { name: 'Alice', age: 20 } + }) + + assert.strictEqual(data.length, 0) + }) + + describe('special filters', () => { + test('.find + $sort', async () => { + let data = await service.find({ + query: { + $sort: { name: 1 } + } + }) + + assert.strictEqual(data.length, 3) + assert.strictEqual(data[0].name, 'Alice') + assert.strictEqual(data[1].name, 'Bob') + assert.strictEqual(data[2].name, 'Doug') + + data = await service.find({ + query: { + $sort: { name: -1 } + } + }) + + assert.strictEqual(data.length, 3) + assert.strictEqual(data[0].name, 'Doug') + assert.strictEqual(data[1].name, 'Bob') + assert.strictEqual(data[2].name, 'Alice') + }) + + test('.find + $sort + string', async () => { + const data = await service.find({ + query: { + $sort: { name: '1' } + } + }) + + assert.strictEqual(data.length, 3) + assert.strictEqual(data[0].name, 'Alice') + assert.strictEqual(data[1].name, 'Bob') + assert.strictEqual(data[2].name, 'Doug') + }) + + test('.find + $limit', async () => { + const data = await service.find({ + query: { + $limit: 2 + } + }) + + assert.strictEqual(data.length, 2) + }) + + test('.find + $limit 0', async () => { + const data = await service.find({ + query: { + $limit: 0 + } + }) + + assert.strictEqual(data.length, 0) + }) + + test('.find + $skip', async () => { + const data = await service.find({ + query: { + $sort: { name: 1 }, + $skip: 1 + } + }) + + assert.strictEqual(data.length, 2) + assert.strictEqual(data[0].name, 'Bob') + assert.strictEqual(data[1].name, 'Doug') + }) + + test('.find + $select', async () => { + const data = await service.find({ + query: { + name: 'Alice', + $select: ['name'] + } + }) + + assert.strictEqual(data.length, 1) + assert.ok(idProp in data[0], 'data has id') + assert.strictEqual(data[0].name, 'Alice') + assert.strictEqual(data[0].age, undefined) + }) + + test('.find + $or', async () => { + const data = await service.find({ + query: { + $or: [{ name: 'Alice' }, { name: 'Bob' }], + $sort: { name: 1 } + } + }) + + assert.strictEqual(data.length, 2) + assert.strictEqual(data[0].name, 'Alice') + assert.strictEqual(data[1].name, 'Bob') + }) + + test('.find + $in', async () => { + const data = await service.find({ + query: { + name: { + $in: ['Alice', 'Bob'] + }, + $sort: { name: 1 } + } + }) + + assert.strictEqual(data.length, 2) + assert.strictEqual(data[0].name, 'Alice') + assert.strictEqual(data[1].name, 'Bob') + }) + + test('.find + $nin', async () => { + const data = await service.find({ + query: { + name: { + $nin: ['Alice', 'Bob'] + } + } + }) + + assert.strictEqual(data.length, 1) + assert.strictEqual(data[0].name, 'Doug') + }) + + test('.find + $lt', async () => { + const data = await service.find({ + query: { + age: { + $lt: 30 + } + } + }) + + assert.strictEqual(data.length, 2) + }) + + test('.find + $lte', async () => { + const data = await service.find({ + query: { + age: { + $lte: 25 + } + } + }) + + assert.strictEqual(data.length, 2) + }) + + test('.find + $gt', async () => { + const data = await service.find({ + query: { + age: { + $gt: 30 + } + } + }) + + assert.strictEqual(data.length, 1) + }) + + test('.find + $gte', async () => { + const data = await service.find({ + query: { + age: { + $gte: 25 + } + } + }) + + assert.strictEqual(data.length, 2) + }) + + test('.find + $ne', async () => { + const data = await service.find({ + query: { + age: { + $ne: 25 + } + } + }) + + assert.strictEqual(data.length, 2) + }) + }) + + test('.find + $gt + $lt + $sort', async () => { + const params = { + query: { + age: { + $gt: 18, + $lt: 30 + }, + $sort: { name: 1 } + } + } + + const data = await service.find(params) + + assert.strictEqual(data.length, 2) + assert.strictEqual(data[0].name, 'Alice') + assert.strictEqual(data[1].name, 'Bob') + }) + + test('.find + $or nested + $sort', async () => { + const params = { + query: { + $or: [ + { name: 'Doug' }, + { + age: { + $gte: 18, + $lt: 25 + } + } + ], + $sort: { name: 1 } + } + } + + const data = await service.find(params) + + assert.strictEqual(data.length, 2) + assert.strictEqual(data[0].name, 'Alice') + assert.strictEqual(data[1].name, 'Doug') + }) + + test('.find + $and', async () => { + const params = { + query: { + $and: [{ age: 19 }], + $sort: { name: 1 } + } + } + + const data = await service.find(params) + + assert.strictEqual(data.length, 1) + assert.strictEqual(data[0].name, 'Alice') + }) + + test('.find + $and + $or', async () => { + const params = { + query: { + $and: [{ $or: [{ name: 'Alice' }] }], + $sort: { name: 1 } + } + } + + const data = await service.find(params) + + assert.strictEqual(data.length, 1) + assert.strictEqual(data[0].name, 'Alice') + }) + + describe('params.adapter', () => { + test('params.adapter + paginate', async () => { + const page = await service.find({ + adapter: { + paginate: { default: 3 } + } + }) + + assert.strictEqual(page.limit, 3) + assert.strictEqual(page.skip, 0) + }) + + test('params.adapter + multi', async () => { + const items = [ + { + name: 'Garald', + age: 200 + }, + { + name: 'Harald', + age: 24 + } + ] + const multiParams = { + adapter: { + multi: ['create'] + } + } + const users = await service.create(items, multiParams) + + assert.strictEqual(users.length, 2) + + await service.remove(users[0][idProp]) + await service.remove(users[1][idProp]) + await assert.rejects(() => service.patch(null, { age: 2 }, multiParams), { + message: 'Can not patch multiple entries' + }) + }) + }) + + describe('paginate', function () { + beforeEach(() => { + service.options.paginate = { + default: 1, + max: 2 + } + }) + + afterEach(() => { + service.options.paginate = {} + }) + + test('.find + paginate', async () => { + const page = await service.find({ + query: { $sort: { name: -1 } } + }) + + assert.strictEqual(page.total, 3) + assert.strictEqual(page.limit, 1) + assert.strictEqual(page.skip, 0) + assert.strictEqual(page.data[0].name, 'Doug') + }) + + test('.find + paginate + query', async () => { + const page = await service.find({ + query: { + $sort: { name: -1 }, + name: 'Doug' + } + }) + + assert.strictEqual(page.total, 1) + assert.strictEqual(page.limit, 1) + assert.strictEqual(page.skip, 0) + assert.strictEqual(page.data[0].name, 'Doug') + }) + + test('.find + paginate + $limit + $skip', async () => { + const params = { + query: { + $skip: 1, + $limit: 4, + $sort: { name: -1 } + } + } + + const page = await service.find(params) + + assert.strictEqual(page.total, 3) + assert.strictEqual(page.limit, 2) + assert.strictEqual(page.skip, 1) + assert.strictEqual(page.data[0].name, 'Bob') + assert.strictEqual(page.data[1].name, 'Alice') + }) + + test('.find + paginate + $limit 0', async () => { + const page = await service.find({ + query: { $limit: 0 } + }) + + assert.strictEqual(page.total, 3) + assert.strictEqual(page.data.length, 0) + }) + + test('.find + paginate + params', async () => { + const page = await service.find({ paginate: { default: 3 } }) + + assert.strictEqual(page.limit, 3) + assert.strictEqual(page.skip, 0) + + const results = await service.find({ paginate: false }) + + assert.ok(Array.isArray(results)) + assert.strictEqual(results.length, 3) + }) + }) + }) +} diff --git a/packages/adapter-tests-vitest/test/index.test.ts b/packages/adapter-tests-vitest/test/index.test.ts new file mode 100644 index 0000000000..fc4a3ad0ec --- /dev/null +++ b/packages/adapter-tests-vitest/test/index.test.ts @@ -0,0 +1,85 @@ +import { strict as assert } from 'assert' +import adapterTests from '../src' + +const testSuite = adapterTests([ + '.events', + '._get', + '._find', + '._create', + '._update', + '._patch', + '._remove', + '.$get', + '.$find', + '.$create', + '.$update', + '.$patch', + '.$remove', + '.get', + '.get + $select', + '.get + id + query', + '.get + NotFound', + '.find', + '.remove', + '.remove + $select', + '.remove + id + query', + '.remove + multi', + '.remove + multi no pagination', + '.update', + '.update + $select', + '.update + id + query', + '.update + NotFound', + '.patch', + '.patch + $select', + '.patch + id + query', + '.patch multiple', + '.patch multiple no pagination', + '.patch multi query changed', + '.patch multi query same', + '.patch + NotFound', + '.create', + '.create + $select', + '.create multi', + 'internal .find', + 'internal .get', + 'internal .create', + 'internal .update', + 'internal .patch', + 'internal .remove', + '.find + equal', + '.find + equal multiple', + '.find + $sort', + '.find + $sort + string', + '.find + $limit', + '.find + $limit 0', + '.find + $skip', + '.find + $select', + '.find + $or', + '.find + $in', + '.find + $nin', + '.find + $lt', + '.find + $lte', + '.find + $gt', + '.find + $gte', + '.find + $ne', + '.find + $gt + $lt + $sort', + '.find + $or nested + $sort', + '.find + paginate', + '.find + paginate + $limit + $skip', + '.find + paginate + $limit 0', + '.find + paginate + params', + '.get + id + query id', + '.remove + id + query id', + '.update + id + query id', + '.patch + id + query id' +]) + +describe('Feathers Memory Service', () => { + it('loads the test suite', () => { + assert.ok(typeof testSuite === 'function') + }) + + it('exports as CommonJS', () => { + assert.equal(typeof require('../lib'), 'function') + }) +}) diff --git a/packages/adapter-tests-vitest/tsconfig.json b/packages/adapter-tests-vitest/tsconfig.json new file mode 100644 index 0000000000..316fd41336 --- /dev/null +++ b/packages/adapter-tests-vitest/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig", + "include": [ + "src/**/*.ts" + ], + "compilerOptions": { + "outDir": "lib" + } +} diff --git a/packages/adapter-tests-vitest/vite.config.ts b/packages/adapter-tests-vitest/vite.config.ts new file mode 100644 index 0000000000..5381f73f70 --- /dev/null +++ b/packages/adapter-tests-vitest/vite.config.ts @@ -0,0 +1,3 @@ +import vitest from '../../vitest.config.template' + +export default vitest diff --git a/packages/adapter-tests/.mocharc.json b/packages/adapter-tests/.mocharc.json new file mode 100644 index 0000000000..df733f29bc --- /dev/null +++ b/packages/adapter-tests/.mocharc.json @@ -0,0 +1,7 @@ +{ + "timeout": 30000, + "require": ["ts-node/register", "source-map-support/register"], + "reporter": "Dot", + "extension": ".test.ts", + "exit": true +} \ No newline at end of file diff --git a/packages/adapter-tests/LICENSE b/packages/adapter-tests/LICENSE index 887338c4f0..7712f870f3 100644 --- a/packages/adapter-tests/LICENSE +++ b/packages/adapter-tests/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2023 Feathers Contributors +Copyright (c) 2024 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/adapter-tests/README.md b/packages/adapter-tests/README.md index 3ac49c8c94..7329806190 100644 --- a/packages/adapter-tests/README.md +++ b/packages/adapter-tests/README.md @@ -1,7 +1,7 @@ # Feathers Adapter Tests [![CI](https://github.com/feathersjs/feathers/workflows/Node.js%20CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3A%22Node.js+CI%22) -[![Download Status](https://img.shields.io/npm/dm/@feathersjs/adapter-commons.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/adapter-commons) +[![Download Status](https://img.shields.io/npm/dm/@feathersjs/adapter-tests.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/adapter-tests) [![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) > Feathers shared database adapter test suite @@ -16,6 +16,6 @@ This is a repository that contains the test suite for the common database adapte ## License -Copyright (c) 2023 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/adapter-tests/package.json b/packages/adapter-tests/package.json index f186b6c3d2..ac5c5fd1f6 100644 --- a/packages/adapter-tests/package.json +++ b/packages/adapter-tests/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/adapter-tests", "version": "5.0.24", - "description": "Feathers shared database adapter test suite", + "description": "Feathers shared database adapter test suite with mocha", "homepage": "https://feathersjs.com", "keywords": [ "feathers" @@ -34,7 +34,7 @@ "prepublish": "npm run compile", "pack": "npm pack --pack-destination ../generators/test/build", "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" + "test": "mocha --config .mocharc.json --recursive test/**.test.ts test/**/*.test.ts" }, "directories": { "lib": "lib" @@ -51,10 +51,14 @@ }, "devDependencies": { "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", + "@types/node": "^20.11.30", "mocha": "^10.3.0", "shx": "^0.3.4", "ts-node": "^10.9.2", + "typescript": "^5.4.3" + }, + "peerDependencies": { + "mocha": "^10.3.0", "typescript": "^5.4.2" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" diff --git a/packages/adapter-tests/src/index.ts b/packages/adapter-tests/src/index.ts index 9a86033698..b90a0525ef 100644 --- a/packages/adapter-tests/src/index.ts +++ b/packages/adapter-tests/src/index.ts @@ -27,6 +27,7 @@ export const adapterTests = (testNames: AdapterTestName[]) => { } describe(`Adapter tests for '${serviceName}' service with '${idProp}' id property`, () => { + // @ts-expect-error TODO: fix this after(() => { testNames.forEach((name) => { if (!allTests.includes(name)) { diff --git a/packages/adapter-tests/src/methods.ts b/packages/adapter-tests/src/methods.ts index 271066df40..cb9375e31b 100644 --- a/packages/adapter-tests/src/methods.ts +++ b/packages/adapter-tests/src/methods.ts @@ -668,6 +668,7 @@ export default (test: AdapterMethodsTest, app: any, _errors: any, serviceName: s describe("doesn't call public methods internally", () => { let throwing: any + // @ts-expect-error TODO: fix this before(() => { throwing = Object.assign(Object.create(app.service(serviceName)), { get store() { diff --git a/packages/authentication-client/LICENSE b/packages/authentication-client/LICENSE index 887338c4f0..7712f870f3 100644 --- a/packages/authentication-client/LICENSE +++ b/packages/authentication-client/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2023 Feathers Contributors +Copyright (c) 2024 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/authentication-client/README.md b/packages/authentication-client/README.md index 8d3dc0fcd5..aa47ecfb25 100644 --- a/packages/authentication-client/README.md +++ b/packages/authentication-client/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers authentication client API documentation](https://feathers ## License -Copyright (c) 2023 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/authentication-client/package.json b/packages/authentication-client/package.json index f4c7ce4f6b..e14067a82e 100644 --- a/packages/authentication-client/package.json +++ b/packages/authentication-client/package.json @@ -44,7 +44,7 @@ "prepublish": "npm run compile", "pack": "npm pack --pack-destination ../generators/test/build", "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" + "test": "vitest run" }, "directories": { "lib": "lib" @@ -65,13 +65,12 @@ "@feathersjs/rest-client": "^5.0.24", "@feathersjs/socketio": "^5.0.24", "@feathersjs/socketio-client": "^5.0.24", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", - "axios": "^1.6.7", - "mocha": "^10.3.0", + "@types/node": "^20.11.30", + "axios": "^1.6.8", + "get-port": "^7.1.0", "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" } diff --git a/packages/authentication-client/test/integration/commons.ts b/packages/authentication-client/test/integration/commons.ts index 4973530792..dad8186a60 100644 --- a/packages/authentication-client/test/integration/commons.ts +++ b/packages/authentication-client/test/integration/commons.ts @@ -11,7 +11,7 @@ export default ( let client: Application let user: any - before( + beforeAll( async () => (user = await getApp().service('users').create({ email, @@ -23,7 +23,7 @@ export default ( client = getClient() }) - after(async () => { + afterAll(async () => { await getApp().service('users').remove(user.id) }) @@ -85,8 +85,8 @@ export default ( password }) - client.authentication.reset() - client.authenticate() + await client.authentication.reset() + await client.authenticate() const result = await client.service('dummy').find() assert.strictEqual(result.provider, provider) @@ -108,7 +108,7 @@ export default ( assert.ok(result!.accessToken) assert.ok(result!.user) - assert.rejects(() => client.service('dummy').find(), { + await assert.rejects(() => client.service('dummy').find(), { name: 'NotAuthenticated', code: 401, message: 'Not authenticated' diff --git a/packages/authentication-client/test/integration/express.test.ts b/packages/authentication-client/test/integration/express.test.ts index e5f7709c6b..047d66da35 100644 --- a/packages/authentication-client/test/integration/express.test.ts +++ b/packages/authentication-client/test/integration/express.test.ts @@ -1,5 +1,4 @@ import axios from 'axios' -import { Server } from 'http' import { feathers, Application as FeathersApplication } from '@feathersjs/feathers' import * as express from '@feathersjs/express' import rest from '@feathersjs/rest-client' @@ -7,29 +6,30 @@ import rest from '@feathersjs/rest-client' import authClient from '../../src' import getApp from './fixture' import commonTests from './commons' +import getPort from 'get-port' -describe('@feathersjs/authentication-client Express integration', () => { - let app: express.Application - let server: Server +describe('@feathersjs/authentication-client Express integration', async () => { + const port = await getPort() - before(async () => { - const restApp = express - .default(feathers()) - .use(express.json()) - .configure(express.rest()) - .use(express.parseAuthentication()) - app = getApp(restApp as unknown as FeathersApplication) as express.Application - app.use(express.errorHandler()) + const restApp = express + .default(feathers()) + .use(express.json()) + .configure(express.rest()) + .use(express.parseAuthentication()) - server = await app.listen(9776) - }) + const app = getApp(restApp as unknown as FeathersApplication) as express.Application + app.use(express.errorHandler()) - after((done) => server.close(() => done())) + const server = await app.listen(port) + + afterAll(() => new Promise((resolve) => server.close(() => resolve()))) commonTests( () => app, () => { - return feathers().configure(rest('http://localhost:9776').axios(axios)).configure(authClient()) + return feathers() + .configure(rest(`http://localhost:${port}`).axios(axios)) + .configure(authClient()) }, { email: 'expressauth@feathersjs.com', diff --git a/packages/authentication-client/test/integration/socketio.test.ts b/packages/authentication-client/test/integration/socketio.test.ts index da4bd2e7cd..3e8a01293f 100644 --- a/packages/authentication-client/test/integration/socketio.test.ts +++ b/packages/authentication-client/test/integration/socketio.test.ts @@ -1,6 +1,6 @@ import { io } from 'socket.io-client' import assert from 'assert' -import { feathers, Application } from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' import socketio from '@feathersjs/socketio' import socketioClient from '@feathersjs/socketio-client' @@ -8,17 +8,14 @@ import authClient from '../../src' import getApp from './fixture' import commonTests from './commons' import { AuthenticationResult } from '@feathersjs/authentication/lib' +import getPort from 'get-port' -describe('@feathersjs/authentication-client Socket.io integration', () => { - let app: Application +describe('@feathersjs/authentication-client Socket.io integration', async () => { + const app = getApp(feathers().configure(socketio())) + const port = await getPort() + await app.listen(port) - before(async () => { - app = getApp(feathers().configure(socketio())) - - await app.listen(9777) - }) - - after((done) => app.io.close(() => done())) + afterAll(() => new Promise((resolve) => app.io.close(() => resolve()))) it('allows to authenticate with handshake headers and sends login event', async () => { const user = { email: 'authtest@example.com', password: 'alsosecret' } @@ -30,7 +27,7 @@ describe('@feathersjs/authentication-client Socket.io integration', () => { ...user }) - const socket = io('http://localhost:9777', { + const socket = io(`http://localhost:${port}`, { transports: ['websocket'], transportOptions: { websocket: { @@ -55,7 +52,7 @@ describe('@feathersjs/authentication-client Socket.io integration', () => { it('reconnects after socket disconnection', async () => { const user = { email: 'disconnecttest@example.com', password: 'alsosecret' } - const socket = io('http://localhost:9777', { + const socket = io(`http://localhost:${port}`, { timeout: 500, reconnection: true, reconnectionDelay: 100 @@ -86,7 +83,7 @@ describe('@feathersjs/authentication-client Socket.io integration', () => { () => app, () => { return feathers() - .configure(socketioClient(io('http://localhost:9777'))) + .configure(socketioClient(io(`http://localhost:${port}`))) .configure(authClient()) }, { diff --git a/packages/authentication-client/vite.config.ts b/packages/authentication-client/vite.config.ts new file mode 100644 index 0000000000..5381f73f70 --- /dev/null +++ b/packages/authentication-client/vite.config.ts @@ -0,0 +1,3 @@ +import vitest from '../../vitest.config.template' + +export default vitest diff --git a/packages/authentication-local/LICENSE b/packages/authentication-local/LICENSE index 887338c4f0..7712f870f3 100644 --- a/packages/authentication-local/LICENSE +++ b/packages/authentication-local/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2023 Feathers Contributors +Copyright (c) 2024 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/authentication-local/README.md b/packages/authentication-local/README.md index ff8c192949..9215940bd5 100644 --- a/packages/authentication-local/README.md +++ b/packages/authentication-local/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers local authentication API documentation](https://feathersj ## License -Copyright (c) 2023 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/authentication-local/package.json b/packages/authentication-local/package.json index eb5722f0f4..edd0b7ec75 100644 --- a/packages/authentication-local/package.json +++ b/packages/authentication-local/package.json @@ -44,7 +44,7 @@ "prepublish": "npm run compile", "pack": "npm pack --pack-destination ../generators/test/build", "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" + "test": "vitest run" }, "directories": { "lib": "lib" @@ -65,12 +65,10 @@ "@feathersjs/schema": "^5.0.24", "@types/bcryptjs": "^2.4.6", "@types/lodash": "^4.17.0", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", - "mocha": "^10.3.0", + "@types/node": "^20.11.30", "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" } diff --git a/packages/authentication-local/vite.config.ts b/packages/authentication-local/vite.config.ts new file mode 100644 index 0000000000..5381f73f70 --- /dev/null +++ b/packages/authentication-local/vite.config.ts @@ -0,0 +1,3 @@ +import vitest from '../../vitest.config.template' + +export default vitest diff --git a/packages/authentication-oauth/LICENSE b/packages/authentication-oauth/LICENSE index 25527ba53a..7839c824d7 100644 --- a/packages/authentication-oauth/LICENSE +++ b/packages/authentication-oauth/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2023 Feathers Contributors +Copyright (c) 2024 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/authentication-oauth/README.md b/packages/authentication-oauth/README.md index cd6d96ecb0..797a932308 100644 --- a/packages/authentication-oauth/README.md +++ b/packages/authentication-oauth/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers oAuth authentication API documentation](https://feathersj ## License -Copyright (c) 2023 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/authentication-oauth/package.json b/packages/authentication-oauth/package.json index 8b700d6fa4..99a2c07e80 100644 --- a/packages/authentication-oauth/package.json +++ b/packages/authentication-oauth/package.json @@ -45,7 +45,7 @@ "prepublish": "npm run compile", "pack": "npm pack --pack-destination ../generators/test/build", "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" + "test": "vitest run" }, "directories": { "lib": "lib" @@ -73,15 +73,14 @@ "@types/express": "^4.17.21", "@types/koa-session": "^6.4.5", "@types/lodash": "^4.17.0", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", + "@types/node": "^20.11.30", "@types/tough-cookie": "^4.0.5", - "axios": "^1.6.7", - "mocha": "^10.3.0", + "axios": "^1.6.8", "shx": "^0.3.4", "tough-cookie": "^4.1.3", "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" } diff --git a/packages/authentication-oauth/test/service.test.ts b/packages/authentication-oauth/test/service.test.ts index a39310763a..311a7bcfc1 100644 --- a/packages/authentication-oauth/test/service.test.ts +++ b/packages/authentication-oauth/test/service.test.ts @@ -21,11 +21,11 @@ describe('@feathersjs/authentication-oauth service', () => { assert.fail('Should never get here') } - before(async () => { + beforeAll(async () => { app = await expressFixture(port, 5115) }) - after(async () => { + afterAll(async () => { await app.teardown() }) diff --git a/packages/authentication-oauth/test/strategy.test.ts b/packages/authentication-oauth/test/strategy.test.ts index a4386fcbc2..deb84d17bd 100644 --- a/packages/authentication-oauth/test/strategy.test.ts +++ b/packages/authentication-oauth/test/strategy.test.ts @@ -7,13 +7,13 @@ describe('@feathersjs/authentication-oauth/strategy', () => { let authService: AuthenticationService let strategy: TestOAuthStrategy - before(async () => { + beforeAll(async () => { app = await expressFixture(9778, 5115) authService = app.service('authentication') strategy = authService.getStrategy('github') as TestOAuthStrategy }) - after(async () => { + afterAll(async () => { await app.teardown() }) diff --git a/packages/authentication-oauth/vite.config.ts b/packages/authentication-oauth/vite.config.ts new file mode 100644 index 0000000000..5381f73f70 --- /dev/null +++ b/packages/authentication-oauth/vite.config.ts @@ -0,0 +1,3 @@ +import vitest from '../../vitest.config.template' + +export default vitest diff --git a/packages/authentication/LICENSE b/packages/authentication/LICENSE index 887338c4f0..7712f870f3 100644 --- a/packages/authentication/LICENSE +++ b/packages/authentication/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2023 Feathers Contributors +Copyright (c) 2024 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/authentication/README.md b/packages/authentication/README.md index dc31fe0651..c669c7c280 100644 --- a/packages/authentication/README.md +++ b/packages/authentication/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers authentication API documentation](https://feathersjs.com/ ## License -Copyright (c) 2023 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/authentication/package.json b/packages/authentication/package.json index 3298f1b2f1..880de09ae9 100644 --- a/packages/authentication/package.json +++ b/packages/authentication/package.json @@ -44,7 +44,7 @@ "prepublish": "npm run compile", "pack": "npm pack --pack-destination ../generators/test/build", "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" + "test": "vitest run" }, "directories": { "lib": "lib" @@ -68,13 +68,11 @@ "devDependencies": { "@feathersjs/memory": "^5.0.24", "@types/lodash": "^4.17.0", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", + "@types/node": "^20.11.30", "@types/uuid": "^9.0.8", - "mocha": "^10.3.0", "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" } diff --git a/packages/authentication/test/hooks/event.test.ts b/packages/authentication/test/hooks/event.test.ts index e602febdff..dee450bb94 100644 --- a/packages/authentication/test/hooks/event.test.ts +++ b/packages/authentication/test/hooks/event.test.ts @@ -22,62 +22,71 @@ describe('authentication/hooks/events', () => { remove: [hook('logout')] }) - it('login', (done) => { - const data = { - message: 'test' - } - - app.once('login', (result: AuthenticationResult, params: AuthenticationParams, context: HookContext) => { - try { - assert.deepStrictEqual(result, data) - assert.ok(params.testParam) - assert.ok(context.method, 'create') - done() - } catch (error: any) { - done(error) + it('login', () => + new Promise((resolve, reject) => { + const data = { + message: 'test' } - }) - service.create(data, { - testParam: true, - provider: 'test' - } as any) - }) + app.once( + 'login', + (result: AuthenticationResult, params: AuthenticationParams, context: HookContext) => { + try { + assert.deepStrictEqual(result, data) + assert.ok(params.testParam) + assert.ok(context.method, 'create') + resolve() + } catch (error: any) { + reject(error) + } + } + ) - it('logout', (done) => { - app.once('logout', (result: AuthenticationResult, params: AuthenticationParams, context: HookContext) => { - try { - assert.deepStrictEqual(result, { - id: 'test' - }) - assert.ok(params.testParam) - assert.ok(context.method, 'remove') - done() - } catch (error: any) { - done(error) - } - }) + service.create(data, { + testParam: true, + provider: 'test' + } as any) + })) - service.remove('test', { - testParam: true, - provider: 'test' - } as any) - }) + it('logout', () => + new Promise((resolve, reject) => { + app.once( + 'logout', + (result: AuthenticationResult, params: AuthenticationParams, context: HookContext) => { + try { + assert.deepStrictEqual(result, { + id: 'test' + }) + assert.ok(params.testParam) + assert.ok(context.method, 'remove') + resolve() + } catch (error: any) { + reject(error) + } + } + ) - it('does nothing when provider is not set', (done) => { - const handler = () => { - done(new Error('Should never get here')) - } + service.remove('test', { + testParam: true, + provider: 'test' + } as any) + })) + + it('does nothing when provider is not set', () => + new Promise((resolve, reject) => { + const handler = () => { + reject(new Error('Should never get here')) + } - app.on('logout', handler) - service.once('removed', (result: AuthenticationResult) => { - app.removeListener('logout', handler) - assert.deepStrictEqual(result, { - id: 'test' + app.on('logout', handler) + service.once('removed', (result: AuthenticationResult) => { + app.removeListener('logout', handler) + assert.deepStrictEqual(result, { + id: 'test' + }) + resolve() }) - done() - }) - service.remove('test') - }) + service.remove('test') + })) }) diff --git a/packages/authentication/vite.config.ts b/packages/authentication/vite.config.ts new file mode 100644 index 0000000000..5381f73f70 --- /dev/null +++ b/packages/authentication/vite.config.ts @@ -0,0 +1,3 @@ +import vitest from '../../vitest.config.template' + +export default vitest diff --git a/packages/cli/LICENSE b/packages/cli/LICENSE index 25527ba53a..7839c824d7 100644 --- a/packages/cli/LICENSE +++ b/packages/cli/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2023 Feathers Contributors +Copyright (c) 2024 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/cli/README.md b/packages/cli/README.md index 026a3a27b3..3b99960ca6 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -23,6 +23,6 @@ Refer to the [Feathers CLI guide](https://feathersjs.com/guides/cli/) for more d ## License -Copyright (c) 2023 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/cli/package.json b/packages/cli/package.json index ed18af6141..a06ac16d9c 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -46,8 +46,8 @@ "scripts": { "prepublish": "npm run compile", "compile": "shx rm -rf lib/ && tsc", - "mocha": "mocha --timeout 60000 --config ../../.mocharc.json --require tsx --recursive test/**.test.ts test/**/*.test.ts", - "test": "npm run compile && npm run mocha && bin/feathers.js --help" + "vitest": "vitest run", + "test": "npm run compile && npm run vitest && bin/feathers.js --help" }, "publishConfig": { "access": "public" @@ -75,15 +75,13 @@ "@feathersjs/socketio": "^5.0.24", "@feathersjs/transport-commons": "^5.0.24", "@feathersjs/typebox": "^5.0.24", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", + "@types/node": "^20.11.30", "@types/prettier": "^2.7.3", - "axios": "^1.6.7", - "mocha": "^10.3.0", + "axios": "^1.6.8", "shx": "^0.3.4", - "ts-node": "^10.9.2", - "type-fest": "^4.12.0", - "typescript": "^5.4.2" + "type-fest": "^4.13.1", + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" } diff --git a/packages/cli/vite.config.ts b/packages/cli/vite.config.ts new file mode 100644 index 0000000000..5381f73f70 --- /dev/null +++ b/packages/cli/vite.config.ts @@ -0,0 +1,3 @@ +import vitest from '../../vitest.config.template' + +export default vitest diff --git a/packages/client/README.md b/packages/client/README.md index 02be9c99f4..934b1157f1 100644 --- a/packages/client/README.md +++ b/packages/client/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers client API documentation](https://docs.feathersjs.com/api ## License -Copyright (c) 2023 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/client/package.json b/packages/client/package.json index 0c78726878..bfffc3eeb3 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -40,8 +40,8 @@ "version": "npm run build", "clean": "shx rm -rf dist/ && shx mkdir -p dist", "build": "npm run clean && npm run compile && npm run webpack", - "mocha": "mocha --config ../../.mocharc.json --recursive test/**/*.test.ts", - "test": "npm run build && npm run mocha", + "vitest": "vitest run", + "test": "npm run build && npm run vitest", "webpack": "webpack --config webpack/feathers.js && webpack --config webpack/feathers.min.js && webpack --config webpack/core.js && webpack --config webpack/core.min.js" }, "browserslist": [ @@ -56,21 +56,22 @@ "@feathersjs/socketio-client": "^5.0.24" }, "devDependencies": { - "@babel/core": "^7.24.0", - "@babel/preset-env": "^7.24.0", + "@babel/core": "^7.24.3", + "@babel/preset-env": "^7.24.3", "@feathersjs/express": "^5.0.24", "@feathersjs/memory": "^5.0.24", "@feathersjs/socketio": "^5.0.24", - "@feathersjs/tests": "^5.0.24", + "@feathersjs/tests-vitest": "^5.0.24", "babel-loader": "^9.1.3", - "mocha": "^10.3.0", + "get-port": "^7.1.0", "node-fetch": "^2.6.1", "shx": "^0.3.4", - "socket.io-client": "^4.7.4", + "socket.io-client": "^4.7.5", "superagent": "^8.1.2", "ts-loader": "^9.5.1", - "typescript": "^5.4.2", - "webpack": "^5.90.3", + "typescript": "^5.4.3", + "vitest": "^1.4.0", + "webpack": "^5.91.0", "webpack-cli": "^5.1.4", "webpack-merge": "^5.10.0" }, diff --git a/packages/client/test/fetch.test.ts b/packages/client/test/fetch.test.ts index 22f626a4a6..17ff3d1e8c 100644 --- a/packages/client/test/fetch.test.ts +++ b/packages/client/test/fetch.test.ts @@ -2,23 +2,28 @@ // @ts-ignore import fetch from 'node-fetch' import { Server } from 'http' -import { clientTests } from '@feathersjs/tests' +import { clientTests } from '@feathersjs/tests-vitest' import * as feathers from '../dist/feathers' import app from './fixture' +import getPort from 'get-port' -describe('fetch REST connector', function () { +describe('fetch REST connector', async function () { let server: Server - const rest = feathers.rest('http://localhost:8889') + const port = await getPort() + const rest = feathers.rest(`http://localhost:${port}`) const client = feathers.default().configure(rest.fetch(fetch)) - before(async () => { - server = await app().listen(8889) + beforeAll(async () => { + server = await app().listen(port) }) - after(function (done) { - server.close(done) - }) + afterAll( + () => + new Promise((resolve) => { + server.close(() => resolve()) + }) + ) clientTests(client, 'todos') }) diff --git a/packages/client/test/socketio.test.ts b/packages/client/test/socketio.test.ts index 74a86cd73e..7725b3c3bb 100644 --- a/packages/client/test/socketio.test.ts +++ b/packages/client/test/socketio.test.ts @@ -1,27 +1,32 @@ import { io } from 'socket.io-client' import socketio from '@feathersjs/socketio' import { Server } from 'http' -import { clientTests } from '@feathersjs/tests' +import { clientTests } from '@feathersjs/tests-vitest' import * as feathers from '../dist/feathers' import app from './fixture' +import getPort from 'get-port' -describe('Socket.io connector', function () { +describe('Socket.io connector', async function () { let server: Server - const socket = io('http://localhost:9988') + const port = await getPort() + const socket = io(`http://localhost:${port}`) const client = feathers.default().configure(feathers.socketio(socket)) - before(async () => { - server = await app((app) => app.configure(socketio())).listen(9988) + beforeAll(async () => { + server = await app((app) => app.configure(socketio())).listen(port) }) - after(function (done) { - socket.once('disconnect', () => { - server.close() - done() - }) - socket.disconnect() - }) + afterAll( + () => + new Promise((resolve) => { + socket.once('disconnect', () => { + server.close() + resolve() + }) + socket.disconnect() + }) + ) clientTests(client, 'todos') }) diff --git a/packages/client/test/superagent.test.ts b/packages/client/test/superagent.test.ts index ea158b9747..cf158f2470 100644 --- a/packages/client/test/superagent.test.ts +++ b/packages/client/test/superagent.test.ts @@ -1,22 +1,27 @@ import superagent from 'superagent' -import { clientTests } from '@feathersjs/tests' +import { clientTests } from '@feathersjs/tests-vitest' import { Server } from 'http' +import getPort from 'get-port' import * as feathers from '../dist/feathers' import app from './fixture' -describe('Superagent REST connector', function () { +describe('Superagent REST connector', async function () { let server: Server - const rest = feathers.rest('http://localhost:8889') + const port = await getPort() + const rest = feathers.rest(`http://localhost:${port}`) const client = feathers.default().configure(rest.superagent(superagent)) - before(async () => { - server = await app().listen(8889) + beforeAll(async () => { + server = await app().listen(port) }) - after(function (done) { - server.close(done) - }) + afterAll( + () => + new Promise((resolve) => { + server.close(() => resolve()) + }) + ) clientTests(client, 'todos') }) diff --git a/packages/client/vite.config.ts b/packages/client/vite.config.ts new file mode 100644 index 0000000000..5381f73f70 --- /dev/null +++ b/packages/client/vite.config.ts @@ -0,0 +1,3 @@ +import vitest from '../../vitest.config.template' + +export default vitest diff --git a/packages/commons/LICENSE b/packages/commons/LICENSE index 887338c4f0..7712f870f3 100644 --- a/packages/commons/LICENSE +++ b/packages/commons/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2023 Feathers Contributors +Copyright (c) 2024 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/commons/README.md b/packages/commons/README.md index adc4469947..2eefb2bb7f 100644 --- a/packages/commons/README.md +++ b/packages/commons/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers API](https://feathersjs.com/api) for more details. ## License -Copyright (c) 2023 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/commons/package.json b/packages/commons/package.json index be778d5acc..620e901aef 100644 --- a/packages/commons/package.json +++ b/packages/commons/package.json @@ -43,7 +43,7 @@ "prepublish": "npm run compile", "pack": "npm pack --pack-destination ../generators/test/build", "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" + "test": "vitest run" }, "directories": { "lib": "lib" @@ -52,12 +52,10 @@ "access": "public" }, "devDependencies": { - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", - "mocha": "^10.3.0", + "@types/node": "^20.11.30", "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" } diff --git a/packages/commons/vite.config.ts b/packages/commons/vite.config.ts new file mode 100644 index 0000000000..5381f73f70 --- /dev/null +++ b/packages/commons/vite.config.ts @@ -0,0 +1,3 @@ +import vitest from '../../vitest.config.template' + +export default vitest diff --git a/packages/configuration/LICENSE b/packages/configuration/LICENSE index 887338c4f0..7712f870f3 100644 --- a/packages/configuration/LICENSE +++ b/packages/configuration/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2023 Feathers Contributors +Copyright (c) 2024 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/configuration/README.md b/packages/configuration/README.md index fa6c7044dd..6e81d7cdb5 100644 --- a/packages/configuration/README.md +++ b/packages/configuration/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers configuration API documentation](https://feathersjs.com/a ## License -Copyright (c) 2023 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/configuration/package.json b/packages/configuration/package.json index 1bf8516af0..981b09ddbc 100644 --- a/packages/configuration/package.json +++ b/packages/configuration/package.json @@ -44,12 +44,7 @@ "prepublish": "npm run compile", "pack": "npm pack --pack-destination ../generators/test/build", "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "NODE_CONFIG_DIR=./test/config mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" - }, - "semistandard": { - "env": [ - "mocha" - ] + "test": "NODE_CONFIG_DIR=./test/config vitest run" }, "directories": { "lib": "lib" @@ -61,16 +56,14 @@ "@feathersjs/commons": "^5.0.24", "@feathersjs/feathers": "^5.0.24", "@feathersjs/schema": "^5.0.24", - "@types/config": "^3.3.3", + "@types/config": "^3.3.4", "config": "^3.3.11" }, "devDependencies": { - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", - "mocha": "^10.3.0", + "@types/node": "^20.11.30", "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" } diff --git a/packages/configuration/vite.config.ts b/packages/configuration/vite.config.ts new file mode 100644 index 0000000000..5381f73f70 --- /dev/null +++ b/packages/configuration/vite.config.ts @@ -0,0 +1,3 @@ +import vitest from '../../vitest.config.template' + +export default vitest diff --git a/packages/create-feathers/README.md b/packages/create-feathers/README.md index 8d39d3b4db..8c4afc3a1d 100644 --- a/packages/create-feathers/README.md +++ b/packages/create-feathers/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers guides](https://feathersjs.com/guides/) for more details. ## License -Copyright (c) 2023 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/create-feathers/vite.config.ts b/packages/create-feathers/vite.config.ts new file mode 100644 index 0000000000..5381f73f70 --- /dev/null +++ b/packages/create-feathers/vite.config.ts @@ -0,0 +1,3 @@ +import vitest from '../../vitest.config.template' + +export default vitest diff --git a/packages/errors/LICENSE b/packages/errors/LICENSE index 887338c4f0..7712f870f3 100644 --- a/packages/errors/LICENSE +++ b/packages/errors/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2023 Feathers Contributors +Copyright (c) 2024 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/errors/README.md b/packages/errors/README.md index 3b3af769ab..1b76126634 100644 --- a/packages/errors/README.md +++ b/packages/errors/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers errors API documentation](https://feathersjs.com/api/erro ## License -Copyright (c) 2023 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/errors/package.json b/packages/errors/package.json index c84e8c33c0..b261b3be3c 100644 --- a/packages/errors/package.json +++ b/packages/errors/package.json @@ -34,7 +34,7 @@ "prepublish": "npm run compile", "pack": "npm pack --pack-destination ../generators/test/build", "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" + "test": "vitest run" }, "publishConfig": { "access": "public" @@ -50,12 +50,10 @@ ], "devDependencies": { "@feathersjs/feathers": "^5.0.24", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", - "mocha": "^10.3.0", + "@types/node": "^20.11.30", "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" } diff --git a/packages/errors/vite.config.ts b/packages/errors/vite.config.ts new file mode 100644 index 0000000000..5381f73f70 --- /dev/null +++ b/packages/errors/vite.config.ts @@ -0,0 +1,3 @@ +import vitest from '../../vitest.config.template' + +export default vitest diff --git a/packages/express/LICENSE b/packages/express/LICENSE index 25527ba53a..7839c824d7 100644 --- a/packages/express/LICENSE +++ b/packages/express/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2023 Feathers Contributors +Copyright (c) 2024 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/express/README.md b/packages/express/README.md index ad6b0f83ad..9c6a221843 100644 --- a/packages/express/README.md +++ b/packages/express/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers Express API documentation](https://feathersjs.com/api/exp ## License -Copyright (c) 2023 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/express/package.json b/packages/express/package.json index 0bc818254a..a5f8cd299f 100644 --- a/packages/express/package.json +++ b/packages/express/package.json @@ -43,7 +43,7 @@ "prepublish": "npm run compile", "pack": "npm pack --pack-destination ../generators/test/build", "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" + "test": "vitest run" }, "directories": { "lib": "lib" @@ -63,20 +63,19 @@ "@types/express-serve-static-core": "^4.17.43", "compression": "^1.7.4", "cors": "^2.8.5", - "express": "^4.18.3" + "express": "^4.19.1" }, "devDependencies": { "@feathersjs/authentication-local": "^5.0.24", - "@feathersjs/tests": "^5.0.24", + "@feathersjs/tests-vitest": "^5.0.24", "@types/lodash": "^4.17.0", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", - "axios": "^1.6.7", + "@types/node": "^20.11.30", + "axios": "^1.6.8", + "get-port": "^7.1.0", "lodash": "^4.17.21", - "mocha": "^10.3.0", "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" } diff --git a/packages/express/test/authentication.test.ts b/packages/express/test/authentication.test.ts index 9a342f39de..b51278c912 100644 --- a/packages/express/test/authentication.test.ts +++ b/packages/express/test/authentication.test.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/ban-ts-comment */ -import { omit } from 'lodash' +import omit from 'lodash/omit.js' import { strict as assert } from 'assert' import { default as _axios } from 'axios' import { feathers } from '@feathersjs/feathers' @@ -20,7 +20,7 @@ describe('@feathersjs/express/authentication', () => { let user: any let authResult: AuthenticationResult - before(async () => { + beforeAll(async () => { const expressApp = expressify(feathers()).use(express.json()).configure(express.rest()) app = createApplication(expressApp as any) as unknown as express.Application @@ -61,7 +61,7 @@ describe('@feathersjs/express/authentication', () => { authResult = res.data }) - after(() => app.teardown()) + afterAll(() => app.teardown()) describe('service authentication', () => { it('successful local authentication', () => { diff --git a/packages/express/test/error-handler.test.ts b/packages/express/test/error-handler.test.ts index e12b653d88..09d19f91e3 100644 --- a/packages/express/test/error-handler.test.ts +++ b/packages/express/test/error-handler.test.ts @@ -1,12 +1,14 @@ /* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function */ import { strict as assert } from 'assert' -import express, { Request, Response, NextFunction } from 'express' +import express, { Request, Response, NextFunction, Application } from 'express' import axios from 'axios' import fs from 'fs' import { join } from 'path' import { BadRequest, NotAcceptable, NotAuthenticated, NotFound, PaymentError } from '@feathersjs/errors' +import getPort from 'get-port' import { errorHandler } from '../src' +import { Server } from 'http' const content = 'Error' @@ -19,9 +21,13 @@ const jsonHandler = function (error: Error, _req: Request, res: Response, _next: } describe('error-handler', () => { - describe('supports catch-all custom handlers', function () { - before(function () { - this.app = express() + describe('supports catch-all custom handlers', async () => { + let app: Application + let server: Server + const port = await getPort() + + beforeAll(() => { + app = express() .get('/error', function (_req: Request, _res: Response, next: NextFunction) { next(new Error('Something went wrong')) }) @@ -32,23 +38,26 @@ describe('error-handler', () => { }) ) - this.server = this.app.listen(5050) + server = app.listen(port) }) - after(function (done) { - this.server.close(done) - }) + afterAll( + () => + new Promise((resolve) => { + server.close(() => resolve()) + }) + ) describe('JSON handler', () => { - const options = { - url: 'http://localhost:5050/error', - headers: { - 'Content-Type': 'application/json', - Accept: 'application/json' + it('can send a custom response', async () => { + const options = { + url: `http://localhost:${port}/error`, + headers: { + 'Content-Type': 'application/json', + Accept: 'application/json' + } } - } - it('can send a custom response', async () => { try { await axios(options) assert.fail('Should never get here') @@ -81,54 +90,57 @@ describe('error-handler', () => { ) } - it('if the value is a string, calls res.sendFile', (done) => { - const err = new NotAuthenticated() - const middleware = errorHandler({ - logger: null, - html: { 401: 'path/to/401.html' } - }) - const res = makeRes(401, { - sendFile(f: any) { - assert.equal(f, 'path/to/401.html') - done() - } - }) - ;(middleware as any)(err, req, res) - }) + it('if the value is a string, calls res.sendFile', () => + new Promise((resolve) => { + const err = new NotAuthenticated() + const middleware = errorHandler({ + logger: null, + html: { 401: 'path/to/401.html' } + }) + const res = makeRes(401, { + sendFile(f: any) { + assert.equal(f, 'path/to/401.html') + resolve() + } + }) + ;(middleware as any)(err, req, res) + })) - it('if the value is a function, calls as middleware ', (done) => { - const err = new PaymentError() - const res = makeRes(402) - const middleware = errorHandler({ - logger: null, - html: { - 402: (_err: any, _req: any, _res: any) => { - assert.equal(_err, err) - assert.equal(_req, req) - assert.equal(_res, res) - done() + it('if the value is a function, calls as middleware ', () => + new Promise((resolve) => { + const err = new PaymentError() + const res = makeRes(402) + const middleware = errorHandler({ + logger: null, + html: { + 402: (_err: any, _req: any, _res: any) => { + assert.equal(_err, err) + assert.equal(_req, req) + assert.equal(_res, res) + resolve() + } } - } - }) - ;(middleware as any)(err, req, res) - }) + }) + ;(middleware as any)(err, req, res) + })) - it('falls back to default if error code config is available', (done) => { - const err = new NotAcceptable() - const res = makeRes(406) - const middleware = errorHandler({ - logger: null, - html: { - default: (_err: any, _req: any, _res: any) => { - assert.equal(_err, err) - assert.equal(_req, req) - assert.equal(_res, res) - done() + it('falls back to default if error code config is available', () => + new Promise((resolve) => { + const err = new NotAcceptable() + const res = makeRes(406) + const middleware = errorHandler({ + logger: null, + html: { + default: (_err: any, _req: any, _res: any) => { + assert.equal(_err, err) + assert.equal(_req, req) + assert.equal(_res, res) + resolve() + } } - } - }) - ;(middleware as any)(err, req, res) - }) + }) + ;(middleware as any)(err, req, res) + })) }) describe('JSON handler', () => { @@ -147,60 +159,67 @@ describe('error-handler', () => { ) } - it('calls res.json by default', (done) => { - const err = new NotAuthenticated() - const middleware = errorHandler({ - logger: null, - json: {} - }) - const res = makeRes(401, { - json(obj: any) { - assert.deepEqual(obj, err.toJSON()) - done() - } - }) - ;(middleware as any)(err, req, res) - }) + it('calls res.json by default', () => + new Promise((resolve) => { + const err = new NotAuthenticated() + const middleware = errorHandler({ + logger: null, + json: {} + }) + const res = makeRes(401, { + json(obj: any) { + assert.deepEqual(obj, err.toJSON()) + resolve() + } + }) + ;(middleware as any)(err, req, res) + })) - it('if the value is a function, calls as middleware ', (done) => { - const err = new PaymentError() - const res = makeRes(402) - const middleware = errorHandler({ - logger: null, - json: { - 402: (_err: any, _req: any, _res: any) => { - assert.equal(_err, err) - assert.equal(_req, req) - assert.equal(_res, res) - done() + it('if the value is a function, calls as middleware ', () => + new Promise((resolve) => { + const err = new PaymentError() + const res = makeRes(402) + const middleware = errorHandler({ + logger: null, + json: { + 402: (_err: any, _req: any, _res: any) => { + assert.equal(_err, err) + assert.equal(_req, req) + assert.equal(_res, res) + resolve() + } } - } - }) - ;(middleware as any)(err, req, res) - }) + }) + ;(middleware as any)(err, req, res) + })) - it('falls back to default if error code config is available', (done) => { - const err = new NotAcceptable() - const res = makeRes(406) - const middleware = errorHandler({ - logger: null, - json: { - default: (_err: any, _req: any, _res: any) => { - assert.equal(_err, err) - assert.equal(_req, req) - assert.equal(_res, res) - done() + it('falls back to default if error code config is available', () => + new Promise((resolve) => { + const err = new NotAcceptable() + const res = makeRes(406) + const middleware = errorHandler({ + logger: null, + json: { + default: (_err: any, _req: any, _res: any) => { + assert.equal(_err, err) + assert.equal(_req, req) + assert.equal(_res, res) + resolve() + } } - } - }) - ;(middleware as any)(err, req, res) - }) + }) + ;(middleware as any)(err, req, res) + })) }) }) - describe('use as app error handler', function () { - before(function () { - this.app = express() + describe('use as app error handler', async () => { + let app: Application + let server: Server + const port = await getPort() + + beforeAll(async () => { + app = express() .get('/error', function (_req: Request, _res: Response, next: NextFunction) { next(new Error('Something went wrong')) }) @@ -233,18 +252,21 @@ describe('error-handler', () => { }) ) - this.server = this.app.listen(5050) + server = app.listen(port) }) - after(function (done) { - this.server.close(done) - }) + afterAll( + () => + new Promise((resolve) => { + server.close(() => resolve()) + }) + ) describe('converts an non-feathers error', () => { it('is an instance of GeneralError', async () => { try { await axios({ - url: 'http://localhost:5050/error', + url: `http://localhost:${port}/error`, responseType: 'json' }) assert.fail('Should never get here') @@ -261,50 +283,52 @@ describe('error-handler', () => { }) describe('text/html format', () => { - it('serves a 404.html', (done) => { - fs.readFile(join(__dirname, '..', 'public', '404.html'), async function (_err, html) { - try { - await axios({ - url: 'http://localhost:5050/path/to/nowhere', - headers: { - 'Content-Type': 'text/html', - Accept: 'text/html' - } - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.equal(error.response.status, 404) - assert.equal(error.response.data, html.toString()) - done() - } - }) - }) + it('serves a 404.html', () => + new Promise((resolve) => { + fs.readFile(join(__dirname, '..', 'public', '404.html'), async function (_err, html) { + try { + await axios({ + url: `http://localhost:${port}/path/to/nowhere`, + headers: { + 'Content-Type': 'text/html', + Accept: 'text/html' + } + }) + assert.fail('Should never get here') + } catch (error: any) { + assert.equal(error.response.status, 404) + assert.equal(error.response.data, html.toString()) + resolve() + } + }) + })) - it('serves a 500.html', (done) => { - fs.readFile(join(__dirname, '..', 'public', 'default.html'), async function (_err, html) { - try { - await axios({ - url: 'http://localhost:5050/error', - headers: { - 'Content-Type': 'text/html', - Accept: 'text/html' - } - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.equal(error.response.status, 500) - assert.equal(error.response.data, html.toString()) - done() - } - }) - }) + it('serves a 500.html', () => + new Promise((resolve) => { + fs.readFile(join(__dirname, '..', 'public', 'default.html'), async function (_err, html) { + try { + await axios({ + url: `http://localhost:${port}/error`, + headers: { + 'Content-Type': 'text/html', + Accept: 'text/html' + } + }) + assert.fail('Should never get here') + } catch (error: any) { + assert.equal(error.response.status, 500) + assert.equal(error.response.data, html.toString()) + resolve() + } + }) + })) }) describe('application/json format', () => { it('500', async () => { try { await axios({ - url: 'http://localhost:5050/error', + url: `http://localhost:${port}/error`, headers: { 'Content-Type': 'application/json', Accept: 'application/json' @@ -325,7 +349,7 @@ describe('error-handler', () => { it('404', async () => { try { await axios({ - url: 'http://localhost:5050/path/to/nowhere', + url: `http://localhost:${port}/path/to/nowhere`, headers: { 'Content-Type': 'application/json', Accept: 'application/json' @@ -346,7 +370,7 @@ describe('error-handler', () => { it('400', async () => { try { await axios({ - url: 'http://localhost:5050/bad-request', + url: `http://localhost:${port}/bad-request`, headers: { 'Content-Type': 'application/json', Accept: 'application/json' @@ -375,7 +399,7 @@ describe('error-handler', () => { it('returns JSON by default', async () => { try { - await axios('http://localhost:5050/bad-request') + await axios(`http://localhost:${port}/bad-request`) assert.fail('Should never get here') } catch (error: any) { assert.equal(error.response.status, 400) diff --git a/packages/express/test/index.test.ts b/packages/express/test/index.test.ts index b22566f22d..441da5164d 100644 --- a/packages/express/test/index.test.ts +++ b/packages/express/test/index.test.ts @@ -9,6 +9,7 @@ import { feathers, HookContext, Id } from '@feathersjs/feathers' import { default as feathersExpress, rest, notFound, errorHandler, original, serveStatic } from '../src' import { RequestListener } from 'http' +import getPort from 'get-port' describe('@feathersjs/express', () => { const service = { @@ -243,49 +244,52 @@ describe('@feathersjs/express', () => { }) }) - it('Works with HTTPS', (done) => { - const todoService = { - async get(name: Id) { - return { - id: name, - description: `You have to do ${name}!` + it('Works with HTTPS', () => + new Promise(async (resolve, reject) => { + const todoService = { + async get(name: Id) { + return { + id: name, + description: `You have to do ${name}!` + } } } - } - const app = feathersExpress(feathers()).configure(rest()) + const app = feathersExpress(feathers()).configure(rest()) - app.use('/secureTodos', todoService) + app.use('/secureTodos', todoService) - const httpsServer = https - .createServer( - { - key: fs.readFileSync(path.join(__dirname, '..', '..', 'tests', 'resources', 'privatekey.pem')), - cert: fs.readFileSync(path.join(__dirname, '..', '..', 'tests', 'resources', 'certificate.pem')), - rejectUnauthorized: false, - requestCert: false - }, - app as unknown as RequestListener - ) - .listen(7889) + const port = await getPort() - app.setup(httpsServer) + const httpsServer = https + .createServer( + { + key: fs.readFileSync(path.join(__dirname, '..', '..', 'tests', 'resources', 'privatekey.pem')), + cert: fs.readFileSync(path.join(__dirname, '..', '..', 'tests', 'resources', 'certificate.pem')), + rejectUnauthorized: false, + requestCert: false + }, + app as unknown as RequestListener + ) + .listen(port) - httpsServer.on('listening', function () { - const instance = axios.create({ - httpsAgent: new https.Agent({ - rejectUnauthorized: false - }) - }) + app.setup(httpsServer) - instance - .get('https://localhost:7889/secureTodos/dishes') - .then((response) => { - assert.ok(response.status === 200, 'Got OK status code') - assert.strictEqual(response.data.description, 'You have to do dishes!') - httpsServer.close(() => done()) + httpsServer.on('listening', function () { + const instance = axios.create({ + httpsAgent: new https.Agent({ + rejectUnauthorized: false + }) }) - .catch(done) - }) - }) + + instance + .get(`https://localhost:${port}/secureTodos/dishes`) + .then((response) => { + assert.ok(response.status === 200, 'Got OK status code') + assert.strictEqual(response.data.description, 'You have to do dishes!') + httpsServer.close(() => resolve()) + }) + .catch(reject) + }) + })) }) diff --git a/packages/express/test/not-found-handler.test.ts b/packages/express/test/not-found-handler.test.ts index 89db3cf1bd..b6301b8232 100644 --- a/packages/express/test/not-found-handler.test.ts +++ b/packages/express/test/not-found-handler.test.ts @@ -6,39 +6,41 @@ import { notFound } from '../src' const handler = notFound as any describe('not-found-handler', () => { - it('returns NotFound error', (done) => { - handler()( - { - url: 'some/where', - headers: {} - }, - {}, - function (error: any) { - assert.ok(error instanceof NotFound) - assert.equal(error.message, 'Page not found') - assert.deepEqual(error.data, { - url: 'some/where' - }) - done() - } - ) - }) + it('returns NotFound error', () => + new Promise((resolve) => { + handler()( + { + url: 'some/where', + headers: {} + }, + {}, + function (error: any) { + assert.ok(error instanceof NotFound) + assert.equal(error.message, 'Page not found') + assert.deepEqual(error.data, { + url: 'some/where' + }) + resolve() + } + ) + })) - it('returns NotFound error with URL when verbose', (done) => { - handler({ verbose: true })( - { - url: 'some/where', - headers: {} - }, - {}, - function (error: any) { - assert.ok(error instanceof NotFound) - assert.equal(error.message, 'Page not found: some/where') - assert.deepEqual(error.data, { - url: 'some/where' - }) - done() - } - ) - }) + it('returns NotFound error with URL when verbose', () => + new Promise((resolve) => { + handler({ verbose: true })( + { + url: 'some/where', + headers: {} + }, + {}, + function (error: any) { + assert.ok(error instanceof NotFound) + assert.equal(error.message, 'Page not found: some/where') + assert.deepEqual(error.data, { + url: 'some/where' + }) + resolve() + } + ) + })) }) diff --git a/packages/express/test/rest.test.ts b/packages/express/test/rest.test.ts index ddc9ff8574..61dbc948ba 100644 --- a/packages/express/test/rest.test.ts +++ b/packages/express/test/rest.test.ts @@ -1,11 +1,12 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ import { strict as assert } from 'assert' import axios, { AxiosRequestConfig } from 'axios' +import getPort from 'get-port' import { Server } from 'http' import { Request, Response, NextFunction } from 'express' import { ApplicationHookMap, feathers, HookContext, Id, Params } from '@feathersjs/feathers' -import { Service, restTests } from '@feathersjs/tests' +import { Service, restTests } from '@feathersjs/tests-vitest' import { BadRequest } from '@feathersjs/errors' import * as express from '../src' @@ -50,9 +51,10 @@ describe('@feathersjs/express/rest provider', () => { } }) - const server = await app.listen(4776) + const port = await getPort() + const server = await app.listen(port) - const res = await axios.get('http://localhost:4776/todo/dishes') + const res = await axios.get(`http://localhost:${port}/todo/dishes`) assert.strictEqual(res.data, 'The todo is: You have to do dishes') server.close() @@ -82,10 +84,11 @@ describe('@feathersjs/express/rest provider', () => { }) }) - describe('CRUD', () => { + describe('CRUD', async () => { let app: express.Application + const port = await getPort() - before(async () => { + beforeAll(async () => { app = expressify(feathers()) .use(express.cors()) .use(express.json()) @@ -117,14 +120,14 @@ describe('@feathersjs/express/rest provider', () => { ] } as ApplicationHookMap) - await app.listen(4777, () => app.use('tasks', new Service())) + await app.listen(port, () => app.use('tasks', new Service())) }) - after(() => app.teardown()) + afterAll(() => app.teardown()) - restTests('Services', 'todo', 4777) - restTests('Root Service', '/', 4777) - restTests('Dynamic Services', 'tasks', 4777) + restTests('Services', 'todo', port) + restTests('Root Service', '/', port) + restTests('Dynamic Services', 'tasks', port) describe('res.hook', () => { const convertHook = (hook: HookContext) => { @@ -167,7 +170,7 @@ describe('@feathersjs/express/rest provider', () => { } }) - const res = await axios.get('http://localhost:4777/hook/dishes?test=param') + const res = await axios.get(`http://localhost:${port}/hook/dishes?test=param`) const paramsWithHeaders = { ...params, headers: res.data.params.headers @@ -203,7 +206,7 @@ describe('@feathersjs/express/rest provider', () => { } }) - const res = await axios.get('http://localhost:4777/hook-dispatch/dishes') + const res = await axios.get(`http://localhost:${port}/hook-dispatch/dishes`) assert.deepStrictEqual(res.data, { id: 'dishes', fromDispatch: true @@ -223,7 +226,7 @@ describe('@feathersjs/express/rest provider', () => { } }) - const res = await axios.get('http://localhost:4777/hook-status/dishes') + const res = await axios.get(`http://localhost:${port}/hook-status/dishes`) assert.strictEqual(res.status, 206) }) @@ -241,7 +244,7 @@ describe('@feathersjs/express/rest provider', () => { } }) - const res = await axios.get('http://localhost:4777/hook-headers/dishes') + const res = await axios.get(`http://localhost:${port}/hook-headers/dishes`) assert.strictEqual(res.headers.foo, 'first') assert.strictEqual(res.headers.bar, 'second, third') @@ -270,7 +273,7 @@ describe('@feathersjs/express/rest provider', () => { }) try { - await axios('http://localhost:4777/hook-error/dishes') + await axios(`http://localhost:${port}/hook-error/dishes`) assert.fail('Should never get here') } catch (error: any) { const { data } = error.response @@ -311,9 +314,10 @@ describe('@feathersjs/express/rest provider', () => { }) .configure(rest(express.formatter)) .use('service', service) - const server = await app.listen(4778) + const port = await getPort() + const server = await app.listen(port) - const res = await axios.get('http://localhost:4778/service/bla?some=param&another=thing') + const res = await axios.get(`http://localhost:${port}/service/bla?some=param&another=thing`) const expected = { headers: res.data.headers, test: 'Happy', @@ -350,9 +354,10 @@ describe('@feathersjs/express/rest provider', () => { } }) - const server = await app.listen(4775) + const port = await getPort() + const server = await app.listen(port) const res = await axios({ - url: 'http://localhost:4775/todo', + url: `http://localhost:${port}/todo`, method: 'post', data, headers: { @@ -395,8 +400,9 @@ describe('@feathersjs/express/rest provider', () => { } ) - const server = await app.listen(4776) - const res = await axios.post('http://localhost:4776/todo', { + const port = await getPort() + const server = await app.listen(port) + const res = await axios.post(`http://localhost:${port}/todo`, { text: 'Do dishes' }) @@ -443,8 +449,9 @@ describe('@feathersjs/express/rest provider', () => { } ) - const server = await app.listen(4776) - const res = await axios.post('http://localhost:4776/todo', { + const port = await getPort() + const server = await app.listen(port) + const res = await axios.post(`http://localhost:${port}/todo`, { text: 'Do dishes' }) @@ -474,8 +481,9 @@ describe('@feathersjs/express/rest provider', () => { ] app.use(express.json()).configure(rest()).use('/array-middleware', middlewareArray) - const server = await app.listen(4776) - const res = await axios.post('http://localhost:4776/array-middleware', { + const port = await getPort() + const server = await app.listen(port) + const res = await axios.post(`http://localhost:${port}/array-middleware`, { text: 'Do dishes' }) @@ -489,8 +497,9 @@ describe('@feathersjs/express/rest provider', () => { res.json(data) ) - const server = await app.listen(7988) - const res = await axios.get('http://localhost:7988/test') + const port = await getPort() + const server = await app.listen(port) + const res = await axios.get(`http://localhost:${port}/test`) assert.deepStrictEqual(res.data, data) server.close() @@ -500,8 +509,9 @@ describe('@feathersjs/express/rest provider', () => { describe('HTTP status codes', () => { let app: express.Application let server: Server + let port: number - before(async () => { + beforeAll(async () => { app = expressify(feathers()) .configure(rest(express.formatter)) .use('todo', { @@ -537,13 +547,15 @@ describe('@feathersjs/express/rest provider', () => { res.json({ message: error.message }) }) - server = await app.listen(4780) + port = await getPort() + + server = await app.listen(port) }) - after((done) => server.close(done)) + afterAll(() => new Promise((resolve) => server.close(() => resolve()))) it('throws a 405 for undefined service methods (#99)', async () => { - const res = await axios.get('http://localhost:4780/todo/dishes') + const res = await axios.get(`http://localhost:${port}/todo/dishes`) assert.ok(res.status === 200, 'Got OK status code for .get') assert.deepStrictEqual( @@ -555,7 +567,7 @@ describe('@feathersjs/express/rest provider', () => { ) try { - await axios.post('http://localhost:4780/todo') + await axios.post(`http://localhost:${port}/todo`) assert.fail('Should never get here') } catch (error: any) { assert.ok(error.response.status === 405, 'Got 405 for .create') @@ -571,7 +583,7 @@ describe('@feathersjs/express/rest provider', () => { it('throws a 404 for undefined route', async () => { try { - await axios.get('http://localhost:4780/todo/foo/bar') + await axios.get(`http://localhost:${port}/todo/foo/bar`) assert.fail('Should never get here') } catch (error: any) { assert.ok(error.response.status === 404, 'Got Not Found code') @@ -579,7 +591,7 @@ describe('@feathersjs/express/rest provider', () => { }) it('empty response sets 204 status codes, does not run other middleware (#391)', async () => { - const res = await axios.get('http://localhost:4780/todo') + const res = await axios.get(`http://localhost:${port}/todo`) assert.ok(res.status === 204, 'Got empty status code') }) @@ -588,8 +600,9 @@ describe('@feathersjs/express/rest provider', () => { describe('route parameters', () => { let server: Server let app: express.Application + let port: number - before(async () => { + beforeAll(async () => { app = expressify(feathers()) .configure(rest()) .use('/:appId/:id/todo', { @@ -606,10 +619,11 @@ describe('@feathersjs/express/rest provider', () => { }) .use(errorHandler) - server = await app.listen(6880) + port = await getPort() + server = await app.listen(port) }) - after((done) => server.close(done)) + afterAll(() => new Promise((resolve) => server.close(() => resolve()))) it('adds route params as `params.route` and allows id property (#76, #407)', async () => { const expected = { @@ -620,7 +634,7 @@ describe('@feathersjs/express/rest provider', () => { } } - const res = await axios.get(`http://localhost:6880/theApp/myId/todo/${expected.id}`) + const res = await axios.get(`http://localhost:${port}/theApp/myId/todo/${expected.id}`) assert.ok(res.status === 200, 'Got OK status code') assert.deepStrictEqual(expected, res.data) @@ -628,7 +642,7 @@ describe('@feathersjs/express/rest provider', () => { it('properly serializes error for nested routes (#1096)', async () => { try { - await axios.get('http://localhost:6880/theApp/myId/todo/test?error=true') + await axios.get(`http://localhost:${port}/theApp/myId/todo/test?error=true`) assert.fail('Should never het here') } catch (error: any) { const { response } = error @@ -647,8 +661,9 @@ describe('@feathersjs/express/rest provider', () => { describe('Custom methods', () => { let server: Server let app: express.Application + let port: number - before(async () => { + beforeAll(async () => { app = expressify(feathers()) .use(express.json()) .configure(rest()) @@ -657,14 +672,15 @@ describe('@feathersjs/express/rest provider', () => { }) .use(errorHandler) - server = await app.listen(4781) + port = await getPort() + server = await app.listen(port) }) - after((done) => server.close(done)) + afterAll(() => new Promise((resolve) => server.close(() => resolve()))) it('calls .customMethod with X-Service-Method header', async () => { const payload = { text: 'Do dishes' } - const res = await axios.post('http://localhost:4781/todo', payload, { + const res = await axios.post(`http://localhost:${port}/todo`, payload, { headers: { 'X-Service-Method': 'customMethod' } @@ -680,7 +696,7 @@ describe('@feathersjs/express/rest provider', () => { it('throws MethodNotImplement for .setup, non option and default methods', async () => { const options: AxiosRequestConfig = { method: 'POST', - url: 'http://localhost:4781/todo', + url: `http://localhost:${port}/todo`, data: { text: 'Do dishes' } } const testMethod = (name: string) => { diff --git a/packages/express/vite.config.ts b/packages/express/vite.config.ts new file mode 100644 index 0000000000..5381f73f70 --- /dev/null +++ b/packages/express/vite.config.ts @@ -0,0 +1,3 @@ +import vitest from '../../vitest.config.template' + +export default vitest diff --git a/packages/feathers/LICENSE b/packages/feathers/LICENSE index 887338c4f0..7712f870f3 100644 --- a/packages/feathers/LICENSE +++ b/packages/feathers/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2023 Feathers Contributors +Copyright (c) 2024 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/feathers/README.md b/packages/feathers/README.md index 29b8ef6b56..d4fe7845d0 100644 --- a/packages/feathers/README.md +++ b/packages/feathers/README.md @@ -28,6 +28,6 @@ To learn more about Feathers visit the website at [feathersjs.com](http://feathe ## License -Copyright (c) 2023 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/feathers/package.json b/packages/feathers/package.json index d818cbd8f6..1b7654c7d1 100644 --- a/packages/feathers/package.json +++ b/packages/feathers/package.json @@ -49,7 +49,7 @@ "publish": "npm run reset-version", "pack": "npm pack --pack-destination ../generators/test/build", "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "mocha --config ../../.mocharc.json --recursive test/" + "test": "vitest run" }, "engines": { "node": ">= 12" @@ -63,12 +63,10 @@ "events": "^3.3.0" }, "devDependencies": { - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", - "mocha": "^10.3.0", + "@types/node": "^20.11.30", "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" } diff --git a/packages/feathers/test/application.test.ts b/packages/feathers/test/application.test.ts index ea5a937741..0f6c76c9eb 100644 --- a/packages/feathers/test/application.test.ts +++ b/packages/feathers/test/application.test.ts @@ -16,17 +16,18 @@ describe('Feathers application', () => { assert.ok(app.version > '5.0.0') }) - it('is an event emitter', (done) => { - const app = feathers() - const original = { hello: 'world' } + it('is an event emitter', () => + new Promise((resolve) => { + const app = feathers() + const original = { hello: 'world' } - app.on('test', (data: any) => { - assert.deepStrictEqual(original, data) - done() - }) + app.on('test', (data: any) => { + assert.deepStrictEqual(original, data) + resolve() + }) - app.emit('test', original) - }) + app.emit('test', original) + })) it('uses .defaultService if available', async () => { const app = feathers() @@ -55,12 +56,13 @@ describe('Feathers application', () => { }) }) - it('additionally passes `app` as .configure parameter (#558)', (done) => { - feathers().configure(function (app) { - assert.strictEqual(this, app) - done() - }) - }) + it('additionally passes `app` as .configure parameter (#558)', () => + new Promise((resolve) => { + feathers().configure(function (app) { + assert.strictEqual(this, app) + resolve() + }) + })) describe('Services', () => { it('calling .use with invalid path throws', () => { @@ -190,45 +192,46 @@ describe('Feathers application', () => { assert.deepStrictEqual(result, { id: 'test' }) }) - it('services can be re-used (#566)', (done) => { - const service = { - async create(data: any) { - return data + it('services can be re-used (#566)', () => + new Promise((resolve) => { + const service = { + async create(data: any) { + return data + } } - } - const app1 = feathers<{ dummy: typeof service; testing: any }>() - const app2 = feathers<{ dummy: typeof service; testing: any }>() + const app1 = feathers<{ dummy: typeof service; testing: any }>() + const app2 = feathers<{ dummy: typeof service; testing: any }>() - app2.use('dummy', { - async create(data: any) { - return data - } - }) + app2.use('dummy', { + async create(data: any) { + return data + } + }) - const dummy = app2.service('dummy') + const dummy = app2.service('dummy') - dummy.hooks({ - before: { - create: [ - (hook) => { - hook.data.fromHook = true - } - ] - } - }) + dummy.hooks({ + before: { + create: [ + (hook) => { + hook.data.fromHook = true + } + ] + } + }) - dummy.on('created', (data: any) => { - assert.deepStrictEqual(data, { - message: 'Hi', - fromHook: true + dummy.on('created', (data: any) => { + assert.deepStrictEqual(data, { + message: 'Hi', + fromHook: true + }) + resolve() }) - done() - }) - app1.use('testing', app2.service('dummy')) + app1.use('testing', app2.service('dummy')) - app1.service('testing').create({ message: 'Hi' }) - }) + app1.service('testing').create({ message: 'Hi' }) + })) it('async hooks run before regular hooks', async () => { const service = { @@ -406,20 +409,21 @@ describe('Feathers application', () => { assert.strictEqual(teardownCount, 2) }) - it('registering app.setup but while still pending will be set up', (done) => { - const app = feathers() + it('registering app.setup but while still pending will be set up', () => + new Promise((resolve) => { + const app = feathers() - app.setup() + app.setup() - app.use('/dummy', { - async setup(appRef: any, path: any) { - assert.ok((app as any)._isSetup) - assert.strictEqual(appRef, app) - assert.strictEqual(path, 'dummy') - done() - } - }) - }) + app.use('/dummy', { + async setup(appRef: any, path: any) { + assert.ok((app as any)._isSetup) + assert.strictEqual(appRef, app) + assert.strictEqual(path, 'dummy') + resolve() + } + }) + })) }) describe('.teardown', () => { @@ -507,62 +511,63 @@ describe('Feathers application', () => { }) describe('sub apps', () => { - it('re-registers sub-app services with prefix', (done) => { - const app = feathers() - const subApp = feathers() - - subApp - .use('/service1', { - async get(id: string) { - return { - id, - name: 'service1' + it('re-registers sub-app services with prefix', () => + new Promise((resolve) => { + const app = feathers() + const subApp = feathers() + + subApp + .use('/service1', { + async get(id: string) { + return { + id, + name: 'service1' + } } - } - }) - .use('/service2', { - async get(id: string) { - return { - id, - name: 'service2' + }) + .use('/service2', { + async get(id: string) { + return { + id, + name: 'service2' + } + }, + + async create(data: any) { + return data } - }, - - async create(data: any) { - return data - } - }) - - app.use('/api/', subApp) + }) - app.service('/api/service2').once('created', (data: any) => { - assert.deepStrictEqual(data, { - message: 'This is a test' - }) + app.use('/api/', subApp) - subApp.service('service2').once('created', (data: any) => { + app.service('/api/service2').once('created', (data: any) => { assert.deepStrictEqual(data, { - message: 'This is another test' + message: 'This is a test' }) - done() - }) + subApp.service('service2').once('created', (data: any) => { + assert.deepStrictEqual(data, { + message: 'This is another test' + }) - app.service('api/service2').create({ - message: 'This is another test' + resolve() + }) + + app.service('api/service2').create({ + message: 'This is another test' + }) }) - }) - ;(async () => { - let data = await app.service('/api/service1').get(10) - assert.strictEqual(data.name, 'service1') + ;(async () => { + let data = await app.service('/api/service1').get(10) + assert.strictEqual(data.name, 'service1') - data = await app.service('/api/service2').get(1) - assert.strictEqual(data.name, 'service2') + data = await app.service('/api/service2').get(1) + assert.strictEqual(data.name, 'service2') - await subApp.service('service2').create({ - message: 'This is a test' - }) - })() - }) + await subApp.service('service2').create({ + message: 'This is a test' + }) + })() + })) }) }) diff --git a/packages/feathers/test/events.test.ts b/packages/feathers/test/events.test.ts index 58e6b7f245..e58f1f45c7 100644 --- a/packages/feathers/test/events.test.ts +++ b/packages/feathers/test/events.test.ts @@ -4,134 +4,141 @@ import { EventEmitter } from 'events' import { feathers } from '../src' describe('Service events', () => { - it('app is an event emitter', (done) => { - const app = feathers() + it('app is an event emitter', () => + new Promise((resolve) => { + const app = feathers() - assert.strictEqual(typeof app.on, 'function') + assert.strictEqual(typeof app.on, 'function') - app.on('test', (data: any) => { - assert.deepStrictEqual(data, { message: 'app' }) - done() - }) - app.emit('test', { message: 'app' }) - }) + app.on('test', (data: any) => { + assert.deepStrictEqual(data, { message: 'app' }) + resolve() + }) + app.emit('test', { message: 'app' }) + })) - it('works with service that is already an EventEmitter', (done) => { - const app = feathers() - const service: any = new EventEmitter() + it('works with service that is already an EventEmitter', () => + new Promise((resolve) => { + const app = feathers() + const service: any = new EventEmitter() - service.create = async function (data: any) { - return data - } + service.create = async function (data: any) { + return data + } - service.on('created', (data: any) => { - assert.deepStrictEqual(data, { - message: 'testing' + service.on('created', (data: any) => { + assert.deepStrictEqual(data, { + message: 'testing' + }) + resolve() }) - done() - }) - app.use('/emitter', service) + app.use('/emitter', service) - app.service('emitter').create({ - message: 'testing' - }) - }) + app.service('emitter').create({ + message: 'testing' + }) + })) describe('emits event data on a service', () => { - it('.create and created', (done) => { - const app = feathers().use('/creator', { - async create(data: any) { - return data - } - }) + it('.create and created', () => + new Promise((resolve) => { + const app = feathers().use('/creator', { + async create(data: any) { + return data + } + }) - const service = app.service('creator') + const service = app.service('creator') - service.on('created', (data: any) => { - assert.deepStrictEqual(data, { message: 'Hello' }) - done() - }) + service.on('created', (data: any) => { + assert.deepStrictEqual(data, { message: 'Hello' }) + resolve() + }) - service.create({ message: 'Hello' }) - }) + service.create({ message: 'Hello' }) + })) - it('allows to skip event emitting', (done) => { - const app = feathers().use('/creator', { - async create(data: any) { - return data - } - }) + it('allows to skip event emitting', () => + new Promise((resolve, reject) => { + const app = feathers().use('/creator', { + async create(data: any) { + return data + } + }) - const service = app.service('creator') + const service = app.service('creator') - service.hooks({ - before: { - create(context: any) { - context.event = null + service.hooks({ + before: { + create(context: any) { + context.event = null - return context + return context + } } - } - }) + }) - service.on('created', () => { - done(new Error('Should never get here')) - }) + service.on('created', () => { + reject(new Error('Should never get here')) + }) - service.create({ message: 'Hello' }).then(() => done()) - }) + service.create({ message: 'Hello' }).then(() => resolve()) + })) - it('.update and updated', (done) => { - const app = feathers().use('/creator', { - async update(id: any, data: any) { - return Object.assign({ id }, data) - } - }) + it('.update and updated', () => + new Promise((resolve) => { + const app = feathers().use('/creator', { + async update(id: any, data: any) { + return Object.assign({ id }, data) + } + }) - const service = app.service('creator') + const service = app.service('creator') - service.on('updated', (data: any) => { - assert.deepStrictEqual(data, { id: 10, message: 'Hello' }) - done() - }) + service.on('updated', (data: any) => { + assert.deepStrictEqual(data, { id: 10, message: 'Hello' }) + resolve() + }) - service.update(10, { message: 'Hello' }) - }) + service.update(10, { message: 'Hello' }) + })) - it('.patch and patched', (done) => { - const app = feathers().use('/creator', { - async patch(id: any, data: any) { - return Object.assign({ id }, data) - } - }) + it('.patch and patched', () => + new Promise((resolve) => { + const app = feathers().use('/creator', { + async patch(id: any, data: any) { + return Object.assign({ id }, data) + } + }) - const service = app.service('creator') + const service = app.service('creator') - service.on('patched', (data: any) => { - assert.deepStrictEqual(data, { id: 12, message: 'Hello' }) - done() - }) + service.on('patched', (data: any) => { + assert.deepStrictEqual(data, { id: 12, message: 'Hello' }) + resolve() + }) - service.patch(12, { message: 'Hello' }) - }) + service.patch(12, { message: 'Hello' }) + })) - it('.remove and removed', (done) => { - const app = feathers().use('/creator', { - async remove(id: any) { - return { id } - } - }) + it('.remove and removed', () => + new Promise((resolve) => { + const app = feathers().use('/creator', { + async remove(id: any) { + return { id } + } + }) - const service = app.service('creator') + const service = app.service('creator') - service.on('removed', (data: any) => { - assert.deepStrictEqual(data, { id: 22 }) - done() - }) + service.on('removed', (data: any) => { + assert.deepStrictEqual(data, { id: 22 }) + resolve() + }) - service.remove(22) - }) + service.remove(22) + })) }) describe('emits event data arrays on a service', () => { @@ -268,54 +275,56 @@ describe('Service events', () => { }) describe('event format', () => { - it('also emits the actual hook object', (done) => { - const app = feathers().use('/creator', { - async create(data: any) { - return data - } - }) + it('also emits the actual hook object', () => + new Promise((resolve, reject) => { + const app = feathers().use('/creator', { + async create(data: any) { + return data + } + }) - const service = app.service('creator') + const service = app.service('creator') - service.hooks({ - after(hook: any) { - hook.changed = true - } - }) + service.hooks({ + after(hook: any) { + hook.changed = true + } + }) - service.on('created', (data: any, hook: any) => { - try { - assert.deepStrictEqual(data, { message: 'Hi' }) - assert.ok(hook.changed) - assert.strictEqual(hook.service, service) - assert.strictEqual(hook.method, 'create') - assert.strictEqual(hook.type, 'around') - done() - } catch (error: any) { - done(error) - } - }) + service.on('created', (data: any, hook: any) => { + try { + assert.deepStrictEqual(data, { message: 'Hi' }) + assert.ok(hook.changed) + assert.strictEqual(hook.service, service) + assert.strictEqual(hook.method, 'create') + assert.strictEqual(hook.type, 'around') + resolve() + } catch (error: any) { + reject(error) + } + }) - service.create({ message: 'Hi' }) - }) + service.create({ message: 'Hi' }) + })) - it('events indicated by the service are not sent automatically', (done) => { - class Creator { - events = ['created'] - async create(data: any) { - return data + it('events indicated by the service are not sent automatically', () => + new Promise((resolve) => { + class Creator { + events = ['created'] + async create(data: any) { + return data + } } - } - const app = feathers().use('/creator', new Creator()) - const service = app.service('creator') + const app = feathers().use('/creator', new Creator()) + const service = app.service('creator') - service.on('created', (data: any) => { - assert.deepStrictEqual(data, { message: 'custom event' }) - done() - }) + service.on('created', (data: any) => { + assert.deepStrictEqual(data, { message: 'custom event' }) + resolve() + }) - service.create({ message: 'hello' }) - service.emit('created', { message: 'custom event' }) - }) + service.create({ message: 'hello' }) + service.emit('created', { message: 'custom event' }) + })) }) }) diff --git a/packages/feathers/vite.config.ts b/packages/feathers/vite.config.ts new file mode 100644 index 0000000000..5381f73f70 --- /dev/null +++ b/packages/feathers/vite.config.ts @@ -0,0 +1,3 @@ +import vitest from '../../vitest.config.template' + +export default vitest diff --git a/packages/generators/README.md b/packages/generators/README.md index 31f0d844e1..eca4bc0a6e 100644 --- a/packages/generators/README.md +++ b/packages/generators/README.md @@ -17,6 +17,6 @@ Refer to the [Feathers CLI guide](https://feathersjs.com/guides/cli/) for more d ## License -Copyright (c) 2023 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/generators/package.json b/packages/generators/package.json index cba7878bc9..86bd964055 100644 --- a/packages/generators/package.json +++ b/packages/generators/package.json @@ -44,7 +44,7 @@ "scripts": { "prepublish": "npm run compile", "compile": "shx rm -rf lib/ && tsc && shx cp -r src/. lib/", - "test": "npm run compile && mocha --config ../../.mocharc.json --require tsx --recursive test/**.test.ts test/**/*.test.ts" + "test": "npm run compile && vitest run" }, "directories": { "lib": "lib" @@ -57,7 +57,8 @@ "chalk": "^5.3.0", "lodash": "^4.17.21", "prettier": "^3.2.5", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "devDependencies": { "@feathersjs/adapter-commons": "^5.0.24", @@ -77,21 +78,19 @@ "@feathersjs/socketio": "^5.0.24", "@feathersjs/transport-commons": "^5.0.24", "@feathersjs/typebox": "^5.0.24", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", + "@types/node": "^20.11.30", "@types/prettier": "^2.7.3", - "axios": "^1.6.7", + "axios": "^1.6.8", "knex": "^3.1.0", - "mocha": "^10.3.0", "mongodb": "^6.5.0", "mssql": "^10.0.2", "mysql": "^2.18.1", "pg": "^8.11.3", "shx": "^0.3.4", "sqlite3": "^5.1.7", - "tsx": "^4.7.1", - "type-fest": "^4.12.0", - "typescript": "^5.4.2" + "type-fest": "^4.13.1", + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" } diff --git a/packages/generators/src/app/templates/app.test.tpl.ts b/packages/generators/src/app/templates/app.test.tpl.ts index d0da71a985..605fd8d8f8 100644 --- a/packages/generators/src/app/templates/app.test.tpl.ts +++ b/packages/generators/src/app/templates/app.test.tpl.ts @@ -16,11 +16,11 @@ const appUrl = \`http://\${app.get('host')}:\${port}\` describe('Feathers application tests', () => { let server: Server - before(async () => { + beforeAll(async () => { server = await app.listen(port) }) - after(async () => { + afterAll(async () => { await app.teardown() }) diff --git a/packages/generators/src/authentication/templates/client.test.tpl.ts b/packages/generators/src/authentication/templates/client.test.tpl.ts index 7b4e648faa..d6422d0e3f 100644 --- a/packages/generators/src/authentication/templates/client.test.tpl.ts +++ b/packages/generators/src/authentication/templates/client.test.tpl.ts @@ -24,11 +24,11 @@ const appUrl = \`http://\${app.get('host')}:\${port}\` describe('application client tests', () => { const client = createClient(rest(appUrl).axios(axios)) - before(async () => { + beforeAll(async () => { await app.listen(port) }) - after(async () => { + afterAll(async () => { await app.teardown() }) diff --git a/packages/generators/test/generators.test.ts b/packages/generators/test/generators.test.ts index 40aa06c8d2..bad80f274f 100644 --- a/packages/generators/test/generators.test.ts +++ b/packages/generators/test/generators.test.ts @@ -41,7 +41,7 @@ describe('@feathersjs/generators', () => { let context: FeathersBaseContext let cwd: string - before(async () => { + beforeAll(async () => { cwd = await mkdtemp(path.join(os.tmpdir(), name + '-')) console.log(`\nGenerating test application to\n${cwd}\n\n`) diff --git a/packages/generators/vite.config.ts b/packages/generators/vite.config.ts new file mode 100644 index 0000000000..5381f73f70 --- /dev/null +++ b/packages/generators/vite.config.ts @@ -0,0 +1,3 @@ +import vitest from '../../vitest.config.template' + +export default vitest diff --git a/packages/knex/LICENSE b/packages/knex/LICENSE index 887338c4f0..7712f870f3 100644 --- a/packages/knex/LICENSE +++ b/packages/knex/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2023 Feathers Contributors +Copyright (c) 2024 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/knex/README.md b/packages/knex/README.md index 3d5d788ee4..61a9eb209d 100644 --- a/packages/knex/README.md +++ b/packages/knex/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers Knex adapter documentation](https://feathersjs.com/api/da ## License -Copyright (c) 2023 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/knex/package.json b/packages/knex/package.json index dafa0cb273..423c89dea4 100644 --- a/packages/knex/package.json +++ b/packages/knex/package.json @@ -42,7 +42,7 @@ "prepublish": "npm run compile", "pack": "npm pack --pack-destination ../generators/test/build", "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" + "test": "vitest run" }, "directories": { "lib": "lib" @@ -60,16 +60,16 @@ "knex": ">=3.1.0" }, "devDependencies": { - "@feathersjs/adapter-tests": "^5.0.24", + "@feathersjs/adapter-tests-vitest": "^5.0.24", "@feathersjs/schema": "^5.0.24", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", - "knex": "^3.1.0", - "mocha": "^10.3.0", + "@types/node": "^20.11.30", + "knex": "^3.0.1", + "@feathersjs/adapter-tests": "^5.0.24", "pg": "^8.11.3", "shx": "^0.3.4", "sqlite3": "^5.1.7", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" } diff --git a/packages/knex/test/index.test.ts b/packages/knex/test/index.test.ts index 7dbb736c38..30804b6858 100644 --- a/packages/knex/test/index.test.ts +++ b/packages/knex/test/index.test.ts @@ -1,7 +1,7 @@ import knex, { Knex } from 'knex' import assert from 'assert' import { feathers, HookContext, Service } from '@feathersjs/feathers' -import adapterTests from '@feathersjs/adapter-tests' +import adapterTests from '@feathersjs/adapter-tests-vitest' import { errors } from '@feathersjs/errors' import { Ajv, getValidator, querySyntax, hooks } from '@feathersjs/schema' @@ -235,14 +235,16 @@ describe('Feathers Knex Service', () => { find: [hooks.validateQuery(personQueryValidator)] } }) - before(() => { + beforeAll(async () => { if (TYPE === 'sqlite') { // Attach the public database to mimic a "schema" db.schema.raw(`attach database '${schemaName}.sqlite' as ${schemaName}`) } + + await clean() }) - before(clean) - after(clean) + + afterAll(clean) describe('$like method', () => { let charlie: Person @@ -717,8 +719,8 @@ describe('Feathers Knex Service', () => { assert.deepStrictEqual(got, todo) assert.deepStrictEqual(found, todo) - peopleService.remove(dave.id) - todoService.remove(todo.id) + await todoService.remove(todo.id) + await peopleService.remove(dave.id) }) }) diff --git a/packages/knex/test/overrides.test.ts b/packages/knex/test/overrides.test.ts index dcd0f1fad5..8470510c9e 100644 --- a/packages/knex/test/overrides.test.ts +++ b/packages/knex/test/overrides.test.ts @@ -77,11 +77,11 @@ describe('Feathers Knex Overridden Method With Self-Join', () => { .use('animals', animals) const animalService = app.service('animals') - before(() => { + beforeAll(() => { return db.schema.raw(`attach database '${schemaName}.sqlite' as ${schemaName}`) }) - before(clean) - after(clean) + beforeAll(clean) + afterAll(clean) beforeEach(async () => { ancestor = await animalService.create({ diff --git a/packages/knex/vite.config.ts b/packages/knex/vite.config.ts new file mode 100644 index 0000000000..5381f73f70 --- /dev/null +++ b/packages/knex/vite.config.ts @@ -0,0 +1,3 @@ +import vitest from '../../vitest.config.template' + +export default vitest diff --git a/packages/koa/README.md b/packages/koa/README.md index 8b05c90c87..3f0fba26dc 100644 --- a/packages/koa/README.md +++ b/packages/koa/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers Koa API documentation](https://feathersjs.com/api/koa.htm ## License -Copyright (c) 2023 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/koa/package.json b/packages/koa/package.json index dca975bd81..73510376e1 100644 --- a/packages/koa/package.json +++ b/packages/koa/package.json @@ -40,7 +40,7 @@ "prepublish": "npm run compile", "pack": "npm pack --pack-destination ../generators/test/build", "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" + "test": "vitest run" }, "directories": { "lib": "lib" @@ -56,10 +56,10 @@ "@feathersjs/transport-commons": "^5.0.24", "@koa/cors": "^5.0.0", "@types/koa": "^2.15.0", + "@types/koa__cors": "^5.0.0", "@types/koa-qs": "^2.0.3", "@types/koa-static": "^4.0.4", - "@types/koa__cors": "^5.0.0", - "koa": "^2.15.0", + "koa": "^2.15.2", "koa-body": "^6.0.1", "koa-compose": "^4.1.0", "koa-qs": "^3.0.0", @@ -68,15 +68,15 @@ "devDependencies": { "@feathersjs/authentication-local": "^5.0.24", "@feathersjs/memory": "^5.0.24", - "@feathersjs/tests": "^5.0.24", + "@feathersjs/tests-vitest": "^5.0.24", "@types/koa-compose": "^3.2.8", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", - "axios": "^1.6.7", - "mocha": "^10.3.0", + "@types/node": "^20.11.30", + "axios": "^1.6.8", + "get-port": "^7.1.0", + "@feathersjs/tests": "^5.0.24", "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" } diff --git a/packages/koa/test/authentication.test.ts b/packages/koa/test/authentication.test.ts index ffdf374bf2..89fc37a6ee 100644 --- a/packages/koa/test/authentication.test.ts +++ b/packages/koa/test/authentication.test.ts @@ -1,22 +1,25 @@ import { strict as assert } from 'assert' import _axios from 'axios' import { AuthenticationResult } from '@feathersjs/authentication' +import getPort from 'get-port' import app from './app.fixture' -const axios = _axios.create({ - baseURL: 'http://localhost:9776/' -}) - -describe('@feathersjs/koa/authentication', () => { +describe('@feathersjs/koa/authentication', async () => { const email = 'koatest@authentication.com' const password = 'superkoa' + const port = await getPort() + + const axios = _axios.create({ + baseURL: `http://localhost:${port}/` + }) + let authResult: AuthenticationResult let user: any - before(async () => { - await app.listen(9776) + beforeAll(async () => { + await app.listen(port) user = await app.service('users').create({ email, password }) authResult = ( await axios.post('/authentication', { @@ -27,7 +30,9 @@ describe('@feathersjs/koa/authentication', () => { ).data }) - after(() => app.teardown()) + afterAll(() => { + app.teardown() + }) describe('service authentication', () => { it('successful local authentication', () => { diff --git a/packages/koa/test/index.test.ts b/packages/koa/test/index.test.ts index 445b140230..6426d1216f 100644 --- a/packages/koa/test/index.test.ts +++ b/packages/koa/test/index.test.ts @@ -2,13 +2,15 @@ import { strict as assert } from 'assert' import Koa from 'koa' import axios from 'axios' import { ApplicationHookMap, feathers, Id } from '@feathersjs/feathers' -import { Service, restTests } from '@feathersjs/tests' +import { Service, restTests } from '@feathersjs/tests-vitest' import { koa, rest, Application, bodyParser, errorHandler } from '../src' +import getPort from 'get-port' -describe('@feathersjs/koa', () => { +describe('@feathersjs/koa', async () => { let app: Application + const port = await getPort() - before(async () => { + beforeAll(async () => { app = koa(feathers()) app.use(errorHandler()) app.use(bodyParser()) @@ -56,10 +58,10 @@ describe('@feathersjs/koa', () => { ] } as ApplicationHookMap) - await app.listen(8465) + await app.listen(port) }) - after(() => app.teardown()) + afterAll(() => app.teardown()) it('throws an error when initialized with invalid application', () => { try { @@ -99,7 +101,7 @@ describe('@feathersjs/koa', () => { }) it('starts as a Koa and Feathers application', async () => { - const { data } = await axios.get('http://localhost:8465/middleware') + const { data } = await axios.get(`http://localhost:${port}/middleware`) const todo = await app.service('todo').get('dishes', { query: {} }) @@ -117,7 +119,7 @@ describe('@feathersjs/koa', () => { }) it('supports custom service middleware', async () => { - const { data } = await axios.get('http://localhost:8465/todo/custom-middleware') + const { data } = await axios.get(`http://localhost:${port}/todo/custom-middleware`) assert.deepStrictEqual(data, { id: 'custom-middleware', @@ -127,7 +129,7 @@ describe('@feathersjs/koa', () => { it('works with custom methods that are allowed', async () => { const { data } = await axios.post( - 'http://localhost:8465/todo', + `http://localhost:${port}/todo`, { message: 'Custom hello' }, @@ -147,7 +149,7 @@ describe('@feathersjs/koa', () => { await assert.rejects( () => axios.post( - 'http://localhost:8465/todo', + `http://localhost:${port}/todo`, {}, { headers: { @@ -170,7 +172,7 @@ describe('@feathersjs/koa', () => { await assert.rejects( () => axios.post( - 'http://localhost:8465/no/where', + `http://localhost:${port}/no/where`, {}, { headers: { @@ -198,7 +200,7 @@ describe('@feathersjs/koa', () => { const app = koa(feathers()) let called = false - const server = await app.listen(8787) + const server = await app.listen(await getPort()) server.on('close', () => { called = true @@ -214,6 +216,6 @@ describe('@feathersjs/koa', () => { await app.teardown() }) - restTests('Services', 'todo', 8465) - restTests('Root service', '/', 8465) + restTests('Services', 'todo', port) + restTests('Root service', '/', port) }) diff --git a/packages/koa/vite.config.ts b/packages/koa/vite.config.ts new file mode 100644 index 0000000000..5381f73f70 --- /dev/null +++ b/packages/koa/vite.config.ts @@ -0,0 +1,3 @@ +import vitest from '../../vitest.config.template' + +export default vitest diff --git a/packages/memory/LICENSE b/packages/memory/LICENSE index 887338c4f0..7712f870f3 100644 --- a/packages/memory/LICENSE +++ b/packages/memory/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2023 Feathers Contributors +Copyright (c) 2024 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/memory/README.md b/packages/memory/README.md index 3e7e8b67e7..c694686789 100644 --- a/packages/memory/README.md +++ b/packages/memory/README.md @@ -18,6 +18,6 @@ See [FeathersJS Memory Adapter API documentation](https://feathersjs.com/api/dat ## License -Copyright (c) 2023 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/memory/package.json b/packages/memory/package.json index 5c5e19d6e8..56a7b0578b 100644 --- a/packages/memory/package.json +++ b/packages/memory/package.json @@ -40,7 +40,7 @@ "prepublish": "npm run compile", "pack": "npm pack --pack-destination ../generators/test/build", "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "mocha --config ../../.mocharc.json --recursive test/**/*.test.ts" + "test": "vitest run" }, "publishConfig": { "access": "public" @@ -55,14 +55,13 @@ "sift": "^17.0.1" }, "devDependencies": { - "@feathersjs/adapter-tests": "^5.0.24", + "@feathersjs/adapter-tests-vitest": "^5.0.24", "@feathersjs/feathers": "^5.0.24", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", - "mocha": "^10.3.0", + "@types/node": "^20.11.30", + "@feathersjs/adapter-tests": "^5.0.24", "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" } diff --git a/packages/memory/test/index.test.ts b/packages/memory/test/index.test.ts index 1b25ba59a0..e4dcce0a4b 100644 --- a/packages/memory/test/index.test.ts +++ b/packages/memory/test/index.test.ts @@ -1,5 +1,5 @@ import assert from 'assert' -import adapterTests from '@feathersjs/adapter-tests' +import adapterTests from '@feathersjs/adapter-tests-vitest' import errors from '@feathersjs/errors' import { feathers } from '@feathersjs/feathers' diff --git a/packages/memory/vite.config.ts b/packages/memory/vite.config.ts new file mode 100644 index 0000000000..5381f73f70 --- /dev/null +++ b/packages/memory/vite.config.ts @@ -0,0 +1,3 @@ +import vitest from '../../vitest.config.template' + +export default vitest diff --git a/packages/mongodb/LICENSE b/packages/mongodb/LICENSE index 887338c4f0..7712f870f3 100644 --- a/packages/mongodb/LICENSE +++ b/packages/mongodb/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2023 Feathers Contributors +Copyright (c) 2024 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/mongodb/README.md b/packages/mongodb/README.md index baabbcff6a..4cfca9afeb 100644 --- a/packages/mongodb/README.md +++ b/packages/mongodb/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers MongoDB adapter documentation](https://feathersjs.com/api ## License -Copyright (c) 2023 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/mongodb/package.json b/packages/mongodb/package.json index d8004d230a..86a10782c2 100644 --- a/packages/mongodb/package.json +++ b/packages/mongodb/package.json @@ -42,7 +42,7 @@ "prepublish": "npm run compile", "pack": "npm pack --pack-destination ../generators/test/build", "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" + "test": "vitest run" }, "directories": { "lib": "lib" @@ -60,14 +60,14 @@ "mongodb": "^6.5.0" }, "devDependencies": { - "@feathersjs/adapter-tests": "^5.0.24", + "@feathersjs/adapter-tests-vitest": "^5.0.24", "@feathersjs/schema": "^5.0.24", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", - "mocha": "^10.3.0", + "@types/node": "^20.11.30", + "@feathersjs/adapter-tests": "^5.0.24", "mongodb-memory-server": "^9.1.7", "shx": "^0.3.4", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" } diff --git a/packages/mongodb/test/index.test.ts b/packages/mongodb/test/index.test.ts index 6b30394536..66f786e849 100644 --- a/packages/mongodb/test/index.test.ts +++ b/packages/mongodb/test/index.test.ts @@ -1,5 +1,5 @@ import { Db, MongoClient, ObjectId } from 'mongodb' -import adapterTests from '@feathersjs/adapter-tests' +import adapterTests from '@feathersjs/adapter-tests-vitest' import assert from 'assert' import { MongoMemoryServer } from 'mongodb-memory-server' import { Ajv, FromSchema, getValidator, hooks, querySyntax } from '@feathersjs/schema' @@ -140,7 +140,7 @@ describe('Feathers MongoDB Service', () => { let mongoClient: MongoClient let mongod: MongoMemoryServer - before(async () => { + beforeAll(async () => { mongod = await MongoMemoryServer.create() const client = await MongoClient.connect(mongod.getUri()) @@ -177,7 +177,7 @@ describe('Feathers MongoDB Service', () => { db.collection('people').createIndex({ name: 1 }, { partialFilterExpression: { team: 'blue' } }) }) - after(async () => { + afterAll(async () => { await db.dropDatabase() await mongoClient.close() await mongod.stop() @@ -408,7 +408,7 @@ describe('Feathers MongoDB Service', () => { let alice: any let doug: any - before(async () => { + beforeAll(async () => { app.use( 'todos', new MongoDBService({ @@ -427,7 +427,7 @@ describe('Feathers MongoDB Service', () => { await app.service('todos').create({ name: 'Doug do dishes', userId: doug._id }) }) - after(async () => { + afterAll(async () => { db.collection('people').deleteMany({}) db.collection('todos').deleteMany({}) }) @@ -488,7 +488,7 @@ describe('Feathers MongoDB Service', () => { }) assert.deepStrictEqual(result, [dave]) - app.service('people').remove(dave._id) + await app.service('people').remove(dave._id) }) }) diff --git a/packages/mongodb/vite.config.ts b/packages/mongodb/vite.config.ts new file mode 100644 index 0000000000..5381f73f70 --- /dev/null +++ b/packages/mongodb/vite.config.ts @@ -0,0 +1,3 @@ +import vitest from '../../vitest.config.template' + +export default vitest diff --git a/packages/rest-client/LICENSE b/packages/rest-client/LICENSE index 887338c4f0..7712f870f3 100644 --- a/packages/rest-client/LICENSE +++ b/packages/rest-client/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2023 Feathers Contributors +Copyright (c) 2024 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/rest-client/README.md b/packages/rest-client/README.md index 37ccdd7c41..a43e3e8e7c 100644 --- a/packages/rest-client/README.md +++ b/packages/rest-client/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers REST client API documentation](https://feathersjs.com/api ## License -Copyright (c) 2023 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/rest-client/package.json b/packages/rest-client/package.json index 5a497a4ca7..1a0388e928 100644 --- a/packages/rest-client/package.json +++ b/packages/rest-client/package.json @@ -44,7 +44,7 @@ "prepublish": "npm run compile", "pack": "npm pack --pack-destination ../generators/test/build", "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" + "test": "vitest run" }, "directories": { "lib": "lib" @@ -56,25 +56,25 @@ "@feathersjs/commons": "^5.0.24", "@feathersjs/errors": "^5.0.24", "@feathersjs/feathers": "^5.0.24", - "@types/superagent": "^8.1.4", + "@types/superagent": "^8.1.6", "qs": "^6.12.0" }, "devDependencies": { "@feathersjs/express": "^5.0.24", "@feathersjs/memory": "^5.0.24", - "@feathersjs/tests": "^5.0.24", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", + "@feathersjs/tests-vitest": "^5.0.24", + "@types/node": "^20.11.30", "@types/node-fetch": "^2.6.11", - "@types/qs": "^6.9.12", - "axios": "^1.6.7", - "mocha": "^10.3.0", + "@types/qs": "^6.9.14", + "axios": "^1.6.8", + "get-port": "^7.1.0", + "@feathersjs/tests": "^5.0.24", "node-fetch": "^2.6.1", "rxjs": "^7.8.1", "shx": "^0.3.4", "superagent": "^8.1.2", - "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" } diff --git a/packages/rest-client/test/axios.test.ts b/packages/rest-client/test/axios.test.ts index 16cfe9635b..612fa1f5c6 100644 --- a/packages/rest-client/test/axios.test.ts +++ b/packages/rest-client/test/axios.test.ts @@ -3,15 +3,17 @@ import { strict as assert } from 'assert' import axios from 'axios' import { Server } from 'http' import { feathers } from '@feathersjs/feathers' -import { clientTests } from '@feathersjs/tests' +import { clientTests } from '@feathersjs/tests-vitest' import { NotAcceptable } from '@feathersjs/errors' +import getPort from 'get-port' import createServer from './server' import rest from '../src' import { ServiceTypes } from './declarations' -describe('Axios REST connector', function () { - const url = 'http://localhost:8889' +describe('Axios REST connector', async function () { + const port = await getPort() + const url = `http://localhost:${port}` const connection = rest(url).axios(axios) const app = feathers() .configure(connection) @@ -21,11 +23,11 @@ describe('Axios REST connector', function () { const service = app.service('todos') let server: Server - before(async () => { - server = await createServer().listen(8889) + beforeAll(async () => { + server = await createServer().listen(port) }) - after((done) => server.close(done)) + afterAll(() => new Promise((resolve) => server.close(() => resolve()))) it('supports custom headers', async () => { const headers = { diff --git a/packages/rest-client/test/fetch.test.ts b/packages/rest-client/test/fetch.test.ts index 54ea3cec8e..c53cd74ac7 100644 --- a/packages/rest-client/test/fetch.test.ts +++ b/packages/rest-client/test/fetch.test.ts @@ -1,16 +1,18 @@ import { strict as assert } from 'assert' import fetch from 'node-fetch' import { feathers } from '@feathersjs/feathers' -import { clientTests } from '@feathersjs/tests' +import { clientTests } from '@feathersjs/tests-vitest' import { NotAcceptable } from '@feathersjs/errors' import { Server } from 'http' import rest from '../src' import createServer from './server' import { ServiceTypes } from './declarations' +import getPort from 'get-port' -describe('fetch REST connector', function () { - const url = 'http://localhost:8889' +describe('fetch REST connector', async function () { + const port = await getPort() + const url = `http://localhost:${port}` const connection = rest(url).fetch(fetch) const app = feathers() .configure(connection) @@ -31,11 +33,11 @@ describe('fetch REST connector', function () { } }) - before(async () => { - server = await createServer().listen(8889) + beforeAll(async () => { + server = await createServer().listen(port) }) - after((done) => server.close(done)) + afterAll(() => new Promise((resolve) => server.close(() => resolve()))) it('supports custom headers', async () => { const headers = { diff --git a/packages/rest-client/test/superagent.test.ts b/packages/rest-client/test/superagent.test.ts index 7e705b4288..31f99ecc3c 100644 --- a/packages/rest-client/test/superagent.test.ts +++ b/packages/rest-client/test/superagent.test.ts @@ -3,28 +3,30 @@ import { strict as assert } from 'assert' import superagent from 'superagent' import { Server } from 'http' import { feathers } from '@feathersjs/feathers' -import { clientTests } from '@feathersjs/tests' +import { clientTests } from '@feathersjs/tests-vitest' import { NotAcceptable } from '@feathersjs/errors' import rest from '../src' import createServer from './server' import { ServiceTypes } from './declarations' +import getPort from 'get-port' -describe('Superagent REST connector', function () { +describe('Superagent REST connector', async function () { let server: Server - const url = 'http://localhost:8889' + const port = await getPort() + const url = `http://localhost:${port}` const setup = rest(url).superagent(superagent) const app = feathers().configure(setup) const service = app.service('todos') service.methods('customMethod') - before(async () => { - server = await createServer().listen(8889) + beforeAll(async () => { + server = await createServer().listen(port) }) - after((done) => server.close(done)) + afterAll(() => new Promise((resolve) => server.close(() => resolve()))) it('supports custom headers', async () => { const headers = { diff --git a/packages/rest-client/vite.config.ts b/packages/rest-client/vite.config.ts new file mode 100644 index 0000000000..5381f73f70 --- /dev/null +++ b/packages/rest-client/vite.config.ts @@ -0,0 +1,3 @@ +import vitest from '../../vitest.config.template' + +export default vitest diff --git a/packages/schema/LICENSE b/packages/schema/LICENSE index 887338c4f0..7712f870f3 100644 --- a/packages/schema/LICENSE +++ b/packages/schema/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2023 Feathers Contributors +Copyright (c) 2024 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/schema/README.md b/packages/schema/README.md index ed4588006f..8a893572ef 100644 --- a/packages/schema/README.md +++ b/packages/schema/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers schema API documentation](https://feathersjs.com/api/sche ## License -Copyright (c) 2023 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/schema/package.json b/packages/schema/package.json index 98dd0f803f..e4243bc0cd 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -44,8 +44,8 @@ "prepublish": "npm run compile", "pack": "npm pack --pack-destination ../generators/test/build", "compile": "shx rm -rf lib/ && tsc && npm run pack", - "mocha": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts", - "test": "npm run compile && npm run mocha" + "vitest": "vitest run", + "test": "npm run compile && npm run vitest" }, "directories": { "lib": "lib" @@ -66,12 +66,11 @@ }, "devDependencies": { "@feathersjs/memory": "^5.0.24", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", + "@types/node": "^20.11.30", "ajv-formats": "^2.1.1", - "mocha": "^10.3.0", "shx": "^0.3.4", - "typescript": "^5.3.2" + "typescript": "^5.3.2", + "vitest": "^1.4.0" }, "peerDependencies": { "typescript": ">=5.4" diff --git a/packages/schema/test/hooks.test.ts b/packages/schema/test/hooks.test.ts index b7a5b1c8a0..f60bda0a19 100644 --- a/packages/schema/test/hooks.test.ts +++ b/packages/schema/test/hooks.test.ts @@ -19,7 +19,7 @@ describe('@feathersjs/schema/hooks', () => { } }) - before(async () => { + beforeAll(async () => { user = ( await app.service('users').create([ { @@ -38,12 +38,12 @@ describe('@feathersjs/schema/hooks', () => { }) }) - it('ran resolvers in sequence', async () => { + it('ran resolvers in sequence', () => { assert.strictEqual(user.name, 'hello (hello@feathersjs.com)') }) it('validates data', async () => { - assert.rejects(() => app.service('users').create({ password: 'failing' } as any), { + await assert.rejects(() => app.service('users').create({ password: 'failing' } as any), { name: 'BadRequest' }) }) @@ -249,7 +249,7 @@ describe('@feathersjs/schema/hooks', () => { user }) - assert.rejects( + await assert.rejects( () => app.service('messages').find({ query: { diff --git a/packages/schema/test/resolver.test.ts b/packages/schema/test/resolver.test.ts index 748c3e0650..3292004d0b 100644 --- a/packages/schema/test/resolver.test.ts +++ b/packages/schema/test/resolver.test.ts @@ -171,7 +171,7 @@ describe('@feathersjs/schema/resolver', () => { } }) - assert.rejects( + await assert.rejects( () => dummyResolver.resolve( { diff --git a/packages/schema/vite.config.ts b/packages/schema/vite.config.ts new file mode 100644 index 0000000000..5381f73f70 --- /dev/null +++ b/packages/schema/vite.config.ts @@ -0,0 +1,3 @@ +import vitest from '../../vitest.config.template' + +export default vitest diff --git a/packages/socketio-client/LICENSE b/packages/socketio-client/LICENSE index 887338c4f0..7712f870f3 100644 --- a/packages/socketio-client/LICENSE +++ b/packages/socketio-client/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2023 Feathers Contributors +Copyright (c) 2024 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/socketio-client/README.md b/packages/socketio-client/README.md index 8cdaa10192..7bb103c6b6 100644 --- a/packages/socketio-client/README.md +++ b/packages/socketio-client/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers SocketIO API documentation](https://feathersjs.com/api/cl ## License -Copyright (c) 2023 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/socketio-client/package.json b/packages/socketio-client/package.json index e4261920fe..1e01cb9f5f 100644 --- a/packages/socketio-client/package.json +++ b/packages/socketio-client/package.json @@ -35,8 +35,8 @@ "prepublish": "npm run compile", "pack": "npm pack --pack-destination ../generators/test/build", "compile": "shx rm -rf lib/ && tsc && npm run pack", - "mocha": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts", - "test": "npm run mocha" + "vitest": "vitest run", + "test": "npm run vitest" }, "directories": { "lib": "lib" @@ -61,14 +61,13 @@ "@feathersjs/commons": "^5.0.24", "@feathersjs/memory": "^5.0.24", "@feathersjs/socketio": "^5.0.24", + "@feathersjs/tests-vitest": "^5.0.24", + "@types/node": "^20.11.30", "@feathersjs/tests": "^5.0.24", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", - "mocha": "^10.3.0", "shx": "^0.3.4", - "socket.io-client": "^4.7.4", - "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "socket.io-client": "^4.7.5", + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" } diff --git a/packages/socketio-client/test/index.test.ts b/packages/socketio-client/test/index.test.ts index a39f8f84e6..a33322642a 100644 --- a/packages/socketio-client/test/index.test.ts +++ b/packages/socketio-client/test/index.test.ts @@ -3,7 +3,7 @@ import { strict as assert } from 'assert' import { Server } from 'http' import { CustomMethod, feathers } from '@feathersjs/feathers' import { io, Socket } from 'socket.io-client' -import { clientTests } from '@feathersjs/tests' +import { clientTests } from '@feathersjs/tests-vitest' import { createServer } from './server' import socketio, { SocketService } from '../src' @@ -22,7 +22,7 @@ describe('@feathersjs/socketio-client', () => { let socket: Socket let server: Server - before(async () => { + beforeAll(async () => { server = await createServer().listen(9988) socket = io('http://localhost:9988') @@ -34,10 +34,13 @@ describe('@feathersjs/socketio-client', () => { }) }) - after((done) => { - socket.disconnect() - server.close(done) - }) + afterAll( + () => + new Promise((resolve) => { + socket.disconnect() + server.close(() => resolve()) + }) + ) it('throws an error with no connection', () => { try { diff --git a/packages/socketio-client/vite.config.ts b/packages/socketio-client/vite.config.ts new file mode 100644 index 0000000000..5381f73f70 --- /dev/null +++ b/packages/socketio-client/vite.config.ts @@ -0,0 +1,3 @@ +import vitest from '../../vitest.config.template' + +export default vitest diff --git a/packages/socketio/LICENSE b/packages/socketio/LICENSE index 887338c4f0..7712f870f3 100644 --- a/packages/socketio/LICENSE +++ b/packages/socketio/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2023 Feathers Contributors +Copyright (c) 2024 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/socketio/README.md b/packages/socketio/README.md index 4c5214f56c..2ba5ebaee2 100644 --- a/packages/socketio/README.md +++ b/packages/socketio/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers SocketIO API documentation](https://feathersjs.com/api/so ## License -Copyright (c) 2023 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/socketio/package.json b/packages/socketio/package.json index a9839ca147..f05c062de7 100644 --- a/packages/socketio/package.json +++ b/packages/socketio/package.json @@ -44,7 +44,7 @@ "prepublish": "npm run compile", "pack": "npm pack --pack-destination ../generators/test/build", "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" + "test": "vitest run" }, "directories": { "lib": "lib" @@ -56,19 +56,20 @@ "@feathersjs/commons": "^5.0.24", "@feathersjs/feathers": "^5.0.24", "@feathersjs/transport-commons": "^5.0.24", - "socket.io": "^4.7.4" + "socket.io": "^4.7.5" }, "devDependencies": { "@feathersjs/express": "^5.0.24", "@feathersjs/memory": "^5.0.24", + "@feathersjs/tests-vitest": "^5.0.24", + "@types/node": "^20.11.30", + "get-port": "^7.1.0", "@feathersjs/tests": "^5.0.24", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", "lodash": "^4.17.21", - "mocha": "^10.3.0", "shx": "^0.3.4", - "socket.io-client": "^4.7.4", - "typescript": "^5.4.2" + "socket.io-client": "^4.7.5", + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" } diff --git a/packages/socketio/test/events.test.ts b/packages/socketio/test/events.test.ts new file mode 100644 index 0000000000..27e130f673 --- /dev/null +++ b/packages/socketio/test/events.test.ts @@ -0,0 +1,223 @@ +import { strict as assert } from 'assert' +import { io, Socket } from 'socket.io-client' +import { verify } from '@feathersjs/tests-vitest' +import { Id, RealTimeConnection } from '@feathersjs/feathers' +import mockApp from './mock-app' + +describe('@feathersjs/socketio/events', async () => { + const { app, socket, port, close } = await mockApp() + + afterAll(async () => { + await close() + }) + + function call(method: string, servicePath: string, id: Id): Promise + function call(method: string, servicePath: string, data: Record): Promise + function call(method: string, servicePath: string, id: Id, data: Record): Promise + function call(method: string, servicePath: string, ...args: any[]): Promise { + return new Promise((resolve, reject) => { + const emitArgs = [method, servicePath].concat(args) + + socket.emit(...emitArgs, (error: any, result: any) => (error ? reject(error) : resolve(result))) + }) + } + + const verifyEvent = (callback: (data: any) => void, resolve: () => void, reject: (err: any) => void) => { + return function (data: any) { + try { + callback(data) + resolve() + } catch (error: any) { + reject?.(error) + } + } + } + + describe('Basic service events', () => { + ;['todo', 'tasks'].forEach((name) => { + it(`${name} created`, () => + new Promise((resolve, reject) => { + const original = { + name: 'created event' + } + + socket.once( + `${name} created`, + verifyEvent((data) => verify.create(original, data), resolve, reject) + ) + + call('create', name, original) + })) + + it(`${name} updated`, () => + new Promise((resolve, reject) => { + const original = { + name: 'updated event' + } + + socket.once( + `${name} updated`, + verifyEvent((data: any) => verify.update(10, original, data), resolve, reject) + ) + + call('update', name, 10, original) + })) + + it(`${name} patched`, () => + new Promise((resolve, reject) => { + const original = { + name: 'patched event' + } + + socket.once( + `${name} patched`, + verifyEvent((data: any) => verify.patch(12, original, data), resolve, reject) + ) + + call('patch', name, 12, original) + })) + + it(`${name} removed`, () => + new Promise((resolve, reject) => { + socket.once( + `${name} removed`, + verifyEvent((data: any) => verify.remove(333, data), resolve, reject) + ) + + call('remove', name, 333) + })) + + it(`${name} custom events`, () => + new Promise((resolve, reject) => { + const service = app.service(name) + const original = { + name: 'created event' + } + + socket.once( + `${name} log`, + verifyEvent( + (data: any) => { + assert.deepStrictEqual(data, { + message: 'Custom log event', + data: original + }) + }, + resolve, + reject + ) + ) + + service.emit('log', { + data: original, + message: 'Custom log event' + }) + })) + }) + }) + + describe('Event channels', () => { + let connections: RealTimeConnection[] + let sockets: Socket[] + + beforeAll( + () => + new Promise((resolve) => { + let counter = 0 + const handler = (connection: RealTimeConnection) => { + counter++ + + app.channel(connection.channel).join(connection) + + connections.push(connection) + + if (counter === 3) { + resolve() + app.removeListener('connection', handler) + } + } + + connections = [] + sockets = [] + + app.on('connection', handler) + + sockets.push( + io(`http://localhost:${port}`, { + query: { channel: 'first' } + }), + + io(`http://localhost:${port}`, { + query: { channel: 'second' } + }), + + io(`http://localhost:${port}`, { + query: { channel: 'second' } + }) + ) + }) + ) + + afterAll(() => { + sockets.forEach((socket) => socket.disconnect()) + }) + ;['todo', 'tasks'].forEach((name) => { + const eventName = `${name} created` + + it(`filters '${eventName}' event for a single channel`, () => + new Promise((resolve, reject) => { + const service = app.service(name) + const [socket, otherSocket] = sockets + const onError = () => { + reject(new Error('Should not get this event')) + } + + service.publish('created', (data: any) => app.channel(data.room)) + + socket.once(eventName, (data: any) => { + assert.strictEqual(data.room, 'first') + otherSocket.removeEventListener(eventName, onError) + resolve() + }) + + otherSocket.once(eventName, onError) + + service.create({ + text: 'Event dispatching test', + room: 'first' + }) + })) + + it(`filters '${name} created' event for a channel with multiple connections`, () => + new Promise((resolve, reject) => { + let counter = 0 + + const service = app.service(name) + const [otherSocket, socketOne, socketTwo] = sockets + const onError = () => { + reject(new Error('Should not get this event')) + } + const onEvent = (data: any) => { + counter++ + assert.strictEqual(data.room, 'second') + + if (++counter === 2) { + otherSocket.removeEventListener(eventName, onError) + resolve() + } + } + + service.publish('created', (data: any) => app.channel(data.room)) + + socketOne.once(eventName, onEvent) + socketTwo.once(eventName, onEvent) + otherSocket.once(eventName, onError) + + service.create({ + text: 'Event dispatching test', + room: 'second' + }) + })) + }) + }) +}) diff --git a/packages/socketio/test/events.ts b/packages/socketio/test/events.ts deleted file mode 100644 index 52b94e8944..0000000000 --- a/packages/socketio/test/events.ts +++ /dev/null @@ -1,216 +0,0 @@ -import { strict as assert } from 'assert' -import { io, Socket } from 'socket.io-client' -import { verify } from '@feathersjs/tests' -import { RealTimeConnection } from '@feathersjs/feathers' - -export default (name: string, options: any) => { - const call = (method: string, ...args: any[]) => { - return new Promise((resolve, reject) => { - const { socket } = options - const emitArgs = [method, name].concat(args) - - socket.emit(...emitArgs, (error: any, result: any) => (error ? reject(error) : resolve(result))) - }) - } - - const verifyEvent = (done: (err?: any) => void, callback: (data: any) => void) => { - return function (data: any) { - try { - callback(data) - done() - } catch (error: any) { - done(error) - } - } - } - - describe('Basic service events', () => { - let socket: Socket - let connection: RealTimeConnection - - before((done) => { - options.app.once('connection', (conn: RealTimeConnection) => { - connection = conn - - options.app.channel('default').join(connection) - options.app.publish(() => options.app.channel('default')) - done() - }) - socket = io('http://localhost:7886') - }) - - after((done) => { - socket.once('disconnect', () => done()) - socket.disconnect() - }) - - it(`${name} created`, (done) => { - const original = { - name: 'created event' - } - - socket.once( - `${name} created`, - verifyEvent(done, (data) => verify.create(original, data)) - ) - - call('create', original) - }) - - it(`${name} updated`, (done) => { - const original = { - name: 'updated event' - } - - socket.once( - `${name} updated`, - verifyEvent(done, (data: any) => verify.update(10, original, data)) - ) - - call('update', 10, original) - }) - - it(`${name} patched`, (done) => { - const original = { - name: 'patched event' - } - - socket.once( - `${name} patched`, - verifyEvent(done, (data: any) => verify.patch(12, original, data)) - ) - - call('patch', 12, original) - }) - - it(`${name} removed`, (done) => { - socket.once( - `${name} removed`, - verifyEvent(done, (data: any) => verify.remove(333, data)) - ) - - call('remove', 333) - }) - - it(`${name} custom events`, (done) => { - const service = options.app.service(name) - const original = { - name: 'created event' - } - - socket.once( - `${name} log`, - verifyEvent(done, (data: any) => { - assert.deepStrictEqual(data, { - message: 'Custom log event', - data: original - }) - }) - ) - - service.emit('log', { - data: original, - message: 'Custom log event' - }) - }) - }) - - describe('Event channels', () => { - const eventName = `${name} created` - - let connections: RealTimeConnection[] - let sockets: any[] - - before((done) => { - let counter = 0 - const handler = (connection: RealTimeConnection) => { - counter++ - - options.app.channel(connection.channel).join(connection) - - connections.push(connection) - - if (counter === 3) { - done() - options.app.removeListener('connection', handler) - } - } - - connections = [] - sockets = [] - - options.app.on('connection', handler) - - sockets.push( - io('http://localhost:7886', { - query: { channel: 'first' } - }), - - io('http://localhost:7886', { - query: { channel: 'second' } - }), - - io('http://localhost:7886', { - query: { channel: 'second' } - }) - ) - }) - - after(() => { - sockets.forEach((socket) => socket.disconnect()) - }) - - it(`filters '${eventName}' event for a single channel`, (done) => { - const service = options.app.service(name) - const [socket, otherSocket] = sockets - const onError = () => { - done(new Error('Should not get this event')) - } - - service.publish('created', (data: any) => options.app.channel(data.room)) - - socket.once(eventName, (data: any) => { - assert.strictEqual(data.room, 'first') - otherSocket.removeEventListener(eventName, onError) - done() - }) - - otherSocket.once(eventName, onError) - - service.create({ - text: 'Event dispatching test', - room: 'first' - }) - }) - - it(`filters '${name} created' event for a channel with multiple connections`, (done) => { - let counter = 0 - - const service = options.app.service(name) - const [otherSocket, socketOne, socketTwo] = sockets - const onError = () => { - done(new Error('Should not get this event')) - } - const onEvent = (data: any) => { - counter++ - assert.strictEqual(data.room, 'second') - - if (++counter === 2) { - otherSocket.removeEventListener(eventName, onError) - done() - } - } - - service.publish('created', (data: any) => options.app.channel(data.room)) - - socketOne.once(eventName, onEvent) - socketTwo.once(eventName, onEvent) - otherSocket.once(eventName, onError) - - service.create({ - text: 'Event dispatching test', - room: 'second' - }) - }) - }) -} diff --git a/packages/socketio/test/index.test.ts b/packages/socketio/test/index.test.ts index 32a14449e7..5b706fd95a 100644 --- a/packages/socketio/test/index.test.ts +++ b/packages/socketio/test/index.test.ts @@ -1,149 +1,48 @@ import { strict as assert } from 'assert' -import { - feathers, - Application, - HookContext, - NullableId, - Params, - ApplicationHookContext -} from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' import express from '@feathersjs/express' import { Request, Response } from 'express' -import { omit, extend } from 'lodash' +import omit from 'lodash/omit.js' import { io } from 'socket.io-client' import axios from 'axios' -import { Server } from 'http' -import { Service } from '@feathersjs/tests' -import { Socket } from 'socket.io-client' +import getPort from 'get-port' -import methodTests from './methods' -import eventTests from './events' import socketio from '../src' -import { FeathersSocket, NextFunction } from '../src/middleware.js' +import mockApp from './mock-app' -class VerifierService { - async find(params: Params) { - return { params } - } +describe('@feathersjs/socketio', async () => { + const { app, socket, port, socketParams, close } = await mockApp() - async create(data: any, params: Params) { - return { data, params } - } - - async update(id: NullableId, data: any, params: Params) { - return { id, data, params } - } -} - -describe('@feathersjs/socketio', () => { - let app: Application - let server: Server - let socket: Socket - - const socketParams: any = { - user: { name: 'David' }, - provider: 'socketio' - } - const options = { - get app() { - return app - }, - - get socket() { - return socket - } - } - - before((done) => { - const errorHook = (hook: HookContext) => { - if (hook.params.query.hookError) { - throw new Error(`Error from ${hook.method}, ${hook.type} hook`) - } - } - - app = feathers() - .configure( - socketio((io) => { - io.use(function (socket: FeathersSocket, next: NextFunction) { - socket.feathers.user = { name: 'David' } - socketParams.headers = socket.feathers.headers - - const { channel } = socket.handshake.query as any - - if (channel) { - socket.feathers.channel = channel - } + afterAll(async () => { + await close() + }) - next() - }) + it('runs io before setup (#131)', () => + new Promise(async (resolve) => { + let counter = 0 + const app = feathers().configure( + socketio(() => { + assert.strictEqual(counter, 0) + counter++ }) ) - .use('/todo', new Service()) - .use('/verify', new VerifierService()) - - app.service('todo').hooks({ - before: { - get: errorHook - } - }) - app.hooks({ - setup: [ - async (context: ApplicationHookContext, next: NextFunction) => { - assert.notStrictEqual(context.app, undefined) - await next() - } - ] - }) - - app - .listen(7886) - .then((srv) => { - server = srv - server.once('listening', () => { - app.use('/tasks', new Service()) - app.service('tasks').hooks({ - before: { - get: errorHook - } - }) - }) + app.listen(await getPort()).then((srv) => { + srv.on('listening', () => srv.close(() => resolve())) }) - .catch(done) + })) - socket = io('http://localhost:7886') - socket.on('connect', () => done()) - }) - - after((done) => { - socket.disconnect() - server.close(done) - }) + it('can set MaxListeners', () => + new Promise(async (resolve) => { + const app = feathers().configure(socketio((io) => io.sockets.setMaxListeners(100))) - it('runs io before setup (#131)', (done) => { - let counter = 0 - const app = feathers().configure( - socketio(() => { - assert.strictEqual(counter, 0) - counter++ - }) - ) - - app.listen(8887).then((srv) => { - srv.on('listening', () => srv.close(done)) - }) - }) - - it('can set MaxListeners', (done) => { - const app = feathers().configure(socketio((io) => io.sockets.setMaxListeners(100))) - - app.listen(8987).then((srv) => { - srv.on('listening', () => { - assert.strictEqual(app.io.sockets.getMaxListeners(), 100) - srv.close(done) + app.listen(await getPort()).then((srv) => { + srv.on('listening', () => { + assert.strictEqual(app.io.sockets.getMaxListeners(), 100) + srv.close(() => resolve()) + }) }) - }) - }) + })) it('expressified app works', async () => { const data = { message: 'Hello world' } @@ -151,15 +50,16 @@ describe('@feathersjs/socketio', () => { .configure(socketio()) .use('/test', (_req: Request, res: Response) => res.json(data)) - const srv = await app.listen(8992) + const port = await getPort() + const srv = await app.listen(port) const response = await axios({ - url: 'http://localhost:8992/socket.io/socket.io.js' + url: `http://localhost:${port}/socket.io/socket.io.js` }) assert.strictEqual(response.status, 200) const res = await axios({ - url: 'http://localhost:8992/test' + url: `http://localhost:${port}/test` }) assert.deepStrictEqual(res.data, data) @@ -167,113 +67,108 @@ describe('@feathersjs/socketio', () => { await new Promise((resolve) => srv.close(() => resolve(srv))) }) - it('can set options (#12)', (done) => { - const application = feathers().configure( - socketio( - { - path: '/test/' - }, - (ioInstance) => assert.ok(ioInstance) + it('can set options (#12)', () => + new Promise(async (resolve) => { + const application = feathers().configure( + socketio( + { + path: '/test/' + }, + (ioInstance) => assert.ok(ioInstance) + ) ) - ) - application.listen(8987).then((srv) => { - srv.on('listening', async () => { - const { status } = await axios('http://localhost:8987/test/socket.io.js') + const port = await getPort() - assert.strictEqual(status, 200) - srv.close(done) - }) - }) - }) - - it('passes handshake as service parameters', (done) => { - socket.emit('create', 'verify', {}, (error: any, data: any) => { - assert.ok(!error) - assert.deepStrictEqual( - omit(data.params, 'query', 'route', 'connection'), - socketParams, - 'Passed handshake parameters' - ) + application.listen(port).then((srv) => { + srv.on('listening', async () => { + const { status } = await axios(`http://localhost:${port}/test/socket.io.js`) - socket.emit( - 'update', - 'verify', - 1, - {}, - { - test: 'param' - }, - (error: any, data: any) => { - assert.ok(!error) - assert.deepStrictEqual( - data.params, - extend( + assert.strictEqual(status, 200) + srv.close(() => resolve()) + }) + }) + })) + + it('passes handshake as service parameters', () => + new Promise((resolve) => { + socket.emit('create', 'verify', {}, (error: any, data: any) => { + assert.ok(!error) + assert.deepStrictEqual( + omit(data.params, 'query', 'route', 'connection'), + socketParams, + 'Passed handshake parameters' + ) + + socket.emit( + 'update', + 'verify', + 1, + {}, + { + test: 'param' + }, + (error: any, data: any) => { + assert.ok(!error) + assert.deepStrictEqual( + data.params, { route: {}, - connection: socketParams, + connection: { + ...socketParams + }, query: { test: 'param' - } + }, + ...socketParams }, - socketParams - ), - 'Passed handshake parameters as query' - ) - done() - } - ) - }) - }) - - it('connection and disconnect events (#1243, #1238)', (done) => { - const mySocket = io('http://localhost:7886?channel=dctest') - - app.once('connection', (connection) => { - assert.strictEqual(connection.channel, 'dctest') - app.once('disconnect', (disconnection) => { - assert.strictEqual(disconnection.channel, 'dctest') - done() + 'Passed handshake parameters as query' + ) + resolve() + } + ) }) - setTimeout(() => mySocket.close(), 100) - }) - - assert.ok(mySocket) - }) + })) - it('app `disconnect` event disconnects socket (#2754)', (done) => { - const mySocket = io('http://localhost:7886?channel=dctest') + it('connection and disconnect events (#1243, #1238)', () => + new Promise((resolve) => { + const mySocket = io(`http://localhost:${port}?channel=dctest`) - app.once('connection', (connection) => { - assert.strictEqual(connection.channel, 'dctest') - mySocket.once('disconnect', () => done()) - app.emit('disconnect', connection) - }) + app.once('connection', (connection) => { + assert.strictEqual(connection.channel, 'dctest') + app.once('disconnect', (disconnection) => { + assert.strictEqual(disconnection.channel, 'dctest') + resolve() + }) + mySocket.close() + }) - assert.ok(mySocket) - }) + assert.ok(mySocket) + })) - it('missing parameters in socket call works (#88)', (done) => { - socket.emit('find', 'verify', (error: any, data: any) => { - assert.ok(!error) - assert.deepStrictEqual( - omit(data.params, 'query', 'route', 'connection'), - socketParams, - 'Handshake parameters passed on proper position' - ) - done() - }) - }) + it('app `disconnect` event disconnects socket (#2754)', () => + new Promise((resolve) => { + const mySocket = io(`http://localhost:${port}?channel=dctest`) - describe('Service method calls', () => { - describe("('method', 'service') event format", () => { - describe('Service', () => methodTests('todo', options)) - describe('Dynamic Service', () => methodTests('todo', options)) - }) - }) + app.once('connection', (connection) => { + assert.strictEqual(connection.channel, 'dctest') + mySocket.once('disconnect', () => resolve()) + app.emit('disconnect', connection) + }) - describe('Service events', () => { - describe('Service', () => eventTests('todo', options)) - describe('Dynamic Service', () => eventTests('tasks', options)) - }) + assert.ok(mySocket) + })) + + it('missing parameters in socket call works (#88)', () => + new Promise((resolve) => { + socket.emit('find', 'verify', (error: any, data: any) => { + assert.ok(!error) + assert.deepStrictEqual( + omit(data.params, 'query', 'route', 'connection'), + socketParams, + 'Handshake parameters passed on proper position' + ) + resolve() + }) + })) }) diff --git a/packages/socketio/test/methods.test.ts b/packages/socketio/test/methods.test.ts new file mode 100644 index 0000000000..24bf0d7fdf --- /dev/null +++ b/packages/socketio/test/methods.test.ts @@ -0,0 +1,139 @@ +import { strict as assert } from 'assert' +import { verify } from '@feathersjs/tests-vitest' +import mockApp from './mock-app' +import { Id } from '@feathersjs/feathers' + +describe('@feathersjs/socketio/methods', async () => { + const { socket, close } = await mockApp() + + afterAll(async () => { + await close() + }) + ;['todo', 'tasks'].forEach((name) => { + function call(method: string, id: Id): Promise + function call(method: string, data: Record): Promise + function call(method: string, id: Id, data: Record): Promise + function call(method: string, ...args: any[]): Promise { + return new Promise((resolve, reject) => { + const emitArgs = [method, name].concat(args) + + socket.emit(...emitArgs, (error: any, result: any) => (error ? reject(error) : resolve(result))) + }) + } + + it('invalid arguments cause an error', async () => { + await assert.rejects(() => call('find', 1, {}), { + message: "Too many arguments for 'find' method" + }) + }) + + it('.find', () => async () => { + await call('find', {}).then((data) => verify.find(data)) + }) + + it('.get', () => async () => { + await call('get', 'laundry').then((data) => verify.get('laundry', data)) + }) + + it('.get with error', () => async () => { + try { + await call('get', 'laundry', { error: true }) + assert.fail('Should never get here') + } catch (error: any) { + assert.strictEqual(error.message, 'Something for laundry went wrong') + } + }) + + it('.get with runtime error', () => async () => { + try { + await call('get', 'laundry', { runtimeError: true }) + assert.fail('Should never get here') + } catch (error: any) { + assert.strictEqual(error.message, 'thingThatDoesNotExist is not defined') + } + }) + + it('.get with error in hook', () => async () => { + try { + await call('get', 'laundry', { hookError: true }) + assert.fail('Should never get here') + } catch (error: any) { + assert.strictEqual(error.message, 'Error from get, before hook') + } + }) + + it('.create', async () => { + const original = { + name: 'creating' + } + + const data = await call('create', original, {}) + + verify.create(original, data) + }) + + it('.create without parameters', async () => { + const original = { + name: 'creating again' + } + + const data = await call('create', original) + + verify.create(original, data) + }) + + it('.update', async () => { + const original = { + name: 'updating' + } + + const data = await call('update', 23, original, {}) + + verify.update(23, original, data) + }) + + it('.update many', async () => { + const original = { + name: 'updating', + many: true + } + + const data = await call('update', null, original) + + verify.update(null, original, data) + }) + + it('.patch', async () => { + const original = { + name: 'patching' + } + + const data = await call('patch', 25, original) + + verify.patch(25, original, data) + }) + + it('.patch many', async () => { + const original = { + name: 'patching', + many: true + } + + const data = await call('patch', null, original) + + verify.patch(null, original, data) + }) + + it('.remove', () => async () => { + const data = await call('remove', 11) + + verify.remove(11, data) + }) + + it('.remove many', async () => { + const data = await call('remove', null) + + verify.remove(null, data) + }) + }) +}) diff --git a/packages/socketio/test/methods.ts b/packages/socketio/test/methods.ts deleted file mode 100644 index e376682256..0000000000 --- a/packages/socketio/test/methods.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { strict as assert } from 'assert' -import { verify } from '@feathersjs/tests' - -export default (name: string, options: any) => { - const call = (method: string, ...args: any[]) => - new Promise((resolve, reject) => { - const { socket } = options - const prefix = [method, name] - const emitArgs = prefix.concat(args) - - socket.emit(...emitArgs, (error: any, result: any) => (error ? reject(error) : resolve(result))) - }) - - it('invalid arguments cause an error', async () => { - await assert.rejects(() => call('find', 1, {}), { - message: "Too many arguments for 'find' method" - }) - }) - - it('.find', () => async () => { - await call('find', {}).then((data) => verify.find(data)) - }) - - it('.get', () => async () => { - await call('get', 'laundry').then((data) => verify.get('laundry', data)) - }) - - it('.get with error', () => async () => { - try { - await call('get', 'laundry', { error: true }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'Something for laundry went wrong') - } - }) - - it('.get with runtime error', () => async () => { - try { - await call('get', 'laundry', { runtimeError: true }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'thingThatDoesNotExist is not defined') - } - }) - - it('.get with error in hook', () => async () => { - try { - await call('get', 'laundry', { hookError: true }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'Error from get, before hook') - } - }) - - it('.create', async () => { - const original = { - name: 'creating' - } - - const data = await call('create', original, {}) - - verify.create(original, data) - }) - - it('.create without parameters', async () => { - const original = { - name: 'creating again' - } - - const data = await call('create', original) - - verify.create(original, data) - }) - - it('.update', async () => { - const original = { - name: 'updating' - } - - const data = await call('update', 23, original, {}) - - verify.update(23, original, data) - }) - - it('.update many', async () => { - const original = { - name: 'updating', - many: true - } - - const data = await call('update', null, original) - - verify.update(null, original, data) - }) - - it('.patch', async () => { - const original = { - name: 'patching' - } - - const data = await call('patch', 25, original) - - verify.patch(25, original, data) - }) - - it('.patch many', async () => { - const original = { - name: 'patching', - many: true - } - - const data = await call('patch', null, original) - - verify.patch(null, original, data) - }) - - it('.remove', () => async () => { - const data = await call('remove', 11) - - verify.remove(11, data) - }) - - it('.remove many', async () => { - const data = await call('remove', null) - - verify.remove(null, data) - }) -} diff --git a/packages/socketio/test/mock-app.ts b/packages/socketio/test/mock-app.ts new file mode 100644 index 0000000000..3100a4a4a7 --- /dev/null +++ b/packages/socketio/test/mock-app.ts @@ -0,0 +1,131 @@ +import { strict as assert } from 'assert' +import { + feathers, + HookContext, + NullableId, + Params, + ApplicationHookContext, + RealTimeConnection +} from '@feathersjs/feathers' +import { io } from 'socket.io-client' +import { Service } from '@feathersjs/tests-vitest' +import getPort from 'get-port' + +import socketio from '../src' +import { FeathersSocket, NextFunction } from '../src/middleware.js' + +class VerifierService { + async find(params: Params) { + return { params } + } + + async create(data: any, params: Params) { + return { data, params } + } + + async update(id: NullableId, data: any, params: Params) { + return { id, data, params } + } +} + +export default async () => { + const userName = 'David' + + const socketParams: any = { + user: { name: userName }, + provider: 'socketio' + } + + const errorHook = (hook: HookContext) => { + if (hook.params.query.hookError) { + throw new Error(`Error from ${hook.method}, ${hook.type} hook`) + } + } + + const app = feathers() + .configure( + socketio((io) => { + io.use(function (socket: FeathersSocket, next: NextFunction) { + socket.feathers.user = { name: userName } + socketParams.headers = socket.feathers.headers + + const { channel } = socket.handshake.query as any + + if (channel) { + socket.feathers.channel = channel + } + + next() + }) + }) + ) + .use('/todo', new Service()) + .use('/verify', new VerifierService()) + + app.service('todo').hooks({ + before: { + get: errorHook + } + }) + + app.hooks({ + setup: [ + async (context: ApplicationHookContext, next: NextFunction) => { + assert.notStrictEqual(context.app, undefined) + await next() + } + ] + }) + + const port = await getPort() + + const server = await app.listen(port) + + await new Promise((resolve) => { + server.once('listening', () => { + app.use('/tasks', new Service()) + app.service('tasks').hooks({ + before: { + get: errorHook + } + }) + resolve() + }) + }) + + const socket = io(`http://localhost:${port}`) + + const pSocketConnected = new Promise((resolve) => socket.on('connect', () => resolve())) + + let connection: RealTimeConnection + + const pAppConnection = new Promise((resolve) => { + app.once('connection', (conn) => { + connection = conn + app.channel('default').join(conn) + app.publish(() => app.channel('default')) + resolve() + }) + }) + + await Promise.all([pSocketConnected, pAppConnection]) + + const pServerClosed = new Promise((resolve) => server.once('close', () => resolve())) + + async function close() { + socket.disconnect() + server.closeAllConnections() + server.close() + await pServerClosed + } + + return { + app, + socket, + server, + port, + socketParams, + connection, + close + } +} diff --git a/packages/socketio/vite.config.ts b/packages/socketio/vite.config.ts new file mode 100644 index 0000000000..5381f73f70 --- /dev/null +++ b/packages/socketio/vite.config.ts @@ -0,0 +1,3 @@ +import vitest from '../../vitest.config.template' + +export default vitest diff --git a/packages/tests-vitest/CHANGELOG.md b/packages/tests-vitest/CHANGELOG.md new file mode 100644 index 0000000000..45e92810eb --- /dev/null +++ b/packages/tests-vitest/CHANGELOG.md @@ -0,0 +1,367 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [5.0.11](https://github.com/feathersjs/feathers/compare/v5.0.10...v5.0.11) (2023-10-11) + +### Bug Fixes + +- **knex:** Update all dependencies and Knex peer ([#3308](https://github.com/feathersjs/feathers/issues/3308)) ([d2f9860](https://github.com/feathersjs/feathers/commit/d2f986036c4741cce2339d8abbcc6b2eb037a12a)) + +## [5.0.10](https://github.com/feathersjs/feathers/compare/v5.0.9...v5.0.10) (2023-10-03) + +**Note:** Version bump only for package @feathersjs/tests + +## [5.0.9](https://github.com/feathersjs/feathers/compare/v5.0.8...v5.0.9) (2023-09-27) + +**Note:** Version bump only for package @feathersjs/tests + +## [5.0.8](https://github.com/feathersjs/feathers/compare/v5.0.7...v5.0.8) (2023-07-19) + +**Note:** Version bump only for package @feathersjs/tests + +## [5.0.7](https://github.com/feathersjs/feathers/compare/v5.0.6...v5.0.7) (2023-07-14) + +**Note:** Version bump only for package @feathersjs/tests + +## [5.0.6](https://github.com/feathersjs/feathers/compare/v5.0.5...v5.0.6) (2023-06-15) + +**Note:** Version bump only for package @feathersjs/tests + +## [5.0.5](https://github.com/feathersjs/feathers/compare/v5.0.4...v5.0.5) (2023-04-28) + +**Note:** Version bump only for package @feathersjs/tests + +## [5.0.4](https://github.com/feathersjs/feathers/compare/v5.0.3...v5.0.4) (2023-04-12) + +**Note:** Version bump only for package @feathersjs/tests + +## [5.0.3](https://github.com/feathersjs/feathers/compare/v5.0.2...v5.0.3) (2023-04-05) + +### Bug Fixes + +- **dependencies:** Update all dependencies ([#3139](https://github.com/feathersjs/feathers/issues/3139)) ([f24276e](https://github.com/feathersjs/feathers/commit/f24276e9a909e2e58a0730c730258ce1f70f4028)) + +## [5.0.1](https://github.com/feathersjs/feathers/compare/v5.0.0...v5.0.1) (2023-03-15) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.38...v5.0.0) (2023-02-24) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.38](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.37...v5.0.0-pre.38) (2023-02-17) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.37](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.36...v5.0.0-pre.37) (2023-02-09) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) + +### Bug Fixes + +- Update all dependencies ([#3024](https://github.com/feathersjs/feathers/issues/3024)) ([283dc47](https://github.com/feathersjs/feathers/commit/283dc4798d85584bc031e6e54b83b4ea77d1edd0)) + +# [5.0.0-pre.35](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.34...v5.0.0-pre.35) (2023-01-12) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.34](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.33...v5.0.0-pre.34) (2022-12-14) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.33](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.32...v5.0.0-pre.33) (2022-11-08) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.30](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.29...v5.0.0-pre.30) (2022-10-07) + +### Features + +- **core:** Allow to unregister services at runtime ([#2756](https://github.com/feathersjs/feathers/issues/2756)) ([d16601f](https://github.com/feathersjs/feathers/commit/d16601f2277dca5357866ffdefba2a611f6dc7fa)) + +# [5.0.0-pre.29](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.28...v5.0.0-pre.29) (2022-09-16) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.28](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.27...v5.0.0-pre.28) (2022-08-03) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.27](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.26...v5.0.0-pre.27) (2022-07-13) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.26](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.25...v5.0.0-pre.26) (2022-06-22) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.25](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.24...v5.0.0-pre.25) (2022-06-22) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.23](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.22...v5.0.0-pre.23) (2022-06-06) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.22](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.21...v5.0.0-pre.22) (2022-05-24) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.21](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.20...v5.0.0-pre.21) (2022-05-23) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.20](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.19...v5.0.0-pre.20) (2022-05-04) + +### Bug Fixes + +- **dependencies:** Lock monorepo package version numbers ([#2623](https://github.com/feathersjs/feathers/issues/2623)) ([5640c10](https://github.com/feathersjs/feathers/commit/5640c1020cc139994e695d658c08bad3494db507)) + +# [5.0.0-pre.19](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.18...v5.0.0-pre.19) (2022-05-01) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.18](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.17...v5.0.0-pre.18) (2022-04-11) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.17](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.16...v5.0.0-pre.17) (2022-02-15) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.16](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.15...v5.0.0-pre.16) (2022-01-12) + +### Features + +- **express, koa:** make transports similar ([#2486](https://github.com/feathersjs/feathers/issues/2486)) ([26aa937](https://github.com/feathersjs/feathers/commit/26aa937c114fb8596dfefc599b1f53cead69c159)) + +# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.14](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.13...v5.0.0-pre.14) (2021-10-13) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.13](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.12...v5.0.0-pre.13) (2021-10-13) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.12](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.11...v5.0.0-pre.12) (2021-10-12) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.11](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.10...v5.0.0-pre.11) (2021-10-06) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.10](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.9...v5.0.0-pre.10) (2021-09-19) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.9](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.8...v5.0.0-pre.9) (2021-08-09) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.8](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.7...v5.0.0-pre.8) (2021-08-09) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.7](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.6...v5.0.0-pre.7) (2021-08-09) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.6](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.5...v5.0.0-pre.6) (2021-08-08) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) + +### Bug Fixes + +- **koa:** Use extended query parser for compatibility ([#2397](https://github.com/feathersjs/feathers/issues/2397)) ([b2944ba](https://github.com/feathersjs/feathers/commit/b2944bac3ec6d5ecc80dc518cd4e58093692db74)) + +# [5.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.3...v5.0.0-pre.4) (2021-05-13) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.2...v5.0.0-pre.3) (2021-04-21) + +### Bug Fixes + +- **typescript:** Improve TypeScript backwards compatibility ([#2310](https://github.com/feathersjs/feathers/issues/2310)) ([f33be73](https://github.com/feathersjs/feathers/commit/f33be73fc46a533efb15df9aab0658e3240d3897)) + +# [5.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.1...v5.0.0-pre.2) (2021-04-06) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-beta.1](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.0...v5.0.0-beta.1) (2021-04-03) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-beta.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.1...v5.0.0-beta.0) (2021-03-28) + +### Bug Fixes + +- Update Grant usage and other dependencies ([#2264](https://github.com/feathersjs/feathers/issues/2264)) ([7b0f8fa](https://github.com/feathersjs/feathers/commit/7b0f8fad252419ed0ad0bf259cdf3104d322ab60)) + +### Features + +- **core:** Public custom service methods ([#2270](https://github.com/feathersjs/feathers/issues/2270)) ([e65abfb](https://github.com/feathersjs/feathers/commit/e65abfb5388df6c19a11c565cf1076a29f32668d)) +- Feathers v5 core refactoring and features ([#2255](https://github.com/feathersjs/feathers/issues/2255)) ([2dafb7c](https://github.com/feathersjs/feathers/commit/2dafb7ce14ba57406aeec13d10ca45b1e709bee9)) + +# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) + +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) + +**Note:** Version bump only for package @feathersjs/tests + +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) + +## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) + +**Note:** Version bump only for package @feathersjs/tests + +## [4.5.10](https://github.com/feathersjs/feathers/compare/v4.5.9...v4.5.10) (2020-11-08) + +**Note:** Version bump only for package @feathersjs/tests + +## [4.5.9](https://github.com/feathersjs/feathers/compare/v4.5.8...v4.5.9) (2020-10-09) + +**Note:** Version bump only for package @feathersjs/tests + +## [4.5.8](https://github.com/feathersjs/feathers/compare/v4.5.7...v4.5.8) (2020-08-12) + +**Note:** Version bump only for package @feathersjs/tests + +## [4.5.8](https://github.com/feathersjs/feathers/compare/v4.5.7...v4.5.8) (2020-08-12) + +## [4.5.7](https://github.com/feathersjs/feathers/compare/v4.5.6...v4.5.7) (2020-07-24) + +**Note:** Version bump only for package @feathersjs/tests + +## [4.5.5](https://github.com/feathersjs/feathers/compare/v4.5.4...v4.5.5) (2020-07-11) + +**Note:** Version bump only for package @feathersjs/tests + +## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) + +**Note:** Version bump only for package @feathersjs/tests + +## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) + +**Note:** Version bump only for package @feathersjs/tests + +## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) + +**Note:** Version bump only for package @feathersjs/tests + +# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) + +**Note:** Version bump only for package @feathersjs/tests + +## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) + +**Note:** Version bump only for package @feathersjs/tests + +## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/tests + +# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/tests + +## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) + +**Note:** Version bump only for package @feathersjs/tests + +## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/tests + +## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/tests + +## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) + +**Note:** Version bump only for package @feathersjs/tests + +## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) + +**Note:** Version bump only for package @feathersjs/tests + +## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) + +**Note:** Version bump only for package @feathersjs/tests + +## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) + +**Note:** Version bump only for package @feathersjs/tests + +## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) + +**Note:** Version bump only for package @feathersjs/tests + +# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) + +**Note:** Version bump only for package @feathersjs/tests + +# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) + +**Note:** Version bump only for package @feathersjs/tests + +# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) + +### Bug Fixes + +- Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) + +# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) + +**Note:** Version bump only for package @feathersjs/tests + +# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) + +**Note:** Version bump only for package @feathersjs/tests + +# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) + +**Note:** Version bump only for package @feathersjs/tests + +# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) + +**Note:** Version bump only for package @feathersjs/tests + +# [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) + +### Bug Fixes + +- Update dependencies and fix tests ([#1373](https://github.com/feathersjs/feathers/issues/1373)) ([d743a7f](https://github.com/feathersjs/feathers/commit/d743a7f)) + +# [4.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.1...v4.0.0-pre.2) (2019-05-15) + +**Note:** Version bump only for package @feathersjs/tests + +# [4.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.0...v4.0.0-pre.1) (2019-05-08) + +### Bug Fixes + +- Improve authentication parameter handling ([#1333](https://github.com/feathersjs/feathers/issues/1333)) ([6e77204](https://github.com/feathersjs/feathers/commit/6e77204)) diff --git a/packages/tests-vitest/LICENSE b/packages/tests-vitest/LICENSE new file mode 100644 index 0000000000..7712f870f3 --- /dev/null +++ b/packages/tests-vitest/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2024 Feathers Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/packages/tests-vitest/README.md b/packages/tests-vitest/README.md new file mode 100644 index 0000000000..5e479274b0 --- /dev/null +++ b/packages/tests-vitest/README.md @@ -0,0 +1,6 @@ +# @feathersjs/tests-vitest + +[![CI](https://github.com/feathersjs/feathers/workflows/CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3ACI) +[![Download Status](https://img.shields.io/npm/dm/@feathersjs/tests-vitest.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/tests-vitest) + +> Common tests for Feathers core modules for vitest diff --git a/packages/tests-vitest/package.json b/packages/tests-vitest/package.json new file mode 100644 index 0000000000..45a6ad5b4b --- /dev/null +++ b/packages/tests-vitest/package.json @@ -0,0 +1,61 @@ +{ + "name": "@feathersjs/tests-vitest", + "private": true, + "description": "Feathers core module common tests with vitest", + "version": "5.0.24", + "homepage": "https://feathersjs.com", + "main": "lib/", + "types": "lib/", + "keywords": [ + "feathers" + ], + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/daffl" + }, + "repository": { + "type": "git", + "url": "git://github.com/feathersjs/feathers.git", + "directory": "packages/tests-vitest" + }, + "author": { + "name": "Feathers contributors", + "email": "hello@feathersjs.com", + "url": "https://feathersjs.com" + }, + "contributors": [], + "bugs": { + "url": "https://github.com/feathersjs/feathers/issues" + }, + "engines": { + "node": ">= 12" + }, + "scripts": { + "prepublish": "npm run compile", + "pack": "echo \"not necessary\"", + "test": "echo \"not necessary\"", + "compile": "shx rm -rf lib/ && tsc" + }, + "directories": { + "lib": "lib" + }, + "publishConfig": { + "access": "public" + }, + "dependencies": { + "@types/lodash": "^4.17.0", + "axios": "^1.6.8", + "lodash": "^4.17.21" + }, + "devDependencies": { + "@feathersjs/feathers": "^5.0.24", + "@types/node": "^20.11.30", + "shx": "^0.3.4", + "typescript": "^5.4.3", + "vitest": "^1.1.1" + }, + "peerDependencies": { + "vitest": "^1.4.0" + } +} diff --git a/packages/tests-vitest/resources/certificate.pem b/packages/tests-vitest/resources/certificate.pem new file mode 100644 index 0000000000..6735645071 --- /dev/null +++ b/packages/tests-vitest/resources/certificate.pem @@ -0,0 +1,16 @@ +-----BEGIN CERTIFICATE----- +MIICmzCCAgQCCQDugFqITnU/sDANBgkqhkiG9w0BAQUFADCBkTELMAkGA1UEBhMC +Q0ExEDAOBgNVBAgTB0FsYmVydGExEDAOBgNVBAcTB0NhbGdhcnkxETAPBgNVBAoT +CEZlYXRoZXJzMREwDwYDVQQLEwhGZWF0aGVyczETMBEGA1UEAxMKRmVhdGhlcnNK +UzEjMCEGCSqGSIb3DQEJARYUaGVsbG9AZmVhdGhlcnNqcy5jb20wHhcNMTQwMTA0 +MDIwNTUyWhcNMTQwMjAzMDIwNTUyWjCBkTELMAkGA1UEBhMCQ0ExEDAOBgNVBAgT +B0FsYmVydGExEDAOBgNVBAcTB0NhbGdhcnkxETAPBgNVBAoTCEZlYXRoZXJzMREw +DwYDVQQLEwhGZWF0aGVyczETMBEGA1UEAxMKRmVhdGhlcnNKUzEjMCEGCSqGSIb3 +DQEJARYUaGVsbG9AZmVhdGhlcnNqcy5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0A +MIGJAoGBALixfLwrvDDYAaaU62oycz8zwUpxCguyyXyhVDN/KMmP/I+HfkbcIrqj +tW0jbpRWiLhn5cw4K/cUTkfMj4AwaN5t2zq0FVFJdIddLxzuamyJLJFZfs5sPYWt +X6morPcu9RM7jwb3R1V852XjVWUj8neUAu7eUzKoSQ575kHsnKrdAgMBAAEwDQYJ +KoZIhvcNAQEFBQADgYEATVlxNPkSgkqBF4foUYNGnkvaiwhd88Mh/Ya3T3EnknF9 +Gz6KrlwWDDI8MkPmqabT2Ijg3LSec7WV+C8SETVFbWLOGV6N1ZVfodFzJ7EKMz5e +VvEIKnHfHpYOEa21E5u02+OfKahtW37eTEVmvcV67vYmW4HNa5QSZ5qfrrqcUhc= +-----END CERTIFICATE----- diff --git a/packages/tests-vitest/resources/certrequest.csr b/packages/tests-vitest/resources/certrequest.csr new file mode 100644 index 0000000000..41f83b2757 --- /dev/null +++ b/packages/tests-vitest/resources/certrequest.csr @@ -0,0 +1,12 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIB0jCCATsCAQAwgZExCzAJBgNVBAYTAkNBMRAwDgYDVQQIEwdBbGJlcnRhMRAw +DgYDVQQHEwdDYWxnYXJ5MREwDwYDVQQKEwhGZWF0aGVyczERMA8GA1UECxMIRmVh +dGhlcnMxEzARBgNVBAMTCkZlYXRoZXJzSlMxIzAhBgkqhkiG9w0BCQEWFGhlbGxv +QGZlYXRoZXJzanMuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4sXy8 +K7ww2AGmlOtqMnM/M8FKcQoLssl8oVQzfyjJj/yPh35G3CK6o7VtI26UVoi4Z+XM +OCv3FE5HzI+AMGjebds6tBVRSXSHXS8c7mpsiSyRWX7ObD2FrV+pqKz3LvUTO48G +90dVfOdl41VlI/J3lALu3lMyqEkOe+ZB7Jyq3QIDAQABoAAwDQYJKoZIhvcNAQEF +BQADgYEAFN1xm2Jc5EwDsiJwjUQkVCYLfAPz8FxLx8XCY7JugPCZWxeJ3w9C3Ymz +hET//7uxNg6q7EO9CI33vP5eOdI8oC8XQffh4GzCoSrmGrKpHSqVh3zN/rCoB4BY +f4nJofTka5iENjMdA0R8//Wp7F1u7xhriuxaRiZoFEPaCIsrvK4= +-----END CERTIFICATE REQUEST----- diff --git a/packages/tests-vitest/resources/privatekey.pem b/packages/tests-vitest/resources/privatekey.pem new file mode 100644 index 0000000000..3a39a23926 --- /dev/null +++ b/packages/tests-vitest/resources/privatekey.pem @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXAIBAAKBgQC4sXy8K7ww2AGmlOtqMnM/M8FKcQoLssl8oVQzfyjJj/yPh35G +3CK6o7VtI26UVoi4Z+XMOCv3FE5HzI+AMGjebds6tBVRSXSHXS8c7mpsiSyRWX7O +bD2FrV+pqKz3LvUTO48G90dVfOdl41VlI/J3lALu3lMyqEkOe+ZB7Jyq3QIDAQAB +AoGAYCTkzf/mY3bOxSzYr9u7ardCc8IMfLKBeMNy1avoS6UM0Jqz/acy3P3DwCCl +u8qgOX68fWbwXBrR9UZjnVOWAvAgACS9bSTR4UxXuHve9YHf1s1Idm1Ck8CopiuY +0PTiuF7OJp6U7fc1RjO5F5tvSMuYbh+68Vpx9SQRfDHYqnECQQD1KnhSRDjLCfoB +lLfTew99W51OTx2NPRKRXwZH/YwlgRl/cAgJhdemah/AAavB6BUdqEXdiIviEHuT +UsfAXhf7AkEAwNrmEI3B4gtMRKJAsyWAKGFxDHuC9wGkhSxCVihQuxXtqEMX7Qnx +ucU9bRRtUgVPcOmFEtpPsI4e0wkTMg+ZBwJAPL+ERuYuqGjVcPTXw+g3Q1mjFddW +vDuI0UqZdNcnlddyaPhqlWl7sPmU2m/PjmGicdHTVfxSpPZumGenpUvrZwJAdodS +9QObEOmus1Qhfbljne3dhDV5FYTd77d3Aer/Syy8BzlNQDNnbKysBxmR4uI+o//x ++NdSOQnwKfYe5RqvCwJBAMfq911uzlD8Kd9s0n+MJe8b5/duYOtgPZvaIFWOWyNm +0aJE/VovVhk2JGvIU9kxdgt9O4N0x2XukS2hq7I1Xts= +-----END RSA PRIVATE KEY----- diff --git a/packages/tests-vitest/src/client.ts b/packages/tests-vitest/src/client.ts new file mode 100644 index 0000000000..42471cb8c6 --- /dev/null +++ b/packages/tests-vitest/src/client.ts @@ -0,0 +1,125 @@ +import { strict as assert } from 'assert' + +export interface Todo { + text: string + complete?: boolean + id?: number +} + +export function clientTests(app: any, name: string) { + const getService = () => (name && typeof app.service === 'function' ? app.service(name) : app) + + describe('Service base tests', () => { + it('.find', async () => { + const todos = await getService().find() + + assert.deepEqual(todos, [ + { + // eslint-disable-line + text: 'some todo', + complete: false, + id: 0 + } + ]) + }) + + it('.get and params passing', async () => { + const query = { + some: 'thing', + other: ['one', 'two'], + nested: { a: { b: 'object' } } + } + + const todo = await getService().get(0, { query }) + + assert.deepEqual(todo, { + // eslint-disable-line + id: 0, + text: 'some todo', + complete: false, + query + }) + }) + + it('.create', async () => { + const todo = await getService().create({ + text: 'created todo', + complete: true + }) + + assert.deepEqual(todo, { + // eslint-disable-line + id: 1, + text: 'created todo', + complete: true + }) + }) + + it('.create and created event', () => + new Promise((resolve) => { + getService().once('created', (data: Todo) => { + assert.strictEqual(data.text, 'created todo') + assert.ok(data.complete) + resolve() + }) + + getService().create({ text: 'created todo', complete: true }) + })) + + it('.update and updated event', () => + new Promise((resolve) => { + getService().once('updated', (data: Todo) => { + assert.strictEqual(data.text, 'updated todo') + assert.ok(data.complete) + resolve() + }) + + getService() + .create({ text: 'todo to update', complete: false }) + .then((todo: Todo) => { + getService().update(todo.id, { + text: 'updated todo', + complete: true + }) + }) + })) + + it('.patch and patched event', () => + new Promise((resolve) => { + getService().once('patched', (data: Todo) => { + assert.strictEqual(data.text, 'todo to patch') + assert.ok(data.complete) + resolve() + }) + + getService() + .create({ text: 'todo to patch', complete: false }) + .then((todo: Todo) => getService().patch(todo.id, { complete: true })) + })) + + it('.remove and removed event', () => + new Promise((resolve, reject) => { + getService().once('removed', (data: Todo) => { + assert.strictEqual(data.text, 'todo to remove') + assert.strictEqual(data.complete, false) + resolve() + }) + + getService() + .create({ text: 'todo to remove', complete: false }) + .then((todo: Todo) => getService().remove(todo.id)) + .catch(reject) + })) + + it('.get with error', async () => { + const query = { error: true } + + try { + await getService().get(0, { query }) + assert.fail('Should never get here') + } catch (error: any) { + assert.strictEqual(error.message, 'Something went wrong') + } + }) + }) +} diff --git a/packages/tests-vitest/src/fixture.ts b/packages/tests-vitest/src/fixture.ts new file mode 100644 index 0000000000..2e7bbb3fbf --- /dev/null +++ b/packages/tests-vitest/src/fixture.ts @@ -0,0 +1,133 @@ +import assert from 'assert' + +const clone = (data: any) => JSON.parse(JSON.stringify(data)) + +const findAllData = [ + { + id: 0, + description: 'You have to do something' + }, + { + id: 1, + description: 'You have to do laundry' + } +] + +export class Service { + events = ['log'] + + async find() { + return findAllData + } + + async get(name: string, params: any) { + if (params.query.error) { + throw new Error(`Something for ${name} went wrong`) + } + + if (params.query.runtimeError) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + thingThatDoesNotExist() // eslint-disable-line + } + + return Promise.resolve({ + id: name, + description: `You have to do ${name}!` + }) + } + + async create(data: any) { + const result = Object.assign({}, clone(data), { + id: 42, + status: 'created' + }) + + if (Array.isArray(data)) { + result.many = true + } + + return result + } + + async update(id: any, data: any) { + const result = Object.assign({}, clone(data), { + id, + status: 'updated' + }) + + if (id === null) { + result.many = true + } + + return result + } + + async patch(id: any, data: any) { + const result = Object.assign({}, clone(data), { + id, + status: 'patched' + }) + + if (id === null) { + result.many = true + } + + return result + } + + async remove(id: any) { + return { id } + } + + async customMethod(data: any, params: any) { + return { + data, + method: 'customMethod', + provider: params.provider + } + } + + async internalMethod() { + throw new Error('Should never get here') + } +} + +export const verify = { + find(data: any) { + assert.deepStrictEqual(findAllData, clone(data), 'Data as expected') + }, + + get(id: any, data: any) { + assert.strictEqual(data.id, id, 'Got id in data') + assert.strictEqual(data.description, `You have to do ${id}!`, 'Got description') + }, + + create(original: any, current: any) { + const expected = Object.assign({}, clone(original), { + id: 42, + status: 'created' + }) + assert.deepStrictEqual(expected, clone(current), 'Data ran through .create as expected') + }, + + update(id: any, original: any, current: any) { + const expected = Object.assign({}, clone(original), { + id, + status: 'updated' + }) + assert.deepStrictEqual(expected, clone(current), 'Data ran through .update as expected') + }, + + patch(id: any, original: any, current: any) { + const expected = Object.assign({}, clone(original), { + id, + status: 'patched' + }) + assert.deepStrictEqual(expected, clone(current), 'Data ran through .patch as expected') + }, + + remove(id: any, data: any) { + assert.deepStrictEqual({ id }, clone(data), '.remove called') + } +} diff --git a/packages/tests-vitest/src/index.ts b/packages/tests-vitest/src/index.ts new file mode 100644 index 0000000000..214319e144 --- /dev/null +++ b/packages/tests-vitest/src/index.ts @@ -0,0 +1,3 @@ +export * from './client' +export * from './rest' +export * from './fixture' diff --git a/packages/tests-vitest/src/rest.ts b/packages/tests-vitest/src/rest.ts new file mode 100644 index 0000000000..78149ba366 --- /dev/null +++ b/packages/tests-vitest/src/rest.ts @@ -0,0 +1,94 @@ +import assert from 'assert' +import axios from 'axios' + +import { verify } from './fixture' + +export function restTests(description: string, name: string, port: number) { + describe(description, () => { + it('GET .find', async () => { + const res = await axios.get(`http://localhost:${port}/${name}`) + + assert.ok(res.status === 200, 'Got OK status code') + verify.find(res.data) + }) + + it('GET .get', async () => { + const res = await axios.get(`http://localhost:${port}/${name}/dishes`) + + assert.ok(res.status === 200, 'Got OK status code') + verify.get('dishes', res.data) + }) + + it('POST .create', async () => { + const original = { + description: 'POST .create' + } + + const res = await axios.post(`http://localhost:${port}/${name}`, original) + + assert.ok(res.status === 201, 'Got CREATED status code') + verify.create(original, res.data) + }) + + it('PUT .update', async () => { + const original = { + description: 'PUT .update' + } + + const res = await axios.put(`http://localhost:${port}/${name}/544`, original) + + assert.ok(res.status === 200, 'Got OK status code') + verify.update('544', original, res.data) + }) + + it('PUT .update many', async () => { + const original = { + description: 'PUT .update', + many: true + } + + const res = await axios.put(`http://localhost:${port}/${name}`, original) + const { data } = res + + assert.ok(res.status === 200, 'Got OK status code') + verify.update(null, original, data) + }) + + it('PATCH .patch', async () => { + const original = { + description: 'PATCH .patch' + } + + const res = await axios.patch(`http://localhost:${port}/${name}/544`, original) + + assert.ok(res.status === 200, 'Got OK status code') + verify.patch('544', original, res.data) + }) + + it('PATCH .patch many', async () => { + const original = { + description: 'PATCH .patch', + many: true + } + + const res = await axios.patch(`http://localhost:${port}/${name}`, original) + + assert.ok(res.status === 200, 'Got OK status code') + verify.patch(null, original, res.data) + }) + + it('DELETE .remove', async () => { + const res = await axios.delete(`http://localhost:${port}/${name}/233`) + + assert.ok(res.status === 200, 'Got OK status code') + verify.remove('233', res.data) + }) + + it('DELETE .remove many', async () => { + const res = await axios.delete(`http://localhost:${port}/${name}`) + + assert.ok(res.status === 200, 'Got OK status code') + verify.remove(null, res.data) + }) + }) +} diff --git a/packages/tests-vitest/tsconfig.json b/packages/tests-vitest/tsconfig.json new file mode 100644 index 0000000000..316fd41336 --- /dev/null +++ b/packages/tests-vitest/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig", + "include": [ + "src/**/*.ts" + ], + "compilerOptions": { + "outDir": "lib" + } +} diff --git a/packages/tests-vitest/vite.config.ts b/packages/tests-vitest/vite.config.ts new file mode 100644 index 0000000000..5381f73f70 --- /dev/null +++ b/packages/tests-vitest/vite.config.ts @@ -0,0 +1,3 @@ +import vitest from '../../vitest.config.template' + +export default vitest diff --git a/packages/tests/LICENSE b/packages/tests/LICENSE index 887338c4f0..7712f870f3 100644 --- a/packages/tests/LICENSE +++ b/packages/tests/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2023 Feathers Contributors +Copyright (c) 2024 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/tests/README.md b/packages/tests/README.md index f5018f2898..74c5cedcd2 100644 --- a/packages/tests/README.md +++ b/packages/tests/README.md @@ -3,4 +3,4 @@ [![CI](https://github.com/feathersjs/feathers/workflows/CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3ACI) [![Download Status](https://img.shields.io/npm/dm/@feathersjs/tests.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/tests) -> Common tests for Feathers core modules +> Common tests for Feathers core modules with mocha diff --git a/packages/tests/package.json b/packages/tests/package.json index e1b314dc12..165369588c 100644 --- a/packages/tests/package.json +++ b/packages/tests/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/tests", "private": true, - "description": "Feathers core module common tests", + "description": "Feathers core module common tests with mocha", "version": "5.0.24", "homepage": "https://feathersjs.com", "main": "lib/", @@ -45,16 +45,20 @@ }, "dependencies": { "@types/lodash": "^4.17.0", - "axios": "^1.6.7", + "axios": "^1.6.8", "lodash": "^4.17.21" }, "devDependencies": { "@feathersjs/feathers": "^5.0.24", "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", + "@types/node": "^20.11.30", "mocha": "^10.3.0", "shx": "^0.3.4", "ts-node": "^10.9.2", + "typescript": "^5.4.3" + }, + "peerDependencies": { + "mocha": "^10.3.0", "typescript": "^5.4.2" } } diff --git a/packages/tests/src/client.ts b/packages/tests/src/client.ts index 5d18a2243f..42471cb8c6 100644 --- a/packages/tests/src/client.ts +++ b/packages/tests/src/client.ts @@ -55,57 +55,61 @@ export function clientTests(app: any, name: string) { }) }) - it('.create and created event', (done) => { - getService().once('created', (data: Todo) => { - assert.strictEqual(data.text, 'created todo') - assert.ok(data.complete) - done() - }) + it('.create and created event', () => + new Promise((resolve) => { + getService().once('created', (data: Todo) => { + assert.strictEqual(data.text, 'created todo') + assert.ok(data.complete) + resolve() + }) - getService().create({ text: 'created todo', complete: true }) - }) + getService().create({ text: 'created todo', complete: true }) + })) - it('.update and updated event', (done) => { - getService().once('updated', (data: Todo) => { - assert.strictEqual(data.text, 'updated todo') - assert.ok(data.complete) - done() - }) + it('.update and updated event', () => + new Promise((resolve) => { + getService().once('updated', (data: Todo) => { + assert.strictEqual(data.text, 'updated todo') + assert.ok(data.complete) + resolve() + }) - getService() - .create({ text: 'todo to update', complete: false }) - .then((todo: Todo) => { - getService().update(todo.id, { - text: 'updated todo', - complete: true + getService() + .create({ text: 'todo to update', complete: false }) + .then((todo: Todo) => { + getService().update(todo.id, { + text: 'updated todo', + complete: true + }) }) + })) + + it('.patch and patched event', () => + new Promise((resolve) => { + getService().once('patched', (data: Todo) => { + assert.strictEqual(data.text, 'todo to patch') + assert.ok(data.complete) + resolve() }) - }) - it('.patch and patched event', (done) => { - getService().once('patched', (data: Todo) => { - assert.strictEqual(data.text, 'todo to patch') - assert.ok(data.complete) - done() - }) - - getService() - .create({ text: 'todo to patch', complete: false }) - .then((todo: Todo) => getService().patch(todo.id, { complete: true })) - }) - - it('.remove and removed event', (done) => { - getService().once('removed', (data: Todo) => { - assert.strictEqual(data.text, 'todo to remove') - assert.strictEqual(data.complete, false) - done() - }) + getService() + .create({ text: 'todo to patch', complete: false }) + .then((todo: Todo) => getService().patch(todo.id, { complete: true })) + })) + + it('.remove and removed event', () => + new Promise((resolve, reject) => { + getService().once('removed', (data: Todo) => { + assert.strictEqual(data.text, 'todo to remove') + assert.strictEqual(data.complete, false) + resolve() + }) - getService() - .create({ text: 'todo to remove', complete: false }) - .then((todo: Todo) => getService().remove(todo.id)) - .catch(done) - }) + getService() + .create({ text: 'todo to remove', complete: false }) + .then((todo: Todo) => getService().remove(todo.id)) + .catch(reject) + })) it('.get with error', async () => { const query = { error: true } diff --git a/packages/tests/vite.config.ts b/packages/tests/vite.config.ts new file mode 100644 index 0000000000..5381f73f70 --- /dev/null +++ b/packages/tests/vite.config.ts @@ -0,0 +1,3 @@ +import vitest from '../../vitest.config.template' + +export default vitest diff --git a/packages/transport-commons/LICENSE b/packages/transport-commons/LICENSE index 887338c4f0..7712f870f3 100644 --- a/packages/transport-commons/LICENSE +++ b/packages/transport-commons/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2023 Feathers Contributors +Copyright (c) 2024 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/transport-commons/README.md b/packages/transport-commons/README.md index c216740468..bce17ee0b5 100644 --- a/packages/transport-commons/README.md +++ b/packages/transport-commons/README.md @@ -8,6 +8,6 @@ ## License -Copyright (c) 2023 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/transport-commons/package.json b/packages/transport-commons/package.json index 509ed25ca6..2bfda7aa78 100644 --- a/packages/transport-commons/package.json +++ b/packages/transport-commons/package.json @@ -35,8 +35,8 @@ "prepublish": "npm run compile", "pack": "npm pack --pack-destination ../generators/test/build", "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "npm run mocha", - "mocha": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" + "test": "npm run vitest", + "vitest": "vitest run" }, "directories": { "lib": "lib" @@ -63,12 +63,10 @@ "devDependencies": { "@types/encodeurl": "^1.0.2", "@types/lodash": "^4.17.0", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.26", - "mocha": "^10.3.0", + "@types/node": "^20.11.30", "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" } diff --git a/packages/transport-commons/test/channels/channel.test.ts b/packages/transport-commons/test/channels/channel.test.ts index 2e9502d9db..87f6e00bde 100644 --- a/packages/transport-commons/test/channels/channel.test.ts +++ b/packages/transport-commons/test/channels/channel.test.ts @@ -115,17 +115,18 @@ describe('app.channel', () => { }) }) - it('empty', (done) => { - const channel = app.channel('test') - const c1 = { id: 1 } - const c2 = { id: 2 } - - channel.once('empty', done) - - channel.join(c1, c2) - channel.leave(c1) - channel.leave(c2) - }) + it('empty', () => + new Promise((resolve) => { + const channel = app.channel('test') + const c1 = { id: 1 } + const c2 = { id: 2 } + + channel.once('empty', () => resolve()) + + channel.join(c1, c2) + channel.leave(c1) + channel.leave(c2) + })) it('removes an empty channel', () => { const channel = app.channel('test') diff --git a/packages/transport-commons/test/channels/dispatch.test.ts b/packages/transport-commons/test/channels/dispatch.test.ts index 8165e3b439..1979c27cd2 100644 --- a/packages/transport-commons/test/channels/dispatch.test.ts +++ b/packages/transport-commons/test/channels/dispatch.test.ts @@ -57,183 +57,194 @@ describe('app.publish', () => { } }) - it('simple event registration and dispatching', (done) => { - app.channel('testing').join(c1) - - app.service('test').registerPublisher('created', () => app.channel('testing')) - - app.once('publish', (event: string, channel: Channel, hook: HookContext) => { - try { - assert.strictEqual(event, 'created') - assert.strictEqual(hook.path, 'test') - assert.deepStrictEqual(hook.result, data) - assert.deepStrictEqual(channel.connections, [c1]) - done() - } catch (error: any) { - done(error) - } - }) - - app.service('test').create(data).catch(done) - }) + it('simple event registration and dispatching', () => + new Promise((resolve, reject) => { + app.channel('testing').join(c1) + + app.service('test').registerPublisher('created', () => app.channel('testing')) + + app.once('publish', (event: string, channel: Channel, hook: HookContext) => { + try { + assert.strictEqual(event, 'created') + assert.strictEqual(hook.path, 'test') + assert.deepStrictEqual(hook.result, data) + assert.deepStrictEqual(channel.connections, [c1]) + resolve() + } catch (error: any) { + reject(error) + } + }) - it('app and global level dispatching and precedence', (done) => { - app.channel('testing').join(c1) - app.channel('other').join(c2) + app.service('test').create(data).catch(reject) + })) - app.registerPublisher('created', () => app.channel('testing')) - app.registerPublisher(() => app.channel('other')) + it('app and global level dispatching and precedence', () => + new Promise((resolve, reject) => { + app.channel('testing').join(c1) + app.channel('other').join(c2) - app.once('publish', (_event: string, channel: Channel) => { - assert.ok(channel.connections.indexOf(c1) !== -1) - done() - }) + app.registerPublisher('created', () => app.channel('testing')) + app.registerPublisher(() => app.channel('other')) - app.service('test').create(data).catch(done) - }) + app.once('publish', (_event: string, channel: Channel) => { + assert.ok(channel.connections.indexOf(c1) !== -1) + resolve() + }) - it('promise event dispatching', (done) => { - app.channel('testing').join(c1) - app.channel('othertest').join(c2) - - app - .service('test') - .registerPublisher( - 'created', - () => new Promise((resolve) => setTimeout(() => resolve(app.channel('testing')), 50)) - ) - app - .service('test') - .registerPublisher( - 'created', - () => new Promise((resolve) => setTimeout(() => resolve(app.channel('testing', 'othertest')), 100)) - ) - - app.once('publish', (_event: string, channel: Channel, hook: HookContext) => { - assert.deepStrictEqual(hook.result, data) - assert.deepStrictEqual(channel.connections, [c1, c2]) - done() - }) + app.service('test').create(data).catch(reject) + })) + + it('promise event dispatching', () => + new Promise((resolve, reject) => { + app.channel('testing').join(c1) + app.channel('othertest').join(c2) + + app + .service('test') + .registerPublisher( + 'created', + () => new Promise((resolve) => setTimeout(() => resolve(app.channel('testing')), 50)) + ) + app + .service('test') + .registerPublisher( + 'created', + () => + new Promise((resolve) => setTimeout(() => resolve(app.channel('testing', 'othertest')), 100)) + ) + + app.once('publish', (_event: string, channel: Channel, hook: HookContext) => { + assert.deepStrictEqual(hook.result, data) + assert.deepStrictEqual(channel.connections, [c1, c2]) + resolve() + }) - app.service('test').create(data).catch(done) - }) + app.service('test').create(data).catch(reject) + })) - it('custom event dispatching', (done) => { - const eventData = { testing: true } + it('custom event dispatching', () => + new Promise((resolve) => { + const eventData = { testing: true } - app.channel('testing').join(c1) - app.channel('othertest').join(c2) + app.channel('testing').join(c1) + app.channel('othertest').join(c2) - app.service('test').registerPublisher('foo', () => app.channel('testing')) + app.service('test').registerPublisher('foo', () => app.channel('testing')) - app.once('publish', (event: string, channel: Channel, hook: HookContext) => { - assert.strictEqual(event, 'foo') - assert.deepStrictEqual(hook, { - app, - path: 'test', - service: app.service('test'), - result: eventData + app.once('publish', (event: string, channel: Channel, hook: HookContext) => { + assert.strictEqual(event, 'foo') + assert.deepStrictEqual(hook, { + app, + path: 'test', + service: app.service('test'), + result: eventData + }) + assert.deepStrictEqual(channel.connections, [c1]) + resolve() }) - assert.deepStrictEqual(channel.connections, [c1]) - done() - }) - app.service('test').emit('foo', eventData) - }) + app.service('test').emit('foo', eventData) + })) - it('does not sent `dispatch` event if there are no dispatchers', (done) => { - app.once('publish', () => done(new Error('Should never get here'))) + it('does not sent `dispatch` event if there are no dispatchers', () => + new Promise((resolve, reject) => { + app.once('publish', () => reject(new Error('Should never get here'))) - process.once('unhandledRejection', (error) => done(error)) + process.once('unhandledRejection', (error) => reject(error)) - app - .service('test') - .create(data) - .then(() => done()) - .catch(done) - }) + app + .service('test') + .create(data) + .then(() => resolve()) + .catch(reject) + })) - it('does not send `dispatch` event if there are no connections', (done) => { - app.service('test').registerPublisher('created', () => app.channel('dummy')) - app.once('publish', () => done(new Error('Should never get here'))) + it('does not send `dispatch` event if there are no connections', () => + new Promise((resolve, reject) => { + app.service('test').registerPublisher('created', () => app.channel('dummy')) + app.once('publish', () => reject(new Error('Should never get here'))) - app - .service('test') - .create(data) - .then(() => done()) - .catch(done) - }) + app + .service('test') + .create(data) + .then(() => resolve()) + .catch(reject) + })) - it('dispatcher returning an array of channels', (done) => { - app.channel('testing').join(c1) - app.channel('othertest').join(c2) + it('dispatcher returning an array of channels', () => + new Promise((resolve, reject) => { + app.channel('testing').join(c1) + app.channel('othertest').join(c2) - app - .service('test') - .registerPublisher('created', () => [app.channel('testing'), app.channel('othertest')]) + app + .service('test') + .registerPublisher('created', () => [app.channel('testing'), app.channel('othertest')]) - app.once('publish', (_event: string, channel: Channel, hook: HookContext) => { - assert.deepStrictEqual(hook.result, data) - assert.deepStrictEqual(channel.connections, [c1, c2]) - done() - }) + app.once('publish', (_event: string, channel: Channel, hook: HookContext) => { + assert.deepStrictEqual(hook.result, data) + assert.deepStrictEqual(channel.connections, [c1, c2]) + resolve() + }) - app.service('test').create(data).catch(done) - }) + app.service('test').create(data).catch(reject) + })) - it('dispatcher can send data', (done) => { - const c1data = { channel: 'testing' } + it('dispatcher can send data', () => + new Promise((resolve, reject) => { + const c1data = { channel: 'testing' } - app.channel('testing').join(c1) - app.channel('othertest').join(c2) + app.channel('testing').join(c1) + app.channel('othertest').join(c2) - app - .service('test') - .registerPublisher('created', () => [app.channel('testing').send(c1data), app.channel('othertest')]) + app + .service('test') + .registerPublisher('created', () => [app.channel('testing').send(c1data), app.channel('othertest')]) - app.once('publish', (_event: string, channel: CombinedChannel, hook: HookContext) => { - assert.deepStrictEqual(hook.result, data) - assert.deepStrictEqual(channel.dataFor(c1), c1data) - assert.ok(channel.dataFor(c2) === null) - assert.deepStrictEqual(channel.connections, [c1, c2]) - done() - }) + app.once('publish', (_event: string, channel: CombinedChannel, hook: HookContext) => { + assert.deepStrictEqual(hook.result, data) + assert.deepStrictEqual(channel.dataFor(c1), c1data) + assert.ok(channel.dataFor(c2) === null) + assert.deepStrictEqual(channel.connections, [c1, c2]) + resolve() + }) - app.service('test').create(data).catch(done) - }) + app.service('test').create(data).catch(reject) + })) - it('publisher precedence and preventing publishing', (done) => { - app.channel('test').join(c1) + it('publisher precedence and preventing publishing', () => + new Promise((resolve, reject) => { + app.channel('test').join(c1) - app.registerPublisher(() => app.channel('test')) - app.service('test').registerPublisher('created', (): null => null) + app.registerPublisher(() => app.channel('test')) + app.service('test').registerPublisher('created', (): null => null) - app.once('publish', () => done(new Error('Should never get here'))) + app.once('publish', () => reject(new Error('Should never get here'))) - app - .service('test') - .create(data) - .then(() => done()) - .catch(done) - }) + app + .service('test') + .create(data) + .then(() => resolve()) + .catch(reject) + })) - it('data of first channel has precedence', (done) => { - const sendData = { test: true } + it('data of first channel has precedence', () => + new Promise((resolve, reject) => { + const sendData = { test: true } - app.channel('testing').join(c1) - app.channel('othertest').join(c1) + app.channel('testing').join(c1) + app.channel('othertest').join(c1) - app.service('test').registerPublisher('created', () => { - return [app.channel('testing'), app.channel('othertest').send(sendData)] - }) + app.service('test').registerPublisher('created', () => { + return [app.channel('testing'), app.channel('othertest').send(sendData)] + }) - app.once('publish', (_event: string, channel: CombinedChannel) => { - assert.strictEqual(channel.dataFor(c1), null) - assert.deepStrictEqual(channel.connections, [c1]) - done() - }) + app.once('publish', (_event: string, channel: CombinedChannel) => { + assert.strictEqual(channel.dataFor(c1), null) + assert.deepStrictEqual(channel.connections, [c1]) + resolve() + }) - app.service('test').create(data).catch(done) - }) + app.service('test').create(data).catch(reject) + })) }) }) diff --git a/packages/transport-commons/test/client.test.ts b/packages/transport-commons/test/client.test.ts index ea307db776..28a1d31303 100644 --- a/packages/transport-commons/test/client.test.ts +++ b/packages/transport-commons/test/client.test.ts @@ -60,26 +60,28 @@ describe('client', () => { ) }) - it('initializes and emits namespaced events', (done) => { - connection.once('todos test', (data: any) => { - assert.deepStrictEqual(data, testData) - done() - }) - service.emit('test', testData) - }) + it('initializes and emits namespaced events', () => + new Promise((resolve) => { + connection.once('todos test', (data: any) => { + assert.deepStrictEqual(data, testData) + resolve() + }) + service.emit('test', testData) + })) it('has other emitter methods', () => { assert.ok(service.eventNames()) }) - it('can receive pathed events', (done) => { - service.once('thing', (data) => { - assert.deepStrictEqual(data, testData) - done() - }) + it('can receive pathed events', () => + new Promise((resolve) => { + service.once('thing', (data) => { + assert.deepStrictEqual(data, testData) + resolve() + }) - connection.emit('todos thing', testData) - }) + connection.emit('todos thing', testData) + })) it('sends all service and custom methods with acknowledgement', async () => { const idCb = (_path: any, id: any, _params: any, callback: DummyCallback) => callback(null, { id }) @@ -231,43 +233,45 @@ describe('client', () => { }) }) - it('has all EventEmitter methods', (done) => { - const testing = { hello: 'world' } - const callback = (data: any) => { - assert.deepStrictEqual(data, testing) - assert.strictEqual(service.listenerCount('test'), 1) - service.removeListener('test', callback) - assert.strictEqual(service.listenerCount('test'), 0) - done() - } + it('has all EventEmitter methods', () => + new Promise((resolve) => { + const testing = { hello: 'world' } + const callback = (data: any) => { + assert.deepStrictEqual(data, testing) + assert.strictEqual(service.listenerCount('test'), 1) + service.removeListener('test', callback) + assert.strictEqual(service.listenerCount('test'), 0) + resolve() + } - service.addListener('test', callback) + service.addListener('test', callback) - connection.emit('todos test', testing) - }) + connection.emit('todos test', testing) + })) - it('properly handles on/off methods', (done) => { - const testing = { hello: 'world' } - - const callback1 = (data: any) => { - assert.deepStrictEqual(data, testing) - assert.strictEqual(service.listenerCount('test'), 3) - service.off('test', callback1) - assert.strictEqual(service.listenerCount('test'), 2) - service.removeAllListeners('test') - assert.strictEqual(service.listenerCount('test'), 0) - done() - } - const callback2 = () => { - // noop - } + it('properly handles on/off methods', () => + new Promise((resolve) => { + const testing = { hello: 'world' } + + const callback1 = (data: any) => { + assert.deepStrictEqual(data, testing) + assert.strictEqual(service.listenerCount('test'), 3) + service.off('test', callback1) + assert.strictEqual(service.listenerCount('test'), 2) + service.removeAllListeners('test') + assert.strictEqual(service.listenerCount('test'), 0) + resolve() + } + const callback2 = () => { + // noop + } - service.on('test', callback1) - service.on('test', callback2) - service.on('test', callback2) + service.on('test', callback1) + service.on('test', callback2) + service.on('test', callback2) - connection.emit('todos test', testing) - }) + connection.emit('todos test', testing) + })) it('forwards namespaced call to .off, returns service instance', () => { // Use it's own connection and service so off method gets detected diff --git a/packages/transport-commons/test/socket/index.test.ts b/packages/transport-commons/test/socket/index.test.ts index 48aacb85b1..98f21820a2 100644 --- a/packages/transport-commons/test/socket/index.test.ts +++ b/packages/transport-commons/test/socket/index.test.ts @@ -52,142 +52,148 @@ describe('@feathersjs/transport-commons', () => { return options.done }) - it('`connection` event', (done) => { - const socket = new EventEmitter() - - app.once('connection', (data) => { - assert.strictEqual(connection, data) - done() - }) - - provider.emit('connection', socket) - }) - - describe('method name based socket events', () => { - it('.get without params', (done) => { + it('`connection` event', () => + new Promise((resolve) => { const socket = new EventEmitter() - provider.emit('connection', socket) - - socket.emit('get', 'myservice', 10, (error: any, result: any) => { - try { - assert.ok(!error) - assert.deepStrictEqual(result, { - id: 10, - params: Object.assign( - { - query: {}, - route: {}, - connection - }, - connection - ) - }) - done() - } catch (e: any) { - done(e) - } + app.once('connection', (data) => { + assert.strictEqual(connection, data) + resolve() }) - }) - - it('method with invalid service name and arguments', (done) => { - const socket = new EventEmitter() provider.emit('connection', socket) + })) - socket.emit('get', null, (error: any) => { - assert.strictEqual(error.name, 'NotFound') - assert.strictEqual(error.message, 'Invalid service path') - done() - }) - }) - - it('method with implicit toString errors properly', (done) => { - const socket = new EventEmitter() - - provider.emit('connection', socket) - - socket.emit('get', { toString: '' }, (error: any) => { - assert.strictEqual(error.name, 'NotFound') - assert.strictEqual(error.message, 'Invalid service path') - done() - }) - }) - - it('.create with params', (done) => { - const socket = new EventEmitter() - const data = { - test: 'data' - } + describe('method name based socket events', () => { + it('.get without params', () => + new Promise((resolve, reject) => { + const socket = new EventEmitter() - provider.emit('connection', socket) + provider.emit('connection', socket) - socket.emit( - 'create', - 'myservice', - data, - { - fromQuery: true - }, - (error: any, result: any) => { + socket.emit('get', 'myservice', 10, (error: any, result: any) => { try { - const params = Object.assign( - { - query: { fromQuery: true }, - route: {}, - connection - }, - connection - ) - assert.ok(!error) - assert.deepStrictEqual(result, Object.assign({ params }, data)) - done() - } catch (e: any) { - done(e) + assert.deepStrictEqual(result, { + id: 10, + params: Object.assign( + { + query: {}, + route: {}, + connection + }, + connection + ) + }) + resolve() + } catch (error: any) { + reject(error) } + }) + })) + + it('method with invalid service name and arguments', () => + new Promise((resolve) => { + const socket = new EventEmitter() + + provider.emit('connection', socket) + + socket.emit('get', null, (error: any) => { + assert.strictEqual(error.name, 'NotFound') + assert.strictEqual(error.message, 'Invalid service path') + resolve() + }) + })) + + it('method with implicit toString errors properly', () => + new Promise((resolve) => { + const socket = new EventEmitter() + + provider.emit('connection', socket) + + socket.emit('get', { toString: '' }, (error: any) => { + assert.strictEqual(error.name, 'NotFound') + assert.strictEqual(error.message, 'Invalid service path') + resolve() + }) + })) + + it('.create with params', () => + new Promise((resolve, reject) => { + const socket = new EventEmitter() + const data = { + test: 'data' } - ) - }) - - it('custom method with params', (done) => { - const socket = new EventEmitter() - const data = { - test: 'data' - } - provider.emit('connection', socket) - - socket.emit( - 'custom', - 'myservice', - data, - { - fromQuery: true - }, - (error: any, result: any) => { - try { - const params = Object.assign( - { - query: { fromQuery: true }, - route: {}, + provider.emit('connection', socket) + + socket.emit( + 'create', + 'myservice', + data, + { + fromQuery: true + }, + (error: any, result: any) => { + try { + const params = Object.assign( + { + query: { fromQuery: true }, + route: {}, + connection + }, connection - }, - connection - ) - - assert.ok(!error) - assert.deepStrictEqual(result, { - ...data, - params, - message: 'From custom method' - }) - done() - } catch (e: any) { - done(e) + ) + + assert.ok(!error) + assert.deepStrictEqual(result, Object.assign({ params }, data)) + resolve() + } catch (error: any) { + reject(error) + } } + ) + })) + + it('custom method with params', () => + new Promise((resolve, reject) => { + const socket = new EventEmitter() + const data = { + test: 'data' } - ) - }) + + provider.emit('connection', socket) + + socket.emit( + 'custom', + 'myservice', + data, + { + fromQuery: true + }, + (error: any, result: any) => { + try { + const params = Object.assign( + { + query: { fromQuery: true }, + route: {}, + connection + }, + connection + ) + + assert.ok(!error) + assert.deepStrictEqual(result, { + ...data, + params, + message: 'From custom method' + }) + resolve() + } catch (error: any) { + reject(error) + } + } + ) + })) }) }) diff --git a/packages/transport-commons/test/socket/utils.test.ts b/packages/transport-commons/test/socket/utils.test.ts index 0c21b2ac53..850faf4eba 100644 --- a/packages/transport-commons/test/socket/utils.test.ts +++ b/packages/transport-commons/test/socket/utils.test.ts @@ -2,7 +2,7 @@ import assert from 'assert' import { EventEmitter } from 'events' import { feathers, Application, Params, RealTimeConnection } from '@feathersjs/feathers' import { NotAuthenticated } from '@feathersjs/errors' -import { isPlainObject } from 'lodash' +import isPlainObject from 'lodash/isPlainObject.js' import { routing } from '../../src/routing' import { normalizeError, getDispatcher, runMethod } from '../../src/socket/utils' @@ -61,27 +61,28 @@ describe('socket commons utils', () => { it('returns a dispatcher function', () => assert.strictEqual(typeof getDispatcher('test', new WeakMap()), 'function')) - it('works with backwards compatible socketKey', (done) => { - const socketKey = Symbol('@feathersjs/test') - const dispatcher = getDispatcher('emit', undefined, socketKey) - const socket = new EventEmitter() - const connection = { - [socketKey]: socket - } - const channel: any = { - connections: [connection], - dataFor(): null { - return null + it('works with backwards compatible socketKey', () => + new Promise((resolve) => { + const socketKey = Symbol('@feathersjs/test') + const dispatcher = getDispatcher('emit', undefined, socketKey) + const socket = new EventEmitter() + const connection = { + [socketKey]: socket + } + const channel: any = { + connections: [connection], + dataFor(): null { + return null + } } - } - socket.once('testing', (data) => { - assert.strictEqual(data, 'hi') - done() - }) + socket.once('testing', (data) => { + assert.strictEqual(data, 'hi') + resolve() + }) - dispatcher('testing', channel, { result: 'hi' } as any) - }) + dispatcher('testing', channel, { result: 'hi' } as any) + })) describe('dispatcher logic', () => { let dispatcher: any @@ -106,38 +107,41 @@ describe('socket commons utils', () => { dummyMap.set(dummyConnection, dummySocket) }) - it('dispatches a basic event', (done) => { - dummySocket.once('testing', (data) => { - assert.strictEqual(data, 'hi') - done() - }) + it('dispatches a basic event', () => + new Promise((resolve) => { + dummySocket.once('testing', (data) => { + assert.strictEqual(data, 'hi') + resolve() + }) - dispatcher('testing', dummyChannel, dummyHook) - }) + dispatcher('testing', dummyChannel, dummyHook) + })) - it('dispatches event on a hooks path event', (done) => { - dummyHook.path = 'myservice' + it('dispatches event on a hooks path event', () => + new Promise((resolve) => { + dummyHook.path = 'myservice' - dummySocket.once('myservice testing', (data) => { - assert.strictEqual(data, 'hi') - done() - }) + dummySocket.once('myservice testing', (data) => { + assert.strictEqual(data, 'hi') + resolve() + }) - dispatcher('testing', dummyChannel, dummyHook) - }) + dispatcher('testing', dummyChannel, dummyHook) + })) - it('dispatches `hook.dispatch` instead', (done) => { - const message = 'hi from dispatch' + it('dispatches `hook.dispatch` instead', () => + new Promise((resolve) => { + const message = 'hi from dispatch' - dummyHook.dispatch = message + dummyHook.dispatch = message - dummySocket.once('testing', (data) => { - assert.strictEqual(data, message) - done() - }) + dummySocket.once('testing', (data) => { + assert.strictEqual(data, message) + resolve() + }) - dispatcher('testing', dummyChannel, dummyHook) - }) + dispatcher('testing', dummyChannel, dummyHook) + })) it('does nothing if there is no socket', () => { dummyChannel.connections[0].test = null @@ -145,55 +149,58 @@ describe('socket commons utils', () => { dispatcher('testing', dummyChannel, dummyHook) }) - it('dispatches arrays properly hook events', (done) => { - const data1 = { message: 'First message' } - const data2 = { message: 'Second message' } + it('dispatches arrays properly hook events', () => + new Promise((resolve) => { + const data1 = { message: 'First message' } + const data2 = { message: 'Second message' } - dummyHook.result = [data1, data2] + dummyHook.result = [data1, data2] - dummySocket.once('testing', (data) => { - assert.deepStrictEqual(data, data1) - dummySocket.once('testing', (result) => { - assert.deepStrictEqual(result, data2) - done() + dummySocket.once('testing', (data) => { + assert.deepStrictEqual(data, data1) + dummySocket.once('testing', (result) => { + assert.deepStrictEqual(result, data2) + resolve() + }) }) - }) - dispatcher('testing', dummyChannel, dummyHook, data1) - dispatcher('testing', dummyChannel, dummyHook, data2) - }) + dispatcher('testing', dummyChannel, dummyHook, data1) + dispatcher('testing', dummyChannel, dummyHook, data2) + })) - it('dispatches dispatch arrays properly', (done) => { - const data1 = { message: 'First message' } - const data2 = { message: 'Second message' } + it('dispatches dispatch arrays properly', () => + new Promise((resolve) => { + const data1 = { message: 'First message' } + const data2 = { message: 'Second message' } - dummyHook.result = [] - dummyHook.dispatch = [data1, data2] + dummyHook.result = [] + dummyHook.dispatch = [data1, data2] - dummySocket.once('testing', (data) => { - assert.deepStrictEqual(data, data1) - dummySocket.once('testing', (result) => { - assert.deepStrictEqual(result, data2) - done() + dummySocket.once('testing', (data) => { + assert.deepStrictEqual(data, data1) + dummySocket.once('testing', (result) => { + assert.deepStrictEqual(result, data2) + resolve() + }) }) - }) - dispatcher('testing', dummyChannel, dummyHook, data1) - dispatcher('testing', dummyChannel, dummyHook, data2) - }) + dispatcher('testing', dummyChannel, dummyHook, data1) + dispatcher('testing', dummyChannel, dummyHook, data2) + })) - it('dispatches arrays properly for custom events', (done) => { - const result = [{ message: 'First' }, { message: 'Second' }] + it('dispatches arrays properly for custom events', () => + new Promise((resolve) => { + const result = [{ message: 'First' }, { message: 'Second' }] - dummyHook.result = result + dummyHook.result = result - dummySocket.once('otherEvent', (data) => { - assert.deepStrictEqual(data, result) - done() - }) + dummySocket.once('otherEvent', (data) => { + assert.deepStrictEqual(data, result) + resolve() + }) - dispatcher('otherEvent', dummyChannel, dummyHook, result) - }) + dispatcher('otherEvent', dummyChannel, dummyHook, result) + })) }) }) @@ -217,182 +224,192 @@ describe('socket commons utils', () => { }) describe('running methods', () => { - it('basic', (done) => { - const callback = (error: any, result: any) => { - if (error) { - return done(error) + it('basic', () => + new Promise((resolve, reject) => { + const callback = (error: any, result: any) => { + if (error) { + return reject(error) + } + + assert.deepStrictEqual(result, { id: 10 }) + resolve() } - assert.deepStrictEqual(result, { id: 10 }) - done() - } + runMethod(app, {}, 'myservice', 'get', [10, {}, callback]) + })) - runMethod(app, {}, 'myservice', 'get', [10, {}, callback]) - }) + it('queries are always plain objects', () => + new Promise((resolve, reject) => { + const callback = (error: any, result: any) => { + if (error) { + return reject(error) + } - it('queries are always plain objects', (done) => { - const callback = (error: any, result: any) => { - if (error) { - return done(error) + assert.deepStrictEqual(result, { id: 10 }) + resolve() } - assert.deepStrictEqual(result, { id: 10 }) - done() - } - - runMethod(app, {}, 'myservice', 'get', [ - 10, - { - __proto__: [] - }, - callback - ]) - }) + runMethod(app, {}, 'myservice', 'get', [ + 10, + { + __proto__: [] + }, + callback + ]) + })) + + it('merges params with connection and passes connection', () => + new Promise((resolve, reject) => { + const connection = { + testing: true + } + const callback = (error: any, result: any) => { + if (error) { + return reject(error) + } - it('merges params with connection and passes connection', (done) => { - const connection = { - testing: true - } - const callback = (error: any, result: any) => { - if (error) { - return done(error) + assert.deepStrictEqual(result, { + id: 10, + params: { + connection, + query: {}, + route: {}, + testing: true + } + }) + resolve() } - assert.deepStrictEqual(result, { - id: 10, - params: { - connection, - query: {}, - route: {}, - testing: true + app.use('/otherservice', { + get(id, params) { + return Promise.resolve({ id, params }) } }) - done() - } - app.use('/otherservice', { - get(id, params) { - return Promise.resolve({ id, params }) - } - }) + runMethod(app, connection, 'otherservice', 'get', [10, {}, callback]) + })) - runMethod(app, connection, 'otherservice', 'get', [10, {}, callback]) - }) + it('with params missing', () => + new Promise((resolve, reject) => { + const callback = (error: any, result: any) => { + if (error) { + return reject(error) + } - it('with params missing', (done) => { - const callback = (error: any, result: any) => { - if (error) { - return done(error) + assert.deepStrictEqual(result, { id: 10 }) + resolve() } - assert.deepStrictEqual(result, { id: 10 }) - done() - } - - runMethod(app, {}, 'myservice', 'get', [10, callback]) - }) + runMethod(app, {}, 'myservice', 'get', [10, callback]) + })) - it('with params but missing callback', (done) => { - app.use('/otherservice', { - get(id: number | string) { - assert.strictEqual(id, 'dishes') + it('with params but missing callback', () => + new Promise((resolve) => { + app.use('/otherservice', { + get(id: number | string) { + assert.strictEqual(id, 'dishes') - return Promise.resolve({ id }).then((res) => { - done() - return res - }) - } - }) - - runMethod(app, {}, 'otherservice', 'get', ['dishes', {}]) - }) + return Promise.resolve({ id }).then((res) => { + resolve() + return res + }) + } + }) - it('with params and callback missing', (done) => { - app.use('/otherservice', { - get(id: number | string) { - assert.strictEqual(id, 'laundry') + runMethod(app, {}, 'otherservice', 'get', ['dishes', {}]) + })) - return Promise.resolve({ id }).then((res) => { - done() - return res - }) - } - }) - - runMethod(app, {}, 'otherservice', 'get', ['laundry']) - }) - }) + it('with params and callback missing', () => + new Promise((resolve) => { + app.use('/otherservice', { + get(id: number | string) { + assert.strictEqual(id, 'laundry') - it('throws NotFound for invalid service', (done) => { - const callback = (error: any) => { - try { - assert.deepStrictEqual(error, { - name: 'NotFound', - message: "Service 'ohmyservice' not found", - code: 404, - className: 'not-found' + return Promise.resolve({ id }).then((res) => { + resolve() + return res + }) + } }) - done() - } catch (e: any) { - done(e) - } - } - runMethod(app, {}, 'ohmyservice', 'get', [10, callback]) + runMethod(app, {}, 'otherservice', 'get', ['laundry']) + })) }) - it('throws MethodNotAllowed undefined method', (done) => { - const callback = (error: any) => { - try { - assert.deepStrictEqual(error, { - name: 'MethodNotAllowed', - message: "Method 'create' not allowed on service 'myservice'", - code: 405, - className: 'method-not-allowed' - }) - done() - } catch (e: any) { - done(e) + it('throws NotFound for invalid service', () => + new Promise((resolve, reject) => { + const callback = (error: any) => { + try { + assert.deepStrictEqual(error, { + name: 'NotFound', + message: "Service 'ohmyservice' not found", + code: 404, + className: 'not-found' + }) + resolve() + } catch (err: any) { + reject(err) + } } - } - - runMethod(app, {}, 'myservice', 'create', [{}, callback]) - }) - it('throws MethodNotAllowed for invalid service method', (done) => { - const callback = (error: any) => { - try { - assert.deepStrictEqual(error, { - name: 'MethodNotAllowed', - message: "Method 'blabla' not allowed on service 'myservice'", - code: 405, - className: 'method-not-allowed' - }) - done() - } catch (e: any) { - done(e) + runMethod(app, {}, 'ohmyservice', 'get', [10, callback]) + })) + + it('throws MethodNotAllowed undefined method', () => + new Promise((resolve, reject) => { + const callback = (error: any) => { + try { + assert.deepStrictEqual(error, { + name: 'MethodNotAllowed', + message: "Method 'create' not allowed on service 'myservice'", + code: 405, + className: 'method-not-allowed' + }) + resolve() + } catch (error: any) { + reject(error) + } } - } - runMethod(app, {}, 'myservice', 'blabla', [{}, callback]) - }) + runMethod(app, {}, 'myservice', 'create', [{}, callback]) + })) + + it('throws MethodNotAllowed for invalid service method', () => + new Promise((resolve, reject) => { + const callback = (error: any) => { + try { + assert.deepStrictEqual(error, { + name: 'MethodNotAllowed', + message: "Method 'blabla' not allowed on service 'myservice'", + code: 405, + className: 'method-not-allowed' + }) + resolve() + } catch (error: any) { + reject(error) + } + } - it('method error calls back with normalized error', (done) => { - const callback = (error: any) => { - try { - assert.deepStrictEqual(error, { - name: 'NotAuthenticated', - message: 'None shall pass', - code: 401, - className: 'not-authenticated' - }) - done() - } catch (e: any) { - done(e) + runMethod(app, {}, 'myservice', 'blabla', [{}, callback]) + })) + + it('method error calls back with normalized error', () => + new Promise((resolve, reject) => { + const callback = (error: any) => { + try { + assert.deepStrictEqual(error, { + name: 'NotAuthenticated', + message: 'None shall pass', + code: 401, + className: 'not-authenticated' + }) + resolve() + } catch (error: any) { + reject(error) + } } - } - runMethod(app, {}, 'myservice', 'get', [42, { error: true }, callback]) - }) + runMethod(app, {}, 'myservice', 'get', [42, { error: true }, callback]) + })) }) }) diff --git a/packages/transport-commons/vite.config.ts b/packages/transport-commons/vite.config.ts new file mode 100644 index 0000000000..5381f73f70 --- /dev/null +++ b/packages/transport-commons/vite.config.ts @@ -0,0 +1,3 @@ +import vitest from '../../vitest.config.template' + +export default vitest diff --git a/packages/typebox/LICENSE b/packages/typebox/LICENSE index 25527ba53a..7839c824d7 100644 --- a/packages/typebox/LICENSE +++ b/packages/typebox/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2023 Feathers Contributors +Copyright (c) 2024 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/typebox/README.md b/packages/typebox/README.md index 9d11794398..b1b3db74f6 100644 --- a/packages/typebox/README.md +++ b/packages/typebox/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers TypeBox documentation](https://feathersjs.com/api/schema/ ## License -Copyright (c) 2023 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/typebox/package.json b/packages/typebox/package.json index cab2baae4c..eedadbc7b1 100644 --- a/packages/typebox/package.json +++ b/packages/typebox/package.json @@ -44,8 +44,8 @@ "prepublish": "npm run compile", "pack": "npm pack --pack-destination ../generators/test/build", "compile": "shx rm -rf lib/ && tsc && npm run pack", - "mocha": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts", - "test": "npm run compile && npm run mocha" + "vitest": "vitest run", + "test": "npm run compile && npm run vitest" }, "directories": { "lib": "lib" @@ -58,11 +58,10 @@ "@sinclair/typebox": "^0.25.0" }, "devDependencies": { - "@types/mocha": "^10.0.6", "@types/node": "^20.11.26", - "mocha": "^10.3.0", "shx": "^0.3.4", - "typescript": "^5.4.2" + "typescript": "^5.4.3", + "vitest": "^1.4.0" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" } diff --git a/packages/typebox/vite.config.ts b/packages/typebox/vite.config.ts new file mode 100644 index 0000000000..5381f73f70 --- /dev/null +++ b/packages/typebox/vite.config.ts @@ -0,0 +1,3 @@ +import vitest from '../../vitest.config.template' + +export default vitest diff --git a/tsconfig.json b/tsconfig.json index 3144d1beb1..58db7d6b12 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -44,7 +44,7 @@ // "typeRoots": [], /* List of folders to include type definitions from. */ // "types": [], /* Type declaration files to be included in compilation. */ // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ - "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ /* Source Map Options */ @@ -56,5 +56,6 @@ /* Experimental Options */ // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + "types": ["vitest/globals"] } } \ No newline at end of file diff --git a/vitest.config.template.ts b/vitest.config.template.ts new file mode 100644 index 0000000000..3f380f6936 --- /dev/null +++ b/vitest.config.template.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + globals: true, + reporters: ['dot'], + testTimeout: 30000, + fileParallelism: false + } +})