diff --git a/.github/scripts/deploy-review-app.sh b/.github/scripts/deploy-review-app.sh index bcd6cf9929c16..4b356c928a49a 100755 --- a/.github/scripts/deploy-review-app.sh +++ b/.github/scripts/deploy-review-app.sh @@ -10,12 +10,11 @@ org="shields-io" # This will fail if $PR_NUMBER is not a valid PR pr_json=$(curl --fail "https://api.github.com/repos/badges/shields/pulls/$PR_NUMBER") -# Attempt to apply the PR diff to the target branch -# This will fail if it does not merge cleanly +# Checkout the PR branch git config user.name "actions[bot]" git config user.email "actions@users.noreply.github.com" git fetch origin "pull/$PR_NUMBER/head:pr-$PR_NUMBER" -git merge "pr-$PR_NUMBER" +git checkout "pr-$PR_NUMBER" # If the app does not already exist, create it if ! flyctl status --app "$app"; then diff --git a/CHANGELOG.md b/CHANGELOG.md index 82fa49c07c221..c3f42a9adba6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,35 @@ Note: this changelog is for the shields.io server. The changelog for the badge-m --- +## server-2023-07-02 + +By far the most significant change in this release is the long-awaited launch of the re-designed frontend: + +- migrate frontend to docusaurus [#9014](https://github.com/badges/shields/issues/9014) +- fix a load of spacing issues in frontend content [#9281](https://github.com/badges/shields/issues/9281) +- set a sensible meta description [#9283](https://github.com/badges/shields/issues/9283) +- chore(frontend): open homepage feature links in new tab [#9300](https://github.com/badges/shields/issues/9300) +- adapt opencollective images to theme background [#9298](https://github.com/badges/shields/issues/9298) +- temp fix: wrap code examples tabs in narrow browser windows [#9302](https://github.com/badges/shields/issues/9302) +- add a bit of border to text boxes [#9324](https://github.com/badges/shields/issues/9324) + +Other changes in this release: + +- cache [dockerpulls] badges for an hour [#9343](https://github.com/badges/shields/issues/9343) +- Mention YouTube API services and link to Google Privacy Policy [#9339](https://github.com/badges/shields/issues/9339) +- allow negative timestamps in relative [date] badge [#9321](https://github.com/badges/shields/issues/9321) +- upgrade to graphql 16 [#9290](https://github.com/badges/shields/issues/9290) +- remove obsolete travis .org examples [#9284](https://github.com/badges/shields/issues/9284) +- increase max age on reddit badges [#9282](https://github.com/badges/shields/issues/9282) +- feat: Add author filter option for [GithubCommitActivity] [#9251](https://github.com/badges/shields/issues/9251) +- Fix: [GithubCommitActivity] invalid branch error handling [#9258](https://github.com/badges/shields/issues/9258) +- Implement a pattern for dealing with upstream APIs which are slow on the first hit; affects [endpoint] [#9233](https://github.com/badges/shields/issues/9233) +- Delete old deprecated services [#9254](https://github.com/badges/shields/issues/9254) +- feat: add 'canceled' status to netlify deploy badge [#9240](https://github.com/badges/shields/issues/9240) +- increase default cache on youtube badges [#9238](https://github.com/badges/shields/issues/9238) +- embiggen youtube cache, again [#9250](https://github.com/badges/shields/issues/9250) +- Dependency updates + ## server-2023-06-01 - feat: Add total commits to [GitHubCommitActivity] [#9196](https://github.com/badges/shields/issues/9196) diff --git a/frontend/src/css/custom.css b/frontend/src/css/custom.css index 18f7eb4368c57..bf4e0384a3ed3 100644 --- a/frontend/src/css/custom.css +++ b/frontend/src/css/custom.css @@ -31,6 +31,12 @@ html[data-theme="dark"] .docusaurus-highlight-code-line { color-scheme: initial; } +input[type="text"], :not(#fakeID#fakeId#fakeID) select { + border-color: var(--ifm-color-primary-lightest); + border-style: solid; + border-width: 1px; +} + /* TODO: remove these two styles when we can upgrade to docusaurus-theme-openapi@0.6.5 diff --git a/package-lock.json b/package-lock.json index 9bcb34a950c22..e76ea5d96a7b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,13 +11,13 @@ "dependencies": { "@renovate/pep440": "^1.0.0", "@renovatebot/ruby-semver": "^2.1.11", - "@sentry/node": "^7.56.0", + "@sentry/node": "^7.57.0", "@shields_io/camp": "^18.1.2", "@xmldom/xmldom": "0.8.8", "badge-maker": "file:badge-maker", "bytes": "^3.1.2", "camelcase": "^7.0.1", - "chalk": "^5.2.0", + "chalk": "^5.3.0", "check-node-version": "^4.2.1", "cloudflare-middleware": "^1.0.4", "config": "^3.3.9", @@ -27,7 +27,7 @@ "emojic": "^1.1.17", "escape-string-regexp": "^4.0.0", "fast-xml-parser": "^4.2.5", - "glob": "^10.3.0", + "glob": "^10.3.1", "global-agent": "^3.0.0", "got": "^13.0.0", "graphql": "16.7.1", @@ -43,14 +43,14 @@ "node-pg-migrate": "^6.2.2", "parse-link-header": "^2.0.0", "path-to-regexp": "^6.2.1", - "pg": "^8.11.0", + "pg": "^8.11.1", "pretty-bytes": "^6.1.0", "priorityqueuejs": "^2.0.0", "prom-client": "^14.2.0", "qs": "^6.11.2", "query-string": "^8.1.0", "semver": "~7.5.3", - "simple-icons": "9.2.0", + "simple-icons": "9.3.0", "webextension-store-meta": "^1.0.5", "xpath": "~0.0.32" }, @@ -58,7 +58,7 @@ "@docusaurus/core": "^2.0.0", "@easyops-cn/docusaurus-search-local": "^0.35.0", "@mdx-js/react": "^1.6.21", - "@typescript-eslint/parser": "^5.58.0", + "@typescript-eslint/parser": "^5.60.1", "c8": "^8.0.0", "caller": "^1.1.0", "chai": "^4.3.7", @@ -68,7 +68,7 @@ "child-process-promise": "^2.2.1", "clsx": "^1.1.1", "concurrently": "^8.2.0", - "cypress": "^12.15.0", + "cypress": "^12.16.0", "cypress-wait-for-stable-dom": "^0.1.0", "danger": "^11.2.6", "deepmerge": "^4.3.1", @@ -82,7 +82,7 @@ "eslint-plugin-cypress": "^2.13.3", "eslint-plugin-icedfrisby": "^0.1.0", "eslint-plugin-import": "^2.27.5", - "eslint-plugin-jsdoc": "^46.2.6", + "eslint-plugin-jsdoc": "^46.4.2", "eslint-plugin-mocha": "^10.1.0", "eslint-plugin-no-extension-in-require": "^0.2.0", "eslint-plugin-node": "^11.1.0", @@ -95,7 +95,7 @@ "icedfrisby-nock": "^2.1.0", "is-svg": "^5.0.0", "jsdoc": "^4.0.2", - "lint-staged": "^13.2.2", + "lint-staged": "^13.2.3", "lodash.difference": "^4.5.0", "minimist": "^1.2.8", "mocha": "^10.2.0", @@ -4563,90 +4563,70 @@ } }, "node_modules/@sentry-internal/tracing": { - "version": "7.56.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.56.0.tgz", - "integrity": "sha512-OKI4Pz/O13gng8hT9rNc+gRV3+P7nnk1HnHlV8fgaQydS6DsRxoDL1sHa42tZGbh7K9jqNAP3TC6VjBOsr2tXA==", + "version": "7.57.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.57.0.tgz", + "integrity": "sha512-tpViyDd8AhQGYYhI94xi2aaDopXOPfL2Apwrtb3qirWkomIQ2K86W1mPmkce+B0cFOnW2Dxv/ZTFKz6ghjK75A==", "dependencies": { - "@sentry/core": "7.56.0", - "@sentry/types": "7.56.0", - "@sentry/utils": "7.56.0", - "tslib": "^1.9.3" + "@sentry/core": "7.57.0", + "@sentry/types": "7.57.0", + "@sentry/utils": "7.57.0", + "tslib": "^2.4.1 || ^1.9.3" }, "engines": { "node": ">=8" } }, - "node_modules/@sentry-internal/tracing/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/@sentry/core": { - "version": "7.56.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.56.0.tgz", - "integrity": "sha512-Nuyyfh09Yz27kPo74fXHlrdmZeK6zrlJVtxQ6LkwuoaTBcNcesNXVaOtr6gjvUGUmsfriVPP3Jero5LXufV7GQ==", + "version": "7.57.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.57.0.tgz", + "integrity": "sha512-l014NudPH0vQlzybtXajPxYFfs9w762NoarjObC3gu76D1jzBBFzhdRelkGpDbSLNTIsKhEDDRpgAjBWJ9icfw==", "dependencies": { - "@sentry/types": "7.56.0", - "@sentry/utils": "7.56.0", - "tslib": "^1.9.3" + "@sentry/types": "7.57.0", + "@sentry/utils": "7.57.0", + "tslib": "^2.4.1 || ^1.9.3" }, "engines": { "node": ">=8" } }, - "node_modules/@sentry/core/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/@sentry/node": { - "version": "7.56.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.56.0.tgz", - "integrity": "sha512-QXbWy/ypRxfFd8iP6zLvHInYZyjGKPrkVNYt43mhKAZHm764NxX/29vDfj1FztgG9Z6lVLIG2eyqTvLruYmsWw==", - "dependencies": { - "@sentry-internal/tracing": "7.56.0", - "@sentry/core": "7.56.0", - "@sentry/types": "7.56.0", - "@sentry/utils": "7.56.0", + "version": "7.57.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.57.0.tgz", + "integrity": "sha512-63mjyUVM6sfJFVQ5TGVRVGUsoEfESl5ABzIW1W0s9gUiQPaG8SOdaQJglb2VNrkMYxnRHgD8Q9LUh/qcmUyPGw==", + "dependencies": { + "@sentry-internal/tracing": "7.57.0", + "@sentry/core": "7.57.0", + "@sentry/types": "7.57.0", + "@sentry/utils": "7.57.0", "cookie": "^0.4.1", "https-proxy-agent": "^5.0.0", "lru_map": "^0.3.3", - "tslib": "^1.9.3" + "tslib": "^2.4.1 || ^1.9.3" }, "engines": { "node": ">=8" } }, - "node_modules/@sentry/node/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/@sentry/types": { - "version": "7.56.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.56.0.tgz", - "integrity": "sha512-5WjhVOQm75ItOytOx2jTx+5yw8/qJ316+g1Di8dS9+kgIi1zniqdMcX00C2yYe3FMUgFB49PegCUYulm9Evapw==", + "version": "7.57.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.57.0.tgz", + "integrity": "sha512-D7ifoUfxuVCUyktIr5Gc+jXUbtcUMmfHdTtTbf1XCZHua5mJceK9wtl3YCg3eq/HK2Ppd52BKnTzEcS5ZKQM+w==", "engines": { "node": ">=8" } }, "node_modules/@sentry/utils": { - "version": "7.56.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.56.0.tgz", - "integrity": "sha512-wgeX7bufxc//TjjSIE+gCMm8hVId7Jzvc+f441bYrWnNZBuzPIDW2BummCcPrKzSYe5GeYZDTZGV8YZGMLGBjw==", + "version": "7.57.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.57.0.tgz", + "integrity": "sha512-YXrkMCiNklqkXctn4mKYkrzNCf/dfVcRUQrkXjeBC+PHXbcpPyaJgInNvztR7Skl8lE3JPGPN4v5XhLxK1bUUg==", "dependencies": { - "@sentry/types": "7.56.0", - "tslib": "^1.9.3" + "@sentry/types": "7.57.0", + "tslib": "^2.4.1 || ^1.9.3" }, "engines": { "node": ">=8" } }, - "node_modules/@sentry/utils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/@shields_io/camp": { "version": "18.1.2", "resolved": "https://registry.npmjs.org/@shields_io/camp/-/camp-18.1.2.tgz", @@ -5528,14 +5508,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.9.tgz", - "integrity": "sha512-FsPkRvBtcLQ/eVK1ivDiNYBjn3TGJdXy2fhXX+rc7czWl4ARwnpArwbihSOHI2Peg9WbtGHrbThfBUkZZGTtvQ==", + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.60.1.tgz", + "integrity": "sha512-pHWlc3alg2oSMGwsU/Is8hbm3XFbcrb6P5wIxcQW9NsYBfnrubl/GhVVD/Jm/t8HXhA2WncoIRfBtnCgRGV96Q==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.59.9", - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/typescript-estree": "5.59.9", + "@typescript-eslint/scope-manager": "5.60.1", + "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/typescript-estree": "5.60.1", "debug": "^4.3.4" }, "engines": { @@ -5555,13 +5535,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.9.tgz", - "integrity": "sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ==", + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.1.tgz", + "integrity": "sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9" + "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/visitor-keys": "5.60.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5572,9 +5552,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", - "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", + "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5585,13 +5565,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz", - "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==", + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz", + "integrity": "sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9", + "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/visitor-keys": "5.60.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -5612,12 +5592,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", - "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", + "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/types": "5.60.1", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -7356,9 +7336,9 @@ "dev": true }, "node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -9001,9 +8981,9 @@ "dev": true }, "node_modules/cypress": { - "version": "12.15.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.15.0.tgz", - "integrity": "sha512-FqGbxsH+QgjStuTO9onXMIeF44eOrgVwPvlcvuzLIaePQMkl72YgBvpuHlBGRcrw3Q4SvqKfajN8iV5XWShAiQ==", + "version": "12.16.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.16.0.tgz", + "integrity": "sha512-mwv1YNe48hm0LVaPgofEhGCtLwNIQEjmj2dJXnAkY1b4n/NE9OtgPph4TyS+tOtYp5CKtRmDvBzWseUXQTjbTg==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -11258,9 +11238,9 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "46.2.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.2.6.tgz", - "integrity": "sha512-zIaK3zbSrKuH12bP+SPybPgcHSM6MFzh3HFeaODzmsF1N8C1l8dzJ22cW1aq4g0+nayU1VMjmNf7hg0dpShLrA==", + "version": "46.4.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.4.2.tgz", + "integrity": "sha512-fmIgOe7irf9otkMtsPjr5P39wC5LzA6aEU/nydfUlc8JaEiS93uhPaxI+x/v5s1Ckm+IZeP3006do2n2ehZcNQ==", "dev": true, "dependencies": { "@es-joy/jsdoccomment": "~0.39.4", @@ -13034,15 +13014,15 @@ "dev": true }, "node_modules/glob": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.0.tgz", - "integrity": "sha512-AQ1/SB9HH0yCx1jXAT4vmCbTOPe5RQ+kCurjbel5xSCGhebumUv+GJZfa1rEqor3XIViqwSEmlkZCQD43RWrBg==", + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.1.tgz", + "integrity": "sha512-9BKYcEeIs7QwlCYs+Y3GBvqAMISufUS0i2ELd11zpZjxI5V9iyRj0HgzB5/cLf2NY4vcYBTYzJ7GIui7j/4DOw==", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.0.3", "minimatch": "^9.0.1", "minipass": "^5.0.0 || ^6.0.2", - "path-scurry": "^1.7.0" + "path-scurry": "^1.10.0" }, "bin": { "glob": "dist/cjs/src/bin.js" @@ -15796,9 +15776,9 @@ } }, "node_modules/lint-staged": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.2.tgz", - "integrity": "sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA==", + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.3.tgz", + "integrity": "sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg==", "dev": true, "dependencies": { "chalk": "5.2.0", @@ -15840,6 +15820,18 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/lint-staged/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -19423,11 +19415,11 @@ "dev": true }, "node_modules/path-scurry": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.2.tgz", - "integrity": "sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.0.tgz", + "integrity": "sha512-tZFEaRQbMLjwrsmidsGJ6wDMv0iazJWk6SfIKnY4Xru8auXgmJkOBa5DUbYFcFD2Rzk2+KDlIiF0GVXNCbgC7g==", "dependencies": { - "lru-cache": "^9.1.1", + "lru-cache": "^9.1.1 || ^10.0.0", "minipass": "^5.0.0 || ^6.0.2" }, "engines": { @@ -19438,9 +19430,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.2.tgz", - "integrity": "sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", + "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", "engines": { "node": "14 || >=16.14" } @@ -19502,14 +19494,14 @@ "dev": true }, "node_modules/pg": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.0.tgz", - "integrity": "sha512-meLUVPn2TWgJyLmy7el3fQQVwft4gU5NGyvV0XbD41iU9Jbg8lCH4zexhIkihDzVHJStlt6r088G6/fWeNjhXA==", + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.1.tgz", + "integrity": "sha512-utdq2obft07MxaDg0zBJI+l/M3mBRfIpEN3iSemsz0G5F2/VXx+XzqF4oxrbIZXQxt2AZzIUzyVg/YM6xOP/WQ==", "dependencies": { "buffer-writer": "2.0.0", "packet-reader": "1.0.0", - "pg-connection-string": "^2.6.0", - "pg-pool": "^3.6.0", + "pg-connection-string": "^2.6.1", + "pg-pool": "^3.6.1", "pg-protocol": "^1.6.0", "pg-types": "^2.1.0", "pgpass": "1.x" @@ -19518,7 +19510,7 @@ "node": ">= 8.0.0" }, "optionalDependencies": { - "pg-cloudflare": "^1.1.0" + "pg-cloudflare": "^1.1.1" }, "peerDependencies": { "pg-native": ">=3.0.1" @@ -19530,15 +19522,15 @@ } }, "node_modules/pg-cloudflare": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.0.tgz", - "integrity": "sha512-tGM8/s6frwuAIyRcJ6nWcIvd3+3NmUKIs6OjviIm1HPPFEt5MzQDOTBQyhPWg/m0kCl95M6gA1JaIXtS8KovOA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", + "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", "optional": true }, "node_modules/pg-connection-string": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.0.tgz", - "integrity": "sha512-x14ibktcwlHKoHxx9X3uTVW9zIGR41ZB6QNhHb21OPNdCCO3NaRnpJuwKIQSR4u+Yqjx4HCvy7Hh7VSy1U4dGg==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.1.tgz", + "integrity": "sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg==" }, "node_modules/pg-int8": { "version": "1.0.1", @@ -19557,9 +19549,9 @@ } }, "node_modules/pg-pool": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.0.tgz", - "integrity": "sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", + "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==", "peerDependencies": { "pg": ">=8.0" } @@ -23752,9 +23744,9 @@ } }, "node_modules/simple-icons": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/simple-icons/-/simple-icons-9.2.0.tgz", - "integrity": "sha512-BwLa76uMHBZKN1+L7Qmboj47mcFADiA/dfAePOd3arSPv6JMRNptJ2FNDBLuqkKliWG2W9XuBKhunuv+GzPpLA==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/simple-icons/-/simple-icons-9.3.0.tgz", + "integrity": "sha512-T6x3teIpPdMc8nibYvE56Va1eF+l8Puk//1YYtCxQP4wbGRzYxgwZTl18YCjoFLnu/0exehwyR2hMEFZV3lflg==", "engines": { "node": ">=0.12.18" }, @@ -31350,81 +31342,53 @@ } }, "@sentry-internal/tracing": { - "version": "7.56.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.56.0.tgz", - "integrity": "sha512-OKI4Pz/O13gng8hT9rNc+gRV3+P7nnk1HnHlV8fgaQydS6DsRxoDL1sHa42tZGbh7K9jqNAP3TC6VjBOsr2tXA==", + "version": "7.57.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.57.0.tgz", + "integrity": "sha512-tpViyDd8AhQGYYhI94xi2aaDopXOPfL2Apwrtb3qirWkomIQ2K86W1mPmkce+B0cFOnW2Dxv/ZTFKz6ghjK75A==", "requires": { - "@sentry/core": "7.56.0", - "@sentry/types": "7.56.0", - "@sentry/utils": "7.56.0", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } + "@sentry/core": "7.57.0", + "@sentry/types": "7.57.0", + "@sentry/utils": "7.57.0", + "tslib": "^2.4.1 || ^1.9.3" } }, "@sentry/core": { - "version": "7.56.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.56.0.tgz", - "integrity": "sha512-Nuyyfh09Yz27kPo74fXHlrdmZeK6zrlJVtxQ6LkwuoaTBcNcesNXVaOtr6gjvUGUmsfriVPP3Jero5LXufV7GQ==", + "version": "7.57.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.57.0.tgz", + "integrity": "sha512-l014NudPH0vQlzybtXajPxYFfs9w762NoarjObC3gu76D1jzBBFzhdRelkGpDbSLNTIsKhEDDRpgAjBWJ9icfw==", "requires": { - "@sentry/types": "7.56.0", - "@sentry/utils": "7.56.0", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } + "@sentry/types": "7.57.0", + "@sentry/utils": "7.57.0", + "tslib": "^2.4.1 || ^1.9.3" } }, "@sentry/node": { - "version": "7.56.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.56.0.tgz", - "integrity": "sha512-QXbWy/ypRxfFd8iP6zLvHInYZyjGKPrkVNYt43mhKAZHm764NxX/29vDfj1FztgG9Z6lVLIG2eyqTvLruYmsWw==", - "requires": { - "@sentry-internal/tracing": "7.56.0", - "@sentry/core": "7.56.0", - "@sentry/types": "7.56.0", - "@sentry/utils": "7.56.0", + "version": "7.57.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.57.0.tgz", + "integrity": "sha512-63mjyUVM6sfJFVQ5TGVRVGUsoEfESl5ABzIW1W0s9gUiQPaG8SOdaQJglb2VNrkMYxnRHgD8Q9LUh/qcmUyPGw==", + "requires": { + "@sentry-internal/tracing": "7.57.0", + "@sentry/core": "7.57.0", + "@sentry/types": "7.57.0", + "@sentry/utils": "7.57.0", "cookie": "^0.4.1", "https-proxy-agent": "^5.0.0", "lru_map": "^0.3.3", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } + "tslib": "^2.4.1 || ^1.9.3" } }, "@sentry/types": { - "version": "7.56.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.56.0.tgz", - "integrity": "sha512-5WjhVOQm75ItOytOx2jTx+5yw8/qJ316+g1Di8dS9+kgIi1zniqdMcX00C2yYe3FMUgFB49PegCUYulm9Evapw==" + "version": "7.57.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.57.0.tgz", + "integrity": "sha512-D7ifoUfxuVCUyktIr5Gc+jXUbtcUMmfHdTtTbf1XCZHua5mJceK9wtl3YCg3eq/HK2Ppd52BKnTzEcS5ZKQM+w==" }, "@sentry/utils": { - "version": "7.56.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.56.0.tgz", - "integrity": "sha512-wgeX7bufxc//TjjSIE+gCMm8hVId7Jzvc+f441bYrWnNZBuzPIDW2BummCcPrKzSYe5GeYZDTZGV8YZGMLGBjw==", + "version": "7.57.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.57.0.tgz", + "integrity": "sha512-YXrkMCiNklqkXctn4mKYkrzNCf/dfVcRUQrkXjeBC+PHXbcpPyaJgInNvztR7Skl8lE3JPGPN4v5XhLxK1bUUg==", "requires": { - "@sentry/types": "7.56.0", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } + "@sentry/types": "7.57.0", + "tslib": "^2.4.1 || ^1.9.3" } }, "@shields_io/camp": { @@ -32162,41 +32126,41 @@ } }, "@typescript-eslint/parser": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.9.tgz", - "integrity": "sha512-FsPkRvBtcLQ/eVK1ivDiNYBjn3TGJdXy2fhXX+rc7czWl4ARwnpArwbihSOHI2Peg9WbtGHrbThfBUkZZGTtvQ==", + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.60.1.tgz", + "integrity": "sha512-pHWlc3alg2oSMGwsU/Is8hbm3XFbcrb6P5wIxcQW9NsYBfnrubl/GhVVD/Jm/t8HXhA2WncoIRfBtnCgRGV96Q==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.59.9", - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/typescript-estree": "5.59.9", + "@typescript-eslint/scope-manager": "5.60.1", + "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/typescript-estree": "5.60.1", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.9.tgz", - "integrity": "sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ==", + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.1.tgz", + "integrity": "sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9" + "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/visitor-keys": "5.60.1" } }, "@typescript-eslint/types": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", - "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", + "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz", - "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==", + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz", + "integrity": "sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9", + "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/visitor-keys": "5.60.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -32205,12 +32169,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", - "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", + "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/types": "5.60.1", "eslint-visitor-keys": "^3.3.0" } }, @@ -33535,9 +33499,9 @@ "dev": true }, "chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==" + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==" }, "char-width-table-consumer": { "version": "1.0.0", @@ -34743,9 +34707,9 @@ "dev": true }, "cypress": { - "version": "12.15.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.15.0.tgz", - "integrity": "sha512-FqGbxsH+QgjStuTO9onXMIeF44eOrgVwPvlcvuzLIaePQMkl72YgBvpuHlBGRcrw3Q4SvqKfajN8iV5XWShAiQ==", + "version": "12.16.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.16.0.tgz", + "integrity": "sha512-mwv1YNe48hm0LVaPgofEhGCtLwNIQEjmj2dJXnAkY1b4n/NE9OtgPph4TyS+tOtYp5CKtRmDvBzWseUXQTjbTg==", "dev": true, "requires": { "@cypress/request": "^2.88.10", @@ -36479,9 +36443,9 @@ } }, "eslint-plugin-jsdoc": { - "version": "46.2.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.2.6.tgz", - "integrity": "sha512-zIaK3zbSrKuH12bP+SPybPgcHSM6MFzh3HFeaODzmsF1N8C1l8dzJ22cW1aq4g0+nayU1VMjmNf7hg0dpShLrA==", + "version": "46.4.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.4.2.tgz", + "integrity": "sha512-fmIgOe7irf9otkMtsPjr5P39wC5LzA6aEU/nydfUlc8JaEiS93uhPaxI+x/v5s1Ckm+IZeP3006do2n2ehZcNQ==", "dev": true, "requires": { "@es-joy/jsdoccomment": "~0.39.4", @@ -37679,15 +37643,15 @@ "dev": true }, "glob": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.0.tgz", - "integrity": "sha512-AQ1/SB9HH0yCx1jXAT4vmCbTOPe5RQ+kCurjbel5xSCGhebumUv+GJZfa1rEqor3XIViqwSEmlkZCQD43RWrBg==", + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.1.tgz", + "integrity": "sha512-9BKYcEeIs7QwlCYs+Y3GBvqAMISufUS0i2ELd11zpZjxI5V9iyRj0HgzB5/cLf2NY4vcYBTYzJ7GIui7j/4DOw==", "requires": { "foreground-child": "^3.1.0", "jackspeak": "^2.0.3", "minimatch": "^9.0.1", "minipass": "^5.0.0 || ^6.0.2", - "path-scurry": "^1.7.0" + "path-scurry": "^1.10.0" }, "dependencies": { "brace-expansion": { @@ -39721,9 +39685,9 @@ } }, "lint-staged": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.2.tgz", - "integrity": "sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA==", + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.3.tgz", + "integrity": "sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg==", "dev": true, "requires": { "chalk": "5.2.0", @@ -39750,6 +39714,12 @@ "color-convert": "^2.0.1" } }, + "chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "dev": true + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -42490,18 +42460,18 @@ "dev": true }, "path-scurry": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.2.tgz", - "integrity": "sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.0.tgz", + "integrity": "sha512-tZFEaRQbMLjwrsmidsGJ6wDMv0iazJWk6SfIKnY4Xru8auXgmJkOBa5DUbYFcFD2Rzk2+KDlIiF0GVXNCbgC7g==", "requires": { - "lru-cache": "^9.1.1", + "lru-cache": "^9.1.1 || ^10.0.0", "minipass": "^5.0.0 || ^6.0.2" }, "dependencies": { "lru-cache": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.2.tgz", - "integrity": "sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==" + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", + "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==" } } }, @@ -42549,15 +42519,15 @@ "dev": true }, "pg": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.0.tgz", - "integrity": "sha512-meLUVPn2TWgJyLmy7el3fQQVwft4gU5NGyvV0XbD41iU9Jbg8lCH4zexhIkihDzVHJStlt6r088G6/fWeNjhXA==", + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.1.tgz", + "integrity": "sha512-utdq2obft07MxaDg0zBJI+l/M3mBRfIpEN3iSemsz0G5F2/VXx+XzqF4oxrbIZXQxt2AZzIUzyVg/YM6xOP/WQ==", "requires": { "buffer-writer": "2.0.0", "packet-reader": "1.0.0", - "pg-cloudflare": "^1.1.0", - "pg-connection-string": "^2.6.0", - "pg-pool": "^3.6.0", + "pg-cloudflare": "^1.1.1", + "pg-connection-string": "^2.6.1", + "pg-pool": "^3.6.1", "pg-protocol": "^1.6.0", "pg-types": "^2.1.0", "pgpass": "1.x" @@ -42601,15 +42571,15 @@ } }, "pg-cloudflare": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.0.tgz", - "integrity": "sha512-tGM8/s6frwuAIyRcJ6nWcIvd3+3NmUKIs6OjviIm1HPPFEt5MzQDOTBQyhPWg/m0kCl95M6gA1JaIXtS8KovOA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", + "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", "optional": true }, "pg-connection-string": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.0.tgz", - "integrity": "sha512-x14ibktcwlHKoHxx9X3uTVW9zIGR41ZB6QNhHb21OPNdCCO3NaRnpJuwKIQSR4u+Yqjx4HCvy7Hh7VSy1U4dGg==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.1.tgz", + "integrity": "sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg==" }, "pg-int8": { "version": "1.0.1", @@ -42622,9 +42592,9 @@ "integrity": "sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==" }, "pg-pool": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.0.tgz", - "integrity": "sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", + "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==", "requires": {} }, "pg-protocol": { @@ -45711,9 +45681,9 @@ "dev": true }, "simple-icons": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/simple-icons/-/simple-icons-9.2.0.tgz", - "integrity": "sha512-BwLa76uMHBZKN1+L7Qmboj47mcFADiA/dfAePOd3arSPv6JMRNptJ2FNDBLuqkKliWG2W9XuBKhunuv+GzPpLA==" + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/simple-icons/-/simple-icons-9.3.0.tgz", + "integrity": "sha512-T6x3teIpPdMc8nibYvE56Va1eF+l8Puk//1YYtCxQP4wbGRzYxgwZTl18YCjoFLnu/0exehwyR2hMEFZV3lflg==" }, "simple-update-notifier": { "version": "1.1.0", diff --git a/package.json b/package.json index a01c9a7d322de..5f1aef499e37e 100644 --- a/package.json +++ b/package.json @@ -23,13 +23,13 @@ "dependencies": { "@renovate/pep440": "^1.0.0", "@renovatebot/ruby-semver": "^2.1.11", - "@sentry/node": "^7.56.0", + "@sentry/node": "^7.57.0", "@shields_io/camp": "^18.1.2", "@xmldom/xmldom": "0.8.8", "badge-maker": "file:badge-maker", "bytes": "^3.1.2", "camelcase": "^7.0.1", - "chalk": "^5.2.0", + "chalk": "^5.3.0", "check-node-version": "^4.2.1", "cloudflare-middleware": "^1.0.4", "config": "^3.3.9", @@ -39,7 +39,7 @@ "emojic": "^1.1.17", "escape-string-regexp": "^4.0.0", "fast-xml-parser": "^4.2.5", - "glob": "^10.3.0", + "glob": "^10.3.1", "global-agent": "^3.0.0", "got": "^13.0.0", "graphql": "16.7.1", @@ -55,14 +55,14 @@ "node-pg-migrate": "^6.2.2", "parse-link-header": "^2.0.0", "path-to-regexp": "^6.2.1", - "pg": "^8.11.0", + "pg": "^8.11.1", "pretty-bytes": "^6.1.0", "priorityqueuejs": "^2.0.0", "prom-client": "^14.2.0", "qs": "^6.11.2", "query-string": "^8.1.0", "semver": "~7.5.3", - "simple-icons": "9.2.0", + "simple-icons": "9.3.0", "webextension-store-meta": "^1.0.5", "xpath": "~0.0.32" }, @@ -145,7 +145,7 @@ "@docusaurus/core": "^2.0.0", "@easyops-cn/docusaurus-search-local": "^0.35.0", "@mdx-js/react": "^1.6.21", - "@typescript-eslint/parser": "^5.58.0", + "@typescript-eslint/parser": "^5.60.1", "c8": "^8.0.0", "caller": "^1.1.0", "chai": "^4.3.7", @@ -155,7 +155,7 @@ "child-process-promise": "^2.2.1", "clsx": "^1.1.1", "concurrently": "^8.2.0", - "cypress": "^12.15.0", + "cypress": "^12.16.0", "cypress-wait-for-stable-dom": "^0.1.0", "danger": "^11.2.6", "deepmerge": "^4.3.1", @@ -169,7 +169,7 @@ "eslint-plugin-cypress": "^2.13.3", "eslint-plugin-icedfrisby": "^0.1.0", "eslint-plugin-import": "^2.27.5", - "eslint-plugin-jsdoc": "^46.2.6", + "eslint-plugin-jsdoc": "^46.4.2", "eslint-plugin-mocha": "^10.1.0", "eslint-plugin-no-extension-in-require": "^0.2.0", "eslint-plugin-node": "^11.1.0", @@ -182,7 +182,7 @@ "icedfrisby-nock": "^2.1.0", "is-svg": "^5.0.0", "jsdoc": "^4.0.2", - "lint-staged": "^13.2.2", + "lint-staged": "^13.2.3", "lodash.difference": "^4.5.0", "minimist": "^1.2.8", "mocha": "^10.2.0", diff --git a/services/date/date.service.js b/services/date/date.service.js index 32fda7de30e4f..d728db5ca4dac 100644 --- a/services/date/date.service.js +++ b/services/date/date.service.js @@ -9,7 +9,7 @@ const documentation = ` export default class Date extends BaseService { static category = 'other' - static route = { base: 'date', pattern: ':timestamp([0-9]+)' } + static route = { base: 'date', pattern: ':timestamp(-?[0-9]+)' } static examples = [ { diff --git a/services/date/date.tester.js b/services/date/date.tester.js index ec5000da23e66..423cdc601394f 100644 --- a/services/date/date.tester.js +++ b/services/date/date.tester.js @@ -10,6 +10,10 @@ t.create('Relative date') .get('/1540814400.json') .expectBadge({ label: 'date', message: isRelativeFormattedDate }) +t.create('Relative date (negative)') + .get('/-1.json') + .expectBadge({ label: 'date', message: isRelativeFormattedDate }) + t.create('Relative date - Invalid') .get('/9999999999999.json') .expectBadge({ label: 'date', message: 'invalid date' }) diff --git a/services/docker/docker-pulls.service.js b/services/docker/docker-pulls.service.js index e1a8e8a129c42..a3ac7924638a1 100644 --- a/services/docker/docker-pulls.service.js +++ b/services/docker/docker-pulls.service.js @@ -26,6 +26,8 @@ export default class DockerPulls extends BaseJsonService { }, ] + static _cacheLength = 7200 + static defaultBadgeData = { label: 'docker pulls' } static render({ count: downloads }) { diff --git a/services/docker/docker-stars.service.js b/services/docker/docker-stars.service.js index d1aa91e850869..cff58af37bd30 100644 --- a/services/docker/docker-stars.service.js +++ b/services/docker/docker-stars.service.js @@ -26,6 +26,8 @@ export default class DockerStars extends BaseJsonService { }, ] + static _cacheLength = 7200 + static defaultBadgeData = { label: 'docker stars' } static render({ stars }) { diff --git a/services/snyk/snyk-test-helpers.js b/services/snyk/snyk-test-helpers.js deleted file mode 100644 index 9f37e02ecdbe1..0000000000000 --- a/services/snyk/snyk-test-helpers.js +++ /dev/null @@ -1,6 +0,0 @@ -const zeroVulnerabilitiesSvg = - 'vulnerabilitiesvulnerabilities00' -const twoVulnerabilitiesSvg = - 'vulnerabilitiesvulnerabilities22' - -export { zeroVulnerabilitiesSvg, twoVulnerabilitiesSvg } diff --git a/services/snyk/snyk-vulnerability-base.js b/services/snyk/snyk-vulnerability-base.js deleted file mode 100644 index ee25d1dd449c6..0000000000000 --- a/services/snyk/snyk-vulnerability-base.js +++ /dev/null @@ -1,40 +0,0 @@ -import Joi from 'joi' -import { BaseSvgScrapingService } from '../index.js' - -const schema = Joi.object({ - message: Joi.alternatives() - .try(Joi.string().regex(/^\d*$/), Joi.equal('unknown')) - .required(), -}).required() - -export default class SnykVulnerabilityBase extends BaseSvgScrapingService { - static category = 'analysis' - - static defaultBadgeData = { - label: 'vulnerabilities', - } - - static render({ vulnerabilities }) { - let color = 'red' - if (vulnerabilities === '0') { - color = 'brightgreen' - } - return { - message: vulnerabilities, - color, - } - } - - async fetch({ url, searchParams, httpErrors }) { - const { message: vulnerabilities } = await this._requestSvg({ - url, - schema, - options: { - searchParams, - }, - httpErrors, - }) - - return { vulnerabilities } - } -} diff --git a/services/snyk/snyk-vulnerability-github.service.js b/services/snyk/snyk-vulnerability-github.service.js index 7611e4ffd4e6c..afcdbb99a7727 100644 --- a/services/snyk/snyk-vulnerability-github.service.js +++ b/services/snyk/snyk-vulnerability-github.service.js @@ -1,48 +1,11 @@ -import SynkVulnerabilityBase from './snyk-vulnerability-base.js' +import { deprecatedService } from '../index.js' -export default class SnykVulnerabilityGitHub extends SynkVulnerabilityBase { - static route = { +export default deprecatedService({ + category: 'analysis', + route: { base: 'snyk/vulnerabilities/github', - pattern: ':user/:repo/:manifestFilePath*', - } - - static examples = [ - { - title: 'Snyk Vulnerabilities for GitHub Repo', - pattern: ':user/:repo', - namedParams: { - user: 'badges', - repo: 'shields', - }, - staticPreview: this.render({ vulnerabilities: '0' }), - }, - { - title: 'Snyk Vulnerabilities for GitHub Repo (Specific Manifest)', - pattern: ':user/:repo/:manifestFilePath', - namedParams: { - user: 'badges', - repo: 'shields', - manifestFilePath: 'badge-maker/package.json', - }, - staticPreview: this.render({ vulnerabilities: '0' }), - documentation: `

