diff --git a/Makefile b/Makefile index 35f93b1..cee7a4a 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ list: @echo "build" pre-build: - npm install -g ava nyc + npm install build: git pull npm install diff --git a/airbnb_code_style.xml b/airbnb_code_style.xml deleted file mode 100644 index 6c72dc8..0000000 --- a/airbnb_code_style.xml +++ /dev/null @@ -1,26 +0,0 @@ - - \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 4e6f754..2ffd7e5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "evaengine", - "version": "0.11.2", + "version": "1.0.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "evaengine", - "version": "0.11.2", + "version": "1.0.2", "license": "MIT", "dependencies": { "acorn": "^8.18.0", @@ -18,24 +18,15 @@ "doctrine": "^3.0.0", "express": "^5.2.1", "express-session": "^1.19.0", - "glob": "^13.0.6", "ioredis": "^5.11.1", "joi": "^18.2.3", "js-yaml": "^5.2.2", "jwt-simple": "^0.5.6", - "later": "^1.2.0", "lodash": "^4.18.1", - "mkdirp": "^3.0.1", - "moment": "^2.30.1", "moment-timezone": "^0.6.3", "morgan": "^1.11.0", - "mysql": "^2.18.1", "mysql2": "^3.23.2", "node-mocks-http": "~1.18.1", - "on-headers": "^1.1.0", - "pug": "^3.0.4", - "request": "^2.88.2", - "request-promise-native": "^1.0.9", "sequelize": "^6.37.8", "swagger-ui-dist": "^5.32.11", "winston": "^3.19.0", @@ -52,15 +43,10 @@ "@semantic-release/github": "^11.0.0", "@semantic-release/npm": "^12.0.0", "@semantic-release/release-notes-generator": "^14.0.0", - "ava": "^8.0.1", "conventional-changelog-conventionalcommits": "^8.0.0", - "cross-env": "^10.1.0", "eslint": "^9.39.5", "eslint-plugin-import": "^2.32.0", "globals": "^17.8.0", - "is-type-of": "^2.2.0", - "nock": "^14.0.17", - "nyc": "^18.0.0", "pre-commit": "^2.0.0", "semantic-release": "^25.0.8" }, @@ -132,254 +118,16 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/compat-data": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", - "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", - "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-compilation-targets": "^7.29.7", - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helpers": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", - "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.8", - "@babel/types": "^7.29.8", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", - "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", - "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", - "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", - "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-validator-identifier": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", - "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helpers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", - "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", - "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.8" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/template": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", - "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", - "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.8", - "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.8", - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.8", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", - "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -391,16 +139,6 @@ "node": ">=0.1.90" } }, - "node_modules/@cto.af/wtf8": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@cto.af/wtf8/-/wtf8-0.0.5.tgz", - "integrity": "sha512-LfUFi+Vv4eDzj+XAtR89e3wwjXA/NZjUSwU5NhwbBrLecxPaBYFy3exCuc1j+D4UZeOVdqlsl8G7LmOt18V0tg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, "node_modules/@dabh/diagnostics": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", @@ -412,13 +150,6 @@ "kuler": "^2.0.0" } }, - "node_modules/@epic-web/invariant": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", - "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", - "dev": true, - "license": "MIT" - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", @@ -719,254 +450,6 @@ "integrity": "sha512-UmeW7z4LfctwoQ5wkhVzgq8tXkreED2xZGpX+Bg+zA+WJFZCT6c062AfCK/Dfk81xZnnwdhJCUMkitihRaoC2Q==", "license": "MIT" }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/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, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.15.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.1.tgz", - "integrity": "sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/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, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/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, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/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, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", - "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.3.tgz", - "integrity": "sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "consola": "^3.2.3", - "detect-libc": "^2.0.0", - "https-proxy-agent": "^7.0.5", - "node-fetch": "^2.6.7", - "nopt": "^8.0.0", - "semver": "^7.5.3", - "tar": "^7.4.0" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@mswjs/interceptors": { - "version": "0.41.9", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.41.9.tgz", - "integrity": "sha512-VVPPgHyQ6ShqnrmDWuxjmUIsO9gWyOZFmuOfLd9LfBGQJwZfy0gvv9pbHSJuoFNIYC7ZDX9aoFwowjcdSC4E8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@open-draft/deferred-promise": "^2.2.0", - "@open-draft/logger": "^0.3.0", - "@open-draft/until": "^2.0.0", - "is-node-process": "^1.2.0", - "outvariant": "^1.4.3", - "strict-event-emitter": "^0.5.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/@octokit/auth-token": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", @@ -1141,31 +624,6 @@ "@octokit/openapi-types": "^28.0.0" } }, - "node_modules/@open-draft/deferred-promise": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", - "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@open-draft/logger": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", - "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-node-process": "^1.2.0", - "outvariant": "^1.4.0" - } - }, - "node_modules/@open-draft/until": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", - "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", - "dev": true, - "license": "MIT" - }, "node_modules/@pnpm/config.env-replace": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", @@ -1298,29 +756,6 @@ "@redis/client": "^6.2.0" } }, - "node_modules/@rollup/pluginutils": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", - "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -1892,43 +1327,6 @@ "integrity": "sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==", "license": "MIT" }, - "node_modules/@vercel/nft": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-1.10.2.tgz", - "integrity": "sha512-w+WyX5Ulmj4dtTZrxaulqrjaLZHSbnPzx75SJsTNYmotKsqn1JlLnDJa+lz5hn90HJofhl/2MAtw0mCrgM3qYw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@mapbox/node-pre-gyp": "^2.0.0", - "@rollup/pluginutils": "^5.1.3", - "acorn": "^8.6.0", - "acorn-import-attributes": "^1.9.5", - "async-sema": "^3.1.1", - "bindings": "^1.4.0", - "estree-walker": "2.0.2", - "glob": "^13.0.0", - "graceful-fs": "^4.2.9", - "node-gyp-build": "^4.2.2", - "picomatch": "^4.0.2", - "resolve-from": "^5.0.0" - }, - "bin": { - "nft": "out/cli.js" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/abbrev": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", - "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", @@ -1954,16 +1352,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -1974,19 +1362,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/acorn-walk": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", - "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/agent-base": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", @@ -2015,6 +1390,7 @@ "version": "6.15.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -2083,26 +1459,6 @@ "node": ">= 6.0.0" } }, - "node_modules/append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "default-require-extensions": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true, - "license": "MIT" - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2133,16 +1489,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array-ify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", @@ -2255,59 +1601,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/arrgv": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arrgv/-/arrgv-1.0.2.tgz", - "integrity": "sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/arrify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", - "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "license": "MIT" - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "license": "MIT", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-never": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.4.0.tgz", - "integrity": "sha512-5oJg84os6NMQNl27T9LnZkvvqzvAnHu03ShCnoj6bsJwS7L8AO4lf+C/XjK/nvzEqQB744moC6V128RucQd1jA==", - "license": "MIT" - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, "node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", @@ -2346,95 +1639,6 @@ "semver": "bin/semver" } }, - "node_modules/async-sema": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", - "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", - "dev": true, - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/ava": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ava/-/ava-8.0.1.tgz", - "integrity": "sha512-YlwwL5HX2EJRE75e2LR8nio8lKAJ702sFbv0QYnhzngAjyo9wB+Xg4JZh5f432khlWfVD5OQ93rrRopEXJptpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vercel/nft": "^1.5.0", - "acorn": "^8.16.0", - "acorn-walk": "^8.3.5", - "ansi-styles": "^6.2.3", - "arrgv": "^1.0.2", - "arrify": "^3.0.0", - "callsites": "^4.2.0", - "cbor2": "^2.3.0", - "chalk": "^5.6.2", - "chunkd": "^2.0.1", - "ci-info": "^4.4.0", - "ci-parallel-vars": "^1.0.1", - "cli-truncate": "^6.0.0", - "code-excerpt": "^4.0.0", - "common-path-prefix": "^3.0.0", - "concordance": "^5.0.4", - "currently-unhandled": "^0.4.1", - "debug": "^4.4.3", - "emittery": "^2.0.0", - "figures": "^6.1.0", - "globby": "^16.2.0", - "ignore-by-default": "^2.1.0", - "indent-string": "^5.0.0", - "is-plain-object": "^5.0.0", - "is-promise": "^4.0.0", - "matcher": "^6.0.0", - "memoize": "^11.0.0", - "ms": "^2.1.3", - "p-map": "^7.0.4", - "package-config": "^5.0.0", - "picomatch": "^4.0.4", - "plur": "^6.0.0", - "pretty-ms": "^9.3.0", - "resolve-cwd": "^3.0.0", - "slash": "^5.1.0", - "stack-utils": "^2.0.6", - "supertap": "^3.0.1", - "temp-dir": "^3.0.0", - "write-file-atomic": "^7.0.1", - "yargs": "^18.0.0" - }, - "bin": { - "ava": "entrypoints/cli.js" - }, - "engines": { - "node": "^22.20 || ^24.12 || >=26" - }, - "peerDependencies": { - "@ava/typescript": "*" - }, - "peerDependenciesMeta": { - "@ava/typescript": { - "optional": true - } - } - }, - "node_modules/ava/node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -2446,18 +1650,9 @@ }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "license": "Apache-2.0", - "engines": { - "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/aws-ssl-profiles": { @@ -2469,24 +1664,6 @@ "node": ">= 6.0.0" } }, - "node_modules/aws4": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", - "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", - "license": "MIT" - }, - "node_modules/babel-walk": { - "version": "3.0.0-canary-5", - "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", - "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.9.6" - }, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2494,19 +1671,6 @@ "dev": true, "license": "MIT" }, - "node_modules/baseline-browser-mapping": { - "version": "2.11.12", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.12.tgz", - "integrity": "sha512-r7WnVImvVCeFpf2DOXfy41aPWzeNg3H/A2X4dKmy1QL0MSyyk/e7z8ihJ3N6Nn2PsdhkVlqnEfnUE4a05P2aTA==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", @@ -2525,15 +1689,6 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "license": "BSD-3-Clause", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, "node_modules/before-after-hook": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", @@ -2541,32 +1696,6 @@ "dev": true, "license": "Apache-2.0" }, - "node_modules/bignumber.js": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", - "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/blueimp-md5": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", - "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", - "dev": true, - "license": "MIT" - }, "node_modules/body-parser": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", @@ -2622,40 +1751,6 @@ "node": ">=8" } }, - "node_modules/browserslist": { - "version": "4.28.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz", - "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.10.44", - "caniuse-lite": "^1.0.30001806", - "electron-to-chromium": "^1.5.393", - "node-releases": "^2.0.51", - "update-browserslist-db": "^1.2.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -2665,35 +1760,6 @@ "node": ">= 0.8" } }, - "node_modules/caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/caching-transform/node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, "node_modules/call-bind": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", @@ -2742,69 +1808,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/callsites": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-4.2.0.tgz", - "integrity": "sha512-kfzR4zzQtAE9PC7CzZsjl3aBNbXWuXiSeOCdLcPpBfGW8YuCqQHcRPFDbr/BPVmd3EEPVpuFzLyuT/cUhPr4OQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001806", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", - "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "license": "Apache-2.0" - }, - "node_modules/cbor2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cbor2/-/cbor2-2.3.0.tgz", - "integrity": "sha512-76WB3hq8BoaGkMkBVJ27fW5LJU+qqDLEpgRNCG/SYKhODWXpVPOTD4UcUto3IEzYLA52nsvbhb0wabhHDn3qXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cto.af/wtf8": "0.0.5" - }, - "engines": { - "node": ">=20" - } - }, "node_modules/chalk": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", @@ -2828,55 +1831,6 @@ "node": ">=10" } }, - "node_modules/character-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", - "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", - "license": "MIT", - "dependencies": { - "is-regex": "^1.0.3" - } - }, - "node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/chunkd": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-2.0.1.tgz", - "integrity": "sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/ci-info": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", - "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ci-parallel-vars": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ci-parallel-vars/-/ci-parallel-vars-1.0.1.tgz", - "integrity": "sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==", - "dev": true, - "license": "MIT" - }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -3133,23 +2087,6 @@ "node": ">=8" } }, - "node_modules/cli-truncate": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-6.1.1.tgz", - "integrity": "sha512-06p9vyLahLa4zkGcgsGxU6iEkSOiuI4fhCH6Emhe2lPAcoUv73n72DnODsnHA+5wwXGnV0n9M9/qOQJSjYhFhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "slice-ansi": "^9.0.0", - "string-width": "^8.2.0" - }, - "engines": { - "node": ">=22" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cliui": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", @@ -3211,19 +2148,6 @@ "node": ">=0.10.0" } }, - "node_modules/code-excerpt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", - "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", - "dev": true, - "license": "MIT", - "dependencies": { - "convert-to-spaces": "^2.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, "node_modules/color": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", @@ -3270,32 +2194,6 @@ "node": ">=18" } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true, - "license": "ISC" - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true, - "license": "MIT" - }, "node_modules/compare-func": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", @@ -3314,26 +2212,6 @@ "dev": true, "license": "MIT" }, - "node_modules/concordance": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/concordance/-/concordance-5.0.4.tgz", - "integrity": "sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==", - "dev": true, - "license": "ISC", - "dependencies": { - "date-time": "^3.1.0", - "esutils": "^2.0.3", - "fast-diff": "^1.2.0", - "js-string-escape": "^1.0.1", - "lodash": "^4.17.15", - "md5-hex": "^3.0.1", - "semver": "^7.3.2", - "well-known-symbols": "^2.0.0" - }, - "engines": { - "node": ">=10.18.0 <11 || >=12.14.0 <13 || >=14" - } - }, "node_modules/config-chain": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", @@ -3358,26 +2236,6 @@ "redis": ">=5" } }, - "node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/constantinople": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", - "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.6.0", - "@babel/types": "^7.6.1" - } - }, "node_modules/constitute": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/constitute/-/constitute-1.6.2.tgz", @@ -3509,23 +2367,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true, - "license": "MIT" - }, - "node_modules/convert-to-spaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", - "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, "node_modules/cookie": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", @@ -3548,6 +2389,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, "license": "MIT" }, "node_modules/cosmiconfig": { @@ -3619,24 +2461,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cross-env": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz", - "integrity": "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@epic-web/invariant": "^1.0.0", - "cross-spawn": "^7.0.6" - }, - "bin": { - "cross-env": "dist/bin/cross-env.js", - "cross-env-shell": "dist/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=20" - } - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -3681,31 +2505,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-find-index": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", @@ -3749,28 +2548,15 @@ "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "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-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz", - "integrity": "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "time-zone": "^1.0.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/debug": { @@ -3790,16 +2576,6 @@ } } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -3817,22 +2593,6 @@ "dev": true, "license": "MIT" }, - "node_modules/default-require-extensions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -3869,15 +2629,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/denque": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", @@ -3896,16 +2647,6 @@ "node": ">= 0.8" } }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -3931,12 +2672,6 @@ "node": ">=6.0.0" } }, - "node_modules/doctypes": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", - "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==", - "license": "MIT" - }, "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -3981,29 +2716,12 @@ "readable-stream": "^2.0.2" } }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "license": "MIT", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, - "node_modules/electron-to-chromium": { - "version": "1.5.400", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.400.tgz", - "integrity": "sha512-96EWDNjM59SYflgeV5Ylsf4EMiq1a25YjCnJH7cxn/AF2H3pILRweaUnoLax0yKHWdpOzY6JKEu45e8irqZIHA==", - "dev": true, - "license": "ISC" - }, "node_modules/emitter-listener": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", @@ -4013,19 +2731,6 @@ "shimmer": "^1.2.0" } }, - "node_modules/emittery": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-2.0.0.tgz", - "integrity": "sha512-FLtgn/CGBXiX3ZtPAm5q4LWWepHChOt55J9u01WFu3dyap2U7IwptlrqoE1COR/kxwdy/DOxIBALSxIW449I1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=22" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -4414,13 +3119,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true, - "license": "MIT" - }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -4727,20 +3425,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/esquery": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", @@ -4777,13 +3461,6 @@ "node": ">=4.0" } }, - "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, - "license": "MIT" - }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -4922,68 +3599,18 @@ "node": ">= 0.6" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ], - "license": "MIT" - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/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, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } + "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { @@ -4993,16 +3620,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -5056,13 +3673,6 @@ "node": ">=16.0.0" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "license": "MIT" - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -5097,24 +3707,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -5205,80 +3797,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/form-data/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/form-data/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -5297,27 +3815,6 @@ "node": ">= 0.8" } }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/fs-extra": { "version": "11.4.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz", @@ -5408,16 +3905,6 @@ "node": ">= 0.4" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -5463,16 +3950,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/get-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", @@ -5517,15 +3994,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, "node_modules/git-log-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.1.tgz", @@ -5541,70 +4009,17 @@ "traverse": "0.6.8" } }, - "node_modules/glob": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", - "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "minimatch": "^10.2.2", - "minipass": "^7.1.3", - "path-scurry": "^2.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", - "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", - "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", - "license": "BlueOak-1.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^5.0.8" + "is-glob": "^4.0.3" }, "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=10.13.0" } }, "node_modules/globals": { @@ -5637,37 +4052,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globby": { - "version": "16.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-16.2.2.tgz", - "integrity": "sha512-NLvV9ubZ6NDsJaOpKPy3cQeJpKi9DcWiyCiFUpJPA0YihRqiE6RWaLUmgNNPr8MgPpLZjnBjSmou7uZBRJv9wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/merge-streams": "^4.0.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.5", - "is-path-inside": "^4.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.4.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/ignore": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", - "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -5709,29 +4093,6 @@ "uglify-js": "^3.1.4" } }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "license": "MIT", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", @@ -5800,6 +4161,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -5811,23 +4173,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/hasown": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", @@ -5883,13 +4228,6 @@ "dev": true, "license": "ISC" }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, "node_modules/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", @@ -5924,21 +4262,6 @@ "node": ">= 14" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, "node_modules/https-proxy-agent": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", @@ -5989,16 +4312,6 @@ "node": ">= 4" } }, - "node_modules/ignore-by-default": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-2.1.0.tgz", - "integrity": "sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10 <11 || >=12 <13 || >=14" - } - }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -6152,19 +4465,6 @@ "node": ">= 0.10" } }, - "node_modules/irregular-plurals": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-4.2.0.tgz", - "integrity": "sha512-bW9UXHL7bnUcNtTo+9ccSngbxc+V40H32IgvdVin0Xs8gbo+AVYD5g/72ce/54Kjfhq66vcZr8H8TKEvsifeOw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -6260,6 +4560,7 @@ "version": "2.16.2", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.3" @@ -6322,28 +4623,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-expression": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", - "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", - "license": "MIT", - "dependencies": { - "acorn": "^7.1.1", - "object-assign": "^4.1.1" - } - }, - "node_modules/is-expression/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -6370,22 +4649,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-fullwidth-code-point": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", - "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.3.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-generator-function": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", @@ -6445,13 +4708,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-node-process": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", - "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", - "dev": true, - "license": "MIT" - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -6489,19 +4745,6 @@ "node": ">=8" } }, - "node_modules/is-path-inside": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", - "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-plain-obj": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", @@ -6515,16 +4758,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-promise": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", @@ -6541,6 +4774,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -6631,13 +4865,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-type-of": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-type-of/-/is-type-of-2.2.0.tgz", - "integrity": "sha512-72axShMJMnMy5HSU/jLGNOonZD5rWM0MwJSCYpKCTQCbggQZBJO/CLMMVP5HgS8kPSYFBkTysJexsD6NMvGKDQ==", - "dev": true, - "license": "MIT" - }, "node_modules/is-typed-array": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", @@ -6654,12 +4881,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "license": "MIT" - }, "node_modules/is-unicode-supported": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", @@ -6686,213 +4907,68 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "license": "MIT" - }, - "node_modules/issue-parser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.2.tgz", - "integrity": "sha512-7atWPjhGEIX3JEtMrOYd8TKzboYlq+5sNbdl9POiLYOI14G5HZiQbZP0Xj5EZdrufQVXfJlpTV0hys0CuxwxZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" - }, - "engines": { - "node": "^18.17 || >=20.6.1" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "append-transform": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-processinfo": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-3.0.1.tgz", - "integrity": "sha512-s3mX05h5wGZeScG6XnOanygPh4SJu5ujMc9YbvpnLGXWy1cRiGbp0NdVcjHxgoZt3WfQppfBsa0y+gWdYJ2pGQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^6.1.3" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" + "call-bound": "^1.0.3" }, "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, "license": "MIT", "dependencies": { - "semver": "^7.5.3" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } + "license": "MIT" }, - "node_modules/istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, - "license": "BSD-3-Clause", + "license": "ISC" + }, + "node_modules/issue-parser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.2.tgz", + "integrity": "sha512-7atWPjhGEIX3JEtMrOYd8TKzboYlq+5sNbdl9POiLYOI14G5HZiQbZP0Xj5EZdrufQVXfJlpTV0hys0CuxwxZw==", + "dev": true, + "license": "MIT", "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" }, "engines": { - "node": ">=8" + "node": "^18.17 || >=20.6.1" } }, "node_modules/java-properties": { @@ -6923,22 +4999,6 @@ "node": ">= 20" } }, - "node_modules/js-string-escape": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/js-stringify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", - "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==", - "license": "MIT" - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -6968,25 +5028,6 @@ "js-yaml": "bin/js-yaml.mjs" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "license": "MIT" - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -7008,16 +5049,11 @@ "dev": true, "license": "MIT" }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { @@ -7027,12 +5063,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "license": "ISC" - }, "node_modules/json-with-bigint": { "version": "3.5.10", "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.10.tgz", @@ -7040,19 +5070,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/jsonfile": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", @@ -7066,37 +5083,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "license": "MIT", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/jstransformer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", - "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", - "license": "MIT", - "dependencies": { - "is-promise": "^2.0.0", - "promise": "^7.0.1" - } - }, - "node_modules/jstransformer/node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "license": "MIT" - }, "node_modules/jwt-simple": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/jwt-simple/-/jwt-simple-0.5.6.tgz", @@ -7122,13 +5108,6 @@ "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", "license": "MIT" }, - "node_modules/later": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/later/-/later-1.2.0.tgz", - "integrity": "sha512-Gi4c6JariwTigfAQLFCyWKKtyY5yzMZOdJdUH9Ori4FqQxQYDREvDRTu5N+jBM7hcnyEDMeYjhmRUTwLIjEMqA==", - "deprecated": "Please upgrade to the maintained and new drop-in replacement @breejs/later at https://github.com/breejs/later 🚀 Thanks and happy hacking! 🚀 @niftylettuce", - "license": "MIT" - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -7150,19 +5129,6 @@ "dev": true, "license": "MIT" }, - "node_modules/load-json-file": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-7.0.1.tgz", - "integrity": "sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -7206,13 +5172,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true, - "license": "MIT" - }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", @@ -7273,16 +5232,6 @@ "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", "license": "Apache-2.0" }, - "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, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, "node_modules/lru.min": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.4.tgz", @@ -7329,32 +5278,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/marked": { "version": "15.0.12", "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", @@ -7390,35 +5313,6 @@ "marked": ">=1 <16" } }, - "node_modules/matcher": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-6.0.0.tgz", - "integrity": "sha512-TzDerdcNtI79w7Av4GT57bLdElPA/VAkjqdMZv8yhuc8geU2z0ljW9anXbX/55aHEMTpYypZb1lxsA/46r9oOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^5.0.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/matcher/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -7428,19 +5322,6 @@ "node": ">= 0.4" } }, - "node_modules/md5-hex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz", - "integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==", - "dev": true, - "license": "MIT", - "dependencies": { - "blueimp-md5": "^2.10.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/media-typer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.1.tgz", @@ -7454,22 +5335,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/memoize": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/memoize/-/memoize-11.0.0.tgz", - "integrity": "sha512-cjsfZaC9b1clqPeIVMbb5dLHSXgdgGWGxdAU3oTUUkHiwWTKTBNnSmcqWJncNjYtBi3S8Rp0c5GIiyGztR8TRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.1" - }, - "engines": { - "node": ">=22" - }, - "funding": { - "url": "https://github.com/sindresorhus/memoize?sponsor=1" - } - }, "node_modules/meow": { "version": "13.2.0", "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", @@ -7502,16 +5367,6 @@ "dev": true, "license": "MIT" }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -7599,19 +5454,6 @@ "node": ">=6" } }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/minimatch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", @@ -7635,43 +5477,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minizlib": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", - "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/moment": { "version": "2.30.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", @@ -7727,32 +5532,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/mysql": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", - "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", - "license": "MIT", - "dependencies": { - "bignumber.js": "9.0.0", - "readable-stream": "2.3.7", - "safe-buffer": "5.1.2", - "sqlstring": "2.3.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "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==", + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/mysql2": { @@ -7831,21 +5615,6 @@ "dev": true, "license": "MIT" }, - "node_modules/nock": { - "version": "14.0.17", - "resolved": "https://registry.npmjs.org/nock/-/nock-14.0.17.tgz", - "integrity": "sha512-EjRr1weMa4ALQX35AgZTEnP+weJJjlW1KGDiNM2IQC2069YDHas4f4B4UUYR+TTLyKWxJvOz2wObDKQs/LNreA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@mswjs/interceptors": "^0.41.0", - "json-stringify-safe": "^5.0.1", - "propagate": "^2.0.0" - }, - "engines": { - "node": ">=18.20.0 <20 || >=20.12.1" - } - }, "node_modules/node-emoji": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", @@ -7891,39 +5660,6 @@ "semver": "bin/semver.js" } }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-gyp-build": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", - "dev": true, - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, "node_modules/node-mocks-http": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/node-mocks-http/-/node-mocks-http-1.18.1.tgz", @@ -8072,45 +5808,6 @@ "node": ">= 0.6" } }, - "node_modules/node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "process-on-spawn": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-releases": { - "version": "2.0.51", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", - "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/nopt": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", - "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", - "dev": true, - "license": "ISC", - "dependencies": { - "abbrev": "^3.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/normalize-package-data": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", @@ -10645,313 +8342,39 @@ "ansi-regex": "^6.2.2" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/write-file-atomic": { - "version": "6.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/yallist": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/nyc": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-18.0.0.tgz", - "integrity": "sha512-G5UyHinFkB1BxqGTrmZdB6uIYH0+v7ZnVssuflUDi+J+RhKWyAhRT1RCehBSI6jLFLuUUgFDyLt49mUtdO1XeQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^3.3.0", - "get-package-type": "^0.1.0", - "glob": "^13.0.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^6.0.2", - "istanbul-lib-processinfo": "^3.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^6.1.3", - "signal-exit": "^3.0.2", - "spawn-wrap": "^3.0.0", - "test-exclude": "^8.0.0", - "yargs": "^15.0.2" - }, - "bin": { - "nyc": "bin/nyc.js" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/nyc/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/nyc/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/nyc/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/nyc/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nyc/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, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/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, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/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, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nyc/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, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/nyc/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/nyc/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "node_modules/npm/node_modules/write-file-atomic": { + "version": "6.0.0", "dev": true, + "inBundle": true, "license": "ISC", "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=6" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "license": "Apache-2.0", + "node_modules/npm/node_modules/yallist": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0", "engines": { - "node": "*" + "node": ">=18" } }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -11142,13 +8565,6 @@ "node": ">= 0.8.0" } }, - "node_modules/outvariant": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", - "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", - "dev": true, - "license": "MIT" - }, "node_modules/own-keys": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.2.tgz", @@ -11281,56 +8697,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-config": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/package-config/-/package-config-5.0.0.tgz", - "integrity": "sha512-GYTTew2slBcYdvRHqjhwaaydVMvn/qrGC323+nKclYioNSLTDUM/lGgtGTgyHVtYcozb+XkE8CNhwcraOmZ9Mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up-simple": "^1.0.0", - "load-json-file": "^7.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -11455,33 +8821,9 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, "license": "MIT" }, - "node_modules/path-scurry": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.5.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, "node_modules/path-to-regexp": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", @@ -11502,12 +8844,6 @@ "node": ">=8" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "license": "MIT" - }, "node_modules/pg-connection-string": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.14.0.tgz", @@ -11671,91 +9007,6 @@ "node": ">=4" } }, - "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, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/plur": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-6.0.0.tgz", - "integrity": "sha512-Y9wXQivjRX0REtwpA9+n0bYYypWESn3cWtW2vazymw711qn+AQXxzZjRqhANYGBLIMC1UzVdpwe/1hHQwHfwng==", - "dev": true, - "license": "MIT", - "dependencies": { - "irregular-plurals": "^4.2.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -11837,39 +9088,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, - "node_modules/process-on-spawn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.1.0.tgz", - "integrity": "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "fromentries": "^1.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "license": "MIT", - "dependencies": { - "asap": "~2.0.3" - } - }, - "node_modules/propagate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", - "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } + "license": "MIT" }, "node_modules/proto-list": { "version": "1.2.4", @@ -11891,185 +9111,29 @@ "node": ">= 0.10" } }, - "node_modules/proxy-agent-negotiate": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-agent-negotiate/-/proxy-agent-negotiate-1.1.0.tgz", - "integrity": "sha512-N8IBcM3UgCVzz2L2Lqv8DVntDnnC8/hiV4nEDUPkqq72TPUgYWjQc+bdZlBPZK9LzPAvOY//gAt0S0DApoOXWQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 20" - }, - "peerDependencies": { - "kerberos": "^2.0.0" - }, - "peerDependenciesMeta": { - "kerberos": { - "optional": true - } - } - }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" - } - }, - "node_modules/pug": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.4.tgz", - "integrity": "sha512-kFfq5mMzrS7+wrl5pLJzZEzemx34OQ0w4SARfhy/3yxTlhbstsudDwJzhf1hP02yHzbjoVMSXUj/Sz6RNfMyXg==", - "license": "MIT", - "dependencies": { - "pug-code-gen": "^3.0.4", - "pug-filters": "^4.0.0", - "pug-lexer": "^5.0.1", - "pug-linker": "^4.0.0", - "pug-load": "^3.0.0", - "pug-parser": "^6.0.0", - "pug-runtime": "^3.0.1", - "pug-strip-comments": "^2.0.0" - } - }, - "node_modules/pug-attrs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", - "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", - "license": "MIT", - "dependencies": { - "constantinople": "^4.0.1", - "js-stringify": "^1.0.2", - "pug-runtime": "^3.0.0" - } - }, - "node_modules/pug-code-gen": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.4.tgz", - "integrity": "sha512-6okWYIKdasTyXICyEtvobmTZAVX57JkzgzIi4iRJlin8kmhG+Xry2dsus+Mun/nGCn6F2U49haHI5mkELXB14g==", - "license": "MIT", - "dependencies": { - "constantinople": "^4.0.1", - "doctypes": "^1.1.0", - "js-stringify": "^1.0.2", - "pug-attrs": "^3.0.0", - "pug-error": "^2.1.0", - "pug-runtime": "^3.0.1", - "void-elements": "^3.1.0", - "with": "^7.0.0" - } - }, - "node_modules/pug-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.1.0.tgz", - "integrity": "sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==", - "license": "MIT" - }, - "node_modules/pug-filters": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", - "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", - "license": "MIT", - "dependencies": { - "constantinople": "^4.0.1", - "jstransformer": "1.0.0", - "pug-error": "^2.0.0", - "pug-walk": "^2.0.0", - "resolve": "^1.15.1" - } - }, - "node_modules/pug-filters/node_modules/resolve": { - "version": "1.22.12", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", - "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/pug-lexer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", - "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", - "license": "MIT", - "dependencies": { - "character-parser": "^2.2.0", - "is-expression": "^4.0.0", - "pug-error": "^2.0.0" - } - }, - "node_modules/pug-linker": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", - "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", - "license": "MIT", - "dependencies": { - "pug-error": "^2.0.0", - "pug-walk": "^2.0.0" - } - }, - "node_modules/pug-load": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", - "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", - "license": "MIT", - "dependencies": { - "object-assign": "^4.1.1", - "pug-walk": "^2.0.0" - } - }, - "node_modules/pug-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", - "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", - "license": "MIT", - "dependencies": { - "pug-error": "^2.0.0", - "token-stream": "1.0.0" - } - }, - "node_modules/pug-runtime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", - "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==", - "license": "MIT" - }, - "node_modules/pug-strip-comments": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", - "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", - "license": "MIT", - "dependencies": { - "pug-error": "^2.0.0" - } - }, - "node_modules/pug-walk": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", - "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==", - "license": "MIT" + "node_modules/proxy-agent-negotiate": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-agent-negotiate/-/proxy-agent-negotiate-1.1.0.tgz", + "integrity": "sha512-N8IBcM3UgCVzz2L2Lqv8DVntDnnC8/hiV4nEDUPkqq72TPUgYWjQc+bdZlBPZK9LzPAvOY//gAt0S0DApoOXWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "kerberos": "^2.0.0" + }, + "peerDependenciesMeta": { + "kerberos": { + "optional": true + } + } }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -12091,27 +9155,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/random-bytes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", @@ -12256,6 +9299,7 @@ "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", @@ -12271,6 +9315,7 @@ "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, "license": "MIT" }, "node_modules/redis": { @@ -12368,114 +9413,6 @@ "node": ">=14" } }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", - "dev": true, - "license": "ISC", - "dependencies": { - "es6-error": "^4.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "license": "Apache-2.0", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "license": "ISC", - "dependencies": { - "lodash": "^4.17.19" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", - "license": "ISC", - "dependencies": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "engines": { - "node": ">=0.12.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/request/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.5.tgz", - "integrity": "sha512-mzR4sElr1bfCaPJe7m8ilJ6ZXdDaGoObcYR0ZHSsktM/Lt21MVHj5De30GQH2eiZ1qGRTO7LCAzQsUeXTNexWQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.6" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -12486,13 +9423,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true, - "license": "ISC" - }, "node_modules/resolve": { "version": "2.0.0-next.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", @@ -12517,19 +9447,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -12546,37 +9463,6 @@ "integrity": "sha512-hMD7odLOt3LkTjcif8aRZqi/hybjpLNgSk5oF5FCowfCjok6LukpN2bDX7R5wDmbgBQFn7YoBxSagmtXHaJYJw==", "license": "MIT" }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz", - "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "glob": "^13.0.3", - "package-json-from-dist": "^1.0.1" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/router": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", @@ -12593,30 +9479,6 @@ "node": ">= 18" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, "node_modules/safe-array-concat": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", @@ -15273,35 +12135,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-error/node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/serve-static": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", @@ -15321,13 +12154,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true, - "license": "ISC" - }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -15610,36 +12436,6 @@ "node": ">=8" } }, - "node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/slice-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-9.0.0.tgz", - "integrity": "sha512-SO/3iYL5S3W57LLEniscOGPZgOqZUPCx6d3dB+52B80yJ0XstzsC/eV8gnA4tM3MHDrKz+OCFSLNjswdSC+/bA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.3", - "is-fullwidth-code-point": "^5.1.0" - }, - "engines": { - "node": ">=22" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -15657,39 +12453,6 @@ "dev": true, "license": "MIT" }, - "node_modules/spawn-wrap": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-3.0.0.tgz", - "integrity": "sha512-z+s5vv4KzFPJVddGab0xX2n7kQPGMdNUX5l9T8EJqsXdKTWpcxmAqWHpsgHEXoC1taGBCc7b79bi62M5kdbrxQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "cross-spawn": "^7.0.6", - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^6.1.3", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/spawn-wrap/node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -15736,13 +12499,6 @@ "through2": "~2.0.0" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/sql-escaper": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/sql-escaper/-/sql-escaper-1.5.1.tgz", @@ -15758,70 +12514,13 @@ "url": "https://github.com/mysqljs/sql-escaper?sponsor=1" } }, - "node_modules/sqlstring": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", - "integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "license": "MIT", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/stack-trace": { "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", "license": "MIT", "engines": { - "node": ">=8" + "node": "*" } }, "node_modules/standard-as-callback": { @@ -15839,15 +12538,6 @@ "node": ">= 0.8" } }, - "node_modules/stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", - "license": "ISC", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/stop-iteration-iterator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", @@ -15873,13 +12563,6 @@ "readable-stream": "^2.0.2" } }, - "node_modules/strict-event-emitter": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", - "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", - "dev": true, - "license": "MIT" - }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -15986,16 +12669,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -16037,59 +12710,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/supertap": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/supertap/-/supertap-3.0.1.tgz", - "integrity": "sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==", - "dev": true, - "license": "MIT", - "dependencies": { - "indent-string": "^5.0.0", - "js-yaml": "^3.14.1", - "serialize-error": "^7.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/supertap/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/supertap/node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supertap/node_modules/js-yaml": { - "version": "3.15.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.1.tgz", - "integrity": "sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -16124,6 +12744,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -16154,33 +12775,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tar": { - "version": "7.5.22", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz", - "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.1.0", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, "node_modules/temp-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", @@ -16236,60 +12830,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/test-exclude": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-8.0.0.tgz", - "integrity": "sha512-ZOffsNrXYggvU1mDGHk54I96r26P8SyMjO5slMKSc7+IWmtB/MQKnEC2fP51imB3/pT6YK5cT5E8f+Dd9KdyOQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^13.0.6", - "minimatch": "^10.2.2" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/test-exclude/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", - "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", - "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.8" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/text-hex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", @@ -16346,16 +12886,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/time-zone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", - "integrity": "sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/tinyglobby": { "version": "0.2.17", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", @@ -16395,38 +12925,12 @@ "node": ">=0.6" } }, - "node_modules/token-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", - "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==", - "license": "MIT" - }, "node_modules/toposort-class": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==", "license": "MIT" }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, - "license": "MIT" - }, "node_modules/traverse": { "version": "0.6.8", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", @@ -16495,24 +12999,6 @@ "node": ">=0.6.11 <=0.7.0 || >=0.7.3" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "license": "Unlicense" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -16526,16 +13012,6 @@ "node": ">= 0.8.0" } }, - "node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, "node_modules/type-is": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", @@ -16632,16 +13108,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, "node_modules/uglify-js": { "version": "3.19.3", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", @@ -16768,41 +13234,11 @@ "node": ">= 0.8" } }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -16824,16 +13260,6 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, "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", @@ -16863,35 +13289,6 @@ "node": ">= 0.8" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "license": "MIT" - }, - "node_modules/void-elements": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", - "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/web-worker": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.5.0.tgz", @@ -16899,34 +13296,6 @@ "dev": true, "license": "Apache-2.0" }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/well-known-symbols": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz", - "integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=6" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -17017,13 +13386,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true, - "license": "ISC" - }, "node_modules/which-typed-array": { "version": "1.1.22", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", @@ -17119,21 +13481,6 @@ "node": ">= 6" } }, - "node_modules/with": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", - "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.9.6", - "@babel/types": "^7.9.6", - "assert-never": "^1.2.1", - "babel-walk": "3.0.0-canary-5" - }, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/wkx": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", @@ -17206,32 +13553,6 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, - "node_modules/write-file-atomic": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-7.0.1.tgz", - "integrity": "sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg==", - "dev": true, - "license": "ISC", - "dependencies": { - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/write-file-atomic/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -17251,13 +13572,6 @@ "node": ">=10" } }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, "node_modules/yargs": { "version": "18.1.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.1.0.tgz", diff --git a/package.json b/package.json index 0b7fa46..8fb8215 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,7 @@ "scripts": { "prestart": "node src/index.js", "prepublish": "npm run test", - "ava": "cross-env LOG_LEVEL=error NODE_ENV=test ava --verbose --serial", - "test": "nyc -a --reporter=lcov --reporter=text --reporter=html npm run ava", + "test": "LOG_LEVEL=error NODE_ENV=test node --import ./test/bootstrap.js --test --test-concurrency=1 --experimental-test-coverage \"test/di.js\" \"test/engine.js\" \"test/error_handlers.js\" \"test/index.js\" \"test/exceptions/index.js\" \"test/entities/index.js\" \"test/commands/make_entity.js\" \"test/middlewares/*.js\" \"test/services/*.js\" \"test/swagger/index.js\" \"test/utils/*.js\"", "lint": "eslint src test index.js", "build": "node --check src/index.js", "ci:check": "npm run lint && npm run build", @@ -38,31 +37,6 @@ "lint" ], "author": "AlloVince", - "ava": { - "files": [ - "test/**/*.js", - "!test/bootstrap.js", - "!test/_*/**/*.js", - "!test/swagger/_*/**/*.js" - ], - "source": [ - "src/**/*.js" - ], - "failFast": false, - "tap": false, - "require": [ - "./test/bootstrap.js" - ] - }, - "nyc": { - "require": [], - "include": [ - "src/**/*.js" - ], - "exclude": [ - "src/config/index.js" - ] - }, "dependencies": { "acorn": "^8.18.0", "app-root-path": "^3.1.0", @@ -73,24 +47,15 @@ "doctrine": "^3.0.0", "express": "^5.2.1", "express-session": "^1.19.0", - "glob": "^13.0.6", "ioredis": "^5.11.1", "joi": "^18.2.3", "js-yaml": "^5.2.2", "jwt-simple": "^0.5.6", - "later": "^1.2.0", "lodash": "^4.18.1", - "mkdirp": "^3.0.1", - "moment": "^2.30.1", "moment-timezone": "^0.6.3", "morgan": "^1.11.0", - "mysql": "^2.18.1", "mysql2": "^3.23.2", "node-mocks-http": "~1.18.1", - "on-headers": "^1.1.0", - "pug": "^3.0.4", - "request": "^2.88.2", - "request-promise-native": "^1.0.9", "sequelize": "^6.37.8", "swagger-ui-dist": "^5.32.11", "winston": "^3.19.0", @@ -104,15 +69,10 @@ "@semantic-release/github": "^11.0.0", "@semantic-release/npm": "^12.0.0", "@semantic-release/release-notes-generator": "^14.0.0", - "ava": "^8.0.1", "conventional-changelog-conventionalcommits": "^8.0.0", - "cross-env": "^10.1.0", "eslint": "^9.39.5", "eslint-plugin-import": "^2.32.0", "globals": "^17.8.0", - "is-type-of": "^2.2.0", - "nock": "^14.0.17", - "nyc": "^18.0.0", "pre-commit": "^2.0.0", "semantic-release": "^25.0.8" } diff --git a/src/commands/make_entity.js b/src/commands/make_entity.js index adc56bc..a194032 100644 --- a/src/commands/make_entity.js +++ b/src/commands/make_entity.js @@ -1,7 +1,7 @@ -import _ from 'lodash'; +import groupBy from 'lodash/groupBy.js'; +import template from 'lodash/template.js'; import Sequelize from 'sequelize'; import fs from 'fs'; -import * as mkdirp from 'mkdirp'; import Command from './interface.js'; import DI from '../di.js'; import Entities from '../entities/index.js'; @@ -55,7 +55,7 @@ CREATE ALGORITHM=UNDEFINED SQL SECURITY DEFINER VIEW view_${tableName} const entities = new Entities(entityPath); logger.info('Start generate db views to %s', file); - mkdirp.sync(path); + fs.mkdirSync(path, { recursive: true }); const models = Object.values(entities.getInstance().models); const sql = []; models.forEach((model) => { @@ -202,7 +202,7 @@ export class MakeEntity extends Command { if (!rawIndexes) { return []; } - rawIndexes = _.groupBy(rawIndexes, 'Key_name'); + rawIndexes = groupBy(rawIndexes, 'Key_name'); return Object.entries(rawIndexes).filter(([key]) => key !== 'PRIMARY').map(([name, columns]) => { const index = columns[0].Non_unique !== 1 ? { name, unique: true } : { name }; index.fields = columns.map(c => c.Column_name); @@ -239,8 +239,8 @@ export class MakeEntity extends Command { const schemaPath = `${path}/schemas`; const entityTemplate = fs.readFileSync(`${import.meta.dirname}/../../template/entity.ejs`, 'utf8'); const schemaTemplate = fs.readFileSync(`${import.meta.dirname}/../../template/schema.ejs`, 'utf8'); - mkdirp.sync(path); - mkdirp.sync(schemaPath); + fs.mkdirSync(path, { recursive: true }); + fs.mkdirSync(schemaPath, { recursive: true }); logger.info('Start generate DB schemas to dir %s', path); @@ -269,7 +269,7 @@ export class MakeEntity extends Command { fs.accessSync(entityFile); logger.info('Entity file %s generate skipped, already exists by %s', table, entityFile); } catch { - fs.writeFileSync(entityFile, _.template(entityTemplate)({ table })); + fs.writeFileSync(entityFile, template(entityTemplate)({ table })); logger.info('Entity file %s generated as %s', table, entityFile); } @@ -279,7 +279,7 @@ export class MakeEntity extends Command { } catch { logger.info('Schema file %s generated as %s', table, schemaFile); } - fs.writeFileSync(schemaFile, _.template(schemaTemplate)({ + fs.writeFileSync(schemaFile, template(schemaTemplate)({ columns, table, indexes, @@ -438,8 +438,8 @@ export class MakeGraphql extends Command { const mappingContent = JSON.parse(fs.readFileSync(mappingFile, 'utf8')); const getMappedTableName = tableName => (mappingContent[tableName] ? mappingContent[tableName] : tableName); - mkdirp.sync(path); - mkdirp.sync(schemaPath); + fs.mkdirSync(path, { recursive: true }); + fs.mkdirSync(schemaPath, { recursive: true }); logger.info('Start generate GraphQL schemas to dir %s', path); @@ -474,7 +474,7 @@ export class MakeGraphql extends Command { } catch { logger.info('Graphql schema file %s generated as %s', tableName, schemaFile); } - fs.writeFileSync(schemaFile, _.template(schemaTemplate)({ + fs.writeFileSync(schemaFile, template(schemaTemplate)({ tableName, mappedTableName, columns, diff --git a/src/di.js b/src/di.js index e89f3ff..14c3067 100644 --- a/src/di.js +++ b/src/di.js @@ -4,6 +4,11 @@ import { ServiceProvider } from './services/providers.js'; let container = new constitute.Container(); let bound = {}; +let boundKind = {}; + +const BIND_CLASS = 'class'; +const BIND_VALUE = 'value'; +const BIND_METHOD = 'method'; export default class DI { static getContainer() { @@ -19,15 +24,19 @@ export default class DI { return container.constitute(service); } - if (!bound[service]) { + if (!Object.prototype.hasOwnProperty.call(bound, service)) { throw new RuntimeException(`Service ${service} not bound yet`); } + if (boundKind[service] === BIND_VALUE) { + return bound[service]; + } return container.constitute(bound[service]); } static bindClass(...args) { if (typeof args[0] === 'string') { [, bound[args[0]]] = args; + boundKind[args[0]] = BIND_CLASS; } return container.bindClass(...args); } @@ -35,6 +44,7 @@ export default class DI { static bindValue(...args) { if (typeof args[0] === 'string') { [, bound[args[0]]] = args; + boundKind[args[0]] = BIND_VALUE; } return container.bindValue(...args); } @@ -42,6 +52,7 @@ export default class DI { static bindMethod(...args) { if (typeof args[0] === 'string') { bound[args[0]] = args[0]; + boundKind[args[0]] = BIND_METHOD; } return container.bindMethod(...args); } @@ -49,6 +60,7 @@ export default class DI { static reset() { container = new constitute.Container(); bound = {}; + boundKind = {}; } /** diff --git a/src/engine.js b/src/engine.js index 89a4682..0b01a29 100644 --- a/src/engine.js +++ b/src/engine.js @@ -3,13 +3,13 @@ import http from 'http'; import https from 'https'; import path from 'path'; import yargs from 'yargs/yargs'; -import later from 'later'; import moment from 'moment-timezone'; import packageJson from '../package.json' with { type: 'json' }; import DI from './di.js'; import * as ServiceProviders from './services/providers.js'; import * as MiddlewareProviders from './middlewares/providers.js'; import { StandardException, RuntimeException } from './exceptions/index.js'; +import { parseCron, setCronInterval } from './utils/cron.js'; moment.tz.setDefault(process.env.TZ ? process.env.TZ : 'Asia/Shanghai'); @@ -21,8 +21,7 @@ export const MODES = { export { DI, express, - yargs, - later + yargs }; let app = null; @@ -116,7 +115,6 @@ export default class EvaEngine { this.namespace = namespace || DI.get('namespace'); this.logger.info('Engine started, Meta:', this.meta); this.logger.debug('Engine config files loaded:', this.config.getMergedFiles()); - later.date.localTime(); } /** @@ -301,7 +299,11 @@ export default class EvaEngine { clearCrontabs() { this.crontabJobHandlers.forEach((handler) => { - clearInterval(handler); + if (handler && typeof handler.clear === 'function') { + handler.clear(); + } else { + clearInterval(handler); + } }); this.crontabJobHandlers = []; } @@ -514,7 +516,8 @@ export default class EvaEngine { } this.registerServiceProviders(EvaEngine.getServiceProvidersForCLI()); this.logger.debug('Bound services', Object.keys(DI.getBound())); - this.logger.info('Cron job using %s Timezone', later.date.isUTC ? 'UTC' : 'Local'); + //Cron jobs run in local time, matching the previous later.date.localTime() default + this.logger.info('Cron job using %s Timezone', 'Local'); const [commandName, ...options] = commandString.split(' '); if (Object.keys(this.commands).includes(commandName) === false) { throw new RuntimeException(`Command ${commandName} not registered`); @@ -523,14 +526,14 @@ export default class EvaEngine { const command = new this.commands[commandName](argv); let i = 1; - const schedule = later.parse.cron(sequence, useSeconds); - const handler = later.setInterval(async() => { + const schedule = parseCron(sequence, useSeconds); + const handler = setCronInterval(async() => { this.logger.info('Cron job [%s] | Round %d | started with params %j', commandName, i, argv); //Let job crash if any exception happen await command.run(); this.logger.info('Cron job [%s] | Round %d | finished', commandName, i); i += 1; - }, schedule); //第二个参数为True表示支持秒 + }, schedule); //useSeconds 为 True 时启用秒级字段 this.logger.info('Cron job [%s] with sequence [%s] registered as %j', commandString, sequence, schedule); this.crontabJobHandlers.push(handler); } diff --git a/src/index.js b/src/index.js index ebd4367..6013e61 100644 --- a/src/index.js +++ b/src/index.js @@ -1,5 +1,4 @@ import constitute from 'constitute'; -import * as mysql from 'mysql'; import sequelize from 'sequelize'; import Joi from 'joi'; import EvaEngine, * as engine from './engine.js'; @@ -39,8 +38,7 @@ const core = { dependencies: { Joi, constitute, - sequelize, - mysql + sequelize }, exceptions, middlewares, diff --git a/src/middlewares/session.js b/src/middlewares/session.js index afe28e7..9ef4aef 100644 --- a/src/middlewares/session.js +++ b/src/middlewares/session.js @@ -1,6 +1,7 @@ import session from 'express-session'; import { RedisStore } from 'connect-redis'; import constitute from 'constitute'; +import DI from '../di.js'; import Config from '../services/config.js'; import Redis from '../services/redis.js'; import Namespace from '../services/namespace.js'; @@ -33,7 +34,11 @@ function SessionMiddleware(_config, redis, namespace) { client: config.store.client || redis.getInstance() })); RedisClient.client.on('error', (err) => { - throw err; + try { + DI.get('logger').error('Session Redis store error:', err); + } catch { + console.error('Session Redis store error:', err); + } }); store = RedisClient; } else { diff --git a/src/middlewares/trace.js b/src/middlewares/trace.js index 2d023bc..438916b 100644 --- a/src/middlewares/trace.js +++ b/src/middlewares/trace.js @@ -1,4 +1,3 @@ -import onHeaders from 'on-headers'; import constitute from 'constitute'; import { randomString, getHostFullUrl, getHostPort, getHostIp, getMicroTimestamp } from '../utils/index.js'; import Namespace from '../services/namespace.js'; @@ -8,6 +7,32 @@ import HttpClient from '../services/http_client.js'; const hostIp = getHostIp(); +/** + * Execute a listener when a response is about to write headers. + * Inlined from the on-headers package (MIT), limited to the behavior trace middleware needs. + * @param {object} res + * @param {function} listener + */ +const onHeaders = (res, listener) => { + if (!res) { + throw new TypeError('argument res is required'); + } + if (typeof listener !== 'function') { + throw new TypeError('argument listener must be a function'); + } + + const prevWriteHead = res.writeHead; + let fired = false; + + res.writeHead = function writeHead() { + if (!fired) { + fired = true; + listener.call(this); + } + return prevWriteHead.apply(this, arguments); + }; +}; + export const tracerToZipkins = (tracer) => { if (!tracer) { return false; diff --git a/src/middlewares/view_cache.js b/src/middlewares/view_cache.js index a087aa0..675aa7a 100644 --- a/src/middlewares/view_cache.js +++ b/src/middlewares/view_cache.js @@ -24,9 +24,10 @@ export const requestToCacheKey = (req, hashStrategy) => { method, originalUrl, query: originQuery, - route, - uid = null //Custom rule + route } = req; + //Prefer uid resolved by auth middleware, keep req.uid as custom rule fallback + const uid = (req.auth && req.auth.uid) || req.uid || null; const query = { ...originQuery }; delete query.flush; if (hashStrategy && typeof hashStrategy !== 'function') { diff --git a/src/services/config.js b/src/services/config.js index 21672f2..5f6e7c4 100644 --- a/src/services/config.js +++ b/src/services/config.js @@ -1,4 +1,7 @@ -import _ from 'lodash'; +import get from 'lodash/get.js'; +import isString from 'lodash/isString.js'; +import merge from 'lodash/merge.js'; +import set from 'lodash/set.js'; import { createRequire } from 'module'; import constitute from 'constitute'; import * as springConfigClient from 'cloud-config-client'; @@ -45,11 +48,11 @@ class Config extends ServiceInterface { const configRemote = await springConfigClient.load({ endpoint, name, - profiles: _.isString(profiles) ? profiles.split(',') : [], + profiles: isString(profiles) ? profiles.split(',') : [], label }); configRemote.forEach((key, value) => { - _.set(this.config, key, value); + set(this.config, key, value); }); } @@ -82,7 +85,7 @@ class Config extends ServiceInterface { } - return _.merge({}, EngineConfig, configDefault, configEnv, configLocal); + return merge({}, EngineConfig, configDefault, configEnv, configLocal); } getMergedFiles() { @@ -91,6 +94,7 @@ class Config extends ServiceInterface { reload() { this.config = null; + this.mergedFiles = []; } /** @@ -102,7 +106,7 @@ class Config extends ServiceInterface { if (typeof keyString !== 'string') { return target; } - return _.get(target, keyString); + return get(target, keyString); } } diff --git a/src/services/http_client.js b/src/services/http_client.js index ab8a29e..e627168 100644 --- a/src/services/http_client.js +++ b/src/services/http_client.js @@ -1,100 +1,10 @@ import constitute from 'constitute'; -import request from 'request-promise-native'; import Config from './config.js'; import Logger from './logger.js'; +import { createRequestClient } from '../utils/request_client.js'; import { HttpRequestLogicException, HttpRequestIOException } from '../exceptions/index.js'; import ServiceInterface from './interface.js'; -export const deepClone = obj => - JSON.parse(JSON.stringify(obj)); - -const TOO_LONG_BODY = '____TLDR____'; - -let debugFlag = false; -/* eslint-disable */ -//Mod version of https://github.com/request/request-debug -export const requestDebug = (logger, maxBodyLength = process.env.MAX_REQUEST_DEBUG_BODY || 3000) => { - if (debugFlag === true) { - return; - } - - let proto = {}; - let debugId = 0; - if (request.Request) { - proto = request.Request.prototype; - } else if (request.get && request.post) { - // The object returned by request.defaults() doesn't include the - // Request property, so do this horrible thing to get at it. Per - // Wikipedia, port 4 is unassigned. - const req = request('http://localhost:4').on('error', () => { - }); - proto = req.constructor.prototype; - } else { - throw new Error('Pass the object returned by require("request") to this function.'); - } - if (proto._initBeforeDebug) { - return; - } - - proto._initBeforeDebug = proto.init; - - const ignoreDebug = (headers) => { - if (!headers || Object.keys(headers).length < 1) { - return {}; - } - return Object.keys(headers) - .filter(key => !key.startsWith('x-debug')) - .reduce((res, key) => (res[key] = headers[key], res), {}); - }; - - proto.init = function () { - if (this._debugId) { - return; - } - this.on('request', function (req) { - const data = { - headers: deepClone(this.headers) - }; - if (this.body) { - data.body = maxBodyLength > 0 && this.body.toString().length < maxBodyLength ? this.body.toString('utf8') : TOO_LONG_BODY; - } - - logger.verbose('[HTTP_REQUEST_%s] [%s %s] [REQ_HEADERS: %s] [REQ_BODY: %s]', this._debugId, - this.method.toUpperCase(), this.uri.href, JSON.stringify(data.headers), data.body || '' - ); - }).on('response', function (res) { - if (this.callback) { - return; - } - - const bodyLength = res.headers['content-length'] || (res.body ? res.body.toString().length : 0); - logger.verbose('[HTTP_RESPONSE_%s] [%s %s] [%s] [RES_HEADERS: %s] [RES_BODY: %s]', this._debugId, - this.method.toUpperCase(), this.uri.href, res.statusCode, JSON.stringify(ignoreDebug(res.headers)), - bodyLength > maxBodyLength ? TOO_LONG_BODY : res.body || '' - ); - }).on('complete', function (res) { - if (!this.callback) { - return; - } - - const bodyLength = res.headers['content-length'] || (res.body ? res.body.toString().length : 0); - logger.verbose('[HTTP_RESPONSE_%s] [%s %s] [%s] [RES_HEADERS: %s] [RES_BODY: %s]', this._debugId, - this.method.toUpperCase(), this.uri.href, res.statusCode, JSON.stringify(ignoreDebug(res.headers)), - bodyLength > maxBodyLength ? TOO_LONG_BODY : res.body || '' - ); - }).on('redirect', function () { - - logger.verbose('[HTTP_REDIRECT_%s] [%s %s] [%s] [RES_HEADERS: %s] [RES_BODY: %s]', this._debugId, - this.method.toUpperCase(), this.uri.href, this.response.statusCode, JSON.stringify(ignoreDebug(this.response.headers)), ''); - }); - this._debugId = ++debugId; - return proto._initBeforeDebug.apply(this, arguments); - }; - - debugFlag = true; -}; -/* eslint-enable */ - class HttpClient extends ServiceInterface { /** * @param config {Config} @@ -103,12 +13,11 @@ class HttpClient extends ServiceInterface { constructor(config, logger) { super(); this.config = config.get(); - this.client = request; - requestDebug(logger); + this.client = createRequestClient(logger); } getProto() { - return request; + return this.client; } getInstance() { diff --git a/src/services/jwt_token_kong.js b/src/services/jwt_token_kong.js index 6a77f82..527d3df 100644 --- a/src/services/jwt_token_kong.js +++ b/src/services/jwt_token_kong.js @@ -1,6 +1,6 @@ import constitute from 'constitute'; import jwt from 'jwt-simple'; -import _ from 'lodash'; +import get from 'lodash/get.js'; import { RuntimeException } from '../exceptions/index.js'; import Config from './config.js'; @@ -16,7 +16,7 @@ class KongJsonWebToken extends ServiceInterface { super(); this.restClient = restClient; this.config = config.get('token'); - if (!_.get(this.config, 'kong.endpoint')) { + if (!get(this.config, 'kong.endpoint')) { throw new RuntimeException('config item `token.kong.endpoint` can not be null'); } } diff --git a/src/services/redis.js b/src/services/redis.js index b9b1739..d00a642 100644 --- a/src/services/redis.js +++ b/src/services/redis.js @@ -1,5 +1,6 @@ import Ioredis from 'ioredis'; import constitute from 'constitute'; +import DI from '../di.js'; import Config from './config.js'; import ServiceInterface from './interface.js'; @@ -45,7 +46,14 @@ class Redis extends ServiceInterface { this.client = new Ioredis(Object.assign({ enableOfflineQueue: true //make redis connect failings throw error }, this.options || this.config.get('redis'))); - this.client.on('error', () => {}); + this.client.on('error', (err) => { + try { + DI.get('logger').error('Redis client error:', err); + } catch { + //Logger not bound yet, keep the error visible on stderr + console.error('Redis client error:', err); + } + }); return this.client; } } diff --git a/src/swagger/index.js b/src/swagger/index.js index 7efd6ba..0fe3b3d 100644 --- a/src/swagger/index.js +++ b/src/swagger/index.js @@ -6,7 +6,6 @@ import assert from 'assert'; import merge from 'lodash/merge.js'; import * as doctrine from 'doctrine'; import * as acorn from 'acorn'; -import { glob } from 'glob'; import * as yaml from 'js-yaml'; import Entitles from '../entities/index.js'; import { RuntimeException, StandardException } from '../exceptions/index.js'; @@ -161,10 +160,6 @@ export class Fragment { }; } - if (!this.isUnknown()) { - return {}; - } - if (this.isException()) { if (!this.getParentFragment()) { return {}; @@ -417,7 +412,7 @@ export class ExSwagger { * @returns {Promise|Array.} */ static async scanFiles(path, options = {}) { - return glob(path, options); + return fs.globSync(path, options); } /** diff --git a/src/utils/cron.js b/src/utils/cron.js new file mode 100644 index 0000000..00912b3 --- /dev/null +++ b/src/utils/cron.js @@ -0,0 +1,208 @@ +/** + * Minimal cron expression parser and scheduler. + * Replaces the unmaintained `later` package with Node built-ins. + * + * Supports 5-field (minute hour day-of-month month day-of-week) and + * 6-field (with a leading seconds) expressions. Each field accepts + * wildcard, step, single value, range, range-with-step and + * comma-separated lists. All times are interpreted in local time, + * matching the previous `later.date.localTime()` default. + */ + +const FIELD_BOUNDS = { + second: [0, 59], + minute: [0, 59], + hour: [0, 23], + dayOfMonth: [1, 31], + month: [1, 12], + dayOfWeek: [0, 7] +}; + +const FIELD_ORDER = [ + 'second', 'minute', 'hour', 'dayOfMonth', 'month', 'dayOfWeek' +]; + +const parseField = (field, min, max) => { + const values = new Set(); + for (const token of field.split(',')) { + if (token === '*') { + for (let value = min; value <= max; value += 1) { + values.add(value); + } + continue; + } + if (token.includes('/')) { + const [base, stepToken] = token.split('/'); + const step = Number.parseInt(stepToken, 10); + if (Number.isNaN(step) || step < 1) { + throw new Error(`Invalid cron step "${stepToken}" in "${field}"`); + } + let start = min; + let end = max; + if (base !== '*') { + if (base.includes('-')) { + [start, end] = base.split('-').map(v => Number.parseInt(v, 10)); + } else { + start = Number.parseInt(base, 10); + } + } + if (Number.isNaN(start) || start < min || start > max + || Number.isNaN(end) || end < min || end > max || start > end) { + throw new Error(`Invalid cron value in "${field}"`); + } + for (let value = start; value <= end; value += step) { + values.add(value); + } + continue; + } + if (token.includes('-')) { + const [start, end] = token.split('-').map(v => Number.parseInt(v, 10)); + if (Number.isNaN(start) || Number.isNaN(end) + || start < min || end > max || start > end) { + throw new Error(`Invalid cron range in "${field}"`); + } + for (let value = start; value <= end; value += 1) { + values.add(value); + } + continue; + } + const value = Number.parseInt(token, 10); + if (Number.isNaN(value) || value < min || value > max) { + throw new Error(`Invalid cron value "${token}" in "${field}"`); + } + values.add(value); + } + return values; +}; + +/** + * Parse a cron expression into a schedule of Sets. + * @param {string} expression + * @param {boolean} [useSeconds=false] + * @returns {Object} + */ +export const parseCron = (expression, useSeconds = false) => { + const parts = String(expression).trim().split(/\s+/); + const names = useSeconds ? FIELD_ORDER : FIELD_ORDER.slice(1); + if (parts.length !== names.length) { + throw new Error( + `Cron expression must contain ${names.length} fields, got ${parts.length}: "${expression}"` + ); + } + const schedule = {}; + names.forEach((name, index) => { + const [min, max] = FIELD_BOUNDS[name]; + schedule[name] = parseField(parts[index], min, max); + }); + if (schedule.dayOfWeek) { + if (schedule.dayOfWeek.has(7)) { + schedule.dayOfWeek.delete(7); + schedule.dayOfWeek.add(0); + } + } + return schedule; +}; + +const matches = (schedule, date) => { + if (schedule.second && !schedule.second.has(date.getSeconds())) { + return false; + } + if (schedule.minute && !schedule.minute.has(date.getMinutes())) { + return false; + } + if (schedule.hour && !schedule.hour.has(date.getHours())) { + return false; + } + if (schedule.dayOfMonth && !schedule.dayOfMonth.has(date.getDate())) { + return false; + } + if (schedule.month && !schedule.month.has(date.getMonth() + 1)) { + return false; + } + if (schedule.dayOfWeek && !schedule.dayOfWeek.has(date.getDay())) { + return false; + } + return true; +}; + +/** + * Compute the next run date strictly after `from` that matches the schedule. + * @param {Object} schedule + * @param {Date} [from=new Date()] + * @returns {Date} + */ +export const getNextRun = (schedule, from = new Date()) => { + const stepMs = schedule.second ? 1000 : 60000; + let current = new Date(Math.floor(from.getTime() / stepMs) * stepMs + stepMs); + const deadline = from.getTime() + 366 * 24 * 3600 * 1000; + + while (current.getTime() <= deadline) { + if (matches(schedule, current)) { + return current; + } + //Fast-forward coarse fields so unschedulable expressions stay fast + if (schedule.month && !schedule.month.has(current.getMonth() + 1)) { + current = new Date(current.getFullYear(), current.getMonth() + 1, 1, 0, 0, 0, 0); + continue; + } + if (schedule.dayOfMonth && !schedule.dayOfMonth.has(current.getDate())) { + current.setDate(current.getDate() + 1); + current.setHours(0, 0, 0, 0); + continue; + } + if (schedule.dayOfWeek && !schedule.dayOfWeek.has(current.getDay())) { + current.setDate(current.getDate() + 1); + current.setHours(0, 0, 0, 0); + continue; + } + if (schedule.hour && !schedule.hour.has(current.getHours())) { + current.setHours(current.getHours() + 1, 0, 0, 0); + continue; + } + if (schedule.minute && !schedule.minute.has(current.getMinutes())) { + current.setMinutes(current.getMinutes() + 1, 0, 0); + continue; + } + if (schedule.second && !schedule.second.has(current.getSeconds())) { + current.setSeconds(current.getSeconds() + 1, 0); + continue; + } + current = new Date(current.getTime() + stepMs); + } + + throw new Error('Cron expression has no match within the next year'); +}; + +const MAX_TIMEOUT = 2147483647; + +/** + * Run `callback` on `schedule` until the returned handle is cleared. + * @param {function} callback + * @param {Object} schedule + * @returns {{clear: function}} + */ +export const setCronInterval = (callback, schedule) => { + let timer = null; + + const scheduleNext = () => { + const nextRun = getNextRun(schedule, new Date()); + const delay = Math.max(0, nextRun.getTime() - Date.now()); + timer = setTimeout(() => { + scheduleNext(); + if (delay <= MAX_TIMEOUT) { + callback(); + } + }, Math.min(delay, MAX_TIMEOUT)); + }; + + scheduleNext(); + + return { + clear() { + if (timer) { + clearTimeout(timer); + timer = null; + } + } + }; +}; diff --git a/src/utils/pagination.js b/src/utils/pagination.js index 099f1d2..ec4b493 100644 --- a/src/utils/pagination.js +++ b/src/utils/pagination.js @@ -39,7 +39,7 @@ const toPaginationUrl = (query, req) => { } return toUrl( scheme, host, requestPath, - Object.assign(req.query, query) + Object.assign({}, req.query, query) ); }; diff --git a/src/utils/request_client.js b/src/utils/request_client.js new file mode 100644 index 0000000..72e3917 --- /dev/null +++ b/src/utils/request_client.js @@ -0,0 +1,179 @@ +/** + * A request-promise-native compatible HTTP client built on the global fetch. + * + * Keeps the option object and error shape used by the legacy `request` + * ecosystem so callers of HttpClient/RestClient see no interface change: + * - resolves with the response body (or the full response with + * `resolveWithFullResponse`) + * - rejects with an error carrying `.name` (`StatusCodeError`/`RequestError`), + * `.statusCode`, `.response` and `.request` + * - supports `url`, `method`, `headers`, `body`, `json`, `qs`, `form`, + * `formData`, `simple`, `resolveWithFullResponse` and `timeout` + */ + +const MAX_BODY_LENGTH = parseInt(process.env.MAX_REQUEST_DEBUG_BODY, 10) || 3000; +const TOO_LONG_BODY = '____TLDR____'; + +let debugId = 0; + +const toPlainHeaders = (headers = {}) => { + const result = {}; + Object.entries(headers).forEach(([key, value]) => { + result[key] = String(value); + }); + return result; +}; + +const buildQueryString = (qs) => { + if (qs === undefined || qs === null) { + return ''; + } + if (typeof qs === 'string') { + return qs.startsWith('?') ? qs : `?${qs}`; + } + return `?${new URLSearchParams(qs).toString()}`; +}; + +const buildBody = (params) => { + if (params.formData) { + const form = new FormData(); + Object.entries(params.formData).forEach(([key, value]) => { + form.append(key, value); + }); + return { body: form, contentType: null }; + } + if (params.form) { + return { + body: new URLSearchParams(params.form).toString(), + contentType: 'application/x-www-form-urlencoded' + }; + } + //The legacy `json` option also accepts a value used as the JSON body + if (params.json !== undefined && params.json !== false && params.json !== true) { + return { body: JSON.stringify(params.json), contentType: 'application/json' }; + } + if (params.json === true && params.body !== undefined) { + return { body: JSON.stringify(params.body), contentType: 'application/json' }; + } + return { body: params.body, contentType: null }; +}; + +const truncateBody = (body) => { + if (typeof body !== 'string') { + return body ? String(body) : ''; + } + return body.length > MAX_BODY_LENGTH ? TOO_LONG_BODY : body; +}; + +/** + * Create a request-promise-native compatible callable client. + * @param {Logger} [logger] when given, verbose request/response logs are emitted + * @returns {function} + */ +export const createRequestClient = (logger) => { + const request = (params = {}) => new Promise((resolve, reject) => { + const { + url, + method: rawMethod = 'GET', + headers = {}, + resolveWithFullResponse = false, + simple = true, + timeout = 0, + qs + } = params; + + const method = String(rawMethod).toUpperCase(); + const targetUrl = `${url}${buildQueryString(qs)}`; + const { body, contentType } = buildBody(params); + + const requestHeaders = toPlainHeaders(headers); + if (contentType + && !Object.keys(requestHeaders).some(key => key.toLowerCase() === 'content-type')) { + requestHeaders['Content-Type'] = contentType; + } + + const abortController = new AbortController(); + const timer = timeout > 0 + ? setTimeout(() => abortController.abort(new Error('Request timed out')), timeout) + : null; + + const requestForDump = { + method, + uri: { + protocol: new URL(targetUrl).protocol, + href: targetUrl + }, + headers: requestHeaders, + req: {}, + _json: params.json !== undefined && params.json !== false + ? true : body !== undefined, + formData: params.formData || null, + body: params.formData + ? new URLSearchParams(params.formData).toString() + : body + }; + + const id = ++debugId; + if (logger) { + logger.verbose('[HTTP_REQUEST_%s] [%s %s] [REQ_HEADERS: %s] [REQ_BODY: %s]', id, + method, targetUrl, JSON.stringify(requestHeaders), truncateBody(body)); + } + + fetch(targetUrl, { + method, + headers: requestHeaders, + body, + signal: abortController.signal, + redirect: 'follow' + }).then(async (response) => { + if (timer) { + clearTimeout(timer); + } + const rawBody = await response.text(); + let parsedBody = rawBody; + if (params.json !== undefined && params.json !== false) { + try { + parsedBody = JSON.parse(rawBody); + } catch { + parsedBody = rawBody; + } + } + + const responseForDump = { + statusCode: response.status, + statusMessage: response.statusText, + headers: toPlainHeaders(Object.fromEntries(response.headers.entries())), + body: parsedBody, + request: requestForDump + }; + + if (logger) { + logger.verbose('[HTTP_RESPONSE_%s] [%s %s] [%s] [RES_HEADERS: %s] [RES_BODY: %s]', id, + method, targetUrl, response.status, JSON.stringify(responseForDump.headers), + truncateBody(parsedBody)); + } + + if (response.status >= 400 && simple) { + const error = new Error(`Response status ${response.status}`); + error.name = 'StatusCodeError'; + error.statusCode = response.status; + error.response = responseForDump; + error.request = requestForDump; + reject(error); + return; + } + + resolve(resolveWithFullResponse ? responseForDump : parsedBody); + }).catch((err) => { + if (timer) { + clearTimeout(timer); + } + const error = new Error(err.message); + error.name = 'RequestError'; + error.request = requestForDump; + reject(error); + }); + }); + + return request; +}; diff --git a/test/_helpers/http_server.js b/test/_helpers/http_server.js new file mode 100644 index 0000000..7c5c0db --- /dev/null +++ b/test/_helpers/http_server.js @@ -0,0 +1,28 @@ +import http from 'http'; + +/** + * Start a local HTTP server for integration tests. + * Responses are consumed from a FIFO queue, each entry shaped like + * `{ statusCode, body, headers }`. + * @returns {Promise<{baseUrl: string, queue: Array, close: function}>} + */ +export const createTestServer = () => new Promise((resolve) => { + const queue = []; + const server = http.createServer((req, res) => { + const next = queue.shift() || {}; + const { + statusCode = 200, + body = '', + headers = {} + } = next; + res.writeHead(statusCode, headers); + res.end(typeof body === 'string' ? body : JSON.stringify(body)); + }); + server.listen(0, '127.0.0.1', () => { + resolve({ + baseUrl: `http://127.0.0.1:${server.address().port}`, + queue, + close: () => new Promise((res) => server.close(res)) + }); + }); +}); diff --git a/test/commands/make_entity.js b/test/commands/make_entity.js index c9bfe56..108c3c4 100644 --- a/test/commands/make_entity.js +++ b/test/commands/make_entity.js @@ -1,55 +1,56 @@ -import test from 'ava'; +import test from 'node:test'; +import assert from 'node:assert/strict'; import { MakeEntity, MakeDbView } from './../../src/commands/make_entity.js'; import DI from '../../src/di.js'; import * as providers from '../../src/services/providers.js'; DI.registerMockedProviders(Object.values(providers), `${import.meta.dirname}/../_demo_project/config`); -test('Make entity mapping', (t) => { - t.is(MakeEntity.typeMapping('boolean'), 'DataTypes.BOOLEAN'); - t.is(MakeEntity.typeMapping('tinyint(1)'), 'DataTypes.BOOLEAN'); - t.is(MakeEntity.typeMapping('bit(1)'), 'DataTypes.BOOLEAN'); +test('Make entity mapping', () => { + assert.equal(MakeEntity.typeMapping('boolean'), 'DataTypes.BOOLEAN'); + assert.equal(MakeEntity.typeMapping('tinyint(1)'), 'DataTypes.BOOLEAN'); + assert.equal(MakeEntity.typeMapping('bit(1)'), 'DataTypes.BOOLEAN'); - t.is(MakeEntity.typeMapping('smallint(5)'), 'DataTypes.INTEGER(5)'); + assert.equal(MakeEntity.typeMapping('smallint(5)'), 'DataTypes.INTEGER(5)'); - t.is(MakeEntity.typeMapping('bigint'), 'DataTypes.BIGINT'); + assert.equal(MakeEntity.typeMapping('bigint'), 'DataTypes.BIGINT'); - t.is(MakeEntity.typeMapping("enum('foo')"), "DataTypes.ENUM('foo')"); + assert.equal(MakeEntity.typeMapping("enum('foo')"), "DataTypes.ENUM('foo')"); - t.is(MakeEntity.typeMapping('varchar'), 'DataTypes.STRING'); - t.is(MakeEntity.typeMapping('varchar(255)'), 'DataTypes.STRING(255)'); + assert.equal(MakeEntity.typeMapping('varchar'), 'DataTypes.STRING'); + assert.equal(MakeEntity.typeMapping('varchar(255)'), 'DataTypes.STRING(255)'); - t.is(MakeEntity.typeMapping('char(5)'), 'DataTypes.CHAR(5)'); + assert.equal(MakeEntity.typeMapping('char(5)'), 'DataTypes.CHAR(5)'); - t.is(MakeEntity.typeMapping('text'), 'DataTypes.TEXT'); + assert.equal(MakeEntity.typeMapping('text'), 'DataTypes.TEXT'); - t.is(MakeEntity.typeMapping('year'), 'DataTypes.INTEGER(4)'); + assert.equal(MakeEntity.typeMapping('year'), 'DataTypes.INTEGER(4)'); - t.is(MakeEntity.typeMapping('datetime'), 'DataTypes.DATE'); + assert.equal(MakeEntity.typeMapping('datetime'), 'DataTypes.DATE'); - t.is(MakeEntity.typeMapping('date'), 'DataTypes.DATEONLY'); + assert.equal(MakeEntity.typeMapping('date'), 'DataTypes.DATEONLY'); - t.is(MakeEntity.typeMapping('time'), 'DataTypes.TIME'); + assert.equal(MakeEntity.typeMapping('time'), 'DataTypes.TIME'); - t.is(MakeEntity.typeMapping('float'), 'DataTypes.FLOAT'); + assert.equal(MakeEntity.typeMapping('float'), 'DataTypes.FLOAT'); - t.is(MakeEntity.typeMapping('decimal'), 'DataTypes.DECIMAL'); - t.is(MakeEntity.typeMapping('decimal(1,2)'), 'DataTypes.DECIMAL(1, 2)'); + assert.equal(MakeEntity.typeMapping('decimal'), 'DataTypes.DECIMAL'); + assert.equal(MakeEntity.typeMapping('decimal(1,2)'), 'DataTypes.DECIMAL(1, 2)'); - t.is(MakeEntity.typeMapping('float8'), 'DataTypes.DOUBLE'); + assert.equal(MakeEntity.typeMapping('float8'), 'DataTypes.DOUBLE'); - t.is(MakeEntity.typeMapping('uuid'), 'DataTypes.UUIDV4'); + assert.equal(MakeEntity.typeMapping('uuid'), 'DataTypes.UUIDV4'); - t.is(MakeEntity.typeMapping('jsonb'), 'DataTypes.JSONB'); + assert.equal(MakeEntity.typeMapping('jsonb'), 'DataTypes.JSONB'); - t.is(MakeEntity.typeMapping('json'), 'DataTypes.JSON'); + assert.equal(MakeEntity.typeMapping('json'), 'DataTypes.JSON'); - t.is(MakeEntity.typeMapping('geometry'), 'DataTypes.GEOMETRY'); + assert.equal(MakeEntity.typeMapping('geometry'), 'DataTypes.GEOMETRY'); }); -test('Make entity generates timestamp SQL expressions', (t) => { +test('Make entity generates timestamp SQL expressions', () => { const command = new MakeDbView({}); const sql = command.getSql('users', [{ fieldName: 'createdAt' }, { fieldName: 'name' }]); - t.true(sql.includes('FROM_UNIXTIME')); - t.true(sql.includes('`name` AS `name`')); + assert.ok(sql.includes('FROM_UNIXTIME')); + assert.ok(sql.includes('`name` AS `name`')); }); diff --git a/test/di.js b/test/di.js index 689c658..10410c4 100644 --- a/test/di.js +++ b/test/di.js @@ -1,36 +1,45 @@ -import test from 'ava'; +import test from 'node:test'; +import assert from 'node:assert/strict'; import { RuntimeException } from '../src/exceptions/index.js'; import DI from '../src/di.js'; import constitute from 'constitute'; -test('throw exception when nothing bound', (t) => { - t.throws(() => DI.get('not_bound'), { instanceOf: RuntimeException }); +test('throw exception when nothing bound', () => { + assert.throws(() => DI.get('not_bound'), RuntimeException); }); -test('bind value', async(t) => { +test('bind value', () => { class ValueClass { } DI.bindValue(ValueClass, 123); - t.is(DI.get(ValueClass), 123); + assert.equal(DI.get(ValueClass), 123); }); -test('bind method', async(t) => { +test('bind value by string key', () => { + DI.bindValue('answer', 42); + assert.equal(DI.get('answer'), 42); + DI.bindValue('options', { a: 1, b: 'two' }); + assert.deepEqual(DI.get('options'), { a: 1, b: 'two' }); + DI.bindValue('nullable', null); + assert.equal(DI.get('nullable'), null); +}); +test('bind method', () => { DI.bindMethod('foo', () => () => 'bar'); const method = DI.get('foo'); - t.true(typeof method === 'function'); - t.is('bar', method()); + assert.equal(typeof method, 'function'); + assert.equal('bar', method()); }); -test('bind class', async(t) => { +test('bind class', () => { class Bar { } DI.bindClass('bar', Bar); - t.true(DI.get('bar') instanceof Bar); - t.true(Object.keys(DI.getBound()).includes('bar')); + assert.ok(DI.get('bar') instanceof Bar); + assert.ok(Object.keys(DI.getBound()).includes('bar')); }); -test('reset container', async(t) => { +test('reset container', () => { class ValueClass { } DI.bindValue(ValueClass, 123); - t.true(Object.keys(DI.getBound()).length > 0); + assert.ok(Object.keys(DI.getBound()).length > 0); DI.reset(); - t.is(Object.keys(DI.getBound()).length, 0); - t.true(DI.getContainer() instanceof constitute.Container); + assert.equal(Object.keys(DI.getBound()).length, 0); + assert.ok(DI.getContainer() instanceof constitute.Container); }); diff --git a/test/engine.js b/test/engine.js index f952bf8..76ee575 100644 --- a/test/engine.js +++ b/test/engine.js @@ -1,50 +1,49 @@ -import test from 'ava'; +import test from 'node:test'; +import assert from 'node:assert/strict'; import path from 'path'; import EvaEngine, { DI } from '../src/engine.js'; import { RuntimeException } from '../src/exceptions/index.js'; import Command from '../src/commands/index.js'; -test('default properties', (t) => { +test('default properties', () => { const projectRoot = path.normalize(`${import.meta.dirname}/_demo_project`); const engine = new EvaEngine({ projectRoot, port: 3000 }); const meta = engine.getMeta(); - t.is(meta.projectRoot, projectRoot); - t.is(meta.configPath, `${projectRoot}${path.sep}config`); - t.is(meta.sourceRoot, `${projectRoot}${path.sep}src`); - t.is(meta.port, 3000); - t.is(engine.getDI(), DI); + assert.equal(meta.projectRoot, projectRoot); + assert.equal(meta.configPath, `${projectRoot}${path.sep}config`); + assert.equal(meta.sourceRoot, `${projectRoot}${path.sep}src`); + assert.equal(meta.port, 3000); + assert.equal(engine.getDI(), DI); }); -test('create app', (t) => { - t.true(EvaEngine.getApp().hasOwnProperty('use')); - t.true(EvaEngine.getApp().hasOwnProperty('route')); +test('create app', () => { + assert.ok(Object.prototype.hasOwnProperty.call(EvaEngine.getApp(), 'use')); + assert.ok(Object.prototype.hasOwnProperty.call(EvaEngine.getApp(), 'route')); }); -test('bootstrap', (t) => { +test('bootstrap', () => { const projectRoot = path.normalize(`${import.meta.dirname}/_demo_project`); const engine = new EvaEngine({ projectRoot, port: 3000 }); - // t.is(Object.keys(DI.getBound()).length, 6); engine.bootstrap(); - t.true(Object.keys(DI.getBound()).length > 10); + assert.ok(Object.keys(DI.getBound()).length > 10); }); - -test('CLI without commands', (t) => { +test('CLI without commands', () => { const projectRoot = path.normalize(`${import.meta.dirname}/_demo_project`); const engine = new EvaEngine({ projectRoot }, 'cli'); - t.is(engine.getMeta().mode, 'cli'); - t.throws(() => engine.getCLI(), { instanceOf: RuntimeException }); + assert.equal(engine.getMeta().mode, 'cli'); + assert.throws(() => engine.getCLI(), RuntimeException); }); -test('CLI with commands', (t) => { +test('CLI with commands', () => { class TestCommand extends Command { static getName() { return 'hello:world'; @@ -63,15 +62,15 @@ test('CLI with commands', (t) => { projectRoot }, 'cli'); engine.registerCommands({ test: TestCommand }); - t.is(Object.keys(engine.getCommands()).length, 1); - t.true(engine.getCLI('hello:world').hasOwnProperty('$0')); - t.is(engine.getCommandName(), 'hello:world'); + assert.equal(Object.keys(engine.getCommands()).length, 1); + assert.ok(Object.prototype.hasOwnProperty.call(engine.getCLI('hello:world'), '$0')); + assert.equal(engine.getCommandName(), 'hello:world'); engine.clearCommands(); - t.is(Object.keys(engine.getCommands()).length, 0); - t.false(Array.isArray(engine.getCommands())); + assert.equal(Object.keys(engine.getCommands()).length, 0); + assert.equal(Array.isArray(engine.getCommands()), false); }); -test('Run commands', (t) => { +test('Run commands', async () => { class TestCommand extends Command { static getName() { return 'hello:world'; @@ -98,13 +97,12 @@ test('Run commands', (t) => { projectRoot }, 'cli'); engine.registerCommands({ test: TestCommand }); - engine.runCLI('hello:world'); - t.is(engine.getCommand().getFoo(), 'bar'); + await engine.runCLI('hello:world'); + assert.equal(engine.getCommand().getFoo(), 'bar'); }); -test('rejects unknown command and cron without commands', async (t) => { +test('rejects unknown command and cron without commands', async () => { const engine = new EvaEngine({ projectRoot: path.normalize(`${import.meta.dirname}/_demo_project`) }, 'cli'); - await t.throwsAsync(engine.runCommand('missing'), { instanceOf: RuntimeException }); - t.throws(() => engine.runCrontab('* * * * *', 'missing'), { instanceOf: RuntimeException }); + await assert.rejects(engine.runCommand('missing'), RuntimeException); + assert.throws(() => engine.runCrontab('* * * * *', 'missing'), RuntimeException); }); - diff --git a/test/entities/index.js b/test/entities/index.js index 71a46a1..fccfb09 100644 --- a/test/entities/index.js +++ b/test/entities/index.js @@ -1,31 +1,34 @@ -import test from 'ava'; +import test from 'node:test'; +import assert from 'node:assert/strict'; import Sequelize from 'sequelize'; import util from 'util'; import Entities from './../../src/entities/index.js'; -test('Custom validator', (t) => { - const entities = new Entities(`${import.meta.dirname}/../_demo_project/entities`, new Sequelize('database', null, null, { dialect: 'mysql' })); - t.true(util.isFunction(entities.getInstance().validateIsUnique)); +const entitiesPath = `${import.meta.dirname}/../_demo_project/entities`; + +test('Custom validator', () => { + const entities = new Entities(entitiesPath, new Sequelize('database', null, null, { dialect: 'mysql' })); + assert.ok(util.isFunction(entities.getInstance().validateIsUnique)); }); -test('Multi instances', (t) => { - const entities1 = new Entities(`${import.meta.dirname}/../_demo_project/entities`, new Sequelize('database', null, null, { dialect: 'mysql' })); - const entities2 = new Entities(`${import.meta.dirname}/../_demo_project/entities`, new Sequelize('database', null, null, { dialect: 'mysql' })); - t.true(entities1.getInstance() instanceof Sequelize); - t.true(entities2.getInstance() instanceof Sequelize); - t.false(entities1 === entities2); - t.is(Object.keys(entities1.getAll()).length, 1); +test('Multi instances', () => { + const entities1 = new Entities(entitiesPath, new Sequelize('database', null, null, { dialect: 'mysql' })); + const entities2 = new Entities(entitiesPath, new Sequelize('database', null, null, { dialect: 'mysql' })); + assert.ok(entities1.getInstance() instanceof Sequelize); + assert.ok(entities2.getInstance() instanceof Sequelize); + assert.notEqual(entities1, entities2); + assert.equal(Object.keys(entities1.getAll()).length, 1); }); -test('Scan from file', (t) => { - const entities = new Entities(`${import.meta.dirname}/../_demo_project/entities`, new Sequelize('database', null, null, { dialect: 'mysql' })); - t.is(entities.getSequelize(), Sequelize); - t.true(entities.getInstance() instanceof Sequelize); - t.is(Object.keys(entities.getAll()).length, 1); - t.true(entities.getAll().hasOwnProperty('kv')); +test('Scan from file', () => { + const entities = new Entities(entitiesPath, new Sequelize('database', null, null, { dialect: 'mysql' })); + assert.equal(entities.getSequelize(), Sequelize); + assert.ok(entities.getInstance() instanceof Sequelize); + assert.equal(Object.keys(entities.getAll()).length, 1); + assert.ok(Object.prototype.hasOwnProperty.call(entities.getAll(), 'kv')); }); -test('uniqueInsert converts booleans and builds bind parameters', (t) => { +test('uniqueInsert converts booleans and builds bind parameters', () => { const entities = new Entities('', null); let query; entities.getInstance = () => ({ @@ -39,7 +42,7 @@ test('uniqueInsert converts booleans and builds bind parameters', (t) => { input: { active: true, name: 'one' }, uniqueCondition: 'SELECT id FROM items WHERE name = $name' }); - t.is(query.options.bind.active, 1); - t.is(query.options.bind.name, 'one'); - t.true(query.sql.includes('INSERT INTO items')); + assert.equal(query.options.bind.active, 1); + assert.equal(query.options.bind.name, 'one'); + assert.ok(query.sql.includes('INSERT INTO items')); }); diff --git a/test/error_handlers.js b/test/error_handlers.js index e0f105b..a422448 100644 --- a/test/error_handlers.js +++ b/test/error_handlers.js @@ -1,19 +1,19 @@ -import test from 'ava'; +import test from 'node:test'; +import assert from 'node:assert/strict'; import path from 'path'; import EvaEngine from '../src/engine.js'; import { mockRequest, mockResponse, mockInstance } from '../src/utils/test.js'; import { RuntimeException, LogicException } from '../src/exceptions/index.js'; - -test('Default errorHandler', (t) => { +test('Default errorHandler', () => { const projectRoot = path.normalize(`${import.meta.dirname}/_demo_project`); const engine = new EvaEngine({ projectRoot }); - t.true(typeof engine.getDefaultErrorHandler() === 'function'); + assert.equal(typeof engine.getDefaultErrorHandler(), 'function'); }); -test('Error handler for not expect error', (t) => { +test('Error handler for not expect error', () => { const projectRoot = path.normalize(`${import.meta.dirname}/_demo_project`); const engine = new EvaEngine({ projectRoot, @@ -24,13 +24,13 @@ test('Error handler for not expect error', (t) => { const res = mockResponse(); errorHandler(new Error('Not expected error'), mockRequest(), res, () => { }); - t.is(res.statusCode, 500); + assert.equal(res.statusCode, 500); const err = JSON.parse(res._getData()); - t.is(err.name, 'RuntimeException'); - t.is(err.message, 'Not expected error'); + assert.equal(err.name, 'RuntimeException'); + assert.equal(err.message, 'Not expected error'); }); -test('Error handler for RuntimeException', (t) => { +test('Error handler for RuntimeException', () => { const projectRoot = path.normalize(`${import.meta.dirname}/_demo_project`); const engine = new EvaEngine({ projectRoot, @@ -41,13 +41,13 @@ test('Error handler for RuntimeException', (t) => { const res = mockResponse(); errorHandler(new RuntimeException('Runtime'), mockRequest(), res, () => { }); - t.is(res.statusCode, 500); + assert.equal(res.statusCode, 500); const err = JSON.parse(res._getData()); - t.is(err.name, 'RuntimeException'); - t.is(err.message, 'Runtime'); + assert.equal(err.name, 'RuntimeException'); + assert.equal(err.message, 'Runtime'); }); -test('Error handler for LogicException', (t) => { +test('Error handler for LogicException', () => { const projectRoot = path.normalize(`${import.meta.dirname}/_demo_project`); const engine = new EvaEngine({ projectRoot, @@ -58,8 +58,8 @@ test('Error handler for LogicException', (t) => { const res = mockResponse(); errorHandler(new LogicException('Logic'), mockRequest(), res, () => { }); - t.is(res.statusCode, 400); + assert.equal(res.statusCode, 400); const err = JSON.parse(res._getData()); - t.is(err.name, 'LogicException'); - t.is(err.message, 'Logic'); + assert.equal(err.name, 'LogicException'); + assert.equal(err.message, 'Logic'); }); diff --git a/test/exceptions/index.js b/test/exceptions/index.js index d15063b..21f8a42 100644 --- a/test/exceptions/index.js +++ b/test/exceptions/index.js @@ -1,4 +1,5 @@ -import test from 'ava'; +import test from 'node:test'; +import assert from 'node:assert/strict'; import { StandardException, LogicException, @@ -10,73 +11,70 @@ import { RuntimeException } from './../../src/exceptions/index.js'; - -test('Throw input', (t) => { - t.throws(() => { +test('Throw input', () => { + assert.throws(() => { new RuntimeException([]); - }, { instanceOf: TypeError }); + }, TypeError); - t.is((new StandardException()).message, 'StandardException'); - t.is((new LogicException()).message, 'LogicException'); - t.is((new StandardException('foo')).message, 'foo'); - t.is((new StandardException(new Error())).message, ''); - t.is((new StandardException(new Error('bar'))).message, 'bar'); - t.is((new StandardException(new TypeError('bar_type'))).message, 'bar_type'); - t.is((new StandardException()).setMessage('custom').message, 'custom'); - t.throws(() => { + assert.equal((new StandardException()).message, 'StandardException'); + assert.equal((new LogicException()).message, 'LogicException'); + assert.equal((new StandardException('foo')).message, 'foo'); + assert.equal((new StandardException(new Error())).message, ''); + assert.equal((new StandardException(new Error('bar'))).message, 'bar'); + assert.equal((new StandardException(new TypeError('bar_type'))).message, 'bar_type'); + assert.equal((new StandardException()).setMessage('custom').message, 'custom'); + assert.throws(() => { new RuntimeException(new LogicException()); - }, { instanceOf: LogicException }); + }, LogicException); }); -test('Factory', (t) => { +test('Factory', () => { const e = StandardException.factory({ code: 123, statusCode: 409, name: 'ResourceConflictedException', message: 'foo' }); - t.true(e instanceof ResourceConflictedException); + assert.ok(e instanceof ResourceConflictedException); }); -test('Throw i18n', (t) => { - t.is((new StandardException()).i18n('foo %s', 'bar').message, 'foo bar'); +test('Throw i18n', () => { + assert.equal((new StandardException()).i18n('foo %s', 'bar').message, 'foo bar'); }); -test('Throw code', (t) => { - // t.is((new LogicException()).getCode(), 385400003318127193); - t.is((new LogicException()).setCode(123).getCode(), 123); +test('Throw code', () => { + assert.equal((new LogicException()).setCode(123).getCode(), 123); }); -test('Throw status code', (t) => { - t.is((new StandardException()).getStatusCode(), 500); - t.is((new LogicException()).getStatusCode(), 400); - t.is((new UnauthorizedException()).getStatusCode(), 401); - t.is((new OperationNotPermittedException()).getStatusCode(), 403); - t.is((new ResourceNotFoundException()).getStatusCode(), 404); - t.is((new OperationUnsupportedException()).getStatusCode(), 405); - t.is((new ResourceConflictedException()).getStatusCode(), 409); - t.is((new RuntimeException()).getStatusCode(), 500); +test('Throw status code', () => { + assert.equal((new StandardException()).getStatusCode(), 500); + assert.equal((new LogicException()).getStatusCode(), 400); + assert.equal((new UnauthorizedException()).getStatusCode(), 401); + assert.equal((new OperationNotPermittedException()).getStatusCode(), 403); + assert.equal((new ResourceNotFoundException()).getStatusCode(), 404); + assert.equal((new OperationUnsupportedException()).getStatusCode(), 405); + assert.equal((new ResourceConflictedException()).getStatusCode(), 409); + assert.equal((new RuntimeException()).getStatusCode(), 500); }); -test('Hash', (t) => { - t.is(StandardException.hash('111111'), '0404288374'); +test('Hash', () => { + assert.equal(StandardException.hash('111111'), '0404288374'); }); -test('Should extends standard exception', (t) => { - t.true(new LogicException('foo') instanceof StandardException); +test('Should extends standard exception', () => { + assert.ok(new LogicException('foo') instanceof StandardException); }); -test('Status code', (t) => { - t.is(new LogicException('foo').getStatusCode(), 400); +test('Status code', () => { + assert.equal(new LogicException('foo').getStatusCode(), 400); }); -test('Stack Beautifier', (t) => { - t.deepEqual(StandardException.stackBeautifier(`foo +test('Stack Beautifier', () => { + assert.deepEqual(StandardException.stackBeautifier(`foo bar`), ['foo', 'bar']); - t.deepEqual(StandardException.stackBeautifier(`foo + assert.deepEqual(StandardException.stackBeautifier(`foo node_modules/abc something/(node.js) something/(native) bar`), ['foo', 'bar']); }); - diff --git a/test/index.js b/test/index.js index 42a762c..73a546c 100644 --- a/test/index.js +++ b/test/index.js @@ -1,6 +1,7 @@ -import test from 'ava'; +import test from 'node:test'; +import assert from 'node:assert/strict'; import engineIndex from '../src/index.js'; -test('index', (t) => { - t.true(Object.keys(engineIndex).length >= 14); +test('index', () => { + assert.ok(Object.keys(engineIndex).length >= 14); }); diff --git a/test/middlewares/security.js b/test/middlewares/security.js index 4b54de6..36967a2 100644 --- a/test/middlewares/security.js +++ b/test/middlewares/security.js @@ -1,4 +1,6 @@ -import test from 'ava'; +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { EventEmitter } from 'events'; import Joi from 'joi'; import DI from '../../src/di.js'; import * as serviceProviders from '../../src/services/providers.js'; @@ -14,7 +16,7 @@ const getAuth = () => DI.get('auth')(); const getValidator = () => DI.get('validator'); const response = () => mockResponse(); -test('auth rejects token without expiration', async (t) => { +test('auth rejects token without expiration', async () => { const originalFind = DI.get('jwt').find; DI.get('jwt').find = async () => ({ uid: 7 }); const request = mockRequest({ headers: { 'x-token': 'missing-expiration' } }); @@ -22,16 +24,16 @@ test('auth rejects token without expiration', async (t) => { const error = await new Promise(resolve => { getAuth()(request, response(), resolve); }); - t.true(error instanceof UnauthorizedException); - t.is(error.message, 'Token expired'); + assert.ok(error instanceof UnauthorizedException); + assert.equal(error.message, 'Token expired'); } catch (error) { - t.fail(error.message); + assert.fail(error.message); } finally { DI.get('jwt').find = originalFind; } }); -test('validator accepts valid Joi 18 schema', async (t) => { +test('validator accepts valid Joi 18 schema', async () => { const middleware = getValidator()(() => ({ query: Joi.object({ page: Joi.number().integer().required() }) })); @@ -40,10 +42,10 @@ test('validator accepts valid Joi 18 schema', async (t) => { await middleware(request, response(), () => { called = true; }); - t.true(called); + assert.ok(called); }); -test('validator rejects invalid Joi 18 schema', async (t) => { +test('validator rejects invalid Joi 18 schema', async () => { const middleware = getValidator()(() => ({ body: Joi.object({ name: Joi.string().required() }) })); @@ -52,19 +54,43 @@ test('validator rejects invalid Joi 18 schema', async (t) => { const error = await new Promise(resolve => { middleware(request, response(), resolve); }); - t.true(error instanceof FormInvalidateException); + assert.ok(error instanceof FormInvalidateException); } catch (error) { - t.fail(error.message); + assert.fail(error.message); } }); -test('session middleware initializes with connect-redis 10', (t) => { +test('session store redis errors are logged instead of thrown', () => { + const config = DI.get('config'); + const originalStore = config.get('session').store; + const fakeClient = new EventEmitter(); + config.get().session.store = { client: fakeClient }; + + const logger = DI.get('logger'); + const originalError = logger.error; + let logged = null; + logger.error = (msg, err) => { + logged = { msg, err }; + }; + + try { + const middleware = DI.get('session')(); + assert.equal(typeof middleware, 'function'); + assert.doesNotThrow(() => fakeClient.emit('error', new Error('redis down'))); + } finally { + config.get().session.store = originalStore; + logger.error = originalError; + } + assert.ok(logged); + assert.equal(logged.err.message, 'redis down'); +}); + +test('session middleware initializes with connect-redis 10', () => { const middleware = DI.get('session')(); - t.is(typeof middleware, 'function'); - t.pass(); + assert.equal(typeof middleware, 'function'); }); -test('Kong auth accepts consumer headers', async (t) => { +test('Kong auth accepts consumer headers', async () => { const request = mockRequest({ headers: { 'x-consumer-custom-id': '9', 'x-consumer-custom-username': 'nine' @@ -72,13 +98,13 @@ test('Kong auth accepts consumer headers', async (t) => { const result = await new Promise((resolve, reject) => { new AuthKongMiddleware()()(request, response(), error => error ? reject(error) : resolve(request)); }); - t.deepEqual(result.auth, { uid: 9, mobile: 'nine' }); + assert.deepEqual(result.auth, { uid: 9, mobile: 'nine' }); }); -test('Kong auth rejects anonymous consumer', async (t) => { +test('Kong auth rejects anonymous consumer', async () => { const request = mockRequest({ headers: { 'x-anonymous-consumer': 'true' } }); const error = await new Promise(resolve => { new AuthKongMiddleware()()(request, response(), resolve); }); - t.true(error instanceof UnauthorizedException); + assert.ok(error instanceof UnauthorizedException); }); diff --git a/test/middlewares/trace.js b/test/middlewares/trace.js index a6e81c2..c6c30ba 100644 --- a/test/middlewares/trace.js +++ b/test/middlewares/trace.js @@ -1,4 +1,5 @@ -import test from 'ava'; +import test from 'node:test'; +import assert from 'node:assert/strict'; import DI from '../../src/di.js'; import * as providers from '../../src/services/providers.js'; import * as middlewares from '../../src/middlewares/providers.js'; @@ -6,16 +7,16 @@ import { mockRequest, mockResponse } from '../../src/utils/test.js'; DI.registerMockedProviders(Object.values(providers), `${import.meta.dirname}/../_demo_project/config`); DI.registerMockedProviders(Object.values(middlewares)); -test('Unique request id', (t) => { +test('Unique request id', () => { const middleware = DI.get('trace')(); const req = mockRequest(); const res = mockResponse(); middleware(req, res, () => { }); - t.truthy(res.getHeader('X-B3-SpanId')); + assert.ok(res.getHeader('X-B3-SpanId')); }); -test('propagates disabled upstream sampling', (t) => { +test('propagates disabled upstream sampling', () => { const middleware = DI.get('trace')(); const req = mockRequest({ headers: { @@ -25,6 +26,7 @@ test('propagates disabled upstream sampling', (t) => { } }); const res = mockResponse(); - middleware(req, res, () => {}); - t.is(res.getHeader('X-B3-Sampled'), 0); + middleware(req, res, () => { + }); + assert.equal(res.getHeader('X-B3-Sampled'), 0); }); diff --git a/test/middlewares/view_cache.js b/test/middlewares/view_cache.js index 69b3658..fc06178 100644 --- a/test/middlewares/view_cache.js +++ b/test/middlewares/view_cache.js @@ -1,4 +1,5 @@ -import test from 'ava'; +import test, { beforeEach, after } from 'node:test'; +import assert from 'node:assert/strict'; import DI from '../../src/di.js'; import * as providers from '../../src/services/providers.js'; import * as middlewares from '../../src/middlewares/providers.js'; @@ -11,74 +12,75 @@ import { RuntimeException } from './../../src/exceptions/index.js'; DI.registerMockedProviders(Object.values(providers), `${import.meta.dirname}/../_demo_project/config`); DI.registerServiceProviders(Object.values(middlewares)); const cache = DI.get('cache'); -test.beforeEach('Flush all', async() => { +beforeEach(async () => { await cache.flush(); }); -test.after.always('Close Redis', () => DI.get('redis').cleanup()); +after(() => DI.get('redis').cleanup()); -test('No route', (t) => { - try { +test('No route', () => { + assert.throws(() => { requestToCacheKey(mockRequest()); - } catch (e) { - t.true(e instanceof RuntimeException); - t.regex(e.message, /View cache middleware require route/); - } + }, (e) => { + assert.ok(e instanceof RuntimeException); + assert.match(e.message, /View cache middleware require route/); + return true; + }); }); -test('No support post', (t) => { +test('No support post', () => { const req = mockRequest({ method: 'POST', url: '/login' }); req.route = {}; - try { + assert.throws(() => { requestToCacheKey(req); - } catch (e) { - t.true(e instanceof RuntimeException); - t.regex(e.message, /View cache middleware only support GET method/); - } + }, (e) => { + assert.ok(e instanceof RuntimeException); + assert.match(e.message, /View cache middleware only support GET method/); + return true; + }); }); -test('Hash strategy not function', (t) => { +test('Hash strategy not function', () => { const req = mockRequest({ method: 'GET', url: '/login' }); req.route = {}; - try { + assert.throws(() => { requestToCacheKey(req, 'something strange'); - } catch (e) { - t.true(e instanceof RuntimeException); - t.regex(e.message, /View cache hash strategy must be a function/); - } + }, (e) => { + assert.ok(e instanceof RuntimeException); + assert.match(e.message, /View cache hash strategy must be a function/); + return true; + }); }); -test('Request hash', (t) => { +test('Request hash', () => { const req = mockRequest({ method: 'GET', url: '/' }); req.route = {}; - t.is( + assert.equal( requestToCacheKey(req), 'get/unknown/:b34681a09a08123738280c8744ac14a6' ); }); -//FIXME: this assert not work!! -// test('View cache', (t) => { -// t.plan(1); -// const req = mockRequest({ -// method: 'GET', url: '/' -// }); -// req.route = {}; -// const res = mockResponse(); -// const middleware = DI.get('view_cache')(60); -// res.on('end', () => { -// cache.namespace('view').has('get/unknown:043fe182887af19ba0be0cb494b75c9c').then((v) => { -// t.true(v); -// }); -// }); -// -// middleware(req, res, () => { -// res.send('something'); -// }); -// }); - +test('cache key is user aware', () => { + const anonymous = mockRequest({ + method: 'GET', url: '/profile' + }); + anonymous.route = {}; + const authed = mockRequest({ + method: 'GET', url: '/profile' + }); + authed.route = {}; + authed.auth = { uid: 7 }; + const otherUser = mockRequest({ + method: 'GET', url: '/profile' + }); + otherUser.route = {}; + otherUser.auth = { uid: 8 }; + assert.notEqual(requestToCacheKey(anonymous), requestToCacheKey(authed)); + assert.notEqual(requestToCacheKey(authed), requestToCacheKey(otherUser)); +}); diff --git a/test/services/cache.js b/test/services/cache.js index 8a0edef..ae7d462 100644 --- a/test/services/cache.js +++ b/test/services/cache.js @@ -1,77 +1,78 @@ -import test from 'ava'; +import test, { beforeEach, after } from 'node:test'; +import assert from 'node:assert/strict'; import DI from '../../src/di.js'; import * as providers from '../../src/services/providers.js'; DI.registerMockedProviders(Object.values(providers), `${import.meta.dirname}/../_demo_project/config`); const cache = DI.get('cache'); -test.beforeEach('Flush all', () => { - cache.flush(); +beforeEach(async () => { + await cache.flush(); }); -test.after.always('Close Redis', () => DI.get('redis').cleanup()); +after(() => DI.get('redis').cleanup()); -test('Cache get && set && del', async (t) => { +test('Cache get && set && del', async () => { await cache.set('foo', 'bar'); - t.is(await cache.get('foo'), 'bar'); + assert.equal(await cache.get('foo'), 'bar'); await cache.del('foo'); - t.is(await cache.get('foo'), null); + assert.equal(await cache.get('foo'), null); }); -test('Cache namespace get & set', async (t) => { +test('Cache namespace get & set', async () => { await cache.namespace('ns').set('foo', 'bar'); - t.is(await cache.namespace('ns').get('foo'), 'bar'); - t.is(await cache.namespace('ns1').has('foo'), false); + assert.equal(await cache.namespace('ns').get('foo'), 'bar'); + assert.equal(await cache.namespace('ns1').has('foo'), false); }); -test('Cache namespace flush', async (t) => { +test('Cache namespace flush', async () => { await cache.namespace('ns').set('foo', 'bar'); await cache.namespace('ns1').set('foo', 'bar'); await cache.namespace('ns').flush(); - t.is(await cache.namespace('ns').has('foo'), false); - t.is(await cache.namespace('ns1').has('foo'), true); + assert.equal(await cache.namespace('ns').has('foo'), false); + assert.equal(await cache.namespace('ns1').has('foo'), true); }); -test('Cache set nx || xx', async(t) => { +test('Cache set nx || xx', async () => { let ret = await cache.set('foo', 'bar', 0, 'xx'); - t.true(ret === null); + assert.equal(ret, null); ret = await cache.set('foo', 'bar', 0, 'nx'); - t.true(ret === 'OK'); + assert.equal(ret, 'OK'); ret = await cache.set('foo', 'bar', 0, 'nx'); - t.true(ret === null); + assert.equal(ret, null); ret = await cache.set('foo', 'bar', 0, 'xx'); - t.true(ret === 'OK'); + assert.equal(ret, 'OK'); ret = await cache.set('foo', 'bar', 1, 'xx'); - t.true(ret === 'OK'); + assert.equal(ret, 'OK'); await cache.flush(); }); -test('Cache namespace set nx || xx', async(t) => { +test('Cache namespace set nx || xx', async () => { let ret = await cache.namespace('ns').set('foo', 'bar', 0, 'xx'); - t.true(ret === null); + assert.equal(ret, null); ret = await cache.namespace('ns').set('foo', 'bar', 0, 'nx'); - t.true(ret === 'OK'); + assert.equal(ret, 'OK'); ret = await cache.namespace('ns').set('foo', 'bar', 0, 'nx'); - t.true(ret === null); + assert.equal(ret, null); ret = await cache.namespace('ns').set('foo', 'bar', 0, 'xx'); - t.true(ret === 'OK'); + assert.equal(ret, 'OK'); ret = await cache.namespace('ns').set('foo', 'bar', 1, 'xx'); - t.true(ret === 'OK'); + assert.equal(ret, 'OK'); await cache.namespace('ns').flush(); }); -test('Cache namespace flush returns', async(t) => { - t.is(await cache.namespace('ns').flush(), 0); +test('Cache namespace flush returns', async () => { + assert.equal(await cache.namespace('ns').flush(), 0); await cache.namespace('ns').set('foo1', 'bar1', 0, 'nx'); await cache.namespace('ns').set('foo2', 'bar2', 0, 'xx'); await cache.namespace('ns').set('foo3', 'bar3'); - t.is(await cache.namespace('ns').flush(), 2); -}); \ No newline at end of file + assert.equal(await cache.namespace('ns').flush(), 2); +}); diff --git a/test/services/config.js b/test/services/config.js index afb6bcf..658baf8 100644 --- a/test/services/config.js +++ b/test/services/config.js @@ -1,17 +1,30 @@ -import test from 'ava'; +import test from 'node:test'; +import assert from 'node:assert/strict'; import Config from '../../src/services/config.js'; import Env from '../../src/services/env.js'; -test('merge 3 levels files', (t) => { +const configPath = `${import.meta.dirname}/../_demo_project/config`; + +test('merge 3 levels files', () => { const config = new Config(new Env()); - config.setPath(`${import.meta.dirname}/../_demo_project/config`); - t.true(Object.keys(config.get()).length > 6); - t.is(config.get('swagger.basePath'), '/'); + config.setPath(configPath); + assert.ok(Object.keys(config.get()).length > 6); + assert.equal(config.get('swagger.basePath'), '/'); }); -test('config instances do not share loaded values', (t) => { - const first = new Config(new Env()).setPath(`${import.meta.dirname}/../_demo_project/config`); - const second = new Config(new Env()).setPath(`${import.meta.dirname}/../_demo_project/config`); +test('config instances do not share loaded values', () => { + const first = new Config(new Env()).setPath(configPath); + const second = new Config(new Env()).setPath(configPath); first.get().app.name = 'first'; - t.not(second.get().app.name, 'first'); + assert.notEqual(second.get().app.name, 'first'); +}); + +test('reload keeps merged files clean', () => { + const config = new Config(new Env()).setPath(configPath); + config.get(); + const mergedFilesCount = config.getMergedFiles().length; + assert.ok(mergedFilesCount >= 2); + config.reload(); + config.get(); + assert.equal(config.getMergedFiles().length, mergedFilesCount); }); diff --git a/test/services/env.js b/test/services/env.js index 19df329..04eef4c 100644 --- a/test/services/env.js +++ b/test/services/env.js @@ -1,23 +1,24 @@ -import test from 'ava'; +import test, { before, after } from 'node:test'; +import assert from 'node:assert/strict'; import Env from '../../src/services/env.js'; let oldEnv = null; -test.before('Set env to production', () => { +before(() => { oldEnv = process.env.NODE_ENV; process.env.NODE_ENV = 'production'; }); -test('Default env', (t) => { +test('Default env', () => { const env = new Env(); - t.is('production', env.get()); - t.false(env.isDevelopment()); - t.true(env.isProduction()); - t.false(env.isTest()); + assert.equal('production', env.get()); + assert.equal(env.isDevelopment(), false); + assert.ok(env.isProduction()); + assert.equal(env.isTest(), false); }); -test('Is Singleton mode', (t) => { +test('Is Singleton mode', () => { const env = new Env(); - t.is('production', env.get()); + assert.equal('production', env.get()); }); -test.after('Restore env', () => { +after(() => { process.env.NODE_ENV = oldEnv; }); diff --git a/test/services/event_manager.js b/test/services/event_manager.js index e0cd1a0..26eb461 100644 --- a/test/services/event_manager.js +++ b/test/services/event_manager.js @@ -1,4 +1,5 @@ -import test from 'ava'; +import test from 'node:test'; +import assert from 'node:assert/strict'; import DI from '../../src/di.js'; import * as exceptions from './../../src/exceptions/index.js'; import * as providers from '../../src/services/providers.js'; @@ -6,15 +7,13 @@ import * as providers from '../../src/services/providers.js'; DI.registerMockedProviders(Object.values(providers), `${import.meta.dirname}/../_demo_project/config`); const eventManager = DI.get('event_manager'); -test('Register non function', async(t) => { - t.throws(() => eventManager.addListener('foo'), { instanceOf: exceptions.RuntimeException }); - t.throws(() => eventManager.addListener(class Foo { - }), { instanceOf: exceptions.RuntimeException }); +test('Register non function', () => { + assert.throws(() => eventManager.addListener('foo'), exceptions.RuntimeException); + assert.throws(() => eventManager.addListener(class Foo { + }), exceptions.RuntimeException); }); - -test('Register standard class', async(t) => { - t.plan(9); +test('Register standard class', () => { let isLogin = false; class Foo { get prefix() { @@ -27,27 +26,27 @@ test('Register standard class', async(t) => { afterLogin() { isLogin = true; - t.true(isLogin); } } eventManager.addListener(Foo); - const events = eventManager.getAllowEvents() - t.true(events instanceof Set); - t.is(events.size, 4); - t.true(events.has('foo:login:before')); - t.true(events.has('foo:login:after')); - t.true(events.has('foo:register:before')); - t.true(events.has('foo:register:after')); - t.deepEqual(eventManager.getEmitter().eventNames(), ['foo:login:after']); - t.false(isLogin); + const events = eventManager.getAllowEvents(); + assert.ok(events instanceof Set); + assert.equal(events.size, 4); + assert.ok(events.has('foo:login:before')); + assert.ok(events.has('foo:login:after')); + assert.ok(events.has('foo:register:before')); + assert.ok(events.has('foo:register:after')); + assert.deepEqual(eventManager.getEmitter().eventNames(), ['foo:login:after']); + assert.equal(isLogin, false); eventManager.emit('foo:login:after'); + assert.ok(isLogin); }); -test('Emit non exists event', async(t) => { - t.throws(() => eventManager.emit('non-exists'), { instanceOf: exceptions.RuntimeException }); +test('Emit non exists event', () => { + assert.throws(() => eventManager.emit('non-exists'), exceptions.RuntimeException); }); -test('Register repeat event', async(t) => { +test('Register repeat event', () => { class Bar { get prefix() { return 'foo'; @@ -57,5 +56,5 @@ test('Register repeat event', async(t) => { return ['login', 'other']; } } - t.throws(() => eventManager.addListener(Bar), { instanceOf: exceptions.RuntimeException }); + assert.throws(() => eventManager.addListener(Bar), exceptions.RuntimeException); }); diff --git a/test/services/http_client.js b/test/services/http_client.js index d1961a1..3f926ab 100644 --- a/test/services/http_client.js +++ b/test/services/http_client.js @@ -1,57 +1,48 @@ -import test from 'ava'; -import nock from 'nock'; +import test, { before, after } from 'node:test'; +import assert from 'node:assert/strict'; import DI from '../../src/di.js'; import * as exceptions from './../../src/exceptions/index.js'; import * as providers from '../../src/services/providers.js'; +import { createTestServer } from '../_helpers/http_server.js'; DI.registerMockedProviders(Object.values(providers), `${import.meta.dirname}/../_demo_project/config`); const client = DI.get('http_client'); -test('Http client request success', async(t) => { - nock('http://example.com') - .get('/foo') - .reply(200, 'bar'); - t.is(await client.request({ - url: 'http://example.com/foo' +let httpServer; +before(async () => { + httpServer = await createTestServer(); +}); +after(() => httpServer.close()); + +test('Http client request success', async () => { + httpServer.queue.push({ statusCode: 200, body: 'bar' }); + assert.equal(await client.request({ + url: `${httpServer.baseUrl}/foo` }), 'bar'); }); -test('Http client failed by 4XX', async(t) => { - t.plan(1); - nock('http://example.com') - .get('/foo') - .reply(400, 'bar'); +test('Http client failed by 4XX', async () => { + httpServer.queue.push({ statusCode: 400, body: 'bar' }); - try { - await client.request({ url: 'http://example.com/foo' }); - } catch (e) { - t.true(e instanceof exceptions.HttpRequestLogicException); - } + await assert.rejects(client.request({ url: `${httpServer.baseUrl}/foo` }), exceptions.HttpRequestLogicException); }); -test('Http client failed by 5XX', async(t) => { - t.plan(1); - nock('http://example.com') - .get('/foo') - .reply(500, 'bar'); +test('Http client failed by 5XX', async () => { + httpServer.queue.push({ statusCode: 500, body: 'bar' }); - try { - await client.request({ url: 'http://example.com/foo' }); - } catch (e) { - t.true(e instanceof exceptions.HttpRequestIOException); - } + await assert.rejects(client.request({ url: `${httpServer.baseUrl}/foo` }), exceptions.HttpRequestIOException); }); -test('Dump req & res', async(t) => { - nock('https://example.com') - .post('/foo') - .reply(500, 'server crashed', { - 'x-foo': 'x-bar' - }); +test('Dump req & res', async () => { + httpServer.queue.push({ + statusCode: 500, + body: 'server crashed', + headers: { 'x-foo': 'x-bar' } + }); try { await client.request({ method: 'POST', - url: 'https://example.com/foo', + url: `${httpServer.baseUrl}/foo`, headers: { hkey1: 'value1' }, @@ -61,35 +52,35 @@ test('Dump req & res', async(t) => { }, resolveWithFullResponse: true }); + assert.fail('Request should reject'); } catch (e) { const { statusCode, headers, body } = client.dumpResponse(e.getResponse()); - t.is(statusCode, 500); - t.is(body, 'server crashed'); - t.deepEqual(headers, { - 'x-foo': 'x-bar' - }); + assert.equal(statusCode, 500); + assert.equal(body, 'server crashed'); + assert.equal(headers['x-foo'], 'x-bar'); const { method, protocol, url, body: resBody } = client.dumpRequest(e.getRequest()); - t.is(method, 'POST'); - t.is(protocol, 'https'); - t.is(resBody, 'key1=value1&key2=value2'); - t.deepEqual(url, 'https://example.com/foo'); + assert.equal(method, 'POST'); + assert.equal(protocol, 'http'); + assert.equal(resBody, 'key1=value1&key2=value2'); + assert.equal(url, `${httpServer.baseUrl}/foo`); } }); -test('Use 2XX as logic error', async(t) => { - nock('http://example.com') - .get('/foo') - .reply(200, 'bar'); +test('Use 2XX as logic error', async () => { + httpServer.queue.push({ + statusCode: 200, + body: 'bar', + headers: { 'x-server': 'eva' } + }); - const response = await client.request({ url: 'http://example.com/foo', resolveWithFullResponse: true }); + const response = await client.request({ url: `${httpServer.baseUrl}/foo`, resolveWithFullResponse: true }); const e = (new exceptions.HttpRequestLogicException('Some logic error')).setResponse(response); const { statusCode, headers, body } = client.dumpResponse(e.getResponse()); - t.is(statusCode, 200); - t.is(body, 'bar'); - t.deepEqual(headers, {}); + assert.equal(statusCode, 200); + assert.equal(body, 'bar'); + assert.equal(headers['x-server'], 'eva'); const { method, protocol, url } = client.dumpRequest(e.getRequest()); - t.is(method, 'GET'); - t.is(protocol, 'http'); - t.deepEqual(url, 'http://example.com/foo'); + assert.equal(method, 'GET'); + assert.equal(protocol, 'http'); + assert.equal(url, `${httpServer.baseUrl}/foo`); }); - diff --git a/test/services/jwt_token.js b/test/services/jwt_token.js index 3c69eee..3170cd5 100644 --- a/test/services/jwt_token.js +++ b/test/services/jwt_token.js @@ -1,22 +1,23 @@ -import test from 'ava'; +import test, { after } from 'node:test'; +import assert from 'node:assert/strict'; import Config from '../../src/services/config.js'; import Env from '../../src/services/env.js'; import Redis from '../../src/services/redis.js'; import JsonWebToken from '../../src/services/jwt_token.js'; let redisClient; -test.after.always('Close Redis', () => redisClient && redisClient.cleanup()); +after(() => redisClient && redisClient.cleanup()); -test('Get and set', async(t) => { +test('Get and set', async () => { redisClient = (new Redis()).setOptions({}); const jwt = new JsonWebToken( (new Config(new Env()).setPath(`${import.meta.dirname}/../_demo_project/config`)), redisClient); const str = await jwt.save(2, { foo: 'bar' }); - t.is(str.split('.').length, 3); + assert.equal(str.split('.').length, 3); const obj = await jwt.find(str); - t.deepEqual(obj, { uid: 2, foo: 'bar' }); + assert.deepEqual(obj, { uid: 2, foo: 'bar' }); await jwt.clear(str); const objAfterClear = await jwt.find(str); - t.deepEqual(objAfterClear, { uid: 2, expiredAt: 0 }); + assert.deepEqual(objAfterClear, { uid: 2, expiredAt: 0 }); }); diff --git a/test/services/logger.js b/test/services/logger.js index d4f35a1..3269609 100644 --- a/test/services/logger.js +++ b/test/services/logger.js @@ -1,23 +1,24 @@ -import test from 'ava'; +import test, { before, after } from 'node:test'; +import assert from 'node:assert/strict'; import Env from '../../src/services/env.js'; import Config from '../../src/services/config.js'; import Logger from '../../src/services/logger.js'; import winston from 'winston'; let oldEnv = null; -test.before('Set env to production', () => { +before(() => { oldEnv = process.env.NODE_ENV; process.env.NODE_ENV = 'production'; }); -test('Logger init', (t) => { +test('Logger init', () => { const logger = new Logger(new Env(), new Config()); logger.setLogFile(`${import.meta.dirname}/../_demo_project/logs/test.log`); logger.setLabel('foo'); logger.setLevel('debug'); - t.is(logger.getWinston(), winston); - t.true(logger.getInstance() instanceof winston.Logger); - t.is(Object.keys(logger.getInstance().transports).length, 2); + assert.equal(logger.getWinston(), winston); + assert.ok(logger.getInstance() instanceof winston.Logger); + assert.equal(Object.keys(logger.getInstance().transports).length, 2); }); -test.after('Restore env', () => { +after(() => { process.env.NODE_ENV = oldEnv; }); diff --git a/test/services/now.js b/test/services/now.js index 8238c77..5648b0f 100644 --- a/test/services/now.js +++ b/test/services/now.js @@ -1,4 +1,5 @@ -import test from 'ava'; +import test, { before, afterEach } from 'node:test'; +import assert from 'node:assert/strict'; import moment from 'moment-timezone'; import DI from '../../src/di.js'; import * as providers from '../../src/services/providers.js'; @@ -6,33 +7,31 @@ import * as providers from '../../src/services/providers.js'; DI.registerMockedProviders(Object.values(providers), `${import.meta.dirname}/../_demo_project/config`); const now = DI.get('now'); -test.before(() => { +before(() => { moment.tz.setDefault('Asia/Shanghai'); - // moment.tz.setDefault('America/Los_Angeles'); }); -test.afterEach(() => { +afterEach(() => { now.clear(); }); -test('Change now by timestamp', (t) => { +test('Change now by timestamp', () => { now.setNow(1481297817); - t.is(now.getDatabaseDatetime(), '2016-12-09 23:36:57'); - t.is(now.getTimestamp(), 1481297817); - t.is(now.getMoment().unix(), 1481297817); + assert.equal(now.getDatabaseDatetime(), '2016-12-09 23:36:57'); + assert.equal(now.getTimestamp(), 1481297817); + assert.equal(now.getMoment().unix(), 1481297817); }); -test('Change now by string', (t) => { +test('Change now by string', () => { now.setNow('2016-12-09T23:42:06.000'); - t.is(now.getDatabaseDatetime(), '2016-12-09 23:42:06'); - t.is(now.getTimestamp(), 1481298126); - t.is(now.getMoment().unix(), 1481298126); + assert.equal(now.getDatabaseDatetime(), '2016-12-09 23:42:06'); + assert.equal(now.getTimestamp(), 1481298126); + assert.equal(now.getMoment().unix(), 1481298126); }); - -test('Change now by other', (t) => { +test('Change now by other', () => { now.setNow(new Date(Date.UTC(2016, 11, 9))); - t.is(now.getDatabaseDatetime(), '2016-12-09 08:00:00'); - t.is(now.getTimestamp(), 1481241600); - t.is(now.getMoment().unix(), 1481241600); + assert.equal(now.getDatabaseDatetime(), '2016-12-09 08:00:00'); + assert.equal(now.getTimestamp(), 1481241600); + assert.equal(now.getMoment().unix(), 1481241600); }); diff --git a/test/services/redis.js b/test/services/redis.js index e548c39..2068e69 100644 --- a/test/services/redis.js +++ b/test/services/redis.js @@ -1,22 +1,46 @@ -import test from 'ava'; +import test, { after } from 'node:test'; +import assert from 'node:assert/strict'; import Config from '../../src/services/config.js'; import Redis from '../../src/services/redis.js'; import ioredis from 'ioredis'; +import DI from '../../src/di.js'; +import * as providers from '../../src/services/providers.js'; let redisClient; -test.after.always('Close Redis', () => redisClient && redisClient.cleanup()); +after(() => redisClient && redisClient.cleanup()); -test('Redis init', (t) => { +test('Redis init', () => { redisClient = new Redis(new Config()); redisClient.setOptions({}); - t.is(redisClient.getRedis(), ioredis); - t.true(redisClient.getInstance() instanceof ioredis); + assert.equal(redisClient.getRedis(), ioredis); + assert.ok(redisClient.getInstance() instanceof ioredis); }); -test('Redis instances do not share clients', (t) => { +test('Redis instances do not share clients', () => { const first = new Redis(new Config()).setOptions({ lazyConnect: true, port: 6380 }); const second = new Redis(new Config()).setOptions({ lazyConnect: true, port: 6381 }); - t.not(first.getInstance(), second.getInstance()); + assert.notEqual(first.getInstance(), second.getInstance()); first.cleanup(); second.cleanup(); }); + +test('Redis errors are logged instead of swallowed', () => { + DI.registerMockedProviders(Object.values(providers), `${import.meta.dirname}/../_demo_project/config`); + const redis = DI.get('redis'); + const logger = DI.get('logger'); + const originalError = logger.error; + let logged = null; + logger.error = (msg, err) => { + logged = { msg, err }; + }; + try { + assert.doesNotThrow(() => { + redis.getInstance().emit('error', new Error('boom')); + }); + } finally { + logger.error = originalError; + } + assert.ok(logged); + assert.equal(logged.err.message, 'boom'); + redis.cleanup(); +}); diff --git a/test/services/rest_client.js b/test/services/rest_client.js index 9b55883..ef11a3c 100644 --- a/test/services/rest_client.js +++ b/test/services/rest_client.js @@ -1,50 +1,51 @@ -import test from 'ava'; -import nock from 'nock'; +import test, { before, after } from 'node:test'; +import assert from 'node:assert/strict'; import DI from '../../src/di.js'; import * as exceptions from './../../src/exceptions/index.js'; import * as providers from '../../src/services/providers.js'; +import { createTestServer } from '../_helpers/http_server.js'; DI.registerMockedProviders(Object.values(providers), `${import.meta.dirname}/../_demo_project/config`); const client = DI.get('rest_client'); -test('Rest client request success', async(t) => { - nock('http://example.com') - .get('/foo') - .reply(200, 'bar'); +let httpServer; +before(async () => { + httpServer = await createTestServer(); +}); +after(() => httpServer.close()); + +test('Rest client request success', async () => { + httpServer.queue.push({ statusCode: 200, body: 'bar' }); const res = await client.request({ - url: 'http://example.com/foo' + url: `${httpServer.baseUrl}/foo` }); - t.is(res, 'bar'); + assert.equal(res, 'bar'); }); -test('Http client failed by 4XX', async(t) => { - t.plan(2); - nock('http://example.com') - .get('/foo') - .reply(400, { +test('Http client failed by 4XX', async () => { + httpServer.queue.push({ + statusCode: 400, + body: { name: 'InvalidArgumentException', code: 123, statusCode: 400, message: 'InvalidArgumentException' - }); + } + }); - try { - await client.request({ url: 'http://example.com/foo' }); - } catch (e) { - t.true(e instanceof exceptions.RestServiceLogicException); - t.true(e.getPrevError() instanceof exceptions.InvalidArgumentException); - } + await assert.rejects(async () => { + try { + await client.request({ url: `${httpServer.baseUrl}/foo` }); + } catch (e) { + assert.ok(e instanceof exceptions.RestServiceLogicException); + assert.ok(e.getPrevError() instanceof exceptions.InvalidArgumentException); + throw e; + } + }, exceptions.RestServiceLogicException); }); -test('Http client failed by 5XX', async(t) => { - t.plan(1); - nock('http://example.com') - .get('/foo') - .reply(500, 'bar'); +test('Http client failed by 5XX', async () => { + httpServer.queue.push({ statusCode: 500, body: 'bar' }); - try { - await client.request({ url: 'http://example.com/foo' }); - } catch (e) { - t.true(e instanceof exceptions.RestServiceIOException); - } + await assert.rejects(client.request({ url: `${httpServer.baseUrl}/foo` }), exceptions.RestServiceIOException); }); diff --git a/test/swagger/index.js b/test/swagger/index.js index 33d13e4..2c2aa0a 100644 --- a/test/swagger/index.js +++ b/test/swagger/index.js @@ -1,4 +1,5 @@ -import test from 'ava'; +import test from 'node:test'; +import assert from 'node:assert/strict'; import path from 'path'; import fs from 'fs'; import Sequelize from 'sequelize'; @@ -6,59 +7,78 @@ import { ExSwagger } from '../../src/swagger/index.js'; import * as exceptions from '../../src/exceptions/index.js'; import Entities from './../../src/entities/index.js'; -test('Could get file lists', async(t) => { +const compileDistPath = `${import.meta.dirname}/_example/exports`; +const demoEntities = new Entities( + `${import.meta.dirname}/../_demo_project/entities`, + new Sequelize('database', null, null, { dialect: 'mysql' }) +); + +test('Could get file lists', async () => { const files = await ExSwagger.scanFiles(`${import.meta.dirname}/_example/**/*.js`); const ctrpath = `${import.meta.dirname}${path.sep}_example${path.sep}controller.js`.split(path.sep).join('/'); - t.true(files.includes(ctrpath)); + assert.ok(files.includes(ctrpath)); }); -test('Could parse annotations', async(t) => { +test('Could parse annotations', async () => { const annotationContainers = await ExSwagger.filesToAnnotationsContainers([`${import.meta.dirname}/_example/controller.js`]); - t.is(annotationContainers.length, 1); - t.is(annotationContainers[0].getAnnotations().length, 6); + assert.equal(annotationContainers.length, 1); + assert.equal(annotationContainers[0].getAnnotations().length, 6); }); -test('Could parse swagger docs', async(t) => { +test('Could parse swagger docs', async () => { const annotationContainers = await ExSwagger.filesToAnnotationsContainers([`${import.meta.dirname}/_example/controller.js`]); const fragments = annotationContainers[0].collectFragments(); - t.is(fragments.length, 4); - t.true(fragments[0].isDefinition()); - t.true(typeof fragments[0].value === 'object'); - t.true(typeof fragments[0].description === 'string'); - t.true(fragments[1].isPath()); - t.true(typeof fragments[1].value === 'object'); - t.true(typeof fragments[1].description === 'string'); - t.true(fragments[2].isException()); - t.true(typeof fragments[2].value === 'string'); - t.true(typeof fragments[2].description === 'string'); - t.is(1, annotationContainers[0].collectYamlErrors().length); - //TODO: test unknown + assert.equal(fragments.length, 4); + assert.ok(fragments[0].isDefinition()); + assert.equal(typeof fragments[0].value, 'object'); + assert.equal(typeof fragments[0].description, 'string'); + assert.ok(fragments[1].isPath()); + assert.equal(typeof fragments[1].value, 'object'); + assert.equal(typeof fragments[1].description, 'string'); + assert.ok(fragments[2].isException()); + assert.equal(typeof fragments[2].value, 'string'); + assert.equal(typeof fragments[2].description, 'string'); + assert.equal(1, annotationContainers[0].collectYamlErrors().length); }); -test('Scan exceptions', async(t) => { + +test('Scan exceptions', async () => { const scannedExceptions = await ExSwagger.scanExceptions( `${import.meta.dirname}/../../src/exceptions/**/*.js`, exceptions.StandardException ); - t.true(Object.keys(scannedExceptions).length >= 12); + assert.ok(Object.keys(scannedExceptions).length >= 12); }); -test('default properties', async(t) => { +test('default properties', async () => { const exSwagger = new ExSwagger({ swaggerDocsTemplate: {}, sourceRootPath: '/foo' }); const states = exSwagger.getStates(); - t.true(states.sourceFilesPath.includes('/foo/**/*.js')); + assert.ok(states.sourceFilesPath.includes('/foo/**/*.js')); }); -test('Generate json file', async(t) => { - const compileDistPath = `${import.meta.dirname}/_example/exports`; +test('Generate json file', async () => { const exSwagger = new ExSwagger({ compileDistPath, - extraSourcePaths: [`${import.meta.dirname}/../../../lib/utils/**/*.js`], - models: new Entities(`${import.meta.dirname}/../_demo_project/entities`, new Sequelize('database', null, null, { dialect: 'mysql' })), + models: demoEntities, swaggerDocsTemplate: { definitions: {}, paths: {} }, sourceRootPath: `${import.meta.dirname}/_example` }); await exSwagger.exportJson(); - t.truthy(JSON.parse(fs.readFileSync(`${compileDistPath}/docs.json`))); + assert.ok(JSON.parse(fs.readFileSync(`${compileDistPath}/docs.json`))); +}); + +test('throws annotation produces exception definition and response', async () => { + const exSwagger = new ExSwagger({ + compileDistPath, + models: demoEntities, + swaggerDocsTemplate: { definitions: {}, paths: {} }, + sourceRootPath: `${import.meta.dirname}/_example` + }); + const docs = await exSwagger.exportJson(`${compileDistPath}/docs-exception.json`); + assert.ok(docs.definitions.LogicException); + assert.equal( + docs.paths['/estimates/price'].get.responses['400'].schema.$ref, + '#/definitions/LogicException' + ); }); diff --git a/test/utils/api_scaffold.js b/test/utils/api_scaffold.js index 833fe24..26e8d71 100644 --- a/test/utils/api_scaffold.js +++ b/test/utils/api_scaffold.js @@ -1,67 +1,68 @@ -import test from 'ava'; +import test from 'node:test'; +import assert from 'node:assert/strict'; import { OrderScaffold, FilterScaffold } from '../../src/utils/api_scaffold.js'; -test('Order Scaffold Works normal', (t) => { +test('Order Scaffold Works normal', () => { const orderScaffold = new OrderScaffold(); orderScaffold.setFields(['startDate']); - t.deepEqual({ + assert.deepEqual({ start_date: ['startDate', 'ASC'], '-start_date': ['startDate', 'DESC'] }, orderScaffold.getAvailableOrders()); - t.deepEqual(orderScaffold.getOrderByQuery('-start_date'), [['startDate', 'DESC']]); - t.deepEqual(orderScaffold.getOrderByQuery('unknown order'), []); + assert.deepEqual(orderScaffold.getOrderByQuery('-start_date'), [['startDate', 'DESC']]); + assert.deepEqual(orderScaffold.getOrderByQuery('unknown order'), []); }); -test('Order Scaffold Works with default order', (t) => { +test('Order Scaffold Works with default order', () => { const orderScaffold = new OrderScaffold(); orderScaffold.setFields(['id', 'startDate'], 'id'); - t.deepEqual(orderScaffold.getOrderByQuery(null), [['id', 'DESC']]); - t.deepEqual(orderScaffold.getOrderByQuery('unknown order'), [['id', 'DESC']]); + assert.deepEqual(orderScaffold.getOrderByQuery(null), [['id', 'DESC']]); + assert.deepEqual(orderScaffold.getOrderByQuery('unknown order'), [['id', 'DESC']]); }); -test('Order Scaffold Works with camel case', (t) => { +test('Order Scaffold Works with camel case', () => { const orderScaffold = new OrderScaffold('camel'); orderScaffold.setFields(['start_date']); - t.deepEqual(orderScaffold.getAvailableOrders(), { + assert.deepEqual(orderScaffold.getAvailableOrders(), { startDate: ['start_date', 'ASC'], '-startDate': ['start_date', 'DESC'] }); - t.deepEqual(orderScaffold.getOrderByQuery('-startDate'), [['start_date', 'DESC']]); + assert.deepEqual(orderScaffold.getOrderByQuery('-startDate'), [['start_date', 'DESC']]); }); -test('Order Scaffold Works with multi order', (t) => { +test('Order Scaffold Works with multi order', () => { const orderScaffold = new OrderScaffold(); orderScaffold.setFields(['id', 'startDate']); - t.deepEqual( + assert.deepEqual( orderScaffold.getOrderByQuery('-id,start_date'), [['id', 'DESC'], ['startDate', 'ASC']] ); }); -test('Filter Scaffold support string equal', (t) => { +test('Filter Scaffold support string equal', () => { const filterScaffold = new FilterScaffold(); filterScaffold.addFilterSchema('createdAt'); const schema = filterScaffold.getFilterSchema(); - t.true(Object.keys(schema).includes('createdAt')); + assert.ok(Object.keys(schema).includes('createdAt')); const conditions = filterScaffold.getConditions({ created_at: 'foo' }); - t.deepEqual({ + assert.deepEqual({ createdAt: 'foo' }, conditions); }); -test('Filter Scaffold support number', (t) => { +test('Filter Scaffold support number', () => { const filterScaffold = new FilterScaffold(); filterScaffold.addFilterSchema('totalAmount', 'number'); const schema = filterScaffold.getFilterSchema(); - t.true(Object.keys(schema).includes('totalAmount')); - t.deepEqual({ + assert.ok(Object.keys(schema).includes('totalAmount')); + assert.deepEqual({ totalAmount: 123 }, filterScaffold.getConditions({ total_amount: 123 })); - t.deepEqual({ + assert.deepEqual({ totalAmount: { $gte: 100, $lte: 200 @@ -71,31 +72,34 @@ test('Filter Scaffold support number', (t) => { total_amount_$lte: 200 })); - t.throws(() => filterScaffold.getConditions({ + assert.throws(() => filterScaffold.getConditions({ total_amount_$gte: 100, total_amount: 200 - }, { message: /conflict/ })); + }), (e) => { + assert.match(e.message, /conflict/); + return true; + }); }); -test('Filter Scaffold replace default operators', (t) => { +test('Filter Scaffold replace default operators', () => { const filterScaffold = new FilterScaffold(); filterScaffold.addFilterSchema('totalAmount', 'number', { operators: [] }); const schema = filterScaffold.getFilterSchema(); - t.true(schema.totalAmount.operators.length === 0); - t.deepEqual({}, filterScaffold.getConditions({ + assert.equal(schema.totalAmount.operators.length, 0); + assert.deepEqual({}, filterScaffold.getConditions({ total_amount_$gte: 100 })); - t.deepEqual({ + assert.deepEqual({ totalAmount: 100 }, filterScaffold.getConditions({ total_amount: 100 })); }); -test('Filter Scaffold skip without value', (t) => { +test('Filter Scaffold skip without value', () => { const filterScaffold = new FilterScaffold(); filterScaffold.addFilterSchema('totalAmount', 'number'); - t.deepEqual({ + assert.deepEqual({ totalAmount: { $gte: 100 } diff --git a/test/utils/crc32.js b/test/utils/crc32.js index 40061a4..9097c72 100644 --- a/test/utils/crc32.js +++ b/test/utils/crc32.js @@ -1,6 +1,7 @@ -import test from 'ava'; +import test from 'node:test'; +import assert from 'node:assert/strict'; import crc32 from './../../src/utils/crc32.js'; -test('CRC32', (t) => { - t.is(crc32('Hello World'), 1243066710); +test('CRC32', () => { + assert.equal(crc32('Hello World'), 1243066710); }); diff --git a/test/utils/cron.js b/test/utils/cron.js new file mode 100644 index 0000000..0a48dc1 --- /dev/null +++ b/test/utils/cron.js @@ -0,0 +1,92 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { parseCron, getNextRun, setCronInterval } from '../../src/utils/cron.js'; + +test('parse 5 field cron', () => { + const schedule = parseCron('* * * * *'); + assert.equal(schedule.second, undefined); + assert.equal(schedule.minute.size, 60); + assert.equal(schedule.hour.size, 24); + assert.equal(schedule.dayOfMonth.size, 31); + assert.equal(schedule.month.size, 12); + assert.equal(schedule.dayOfWeek.size, 7); +}); + +test('parse 6 field cron with seconds', () => { + const schedule = parseCron('0/10 * * * * *', true); + assert.deepEqual([...schedule.second].sort((a, b) => a - b), [0, 10, 20, 30, 40, 50]); +}); + +test('parse range, range with step and lists', () => { + assert.deepEqual([...parseCron('1-5 * * * *').minute].sort((a, b) => a - b), [1, 2, 3, 4, 5]); + assert.deepEqual( + [...parseCron('1-10/3 * * * *').minute].sort((a, b) => a - b), + [1, 4, 7, 10] + ); + assert.deepEqual( + [...parseCron('1,5,20 * * * *').minute].sort((a, b) => a - b), + [1, 5, 20] + ); +}); + +test('parse normalizes sunday 7 to 0', () => { + const schedule = parseCron('* * * * 7'); + assert.ok(schedule.dayOfWeek.has(0)); + assert.equal(schedule.dayOfWeek.has(7), false); +}); + +test('parse invalid field count throws', () => { + assert.throws(() => parseCron('* * * *'), /must contain 5 fields/); + assert.throws(() => parseCron('* * * * * *'), /must contain 5 fields/); + assert.throws(() => parseCron('* * * * *', true), /must contain 6 fields/); +}); + +test('parse invalid value throws', () => { + assert.throws(() => parseCron('99 * * * *'), /Invalid cron value/); + assert.throws(() => parseCron('*/0 * * * *'), /Invalid cron step/); + assert.throws(() => parseCron('5-1 * * * *'), /Invalid cron range/); +}); + +test('getNextRun every minute', () => { + const next = getNextRun(parseCron('* * * * *'), new Date(2020, 0, 1, 12, 30, 45)); + assert.equal(next.getTime(), new Date(2020, 0, 1, 12, 31, 0).getTime()); +}); + +test('getNextRun every second', () => { + const next = getNextRun(parseCron('* * * * * *', true), new Date(2020, 0, 1, 12, 30, 45)); + assert.equal(next.getTime(), new Date(2020, 0, 1, 12, 30, 46).getTime()); +}); + +test('getNextRun every 10 seconds aligns to step', () => { + const next = getNextRun(parseCron('0/10 * * * * *', true), new Date(2020, 0, 1, 12, 30, 45)); + assert.equal(next.getTime(), new Date(2020, 0, 1, 12, 30, 50).getTime()); +}); + +test('getNextRun daily schedule jumps to next day', () => { + const next = getNextRun(parseCron('5 4 * * *'), new Date(2020, 0, 1, 12, 30, 45)); + assert.equal(next.getTime(), new Date(2020, 0, 2, 4, 5, 0).getTime()); +}); + +test('getNextRun yearly schedule rolls over', () => { + const next = getNextRun(parseCron('0 0 1 1 *'), new Date(2020, 0, 1, 12, 30, 45)); + assert.equal(next.getTime(), new Date(2021, 0, 1, 0, 0, 0).getTime()); +}); + +test('getNextRun throws for unsatisfiable schedule', () => { + assert.throws(() => getNextRun(parseCron('0 0 31 2 *'), new Date(2020, 0, 1, 0, 0, 0)), /no match/); +}); + +test('setCronInterval runs and clears', async () => { + let count = 0; + const handle = setCronInterval(() => { + count += 1; + }, parseCron('* * * * * *', true)); + + await new Promise(resolve => setTimeout(resolve, 2500)); + assert.ok(count >= 1); + + handle.clear(); + const frozen = count; + await new Promise(resolve => setTimeout(resolve, 1200)); + assert.equal(count, frozen); +}); diff --git a/test/utils/datetime.js b/test/utils/datetime.js index e238fe5..3f0d63b 100644 --- a/test/utils/datetime.js +++ b/test/utils/datetime.js @@ -1,12 +1,13 @@ -import test from 'ava'; +import test from 'node:test'; +import assert from 'node:assert/strict'; import { getTimestamp, getMilliTimestamp, getMicroTimestamp, getDatabaseDatetime } from './../../src/utils/datetime.js'; -test('Datetime length', (t) => { - t.is(getTimestamp().toString().length, 10); - t.is(getMilliTimestamp().toString().length, 13); - t.is(getMicroTimestamp().toString().length, 16); - t.is(getDatabaseDatetime().length, 19); +test('Datetime length', () => { + assert.equal(getTimestamp().toString().length, 10); + assert.equal(getMilliTimestamp().toString().length, 13); + assert.equal(getMicroTimestamp().toString().length, 16); + assert.equal(getDatabaseDatetime().length, 19); }); diff --git a/test/utils/host.js b/test/utils/host.js index 1be1558..c8439a4 100644 --- a/test/utils/host.js +++ b/test/utils/host.js @@ -1,16 +1,17 @@ -import test from 'ava'; +import test from 'node:test'; +import assert from 'node:assert/strict'; import { getHostFullUrl, } from './../../src/utils/host.js'; -test('Host full url', (t) => { - t.is(getHostFullUrl({ +test('Host full url', () => { + assert.equal(getHostFullUrl({ protocol: 'http', originalUrl: '/foo', get: () => 'evaengine.com' }), 'http://evaengine.com/foo'); - t.is(getHostFullUrl({ + assert.equal(getHostFullUrl({ protocol: 'http', originalUrl: '/foo', get: () => 'evaengine.com' diff --git a/test/utils/pagination.js b/test/utils/pagination.js index 33a498f..effa3c9 100644 --- a/test/utils/pagination.js +++ b/test/utils/pagination.js @@ -1,4 +1,5 @@ -import test from 'ava'; +import test from 'node:test'; +import assert from 'node:assert/strict'; import { pagination, paginationFilter } from '../../src/utils/pagination.js'; const req = { @@ -15,7 +16,7 @@ const req = { query: {} }; -test('Works when no data', (t) => { +test('Works when no data', () => { const { total, offset, limit, prev, next, isFirst, isLast, prevUri, nextUri, firstUri, lastUri @@ -26,20 +27,20 @@ test('Works when no data', (t) => { offset: 15, req }); - t.is(total, 0); - t.is(offset, 15); - t.is(limit, 10); - t.is(prev, 5); - t.is(next, 25); - t.true(isFirst); - t.true(isLast); - t.is(prevUri, ''); - t.is(nextUri, ''); - t.is(firstUri, ''); - t.is(lastUri, ''); + assert.equal(total, 0); + assert.equal(offset, 15); + assert.equal(limit, 10); + assert.equal(prev, 5); + assert.equal(next, 25); + assert.ok(isFirst); + assert.ok(isLast); + assert.equal(prevUri, ''); + assert.equal(nextUri, ''); + assert.equal(firstUri, ''); + assert.equal(lastUri, ''); }); -test('Works when less than 1 page', (t) => { +test('Works when less than 1 page', () => { const { total, offset, limit, prev, next, isFirst, isLast, prevUri, nextUri, firstUri, lastUri @@ -50,20 +51,20 @@ test('Works when less than 1 page', (t) => { offset: 0, req }); - t.is(total, 3); - t.is(offset, 0); - t.is(limit, 5); - t.is(prev, -5); - t.is(next, 5); - t.true(isFirst); - t.true(isLast); - t.is(prevUri, ''); - t.is(nextUri, ''); - t.is(firstUri, 'http://localhost/?offset=0&limit=5'); - t.is(lastUri, 'http://localhost/?offset=0&limit=5'); + assert.equal(total, 3); + assert.equal(offset, 0); + assert.equal(limit, 5); + assert.equal(prev, -5); + assert.equal(next, 5); + assert.ok(isFirst); + assert.ok(isLast); + assert.equal(prevUri, ''); + assert.equal(nextUri, ''); + assert.equal(firstUri, 'http://localhost/?offset=0&limit=5'); + assert.equal(lastUri, 'http://localhost/?offset=0&limit=5'); }); -test('Works when normal', (t) => { +test('Works when normal', () => { const { total, offset, limit, prev, next, isFirst, isLast, prevUri, nextUri, firstUri, lastUri @@ -74,20 +75,20 @@ test('Works when normal', (t) => { offset: 30, req }); - t.is(total, 100); - t.is(offset, 30); - t.is(limit, 15); - t.is(prev, 15); - t.is(next, 45); - t.false(isFirst); - t.false(isLast); - t.is(prevUri, 'http://localhost/?offset=15&limit=15'); - t.is(nextUri, 'http://localhost/?offset=45&limit=15'); - t.is(firstUri, 'http://localhost/?offset=0&limit=15'); - t.is(lastUri, 'http://localhost/?offset=90&limit=15'); + assert.equal(total, 100); + assert.equal(offset, 30); + assert.equal(limit, 15); + assert.equal(prev, 15); + assert.equal(next, 45); + assert.equal(isFirst, false); + assert.equal(isLast, false); + assert.equal(prevUri, 'http://localhost/?offset=15&limit=15'); + assert.equal(nextUri, 'http://localhost/?offset=45&limit=15'); + assert.equal(firstUri, 'http://localhost/?offset=0&limit=15'); + assert.equal(lastUri, 'http://localhost/?offset=90&limit=15'); }); -test('Works when not aligned', (t) => { +test('Works when not aligned', () => { const { total, offset, limit, prev, next, isFirst, isLast, prevUri, nextUri, firstUri, lastUri @@ -98,20 +99,20 @@ test('Works when not aligned', (t) => { offset: 5, req }); - t.is(total, 100); - t.is(offset, 5); - t.is(limit, 15); - t.is(prev, -10); - t.is(next, 20); - t.false(isFirst); - t.false(isLast); - t.is(prevUri, 'http://localhost/?offset=-10&limit=15'); - t.is(nextUri, 'http://localhost/?offset=20&limit=15'); - t.is(firstUri, 'http://localhost/?offset=0&limit=15'); - t.is(lastUri, 'http://localhost/?offset=95&limit=15'); + assert.equal(total, 100); + assert.equal(offset, 5); + assert.equal(limit, 15); + assert.equal(prev, -10); + assert.equal(next, 20); + assert.equal(isFirst, false); + assert.equal(isLast, false); + assert.equal(prevUri, 'http://localhost/?offset=-10&limit=15'); + assert.equal(nextUri, 'http://localhost/?offset=20&limit=15'); + assert.equal(firstUri, 'http://localhost/?offset=0&limit=15'); + assert.equal(lastUri, 'http://localhost/?offset=95&limit=15'); }); -test('Works on last page', (t) => { +test('Works on last page', () => { const { total, offset, limit, prev, next, isFirst, isLast, prevUri, nextUri, firstUri, lastUri @@ -122,20 +123,20 @@ test('Works on last page', (t) => { offset: 95, req }); - t.is(total, 100); - t.is(offset, 95); - t.is(limit, 15); - t.is(prev, 80); - t.is(next, 110); - t.false(isFirst); - t.true(isLast); - t.is(prevUri, 'http://localhost/?offset=80&limit=15'); - t.is(nextUri, ''); - t.is(firstUri, 'http://localhost/?offset=0&limit=15'); - t.is(lastUri, 'http://localhost/?offset=95&limit=15'); + assert.equal(total, 100); + assert.equal(offset, 95); + assert.equal(limit, 15); + assert.equal(prev, 80); + assert.equal(next, 110); + assert.equal(isFirst, false); + assert.ok(isLast); + assert.equal(prevUri, 'http://localhost/?offset=80&limit=15'); + assert.equal(nextUri, ''); + assert.equal(firstUri, 'http://localhost/?offset=0&limit=15'); + assert.equal(lastUri, 'http://localhost/?offset=95&limit=15'); }); -test('Works when illegal args', (t) => { +test('Works when illegal args', () => { const { total, offset, limit } = @@ -145,12 +146,12 @@ test('Works when illegal args', (t) => { offset: 'foo', req }); - t.is(total, 0); - t.is(offset, 0); - t.is(limit, 1); + assert.equal(total, 0); + assert.equal(offset, 0); + assert.equal(limit, 1); }); -test('Works when negative', (t) => { +test('Works when negative', () => { const { total, offset, limit, prev } = @@ -160,13 +161,13 @@ test('Works when negative', (t) => { offset: -20, req }); - t.is(total, 10); - t.is(offset, -20); - t.is(limit, 1); - t.is(prev, -21); + assert.equal(total, 10); + assert.equal(offset, -20); + assert.equal(limit, 1); + assert.equal(prev, -21); }); -test('Should keep request query', (t) => { +test('Should keep request query', () => { const { prevUri, nextUri, firstUri, lastUri } = @@ -188,41 +189,61 @@ test('Should keep request query', (t) => { query: { foo: 'bar' } } }); - t.is(prevUri, 'http://localhost/?foo=bar&offset=-10&limit=15'); - t.is(nextUri, 'http://localhost/?foo=bar&offset=20&limit=15'); - t.is(firstUri, 'http://localhost/?foo=bar&offset=0&limit=15'); - t.is(lastUri, 'http://localhost/?foo=bar&offset=95&limit=15'); + assert.equal(prevUri, 'http://localhost/?foo=bar&offset=-10&limit=15'); + assert.equal(nextUri, 'http://localhost/?foo=bar&offset=20&limit=15'); + assert.equal(firstUri, 'http://localhost/?foo=bar&offset=0&limit=15'); + assert.equal(lastUri, 'http://localhost/?foo=bar&offset=95&limit=15'); }); -test('Filter for normal number', (t) => { +test('does not mutate request query', () => { + const localReq = { + protocol: 'http', + method: 'GET', + baseUrl: '/', + path: '', + get(name) { + return { host: 'localhost' }[name]; + }, + query: { foo: 'bar' } + }; + pagination({ + total: 100, + limit: 15, + offset: 5, + req: localReq + }); + assert.deepEqual(localReq.query, { foo: 'bar' }); +}); + +test('Filter for normal number', () => { const { limit, offset } = paginationFilter({ limit: '15', offset: '5' }); - t.is(limit, 15); - t.is(offset, 5); + assert.equal(limit, 15); + assert.equal(offset, 5); }); -test('Filter for negative number', (t) => { +test('Filter for negative number', () => { const { limit, offset } = paginationFilter({ limit: 15, offset: -3 }); - t.is(limit, 12); - t.is(offset, 0); + assert.equal(limit, 12); + assert.equal(offset, 0); }); -test('Filter for large negative number', (t) => { +test('Filter for large negative number', () => { const { limit, offset } = paginationFilter({ limit: 15, offset: -32 }); - t.is(limit, 13); - t.is(offset, 0); + assert.equal(limit, 13); + assert.equal(offset, 0); }); -test('Filter for illegal input', (t) => { +test('Filter for illegal input', () => { const { limit, offset } = paginationFilter({ limit: 'foo', offset: 'bar' }); - t.is(limit, 15); - t.is(offset, 0); + assert.equal(limit, 15); + assert.equal(offset, 0); }); -test('Filter with default limit', (t) => { +test('Filter with default limit', () => { const { limit } = paginationFilter({}, 15); - t.is(limit, 15); + assert.equal(limit, 15); }); -test('Filter with max limit', (t) => { +test('Filter with max limit', () => { const { limit } = paginationFilter({ limit: 500 }, 15, 150); - t.is(limit, 150); + assert.equal(limit, 150); }); -test('Filter with unlimit', (t) => { +test('Filter with unlimit', () => { const { limit } = paginationFilter({ limit: 500 }, 15, -1); - t.is(limit, 500); + assert.equal(limit, 500); }); diff --git a/test/utils/random.js b/test/utils/random.js index b72e840..9cf34a6 100644 --- a/test/utils/random.js +++ b/test/utils/random.js @@ -1,8 +1,9 @@ -import test from 'ava'; +import test from 'node:test'; +import assert from 'node:assert/strict'; import { randomString } from './../../src/utils/random.js'; -test('Random string', (t) => { - t.is(randomString(1).length, 1); - t.is(randomString().length, 16); - t.is(randomString(512).length, 512); +test('Random string', () => { + assert.equal(randomString(1).length, 1); + assert.equal(randomString().length, 16); + assert.equal(randomString(512).length, 512); }); diff --git a/test/utils/smart_query.js b/test/utils/smart_query.js index d445319..e6030e2 100644 --- a/test/utils/smart_query.js +++ b/test/utils/smart_query.js @@ -1,21 +1,21 @@ -import test from 'ava'; +import test from 'node:test'; +import assert from 'node:assert/strict'; import moment from 'moment-timezone'; import { Op } from 'sequelize'; import SmartQuery from '../../src/utils/smart_query.js'; moment.tz.setDefault('Asia/Shanghai'); -test('SmartQuery: equal', (t) => { - t.deepEqual( +test('SmartQuery: equal', () => { + assert.deepEqual( new SmartQuery({ title: 'foo', redundant: 'bar' }).equal('title').where, { title: { [Op.eq]: 'foo' } } ); - t.deepEqual( + assert.deepEqual( new SmartQuery({ title: 'foo', redundant: 'bar' }).equal('title').equal('content').where, { title: { [Op.eq]: 'foo' } } ); - // test default value - t.deepEqual( + assert.deepEqual( new SmartQuery({ title: 'foo', redundant: 'bar' @@ -24,124 +24,120 @@ test('SmartQuery: equal', (t) => { ); }); -test('SmartQuery: like', (t) => { - t.deepEqual( +test('SmartQuery: like', () => { + assert.deepEqual( new SmartQuery({ title: 'foo', redundant: 'bar' }).like('title').where, { title: { [Op.like]: '%foo%' } } ); - // test default value - t.deepEqual( + assert.deepEqual( new SmartQuery({ titlex: 'foo', redundant: 'bar' }).like('title', 'title', 'defaultTitle').where, { title: { [Op.like]: '%defaultTitle%' } } ); }); -test('SmartQuery: startsWith', (t) => { - t.deepEqual( +test('SmartQuery: startsWith', () => { + assert.deepEqual( new SmartQuery({ title: 'foo', redundant: 'bar' }).startsWith('title').where, { title: { [Op.like]: 'foo%' } } ); - // test default value - t.deepEqual( + assert.deepEqual( new SmartQuery({ titlex: 'foo', redundant: 'bar' }).startsWith('title', 'title', 'defaultTitle').where, { title: { [Op.like]: 'defaultTitle%' } } ); }); -test('SmartQuery: endsWith', (t) => { - t.deepEqual( +test('SmartQuery: endsWith', () => { + assert.deepEqual( new SmartQuery({ title: 'foo', redundant: 'bar' }).endsWith('title').where, { title: { [Op.like]: '%foo' } } ); - // test default value - t.deepEqual( + assert.deepEqual( new SmartQuery({ titlex: 'foo', redundant: 'bar' }).endsWith('title', 'title', 'defaultTitle').where, { title: { [Op.like]: '%defaultTitle' } } ); }); -test('SmartQuery: gte', (t) => { - t.deepEqual( +test('SmartQuery: gte', () => { + assert.deepEqual( new SmartQuery({ created_starts: 12345 }).gte('created_starts', 'createdAt').where, { createdAt: { [Op.gte]: 12345 } } ); }); -test('SmartQuery: lte', (t) => { - t.deepEqual( +test('SmartQuery: lte', () => { + assert.deepEqual( new SmartQuery({ created_ends: 12345 }).lte('created_ends', 'createdAt').where, { createdAt: { [Op.lte]: 12345 } } ); }); -test('SmartQuery: in', (t) => { - t.deepEqual( +test('SmartQuery: in', () => { + assert.deepEqual( new SmartQuery({ uids: '3,4', redundant: 'bar' }).in('uids', 'userId').where, { userId: { [Op.in]: ['3', '4'] } } ); - t.deepEqual( + assert.deepEqual( new SmartQuery({ status: ['pending', 'deleted'], redundant: 'bar' }).in('status').where, { status: { [Op.in]: ['pending', 'deleted'] } } ); - // test default value - t.deepEqual( + assert.deepEqual( new SmartQuery({ redundant: 'bar' }).in('status', 'status', 'published,approved').where, { status: { [Op.in]: ['published', 'approved'] } } ); }); -test('SmartQuery: notIn', (t) => { - t.deepEqual( +test('SmartQuery: notIn', () => { + assert.deepEqual( new SmartQuery({ uids: '3,4', redundant: 'bar' }).notIn('uids', 'userId').where, { userId: { [Op.notIn]: ['3', '4'] } } ); - t.deepEqual( + assert.deepEqual( new SmartQuery({ uids: [3, 4], redundant: 'bar' }).notIn('uids', 'userId').where, { userId: { [Op.notIn]: [3, 4] } } ); }); -test('SmartQuery: range', (t) => { - t.deepEqual( +test('SmartQuery: range', () => { + assert.deepEqual( new SmartQuery({ minUid: 3, maxUid: 4 }).range('minUid', 'maxUid', 'userId').where, { userId: { [Op.gte]: 3, [Op.lte]: 4 } } ); - t.deepEqual( + assert.deepEqual( new SmartQuery({ minUid: 3 }).range('minUid', 'maxUid', 'userId').where, { userId: { [Op.gte]: 3 } } ); - t.deepEqual( + assert.deepEqual( new SmartQuery({ maxUid: 4 }).range('minUid', 'maxUid', 'userId').where, { userId: { [Op.lte]: 4 } } ); }); -test('SmartQuery: dateRange', (t) => { - t.deepEqual( +test('SmartQuery: dateRange', () => { + assert.deepEqual( new SmartQuery({ createdStart: '2016-01-01', createdEnd: '2016-01-01' }).dateRange('createdStart', 'createdEnd', 'createdAt').where, { createdAt: { [Op.gte]: '1451577600', [Op.lte]: '1451663999' } } ); - t.deepEqual( + assert.deepEqual( new SmartQuery({ createdStart: '2016-01-01' }).dateRange('createdStart', 'createdEnd', 'createdAt').where, { createdAt: { [Op.gte]: '1451577600' } } ); - t.deepEqual( + assert.deepEqual( new SmartQuery({ createdEnd: '2016-01-01' }).dateRange('createdStart', 'createdEnd', 'createdAt').where, { createdAt: { [Op.lte]: '1451663999' } } ); - t.deepEqual( + assert.deepEqual( new SmartQuery({ createdStart: '2016-01-01 03:05', createdEnd: '2016-01-01 04:05' }).dateRange('createdStart', 'createdEnd', 'createdAt').where, { createdAt: { [Op.gte]: '1451577600', [Op.lte]: '1451663999' } } ); - t.deepEqual( + assert.deepEqual( new SmartQuery({ createdStart: 'xxxx', createdEnd: 'xxxx' @@ -149,8 +145,8 @@ test('SmartQuery: dateRange', (t) => { {} ); }); -test('SmartQuery: dateTimeRange', (t) => { - t.deepEqual( +test('SmartQuery: dateTimeRange', () => { + assert.deepEqual( new SmartQuery({ createdStart: '2016-01-01', createdEnd: '2016-01-01' @@ -158,20 +154,20 @@ test('SmartQuery: dateTimeRange', (t) => { { createdAt: { [Op.gte]: '1451577600', [Op.lte]: '1451577600' } } ); - t.deepEqual( + assert.deepEqual( new SmartQuery({ createdStart: '2016-01-01 03:05', createdEnd: '2016-01-01 12:05:03' }).dateTimeRange('createdStart', 'createdEnd', 'createdAt').where, { createdAt: { [Op.gte]: '1451588700', [Op.lte]: '1451621103' } } ); - t.deepEqual( + assert.deepEqual( new SmartQuery({ createdEnd: '2016-01-01 12:05:03' }).dateTimeRange('createdStart', 'createdEnd', 'createdAt').where, { createdAt: { [Op.lte]: '1451621103' } } ); - t.deepEqual( + assert.deepEqual( new SmartQuery({ createdStart: 'xxxx', createdEnd: 'xxxx' @@ -179,84 +175,84 @@ test('SmartQuery: dateTimeRange', (t) => { {} ); }); -test('SmartQuery: orderable', (t) => { - t.deepEqual( +test('SmartQuery: orderable', () => { + assert.deepEqual( new SmartQuery({ order: 'createdAt' }).orderable(['createdAt']).order, [ ['createdAt', 'ASC'] ] ); - t.deepEqual( + assert.deepEqual( new SmartQuery({ order: '-createdAt' }).orderable(['createdAt']).order, [ ['createdAt', 'DESC'] ] ); - t.deepEqual( + assert.deepEqual( new SmartQuery({}).orderable(['createdAt']).order, [ ['createdAt', 'DESC'] ] ); - t.deepEqual( + assert.deepEqual( new SmartQuery({ order: 'test' }).orderable(['createdAt'], { test: ['deletedAt', 'DESC'] }).order, [ ['deletedAt', 'DESC'] ] ); - t.deepEqual( + assert.deepEqual( new SmartQuery({}).orderable(['createdAt'], { test: ['deletedAt', 'DESC'] }, ['id', 'DESC']).order, [ ['id', 'DESC'] ] ); }); -test('SmartQuery: determineParam', (t) => { - t.is( +test('SmartQuery: determineParam', () => { + assert.equal( new SmartQuery({ title: 'foo' }).determineParam('title'), true ); - t.is( + assert.equal( new SmartQuery({ title: ' ' }).determineParam('title'), false ); - t.is( + assert.equal( new SmartQuery({ title: null }).determineParam('title'), false ); - t.is( + assert.equal( new SmartQuery({ foo: 'bar' }).determineParam('title'), false ); - t.is( + assert.equal( new SmartQuery({ uids: [1] }).determineParam('uids'), true ); - t.is( + assert.equal( new SmartQuery({ uids: [1, 2] }).determineParam('uids'), true ); - t.is( + assert.equal( new SmartQuery({ uids: [] }).determineParam('uids'), false ); - t.is( + assert.equal( new SmartQuery({ uids: { foo: 'bar' } }).determineParam('uids'), true ); - t.is( + assert.equal( new SmartQuery({ uids: { foo: 'bar', 'a': 'c' } }).determineParam('uids'), true ); - t.is( + assert.equal( new SmartQuery({ uids: {} }).determineParam('uids'), false ); }); -test('SmartQuery: applyWhere', (t) => { +test('SmartQuery: applyWhere', () => { const smartQuery = new SmartQuery({}); smartQuery.applyWhere('title', '$eq', 'xxx'); - t.deepEqual( + assert.deepEqual( smartQuery.where, { title: { @@ -265,7 +261,7 @@ test('SmartQuery: applyWhere', (t) => { } ); smartQuery.applyWhere('title', '$eq', 'ooo'); - t.deepEqual( + assert.deepEqual( smartQuery.where, { title: { @@ -274,7 +270,7 @@ test('SmartQuery: applyWhere', (t) => { } ); smartQuery.applyWhere('title', '$in', 'bar'); - t.deepEqual( + assert.deepEqual( smartQuery.where, { title: { @@ -285,10 +281,10 @@ test('SmartQuery: applyWhere', (t) => { ); }); -test('SmartQuery: getCriteria includes where and order', (t) => { +test('SmartQuery: getCriteria includes where and order', () => { const smartQuery = new SmartQuery({ title: 'foo' }); smartQuery.like('title').orderable(['createdAt'], {}, ['id', 'DESC']); - t.deepEqual( + assert.deepEqual( smartQuery.getCriteria(), { where: { title: { [Op.like]: '%foo%' } }, @@ -297,7 +293,7 @@ test('SmartQuery: getCriteria includes where and order', (t) => { ); }); -test('SmartQuery: getCriteria returns empty without conditions', (t) => { +test('SmartQuery: getCriteria returns empty without conditions', () => { const smartQuery = new SmartQuery({}); - t.deepEqual(smartQuery.getCriteria(), {}); + assert.deepEqual(smartQuery.getCriteria(), {}); }); diff --git a/test/utils/wrapper.js b/test/utils/wrapper.js index b493a05..d229d06 100644 --- a/test/utils/wrapper.js +++ b/test/utils/wrapper.js @@ -1,7 +1,7 @@ -import test from 'ava'; -import * as is from 'is-type-of'; +import test from 'node:test'; +import assert from 'node:assert/strict'; import wrapper from './../../src/utils/wrapper.js'; -test('Wrapper', (t) => { - t.true(is.function(wrapper(() => {}))); +test('Wrapper', () => { + assert.equal(typeof wrapper(() => {}), 'function'); });