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');
});