- Provide the path to your target manifest file relative to the base of your repository. - Snyk does not support using a specific branch for this, so do not include "blob" nor a branch name. -

- `, - }, - ] - - async handle({ user, repo, manifestFilePath }) { - const url = `https://snyk.io/test/github/${user}/${repo}/badge.svg` - const searchParams = { targetFile: manifestFilePath } - const { vulnerabilities } = await this.fetch({ - url, - searchParams, - httpErrors: { - 404: 'repo or manifest not found', - }, - }) - return this.constructor.render({ vulnerabilities }) - } -} + pattern: ':various*', + }, + label: 'vulnerabilities', + dateAdded: new Date('2023-07-03'), +}) diff --git a/services/snyk/snyk-vulnerability-github.tester.js b/services/snyk/snyk-vulnerability-github.tester.js index b5fdc00d00306..a9ff28a0c71be 100644 --- a/services/snyk/snyk-vulnerability-github.tester.js +++ b/services/snyk/snyk-vulnerability-github.tester.js @@ -1,94 +1,18 @@ -import Joi from 'joi' -import { createServiceTester } from '../tester.js' -import { - twoVulnerabilitiesSvg, - zeroVulnerabilitiesSvg, -} from './snyk-test-helpers.js' -export const t = await createServiceTester() +import { ServiceTester } from '../tester.js' +export const t = new ServiceTester({ + id: 'SnykVulnerabilityGitHub', + title: 'SnykVulnerabilityGitHub', + pathPrefix: '/snyk/vulnerabilities/github', +}) -t.create('valid repo').get('/snyk/snyk.json').timeout(20000).expectBadge({ +t.create('repo').get('/snyk/snyk.json').expectBadge({ label: 'vulnerabilities', - message: Joi.number().required(), + message: 'no longer available', }) -t.create('non existent repo') - .get('/badges/not-real.json') - .timeout(20000) - .expectBadge({ - label: 'vulnerabilities', - message: 'repo or manifest not found', - }) - -t.create('valid target manifest path') +t.create('manifest path') .get('/snyk/snyk/test/fixtures/demo-os/package.json.json') - .timeout(20000) - .expectBadge({ - label: 'vulnerabilities', - message: Joi.number().required(), - }) - -t.create('invalid target manifest path') - .get('/badges/shields/badge-maker/requirements.txt.json') - .timeout(20000) - .expectBadge({ - label: 'vulnerabilities', - message: 'repo or manifest not found', - }) - -t.create('repo has no vulnerabilities') - .get('/badges/shields.json') - .intercept(nock => - nock('https://snyk.io/test/github/badges/shields') - .get('/badge.svg') - .reply(200, zeroVulnerabilitiesSvg) - ) - .expectBadge({ - label: 'vulnerabilities', - message: '0', - color: 'brightgreen', - }) - -t.create('repo has vulnerabilities') - .get('/badges/shields.json') - .intercept(nock => - nock('https://snyk.io/test/github/badges/shields') - .get('/badge.svg') - .reply(200, twoVulnerabilitiesSvg) - ) - .expectBadge({ - label: 'vulnerabilities', - message: '2', - color: 'red', - }) - -t.create('target manifest file has no vulnerabilities') - .get('/badges/shields/badge-maker/package.json.json') - .intercept(nock => - nock('https://snyk.io/test/github/badges/shields') - .get('/badge.svg') - .query({ - targetFile: 'badge-maker/package.json', - }) - .reply(200, zeroVulnerabilitiesSvg) - ) - .expectBadge({ - label: 'vulnerabilities', - message: '0', - color: 'brightgreen', - }) - -t.create('target manifest file has vulnerabilities') - .get('/badges/shields/badge-maker/package.json.json') - .intercept(nock => - nock('https://snyk.io/test/github/badges/shields') - .get('/badge.svg') - .query({ - targetFile: 'badge-maker/package.json', - }) - .reply(200, twoVulnerabilitiesSvg) - ) .expectBadge({ label: 'vulnerabilities', - message: '2', - color: 'red', + message: 'no longer available', }) diff --git a/services/snyk/snyk-vulnerability-npm.service.js b/services/snyk/snyk-vulnerability-npm.service.js index 5043608400e5d..303204126592f 100644 --- a/services/snyk/snyk-vulnerability-npm.service.js +++ b/services/snyk/snyk-vulnerability-npm.service.js @@ -1,60 +1,11 @@ -import { NotFound } from '../index.js' -import SynkVulnerabilityBase from './snyk-vulnerability-base.js' +import { deprecatedService } from '../index.js' -export default class SnykVulnerabilityNpm extends SynkVulnerabilityBase { - static route = { +export default deprecatedService({ + category: 'analysis', + route: { base: 'snyk/vulnerabilities/npm', - pattern: ':packageName(.+?)', - } - - static examples = [ - { - title: 'Snyk Vulnerabilities for npm package', - pattern: ':packageName', - namedParams: { - packageName: 'mocha', - }, - staticPreview: this.render({ vulnerabilities: '0' }), - }, - { - title: 'Snyk Vulnerabilities for npm package version', - pattern: ':packageName', - namedParams: { - packageName: 'mocha@4.0.0', - }, - staticPreview: this.render({ vulnerabilities: '1' }), - }, - { - title: 'Snyk Vulnerabilities for npm scoped package', - pattern: ':packageName', - namedParams: { - packageName: '@babel/core', - }, - staticPreview: this.render({ vulnerabilities: '0' }), - }, - ] - - async handle({ packageName }) { - const url = `https://snyk.io/test/npm/${packageName}/badge.svg` - - try { - const { vulnerabilities } = await this.fetch({ - url, - // Snyk returns an HTTP 200 with an HTML page when the specified - // npm package is not found that contains the text 404. - // Including this in case Snyk starts returning a 404 response code instead. - httpErrors: { - 404: 'npm package is invalid or does not exist', - }, - }) - return this.constructor.render({ vulnerabilities }) - } catch (e) { - // If the package is invalid/nonexistent Snyk will return an HTML page - // which will result in an InvalidResponse error being thrown by the valueFromSvgBadge() - // function. Catching it here to switch to a more contextualized error message. - throw new NotFound({ - prettyMessage: 'npm package is invalid or does not exist', - }) - } - } -} + pattern: ':various*', + }, + label: 'vulnerabilities', + dateAdded: new Date('2023-07-03'), +}) diff --git a/services/snyk/snyk-vulnerability-npm.tester.js b/services/snyk/snyk-vulnerability-npm.tester.js index 5df48e99502e1..5a44401b2e7f5 100644 --- a/services/snyk/snyk-vulnerability-npm.tester.js +++ b/services/snyk/snyk-vulnerability-npm.tester.js @@ -1,86 +1,20 @@ -import Joi from 'joi' -import { createServiceTester } from '../tester.js' -import { - twoVulnerabilitiesSvg, - zeroVulnerabilitiesSvg, -} from './snyk-test-helpers.js' -export const t = await createServiceTester() - -t.create('valid package latest version') - .get('/commander.json') - .timeout(20000) - .expectBadge({ - label: 'vulnerabilities', - message: Joi.number().required(), - }) - -t.create('valid scoped package latest version') - .get('/@babel/core.json') - .timeout(20000) - .expectBadge({ - label: 'vulnerabilities', - message: Joi.number().required(), - }) - -t.create('non existent package') - .get('/mochaabcdef.json') - .timeout(20000) - .expectBadge({ - label: 'vulnerabilities', - message: 'npm package is invalid or does not exist', - }) - -t.create('valid package specific version') - .get('/commander@2.20.0.json') - .timeout(20000) - .expectBadge({ - label: 'vulnerabilities', - message: Joi.number().required(), - }) - -t.create('non existent package version') - .get('/gh-badges@0.3.4.json') - .timeout(20000) - .expectBadge({ - label: 'vulnerabilities', - message: 'npm package is invalid or does not exist', - }) - -t.create('package has no vulnerabilities') - .get('/mocha.json') - .intercept(nock => - nock('https://snyk.io/test/npm/mocha') - .get('/badge.svg') - .reply(200, zeroVulnerabilitiesSvg) - ) - .expectBadge({ - label: 'vulnerabilities', - message: '0', - color: 'brightgreen', - }) - -t.create('package has vulnerabilities') - .get('/mocha.json') - .intercept(nock => - nock('https://snyk.io/test/npm/mocha') - .get('/badge.svg') - .reply(200, twoVulnerabilitiesSvg) - ) - .expectBadge({ - label: 'vulnerabilities', - message: '2', - color: 'red', - }) - -t.create('package not found') - .get('/not-mocha-fake-ish@13.0.0.json') - .intercept(nock => - nock('https://snyk.io/test/npm/not-mocha-fake-ish@13.0.0') - .get('/badge.svg') - .reply(200, 'foo') - ) - .expectBadge({ - label: 'vulnerabilities', - message: 'npm package is invalid or does not exist', - color: 'red', - }) +import { ServiceTester } from '../tester.js' +export const t = new ServiceTester({ + id: 'SnykVulnerabilityNpm', + title: 'SnykVulnerabilityNpm', + pathPrefix: '/snyk/vulnerabilities/npm', +}) +t.create('latest version').get('/commander.json').expectBadge({ + label: 'vulnerabilities', + message: 'no longer available', +}) + +t.create('scoped package latest version').get('/@babel/core.json').expectBadge({ + label: 'vulnerabilities', + message: 'no longer available', +}) + +t.create('package specific version').get('/commander@2.20.0.json').expectBadge({ + label: 'vulnerabilities', + message: 'no longer available', +}) diff --git a/services/youtube/youtube-base.js b/services/youtube/youtube-base.js index e1c70d19b3d45..b66de4b4ef659 100644 --- a/services/youtube/youtube-base.js +++ b/services/youtube/youtube-base.js @@ -4,8 +4,10 @@ import { metric } from '../text-formatters.js' import { nonNegativeInteger } from '../validators.js' const documentation = ` -By using the YouTube badges provided by Shields.io, you are agreeing to be bound by the YouTube Terms of Service. -These can be found here: [https://www.youtube.com/t/terms](https://www.youtube.com/t/terms)` +The YouTube badges provided by Shields.io leverage the YouTube API Services. By using this badge, you are: +* agreeing to be bound by the YouTube Terms of Service, which can be found here: [https://www.youtube.com/t/terms](https://www.youtube.com/t/terms) +* acknowledging and accepting the Google Privacy Policy, which can be found here: [https://policies.google.com/privacy](https://policies.google.com/privacy) +` const schema = Joi.object({ pageInfo: Joi.object({