From 1de5789a90ee5ff5dfab7ab7329f3ce1c28b06d8 Mon Sep 17 00:00:00 2001 From: Mix <32300164+mnixry@users.noreply.github.com> Date: Fri, 22 Mar 2024 22:50:23 +0800 Subject: [PATCH 01/99] fix(route): fix indentation issue in ABC news description (#14912) --- lib/routes/abc/index.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/routes/abc/index.ts b/lib/routes/abc/index.ts index aa1f0121fe..ea5dd7992f 100644 --- a/lib/routes/abc/index.ts +++ b/lib/routes/abc/index.ts @@ -22,13 +22,14 @@ export const route: Route = { }, name: 'Channel & Topic', categories: ['traditional-media'], - description: `:::tip - All Topics in [Topic Library](https://abc.net.au/news/topics) are supported, you can fill in the field after \`topic\` in its URL, or fill in the \`documentId\`. + description: ` + :::tip + All Topics in [Topic Library](https://abc.net.au/news/topics) are supported, you can fill in the field after \`topic\` in its URL, or fill in the \`documentId\`. - For example, the URL for [Computer Science](https://www.abc.net.au/news/topic/computer-science) is \`https://www.abc.net.au/news/topic/computer-science\`, the \`category\` is \`news/topic/computer-science\`, and the \`documentId\` of the Topic is \`2302\`, so the route is [/abc/news/topic/computer-science](https://rsshub.app/abc/news/topic/computer-science) and [/abc/2302](https://rsshub.app/abc/2302). + For example, the URL for [Computer Science](https://www.abc.net.au/news/topic/computer-science) is \`https://www.abc.net.au/news/topic/computer-science\`, the \`category\` is \`news/topic/computer-science\`, and the \`documentId\` of the Topic is \`2302\`, so the route is [/abc/news/topic/computer-science](https://rsshub.app/abc/news/topic/computer-science) and [/abc/2302](https://rsshub.app/abc/2302). - The supported channels are all listed in the table below. For other channels, please find the \`documentId\` in the source code of the channel page and fill it in as above. - :::`, + The supported channels are all listed in the table below. For other channels, please find the \`documentId\` in the source code of the channel page and fill it in as above. + :::`, maintainers: ['nczitzk'], handler, }; From 3e91889f72460ff280617f4fcd80fdb87e9ffd39 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Mar 2024 16:47:42 +0000 Subject: [PATCH 02/99] chore(deps): bump @hono/zod-openapi from 0.9.8 to 0.9.9 (#14914) * chore(deps): bump @hono/zod-openapi from 0.9.8 to 0.9.9 Bumps [@hono/zod-openapi](https://github.com/honojs/middleware) from 0.9.8 to 0.9.9. - [Release notes](https://github.com/honojs/middleware/releases) - [Commits](https://github.com/honojs/middleware/compare/@hono/zod-openapi@0.9.8...@hono/zod-openapi@0.9.9) --- updated-dependencies: - dependency-name: "@hono/zod-openapi" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * chore: fix pnpm install --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 670 +++++++++++++++++++++++-------------------------- 2 files changed, 316 insertions(+), 356 deletions(-) diff --git a/package.json b/package.json index 81bae96eed..e74d478e45 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "dependencies": { "@hono/node-server": "1.8.2", "@hono/swagger-ui": "0.2.1", - "@hono/zod-openapi": "0.9.8", + "@hono/zod-openapi": "0.9.9", "@notionhq/client": "2.2.14", "@postlight/parser": "2.2.3", "@sentry/node": "7.107.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 387bc28e98..774a1c6cca 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,8 +12,8 @@ dependencies: specifier: 0.2.1 version: 0.2.1(hono@4.1.3) '@hono/zod-openapi': - specifier: 0.9.8 - version: 0.9.8(hono@4.1.3)(zod@3.22.4) + specifier: 0.9.9 + version: 0.9.9(hono@4.1.3)(zod@3.22.4) '@notionhq/client': specifier: 2.2.14 version: 2.2.14 @@ -216,10 +216,10 @@ dependencies: devDependencies: '@babel/preset-env': specifier: 7.24.3 - version: 7.24.3(@babel/core@7.24.3) + version: 7.24.3(@babel/core@7.23.9) '@babel/preset-typescript': specifier: 7.24.1 - version: 7.24.1(@babel/core@7.24.3) + version: 7.24.1(@babel/core@7.23.9) '@microsoft/eslint-formatter-sarif': specifier: 3.0.0 version: 3.0.0 @@ -380,14 +380,6 @@ packages: '@jridgewell/trace-mapping': 0.3.22 dev: true - /@ampproject/remapping@2.3.0: - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - dev: true - /@asteasolutions/zod-to-openapi@5.5.0(zod@3.22.4): resolution: {integrity: sha512-d5HwrvM6dOKr3XdeF+DmashGvfEc+1oiEfbscugsiwSTrFtuMa7ETpW9sTNnVgn+hJaz+PRxPQUYD7q9/5dUig==} peerDependencies: @@ -410,32 +402,24 @@ packages: '@babel/highlight': 7.23.4 chalk: 2.4.2 - /@babel/code-frame@7.24.2: - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.24.2 - picocolors: 1.0.0 - dev: true - /@babel/compat-data@7.24.1: resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==} engines: {node: '>=6.9.0'} dev: true - /@babel/core@7.24.3: - resolution: {integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==} + /@babel/core@7.23.9: + resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==} engines: {node: '>=6.9.0'} dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.1 + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) - '@babel/helpers': 7.24.1 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) + '@babel/helpers': 7.23.9 '@babel/parser': 7.24.1 '@babel/template': 7.24.0 - '@babel/traverse': 7.24.1 + '@babel/traverse': 7.23.9 '@babel/types': 7.24.0 convert-source-map: 2.0.0 debug: 4.3.4 @@ -446,12 +430,12 @@ packages: - supports-color dev: true - /@babel/generator@7.24.1: - resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==} + /@babel/generator@7.23.6: + resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.24.0 - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 dev: true @@ -481,42 +465,42 @@ packages: semver: 6.3.1 dev: true - /@babel/helper-create-class-features-plugin@7.24.1(@babel/core@7.24.3): + /@babel/helper-create-class-features-plugin@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3) + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.23.9) '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 dev: true - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.3): + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.9): resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 regexpu-core: 5.3.2 semver: 6.3.1 dev: true - /@babel/helper-define-polyfill-provider@0.6.1(@babel/core@7.24.3): + /@babel/helper-define-polyfill-provider@0.6.1(@babel/core@7.23.9): resolution: {integrity: sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.24.0 debug: 4.3.4 @@ -560,13 +544,13 @@ packages: '@babel/types': 7.24.0 dev: true - /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3): + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-module-imports': 7.24.1 '@babel/helper-simple-access': 7.22.5 @@ -586,25 +570,25 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.3): + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.9): resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.22.20 dev: true - /@babel/helper-replace-supers@7.24.1(@babel/core@7.24.3): + /@babel/helper-replace-supers@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 @@ -654,12 +638,12 @@ packages: '@babel/types': 7.24.0 dev: true - /@babel/helpers@7.24.1: - resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==} + /@babel/helpers@7.23.9: + resolution: {integrity: sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.24.0 - '@babel/traverse': 7.24.1 + '@babel/traverse': 7.23.9 '@babel/types': 7.24.0 transitivePeerDependencies: - supports-color @@ -673,16 +657,6 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/highlight@7.24.2: - resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.0 - dev: true - /@babel/parser@7.23.9: resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} engines: {node: '>=6.0.0'} @@ -699,895 +673,895 @@ packages: '@babel/types': 7.24.0 dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.3): + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.3): + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.23.9) dev: true - /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.3): + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.3): + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.9): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.3): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.9): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.3): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.9): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.3): + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.9): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.3): + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.3): + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.3): + /@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.3): + /@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.3): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.9): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.3): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.3): + /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.3): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.9): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.3): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.3): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.9): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.3): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.3): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.3): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.3): + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.9): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.3): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.9): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.3): + /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.3): + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.3): + /@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.23.9): resolution: {integrity: sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.3) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.3) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.9) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-module-imports': 7.24.1 '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.3) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-block-scoping@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-block-scoping@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) + '@babel/core': 7.23.9 + '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-class-static-block@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-class-static-block@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) + '@babel/core': 7.23.9 + '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.3) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-classes@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-classes@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3) + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.23.9) '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 dev: true - /@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 '@babel/template': 7.24.0 dev: true - /@babel/plugin-transform-destructuring@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-destructuring@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-for-of@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true - /@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-function-name@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-literals@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.3) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/core': 7.23.9 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/core': 7.23.9 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-simple-access': 7.22.5 dev: true - /@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-validator-identifier': 7.22.20 dev: true - /@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/core': 7.23.9 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.3): + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.9): resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-new-target@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.3) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-object-rest-spread@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-object-rest-spread@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-object-super@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3) + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-optional-chaining@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-optional-chaining@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-parameters@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-parameters@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) + '@babel/core': 7.23.9 + '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-private-property-in-object@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-private-property-in-object@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) + '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.3) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 regenerator-transform: 0.15.2 dev: true - /@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-spread@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true - /@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-typeof-symbol@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-typeof-symbol@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-typescript@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-typescript@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-liYSESjX2fZ7JyBFkYG78nfvHlMKE6IpNdTVnxmlYUR+j5ZLsitFbaAE+eJSK2zPPkNWNw4mXL51rQ8WrvdK0w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) + '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/preset-env@7.24.3(@babel/core@7.24.3): + /@babel/preset-env@7.24.3(@babel/core@7.23.9): resolution: {integrity: sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.24.1 - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.3) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.3) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.3) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.3) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.3) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.3) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.3) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.3) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.3) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.3) - '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.24.3) - '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-block-scoping': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-class-static-block': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-classes': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-destructuring': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.3) - '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-object-rest-spread': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-private-property-in-object': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-typeof-symbol': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.24.3) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.3) - babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.3) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.3) - babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.24.3) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.9) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.9) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.9) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.9) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.9) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.23.9) + '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-block-scoping': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-class-static-block': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-classes': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-destructuring': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-object-rest-spread': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-private-property-in-object': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-typeof-symbol': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.23.9) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.9) + babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.23.9) + babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.23.9) + babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.23.9) core-js-compat: 3.36.1 semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.3): + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.9): resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 '@babel/types': 7.24.0 esutils: 2.0.3 dev: true - /@babel/preset-typescript@7.24.1(@babel/core@7.24.3): + /@babel/preset-typescript@7.24.1(@babel/core@7.23.9): resolution: {integrity: sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-typescript': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-typescript': 7.24.1(@babel/core@7.23.9) dev: true /@babel/regjsgen@0.8.0: @@ -1618,12 +1592,12 @@ packages: '@babel/types': 7.24.0 dev: true - /@babel/traverse@7.24.1: - resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} + /@babel/traverse@7.23.9: + resolution: {integrity: sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.1 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 @@ -1909,8 +1883,8 @@ packages: hono: 4.1.3 dev: false - /@hono/zod-openapi@0.9.8(hono@4.1.3)(zod@3.22.4): - resolution: {integrity: sha512-NS6lvQEGnsjyQkp+aQjMARREz3WGf19y0+RiiJMVrihWlmKbGaJkPuOWpfFQG6FU9q+FVUyUCryXK+3J07GPAw==} + /@hono/zod-openapi@0.9.9(hono@4.1.3)(zod@3.22.4): + resolution: {integrity: sha512-Icak3c8WKNS1gFDWmYs2zJ7ra3js9lDeAXNPf5h3fa0SnJQcjcCrLaG6EZPPAbW92HRwCDeQt8yA/ZVp17HPFg==} engines: {node: '>=16.0.0'} peerDependencies: hono: '>=3.11.3' @@ -1985,15 +1959,6 @@ packages: '@jridgewell/trace-mapping': 0.3.22 dev: true - /@jridgewell/gen-mapping@0.3.5: - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 - dev: true - /@jridgewell/resolve-uri@3.1.2: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -2004,11 +1969,6 @@ packages: engines: {node: '>=6.0.0'} dev: true - /@jridgewell/set-array@1.2.1: - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - dev: true - /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: true @@ -3224,38 +3184,38 @@ packages: resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} dev: false - /babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.24.3): + /babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.23.9): resolution: {integrity: sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: '@babel/compat-data': 7.24.1 - '@babel/core': 7.24.3 - '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.3) + '@babel/core': 7.23.9 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.23.9) semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.3): + /babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.23.9): resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.3) + '@babel/core': 7.23.9 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.23.9) core-js-compat: 3.36.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-regenerator@0.6.1(@babel/core@7.24.3): + /babel-plugin-polyfill-regenerator@0.6.1(@babel/core@7.23.9): resolution: {integrity: sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.3) + '@babel/core': 7.23.9 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.23.9) transitivePeerDependencies: - supports-color dev: true @@ -3277,8 +3237,8 @@ packages: dev: false optional: true - /bare-fs@2.2.2: - resolution: {integrity: sha512-X9IqgvyB0/VA5OZJyb5ZstoN62AzD7YxVGog13kkfYWYqJYcK0kcqLZ6TrmH5qr4/8//ejVcX4x/a0UvaogXmA==} + /bare-fs@2.1.5: + resolution: {integrity: sha512-5t0nlecX+N2uJqdxe9d18A98cp2u9BETelbjKpiVgQqzzmVNFYWEAjQHqS+2Khgto1vcwhik9cXucaj5ve2WWA==} requiresBuild: true dependencies: bare-events: 2.2.0 @@ -3450,7 +3410,7 @@ packages: http-cache-semantics: 4.1.1 keyv: 4.5.4 mimic-response: 4.0.0 - normalize-url: 8.0.1 + normalize-url: 8.0.0 responselike: 3.0.0 dev: false @@ -6851,8 +6811,8 @@ packages: validate-npm-package-license: 3.0.4 dev: true - /normalize-url@8.0.1: - resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} + /normalize-url@8.0.0: + resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==} engines: {node: '>=14.16'} dev: false @@ -8406,7 +8366,7 @@ packages: pump: 3.0.0 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 2.2.2 + bare-fs: 2.1.5 bare-path: 2.1.0 dev: false From df5629d384a13c6268893565c65b13304bf5db40 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 23 Mar 2024 01:14:03 +0800 Subject: [PATCH 03/99] chore(deps): bump @sentry/node from 7.107.0 to 7.108.0 (#14915) * chore(deps): bump @sentry/node from 7.107.0 to 7.108.0 Bumps [@sentry/node](https://github.com/getsentry/sentry-javascript) from 7.107.0 to 7.108.0. - [Release notes](https://github.com/getsentry/sentry-javascript/releases) - [Changelog](https://github.com/getsentry/sentry-javascript/blob/7.108.0/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-javascript/compare/7.107.0...7.108.0) --- updated-dependencies: - dependency-name: "@sentry/node" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * chore: fix pnpm install --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 44 ++++++++++++++++++++++---------------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index e74d478e45..b683f73df9 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "@hono/zod-openapi": "0.9.9", "@notionhq/client": "2.2.14", "@postlight/parser": "2.2.3", - "@sentry/node": "7.107.0", + "@sentry/node": "7.108.0", "@tonyrl/rand-user-agent": "2.0.55", "aes-js": "3.1.2", "art-template": "4.13.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 774a1c6cca..ed962c29ff 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ dependencies: specifier: 2.2.3 version: 2.2.3 '@sentry/node': - specifier: 7.107.0 - version: 7.107.0 + specifier: 7.108.0 + version: 7.108.0 '@tonyrl/rand-user-agent': specifier: 2.0.55 version: 2.0.55 @@ -2288,43 +2288,43 @@ packages: selderee: 0.11.0 dev: false - /@sentry-internal/tracing@7.107.0: - resolution: {integrity: sha512-le9wM8+OHBbq7m/8P7JUJ1UhSPIty+Z/HmRXc5Z64ODZcOwFV6TmDpYx729IXDdz36XUKmeI+BeM7yQdTTZPfQ==} + /@sentry-internal/tracing@7.108.0: + resolution: {integrity: sha512-zuK5XsTsb+U+hgn3SPetYDAogrXsM16U/LLoMW7+TlC6UjlHGYQvmX3o+M2vntejoU1QZS8m1bCAZSMWEypAEw==} engines: {node: '>=8'} dependencies: - '@sentry/core': 7.107.0 - '@sentry/types': 7.107.0 - '@sentry/utils': 7.107.0 + '@sentry/core': 7.108.0 + '@sentry/types': 7.108.0 + '@sentry/utils': 7.108.0 dev: false - /@sentry/core@7.107.0: - resolution: {integrity: sha512-C7ogye6+KPyBi8NVL0P8Rxx3Ur7Td8ufnjxosVy678lqY+dcYPk/HONROrzUFYW5fMKWL4/KYnwP+x9uHnkDmw==} + /@sentry/core@7.108.0: + resolution: {integrity: sha512-I/VNZCFgLASxHZaD0EtxZRM34WG9w2gozqgrKGNMzAymwmQ3K9g/1qmBy4e6iS3YRptb7J5UhQkZQHrcwBbjWQ==} engines: {node: '>=8'} dependencies: - '@sentry/types': 7.107.0 - '@sentry/utils': 7.107.0 + '@sentry/types': 7.108.0 + '@sentry/utils': 7.108.0 dev: false - /@sentry/node@7.107.0: - resolution: {integrity: sha512-UZXkG7uThT2YyPW8AOSKRXp1LbVcBHufa4r1XAwBukA2FKO6HHJPjMUgY6DYVQ6k+BmA56CNfVjYrdLbyjBYYA==} + /@sentry/node@7.108.0: + resolution: {integrity: sha512-pMxc9txnDDkU4Z8k2Uw/DPSLPehNtWV3mjJ3+my0AMORGYrXLkJI93tddlE5z/7k+GEJdj1HsOLgxUN0OU+HGA==} engines: {node: '>=8'} dependencies: - '@sentry-internal/tracing': 7.107.0 - '@sentry/core': 7.107.0 - '@sentry/types': 7.107.0 - '@sentry/utils': 7.107.0 + '@sentry-internal/tracing': 7.108.0 + '@sentry/core': 7.108.0 + '@sentry/types': 7.108.0 + '@sentry/utils': 7.108.0 dev: false - /@sentry/types@7.107.0: - resolution: {integrity: sha512-H7qcPjPSUWHE/Zf5bR1EE24G0pGVuJgrSx8Tvvl5nKEepswMYlbXHRVSDN0gTk/E5Z7cqf+hUBOpkQgZyps77w==} + /@sentry/types@7.108.0: + resolution: {integrity: sha512-bKtHITmBN3kqtqE5eVvL8mY8znM05vEodENwRpcm6TSrrBjC2RnwNWVwGstYDdHpNfFuKwC8mLY9bgMJcENo8g==} engines: {node: '>=8'} dev: false - /@sentry/utils@7.107.0: - resolution: {integrity: sha512-C6PbN5gHh73MRHohnReeQ60N8rrLYa9LciHue3Ru2290eSThg4CzsPnx4SzkGpkSeVlhhptKtKZ+hp/ha3iVuw==} + /@sentry/utils@7.108.0: + resolution: {integrity: sha512-a45yEFD5qtgZaIFRAcFkG8C8lnDzn6t4LfLXuV4OafGAy/3ZAN3XN8wDnrruHkiUezSSANGsLg3bXaLW/JLvJw==} engines: {node: '>=8'} dependencies: - '@sentry/types': 7.107.0 + '@sentry/types': 7.108.0 dev: false /@sinclair/typebox@0.27.8: From 7cd8f9c11b8108c96cbb125eb7ae7730751d4380 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 23 Mar 2024 01:29:57 +0800 Subject: [PATCH 04/99] chore(deps): bump tldts from 6.1.13 to 6.1.14 (#14916) * chore(deps): bump tldts from 6.1.13 to 6.1.14 Bumps [tldts](https://github.com/remusao/tldts) from 6.1.13 to 6.1.14. - [Release notes](https://github.com/remusao/tldts/releases) - [Changelog](https://github.com/remusao/tldts/blob/master/CHANGELOG.md) - [Commits](https://github.com/remusao/tldts/compare/v6.1.13...v6.1.14) --- updated-dependencies: - dependency-name: tldts dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * chore: fix pnpm install --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index b683f73df9..b84ecb4a3f 100644 --- a/package.json +++ b/package.json @@ -108,7 +108,7 @@ "telegram": "2.20.2", "tiny-async-pool": "2.1.0", "title": "3.5.3", - "tldts": "6.1.13", + "tldts": "6.1.14", "tough-cookie": "4.1.3", "tsx": "4.7.1", "twitter-api-v2": "1.16.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ed962c29ff..85dffb7859 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -189,8 +189,8 @@ dependencies: specifier: 3.5.3 version: 3.5.3 tldts: - specifier: 6.1.13 - version: 6.1.13 + specifier: 6.1.14 + version: 6.1.14 tough-cookie: specifier: 4.1.3 version: 4.1.3 @@ -8483,15 +8483,15 @@ packages: hasBin: true dev: false - /tldts-core@6.1.13: - resolution: {integrity: sha512-M1XP4D13YtXARKroULnLsKKuI1NCRAbJmUGGoXqWinajIDOhTeJf/trYUyBoLVx1/Nx1KBKxCrlW57ZW9cMHAA==} + /tldts-core@6.1.14: + resolution: {integrity: sha512-McyMQkkIUFYhfs3FPTxTn+5mewxERhfwy2x7TWHkBPb1poKaTBJhXehtuMg0FrhXp53J5eXRfvSD/oH/3mk/2A==} dev: false - /tldts@6.1.13: - resolution: {integrity: sha512-+GxHFKVHvUTg2ieNPTx3b/NpZbgJSTZEDdI4cJzTjVYDuxijeHi1tt7CHHsMjLqyc+T50VVgWs3LIb2LrXOzxw==} + /tldts@6.1.14: + resolution: {integrity: sha512-zGbimRt9fHP68Gbj5fGWmR90xiuRDK/iYukHevT9mcG6Job+HfR119D9DSr6voFWjpStJwOtVfWGpbhNYVwt3A==} hasBin: true dependencies: - tldts-core: 6.1.13 + tldts-core: 6.1.14 dev: false /tmp@0.0.33: From e5a9fd46eeb55153a4ba4ad23d4da2586d01fb6b Mon Sep 17 00:00:00 2001 From: DIYgod Date: Sat, 23 Mar 2024 02:03:55 +0800 Subject: [PATCH 05/99] feat: use ofetch imitate got --- lib/utils/got-deprecated.ts | 79 +++++++++++++++++++++ lib/utils/got.ts | 133 ++++++++++++++++-------------------- lib/utils/ofetch.ts | 17 +++++ package.json | 2 + pnpm-lock.yaml | 26 +++++++ 5 files changed, 181 insertions(+), 76 deletions(-) create mode 100644 lib/utils/got-deprecated.ts create mode 100644 lib/utils/ofetch.ts diff --git a/lib/utils/got-deprecated.ts b/lib/utils/got-deprecated.ts new file mode 100644 index 0000000000..d99ddc3f6d --- /dev/null +++ b/lib/utils/got-deprecated.ts @@ -0,0 +1,79 @@ +import logger from '@/utils/logger'; +import { config } from '@/config'; +import got, { CancelableRequest, Response as GotResponse, OptionsInit, Options, Got } from 'got'; + +type Response = GotResponse & { + data: T; + status: number; +}; + +type GotRequestFunction = { + (url: string | URL, options?: Options): CancelableRequest>>; + (url: string | URL, options?: Options): CancelableRequest>; + (options: Options): CancelableRequest>>; + (options: Options): CancelableRequest>; +}; + +// @ts-expect-error got instance with custom response type +const custom: { + all?: (list: Array>) => Promise>; + get: GotRequestFunction; + post: GotRequestFunction; + put: GotRequestFunction; + patch: GotRequestFunction; + head: GotRequestFunction; + delete: GotRequestFunction; +} & GotRequestFunction & + Got = got.extend({ + retry: { + limit: config.requestRetry, + statusCodes: [400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 421, 422, 423, 424, 426, 428, 429, 431, 451, 500, 501, 502, 503, 504, 505, 506, 507, 508, 510, 511, 521, 522, 524], + }, + hooks: { + beforeRetry: [ + (err, count) => { + logger.error(`Request ${err.options.url} fail, retry attempt #${count}: ${err}`); + }, + ], + beforeRedirect: [ + (options, response) => { + logger.http(`Redirecting to ${options.url} for ${response.requestUrl}`); + }, + ], + afterResponse: [ + // @ts-expect-error custom response type + (response: Response>) => { + try { + response.data = typeof response.body === 'string' ? JSON.parse(response.body) : response.body; + } catch { + // @ts-expect-error for compatibility + response.data = response.body; + } + response.status = response.statusCode; + return response; + }, + ], + init: [ + ( + options: OptionsInit & { + data?: string; + } + ) => { + // compatible with axios api + if (options && options.data) { + options.body = options.body || options.data; + } + }, + ], + }, + headers: { + 'user-agent': config.ua, + }, + timeout: { + request: config.requestTimeout, + }, +}); +custom.all = (list) => Promise.all(list); + +export default custom; +export type { Response, Options } from 'got'; diff --git a/lib/utils/got.ts b/lib/utils/got.ts index d99ddc3f6d..6701fd5021 100644 --- a/lib/utils/got.ts +++ b/lib/utils/got.ts @@ -1,79 +1,60 @@ -import logger from '@/utils/logger'; -import { config } from '@/config'; -import got, { CancelableRequest, Response as GotResponse, OptionsInit, Options, Got } from 'got'; +import { destr } from 'destr'; +import ofetch from '@/utils/ofetch'; -type Response = GotResponse & { - data: T; - status: number; -}; - -type GotRequestFunction = { - (url: string | URL, options?: Options): CancelableRequest>>; - (url: string | URL, options?: Options): CancelableRequest>; - (options: Options): CancelableRequest>>; - (options: Options): CancelableRequest>; -}; - -// @ts-expect-error got instance with custom response type -const custom: { - all?: (list: Array>) => Promise>; - get: GotRequestFunction; - post: GotRequestFunction; - put: GotRequestFunction; - patch: GotRequestFunction; - head: GotRequestFunction; - delete: GotRequestFunction; -} & GotRequestFunction & - Got = got.extend({ - retry: { - limit: config.requestRetry, - statusCodes: [400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 421, 422, 423, 424, 426, 428, 429, 431, 451, 500, 501, 502, 503, 504, 505, 506, 507, 508, 510, 511, 521, 522, 524], - }, - hooks: { - beforeRetry: [ - (err, count) => { - logger.error(`Request ${err.options.url} fail, retry attempt #${count}: ${err}`); - }, - ], - beforeRedirect: [ - (options, response) => { - logger.http(`Redirecting to ${options.url} for ${response.requestUrl}`); - }, - ], - afterResponse: [ - // @ts-expect-error custom response type - (response: Response>) => { - try { - response.data = typeof response.body === 'string' ? JSON.parse(response.body) : response.body; - } catch { - // @ts-expect-error for compatibility - response.data = response.body; - } - response.status = response.statusCode; - return response; - }, - ], - init: [ - ( - options: OptionsInit & { - data?: string; - } - ) => { - // compatible with axios api - if (options && options.data) { - options.body = options.body || options.data; - } - }, - ], - }, - headers: { - 'user-agent': config.ua, - }, - timeout: { - request: config.requestTimeout, - }, +const gotofetch = ofetch.create({ + parseResponse: (responseText) => ({ + data: destr(responseText), + body: responseText, + }), }); -custom.all = (list) => Promise.all(list); -export default custom; -export type { Response, Options } from 'got'; +const getFakeGot = (defaultOptions?: any) => { + const fakeGot = (request, options) => { + if (options?.hooks?.beforeRequest) { + for (const hook of options.hooks.beforeRequest) { + hook(options); + } + } + if (!(typeof request === 'string' || request instanceof Request) && request.url) { + options = { + ...request, + ...options, + }; + request = request.url; + } + + options = { + ...defaultOptions, + ...options, + }; + + if (options?.json && !options.body) { + options.body = options.json; + } + if (options?.form && !options.body) { + const body = new FormData(); + for (const key in options.form) { + body.append(key, options.form[key]); + } + options.body = body; + if (!options.headers) { + options.headers = {}; + } + options.headers['Content-Type'] = 'application/x-www-form-urlencoded'; + } + + return gotofetch(request, options); + }; + + fakeGot.get = (request, options) => fakeGot(request, { ...options, method: 'GET' }); + fakeGot.post = (request, options) => fakeGot(request, { ...options, method: 'POST' }); + fakeGot.put = (request, options) => fakeGot(request, { ...options, method: 'PUT' }); + fakeGot.patch = (request, options) => fakeGot(request, { ...options, method: 'PATCH' }); + fakeGot.head = (request, options) => fakeGot(request, { ...options, method: 'HEAD' }); + fakeGot.delete = (request, options) => fakeGot(request, { ...options, method: 'DELETE' }); + fakeGot.extend = (options) => getFakeGot(options); + + return fakeGot; +}; + +export default getFakeGot(); diff --git a/lib/utils/ofetch.ts b/lib/utils/ofetch.ts new file mode 100644 index 0000000000..c02204862f --- /dev/null +++ b/lib/utils/ofetch.ts @@ -0,0 +1,17 @@ +import { ofetch } from 'ofetch'; +import { config } from '@/config'; +import logger from '@/utils/logger'; + +const rofetch = ofetch.create({ + retry: config.requestRetry, + retryDelay: 1000, + timeout: config.requestTimeout, + headers: { + 'user-agent': config.ua, + }, + onRequestError({ request, error }) { + logger.error(`Request ${request.url} fail: ${error}`); + }, +}); + +export default rofetch; diff --git a/package.json b/package.json index 81bae96eed..c27f74fc58 100644 --- a/package.json +++ b/package.json @@ -63,6 +63,7 @@ "crypto-js": "4.2.0", "currency-symbol-map": "5.1.0", "dayjs": "1.11.8", + "destr": "2.0.3", "directory-import": "3.2.1", "dotenv": "16.4.5", "entities": "4.5.0", @@ -89,6 +90,7 @@ "module-alias": "2.2.3", "notion-to-md": "3.1.1", "oauth-1.0a": "2.2.6", + "ofetch": "1.3.4", "otplib": "12.0.1", "pac-proxy-agent": "7.0.1", "proxy-chain": "2.4.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 387bc28e98..aa2ee63b06 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,6 +53,9 @@ dependencies: dayjs: specifier: 1.11.8 version: 1.11.8 + destr: + specifier: 2.0.3 + version: 2.0.3 directory-import: specifier: 3.2.1 version: 3.2.1 @@ -131,6 +134,9 @@ dependencies: oauth-1.0a: specifier: 2.2.6 version: 2.2.6 + ofetch: + specifier: 1.3.4 + version: 1.3.4 otplib: specifier: 12.0.1 version: 12.0.1 @@ -4085,6 +4091,10 @@ packages: engines: {node: '>=6'} dev: true + /destr@2.0.3: + resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} + dev: false + /detect-libc@2.0.2: resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} engines: {node: '>=8'} @@ -6798,6 +6808,10 @@ packages: - supports-color dev: true + /node-fetch-native@1.6.4: + resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} + dev: false + /node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -6920,6 +6934,14 @@ packages: /object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + /ofetch@1.3.4: + resolution: {integrity: sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==} + dependencies: + destr: 2.0.3 + node-fetch-native: 1.6.4 + ufo: 1.5.3 + dev: false + /on-exit-leak-free@2.1.2: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} @@ -8764,6 +8786,10 @@ packages: resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} dev: true + /ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + dev: false + /uglify-js@3.4.10: resolution: {integrity: sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==} engines: {node: '>=0.8.0'} From 847fdaba1d6abd239b510d17c6f29bc83ca551ad Mon Sep 17 00:00:00 2001 From: Tony Date: Sat, 23 Mar 2024 08:19:05 +0800 Subject: [PATCH 06/99] chore: fix route test github actions (#14923) * chore: fix route test actions * chore: bump unified --- .github/dependabot.yml | 2 - .github/workflows/comment-on-issue.yml | 10 +- .github/workflows/docker-test-cont.yml | 21 +- .github/workflows/issue-command.yml | 9 +- lib/views/error.tsx | 13 +- package.json | 3 +- pnpm-lock.yaml | 875 ++++++++++-------- ...call-maintainer.js => call-maintainer.mjs} | 31 +- .../test-route/{identify.js => identify.mjs} | 36 +- scripts/workflow/test-route/test.js | 103 --- scripts/workflow/test-route/test.mjs | 92 ++ 11 files changed, 664 insertions(+), 531 deletions(-) rename scripts/workflow/test-issue/{call-maintainer.js => call-maintainer.mjs} (87%) rename scripts/workflow/test-route/{identify.js => identify.mjs} (77%) delete mode 100644 scripts/workflow/test-route/test.js create mode 100644 scripts/workflow/test-route/test.mjs diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 9aa571cd5e..845d7d382e 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -11,8 +11,6 @@ updates: ignore: - dependency-name: jsrsasign versions: ['>=11.0.0'] # no longer includes KJUR.crypto.Cipher for RSA - - dependency-name: unified - versions: ['>=10.0.0'] - package-ecosystem: 'github-actions' directory: '/' diff --git a/.github/workflows/comment-on-issue.yml b/.github/workflows/comment-on-issue.yml index 3fea22cb68..9ef4dd5619 100644 --- a/.github/workflows/comment-on-issue.yml +++ b/.github/workflows/comment-on-issue.yml @@ -15,16 +15,16 @@ jobs: - uses: pnpm/action-setup@v3 with: version: 8 - - uses: actions/setup-node@v4 # just need its cache + - uses: actions/setup-node@v4 with: node-version: lts/* cache: 'pnpm' - - name: Install dependencies (pnpm) # needed since we need to parse markdown, so we also use got instead + - name: Install dependencies (pnpm) # import remark-parse and unified run: pnpm i - name: Generate feedback uses: actions/github-script@v7 with: - github-token: ${{secrets.GITHUB_TOKEN}} + github-token: ${{ secrets.GITHUB_TOKEN }} script: | - const script = require(`${process.env.GITHUB_WORKSPACE}/scripts/workflow/test-issue/call-maintainer.js`) - return script({ github, context, core }) + const { default: callMaintainer } = await import('${{ github.workspace }}/scripts/workflow/test-issue/call-maintainer.mjs') + await callMaintainer({ github, context, core }) diff --git a/.github/workflows/docker-test-cont.yml b/.github/workflows/docker-test-cont.yml index 05f9f6f003..4ab535a2d1 100644 --- a/.github/workflows/docker-test-cont.yml +++ b/.github/workflows/docker-test-cont.yml @@ -2,14 +2,14 @@ name: PR - route test on: workflow_run: - workflows: [ PR - Docker build test ] # open, reopen, synchronized, edited included - types: [ completed ] + workflows: [PR - Docker build test] # open, reopen, synchronized, edited included + types: [completed] jobs: testRoute: name: Route test runs-on: ubuntu-latest - if: ${{ github.event.workflow_run.conclusion == 'success' }} # skip if unsuccessful + if: ${{ github.event.workflow_run.conclusion == 'success' }} # skip if unsuccessful steps: - uses: actions/checkout@v4 @@ -44,8 +44,8 @@ jobs: const body = PR.body const number = PR.number const sender = PR.user.login - const script = require(`${process.env.GITHUB_WORKSPACE}/scripts/workflow/test-route/identify.js`) - return script({ github, context, core }, body, number, sender) + const { default: identify } = await import('${{ github.workspace }}/scripts/workflow/test-route/identify.mjs') + return identify({ github, context, core }, body, number, sender) - name: Fetch Docker image if: (env.TEST_CONTINUE) @@ -72,13 +72,13 @@ jobs: with: version: 8 - - uses: actions/setup-node@v4 # just need its cache + - uses: actions/setup-node@v4 if: (env.TEST_CONTINUE) with: node-version: lts/* cache: 'pnpm' - - name: Install dependencies (pnpm) # `got` needed since `github.request` disallows HTTP requests + - name: Install dependencies (pnpm) # require js-beautify if: (env.TEST_CONTINUE) run: pnpm i @@ -99,9 +99,8 @@ jobs: const routes = JSON.parse(process.env.TEST_ROUTES) const number = PR.number core.info(`${link}, ${routes}, ${number}`) - const got = require("got") - const script = require(`${process.env.GITHUB_WORKSPACE}/scripts/workflow/test-route/test.js`) - return script({ github, context, core, got }, link, routes, number) + const { default: test } = await import('${{ github.workspace }}/scripts/workflow/test-route/test.mjs') + await test({ github, context, core }, link, routes, number) - name: Pull Request Labeler if: ${{ failure() }} @@ -114,4 +113,4 @@ jobs: - name: Print Docker container logs if: (env.TEST_CONTINUE) - run: docker logs rsshub # logs/combined.log? Not so readable... + run: docker logs rsshub # logs/combined.log? Not so readable... diff --git a/.github/workflows/issue-command.yml b/.github/workflows/issue-command.yml index 1cc371618c..18d84c591c 100644 --- a/.github/workflows/issue-command.yml +++ b/.github/workflows/issue-command.yml @@ -77,8 +77,8 @@ jobs: const body = event.comment.body const number = event.issue.number const sender = event.comment.user.login - const script = require(`${process.env.GITHUB_WORKSPACE}/scripts/workflow/test-route/identify.js`) - return script({ github, context, core }, body, number, sender) + const { default: identify } = await import('${{ github.workspace }}/scripts/workflow/test-route/identify.mjs') + return identify({ github, context, core }, body, number, sender) - name: Build RSSHub if: env.TEST_CONTINUE @@ -107,9 +107,8 @@ jobs: const routes = JSON.parse(process.env.TEST_ROUTES) const number = event.issue.number core.info(`${link}, ${routes}, ${number}`) - const got = require("got") - const script = require(`${process.env.GITHUB_WORKSPACE}/scripts/workflow/test-route/test.js`) - return script({ github, context, core, got }, link, routes, number) + const { default: test } = await import('${{ github.workspace }}/scripts/workflow/test-route/test.mjs') + await test({ github, context, core }, link, routes, number) - name: Print logs if: (env.TEST_CONTINUE) diff --git a/lib/views/error.tsx b/lib/views/error.tsx index be2f75b1be..9aedf58649 100644 --- a/lib/views/error.tsx +++ b/lib/views/error.tsx @@ -52,13 +52,12 @@ const Index: FC<{

Helpful Information

-

Error Message:

- {message} -

Route: {errorRoute}

-

Full Route: {requestPath}

-

Node Version: {nodeVersion}

-

Git Hash: {gitHash}

-

Git Date: {gitDate?.toUTCString()}

+

Error Message:
{message}

+

Route: {errorRoute}

+

Full Route: {requestPath}

+

Node Version: {nodeVersion}

+

Git Hash: {gitHash}

+

Git Date: {gitDate?.toUTCString()}

Report

diff --git a/package.json b/package.json index b84ecb4a3f..f893d3a7a7 100644 --- a/package.json +++ b/package.json @@ -157,6 +157,7 @@ "eslint-plugin-yml": "1.13.2", "fs-extra": "11.2.0", "husky": "9.0.11", + "js-beautify": "1.15.1", "lint-staged": "15.2.2", "mockdate": "3.0.5", "nock": "13.5.4", @@ -165,7 +166,7 @@ "supertest": "6.3.4", "tosource": "2.0.0-alpha.3", "typescript": "5.4.3", - "unified": "9.2.2", + "unified": "11.0.4", "vite-tsconfig-paths": "4.3.2", "vitest": "1.4.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 85dffb7859..76e6faa3aa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -216,10 +216,10 @@ dependencies: devDependencies: '@babel/preset-env': specifier: 7.24.3 - version: 7.24.3(@babel/core@7.23.9) + version: 7.24.3(@babel/core@7.24.3) '@babel/preset-typescript': specifier: 7.24.1 - version: 7.24.1(@babel/core@7.23.9) + version: 7.24.1(@babel/core@7.24.3) '@microsoft/eslint-formatter-sarif': specifier: 3.0.0 version: 3.0.0 @@ -331,6 +331,9 @@ devDependencies: husky: specifier: 9.0.11 version: 9.0.11 + js-beautify: + specifier: 1.15.1 + version: 1.15.1 lint-staged: specifier: 15.2.2 version: 15.2.2 @@ -356,8 +359,8 @@ devDependencies: specifier: 5.4.3 version: 5.4.3 unified: - specifier: 9.2.2 - version: 9.2.2 + specifier: 11.0.4 + version: 11.0.4 vite-tsconfig-paths: specifier: 4.3.2 version: 4.3.2(typescript@5.4.3) @@ -380,6 +383,14 @@ packages: '@jridgewell/trace-mapping': 0.3.22 dev: true + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + /@asteasolutions/zod-to-openapi@5.5.0(zod@3.22.4): resolution: {integrity: sha512-d5HwrvM6dOKr3XdeF+DmashGvfEc+1oiEfbscugsiwSTrFtuMa7ETpW9sTNnVgn+hJaz+PRxPQUYD7q9/5dUig==} peerDependencies: @@ -402,24 +413,32 @@ packages: '@babel/highlight': 7.23.4 chalk: 2.4.2 + /@babel/code-frame@7.24.2: + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 + dev: true + /@babel/compat-data@7.24.1: resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==} engines: {node: '>=6.9.0'} dev: true - /@babel/core@7.23.9: - resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==} + /@babel/core@7.24.3: + resolution: {integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==} engines: {node: '>=6.9.0'} dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.1 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) - '@babel/helpers': 7.23.9 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/helpers': 7.24.1 '@babel/parser': 7.24.1 '@babel/template': 7.24.0 - '@babel/traverse': 7.23.9 + '@babel/traverse': 7.24.1 '@babel/types': 7.24.0 convert-source-map: 2.0.0 debug: 4.3.4 @@ -430,12 +449,12 @@ packages: - supports-color dev: true - /@babel/generator@7.23.6: - resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + /@babel/generator@7.24.1: + resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.24.0 - '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 dev: true @@ -465,42 +484,42 @@ packages: semver: 6.3.1 dev: true - /@babel/helper-create-class-features-plugin@7.24.1(@babel/core@7.23.9): + /@babel/helper-create-class-features-plugin@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.23.9) + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3) '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 dev: true - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.9): + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.3): resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-annotate-as-pure': 7.22.5 regexpu-core: 5.3.2 semver: 6.3.1 dev: true - /@babel/helper-define-polyfill-provider@0.6.1(@babel/core@7.23.9): + /@babel/helper-define-polyfill-provider@0.6.1(@babel/core@7.24.3): resolution: {integrity: sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.24.0 debug: 4.3.4 @@ -544,13 +563,13 @@ packages: '@babel/types': 7.24.0 dev: true - /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9): + /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-module-imports': 7.24.1 '@babel/helper-simple-access': 7.22.5 @@ -570,25 +589,25 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.9): + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.3): resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.22.20 dev: true - /@babel/helper-replace-supers@7.24.1(@babel/core@7.23.9): + /@babel/helper-replace-supers@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 @@ -638,12 +657,12 @@ packages: '@babel/types': 7.24.0 dev: true - /@babel/helpers@7.23.9: - resolution: {integrity: sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==} + /@babel/helpers@7.24.1: + resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.24.0 - '@babel/traverse': 7.23.9 + '@babel/traverse': 7.24.1 '@babel/types': 7.24.0 transitivePeerDependencies: - supports-color @@ -657,6 +676,16 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 + /@babel/highlight@7.24.2: + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + dev: true + /@babel/parser@7.23.9: resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} engines: {node: '>=6.0.0'} @@ -673,895 +702,895 @@ packages: '@babel/types': 7.24.0 dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.23.9): + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.23.9): + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.3) dev: true - /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.23.9): + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.9): + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.3): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.9): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.3): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.9): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.3): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.9): + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.3): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.9): + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.3): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.9): + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.3): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.23.9): + /@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.23.9): + /@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.9): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.3): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.9): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.3): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.23.9): + /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.9): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.3): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.9): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.3): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.9): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.3): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.9): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.3): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.9): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.3): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.9): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.3): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.9): + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.3): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.9): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.3): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.23.9): + /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.9): + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.3): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) + '@babel/core': 7.24.3 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.23.9): + /@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.3): resolution: {integrity: sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.9) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.3) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-module-imports': 7.24.1 '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.9) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-block-scoping@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-block-scoping@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.23.9) + '@babel/core': 7.24.3 + '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-class-static-block@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-class-static-block@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.23.9) + '@babel/core': 7.24.3 + '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.9) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-classes@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-classes@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.23.9) + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3) '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 dev: true - /@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 '@babel/template': 7.24.0 dev: true - /@babel/plugin-transform-destructuring@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-destructuring@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) + '@babel/core': 7.24.3 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-for-of@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true - /@babel/plugin-transform-function-name@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-literals@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) + '@babel/core': 7.24.3 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) + '@babel/core': 7.24.3 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-simple-access': 7.22.5 dev: true - /@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-validator-identifier': 7.22.20 dev: true - /@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) + '@babel/core': 7.24.3 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.9): + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.3): resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) + '@babel/core': 7.24.3 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-new-target@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-object-rest-spread@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-object-rest-spread@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-object-super@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.23.9) + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-optional-chaining@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-optional-chaining@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-parameters@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-parameters@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.23.9) + '@babel/core': 7.24.3 + '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-private-property-in-object@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-private-property-in-object@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.23.9) + '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.9) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 regenerator-transform: 0.15.2 dev: true - /@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-spread@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true - /@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-typeof-symbol@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-typeof-symbol@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-typescript@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-typescript@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-liYSESjX2fZ7JyBFkYG78nfvHlMKE6IpNdTVnxmlYUR+j5ZLsitFbaAE+eJSK2zPPkNWNw4mXL51rQ8WrvdK0w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.23.9) + '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) + '@babel/core': 7.24.3 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) + '@babel/core': 7.24.3 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.23.9): + /@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) + '@babel/core': 7.24.3 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/preset-env@7.24.3(@babel/core@7.23.9): + /@babel/preset-env@7.24.3(@babel/core@7.24.3): resolution: {integrity: sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.24.1 - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.9) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.9) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.9) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.9) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.9) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.9) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.9) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.9) - '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.23.9) - '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-block-scoping': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-class-static-block': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-classes': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-destructuring': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.9) - '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-object-rest-spread': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-private-property-in-object': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-typeof-symbol': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.23.9) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.9) - babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.23.9) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.23.9) - babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.23.9) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.3) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.3) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.3) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.3) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.3) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.3) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.3) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.3) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.3) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.3) + '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.24.3) + '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-block-scoping': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-class-static-block': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-classes': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-destructuring': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.3) + '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-object-rest-spread': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-private-property-in-object': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-typeof-symbol': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.24.3) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.3) + babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.3) + babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.3) + babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.24.3) core-js-compat: 3.36.1 semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.9): + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.3): resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 '@babel/types': 7.24.0 esutils: 2.0.3 dev: true - /@babel/preset-typescript@7.24.1(@babel/core@7.23.9): + /@babel/preset-typescript@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.23.9) - '@babel/plugin-transform-typescript': 7.24.1(@babel/core@7.23.9) + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-typescript': 7.24.1(@babel/core@7.24.3) dev: true /@babel/regjsgen@0.8.0: @@ -1592,12 +1621,12 @@ packages: '@babel/types': 7.24.0 dev: true - /@babel/traverse@7.23.9: - resolution: {integrity: sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==} + /@babel/traverse@7.24.1: + resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.1 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 @@ -1938,6 +1967,18 @@ packages: resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} dev: false + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true + /@istanbuljs/schema@0.1.3: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} @@ -1959,6 +2000,15 @@ packages: '@jridgewell/trace-mapping': 0.3.22 dev: true + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + /@jridgewell/resolve-uri@3.1.2: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -1969,6 +2019,11 @@ packages: engines: {node: '>=6.0.0'} dev: true + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + dev: true + /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: true @@ -2052,6 +2107,10 @@ packages: - encoding dev: false + /@one-ini/wasm@0.1.1: + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + dev: true + /@otplib/core@12.0.1: resolution: {integrity: sha512-4sGntwbA/AC+SbPhbsziRiD+jNDdIzsZ3JUyfZwjtKyc/wufl1pnSIaG4Uqx8ymPagujub0o92kgBnB89cuAMA==} dev: false @@ -2085,6 +2144,13 @@ packages: '@otplib/plugin-thirty-two': 12.0.1 dev: false + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: true + optional: true + /@pkgr/core@0.1.1: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -2645,10 +2711,6 @@ packages: resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} dev: false - /@types/unist@2.0.10: - resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} - dev: true - /@types/unist@3.0.2: resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} dev: true @@ -2948,6 +3010,11 @@ packages: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: true + /abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + /abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -3184,46 +3251,42 @@ packages: resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} dev: false - /babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.23.9): + /babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.24.3): resolution: {integrity: sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: '@babel/compat-data': 7.24.1 - '@babel/core': 7.23.9 - '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.23.9) + '@babel/core': 7.24.3 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.3) semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.23.9): + /babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.3): resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.23.9 - '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.23.9) + '@babel/core': 7.24.3 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.3) core-js-compat: 3.36.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-regenerator@0.6.1(@babel/core@7.23.9): + /babel-plugin-polyfill-regenerator@0.6.1(@babel/core@7.24.3): resolution: {integrity: sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.23.9 - '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.23.9) + '@babel/core': 7.24.3 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.3) transitivePeerDependencies: - supports-color dev: true - /bail@1.0.5: - resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} - dev: true - /bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} dev: true @@ -3237,8 +3300,8 @@ packages: dev: false optional: true - /bare-fs@2.1.5: - resolution: {integrity: sha512-5t0nlecX+N2uJqdxe9d18A98cp2u9BETelbjKpiVgQqzzmVNFYWEAjQHqS+2Khgto1vcwhik9cXucaj5ve2WWA==} + /bare-fs@2.2.2: + resolution: {integrity: sha512-X9IqgvyB0/VA5OZJyb5ZstoN62AzD7YxVGog13kkfYWYqJYcK0kcqLZ6TrmH5qr4/8//ejVcX4x/a0UvaogXmA==} requiresBuild: true dependencies: bare-events: 2.2.0 @@ -3756,6 +3819,11 @@ packages: dependencies: delayed-stream: 1.0.0 + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + dev: true + /commander@11.1.0: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} @@ -3776,6 +3844,13 @@ packages: /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + /config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + dev: true + /console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} dev: true @@ -4182,6 +4257,10 @@ packages: engines: {node: '>=6'} dev: false + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + /ecc-jsbn@0.1.2: resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} dependencies: @@ -4195,6 +4274,17 @@ packages: safe-buffer: 5.2.1 dev: false + /editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.6.0 + dev: true + /electron-to-chromium@1.4.669: resolution: {integrity: sha512-E2SmpffFPrZhBSgf8ibqanRS2mpuk3FIRDzLDwt7WFpfgJMKDHJs0hmacyP0PS1cWsq0dVkwIIzlscNaterkPg==} dev: true @@ -4210,6 +4300,10 @@ packages: /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + /enabled@2.0.0: resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} dev: false @@ -4886,6 +4980,14 @@ packages: for-in: 1.0.2 dev: false + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: true + /forever-agent@0.6.1: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} dev: false @@ -5105,6 +5207,18 @@ packages: is-glob: 4.0.3 dev: true + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 5.0.0 + path-scurry: 1.10.1 + dev: true + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: @@ -5535,6 +5649,10 @@ packages: /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + /inquirer@8.2.6: resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} engines: {node: '>=12.0.0'} @@ -5641,11 +5759,6 @@ packages: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} dev: false - /is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - dev: true - /is-builtin-module@3.2.1: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} @@ -5711,11 +5824,6 @@ packages: engines: {node: '>=8'} dev: true - /is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - dev: true - /is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -5805,6 +5913,32 @@ packages: istanbul-lib-report: 3.0.1 dev: true + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: true + + /js-beautify@1.15.1: + resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} + engines: {node: '>=14'} + hasBin: true + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 10.3.10 + js-cookie: 3.0.5 + nopt: 7.2.0 + dev: true + + /js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + dev: true + /js-tokens@3.0.2: resolution: {integrity: sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==} dev: false @@ -6230,7 +6364,6 @@ packages: /lru-cache@10.2.0: resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} engines: {node: 14 || >=16.14} - dev: false /lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} @@ -6638,6 +6771,13 @@ packages: dependencies: brace-expansion: 1.1.11 + /minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} @@ -6802,6 +6942,14 @@ packages: abbrev: 1.1.1 dev: true + /nopt@7.2.0: + resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + abbrev: 2.0.0 + dev: true + /normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: @@ -7126,6 +7274,14 @@ packages: /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.2.0 + minipass: 5.0.0 + dev: true + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -7298,6 +7454,10 @@ packages: engines: {node: '>= 8'} dev: true + /proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + dev: true + /proxy-agent@6.4.0: resolution: {integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==} engines: {node: '>= 14'} @@ -8223,6 +8383,15 @@ packages: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true + /string-width@7.1.0: resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} engines: {node: '>=18'} @@ -8366,7 +8535,7 @@ packages: pump: 3.0.0 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 2.1.5 + bare-fs: 2.2.2 bare-path: 2.1.0 dev: false @@ -8565,10 +8734,6 @@ packages: engines: {node: '>= 14.0.0'} dev: false - /trough@1.0.5: - resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} - dev: true - /trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} dev: true @@ -8778,24 +8943,6 @@ packages: vfile: 6.0.1 dev: true - /unified@9.2.2: - resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==} - dependencies: - '@types/unist': 2.0.10 - bail: 1.0.5 - extend: 3.0.2 - is-buffer: 2.0.5 - is-plain-obj: 2.1.0 - trough: 1.0.5 - vfile: 4.2.1 - dev: true - - /unist-util-stringify-position@2.0.3: - resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} - dependencies: - '@types/unist': 2.0.10 - dev: true - /unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} dependencies: @@ -8922,13 +9069,6 @@ packages: extsprintf: 1.3.0 dev: false - /vfile-message@2.0.4: - resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} - dependencies: - '@types/unist': 2.0.10 - unist-util-stringify-position: 2.0.3 - dev: true - /vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} dependencies: @@ -8936,15 +9076,6 @@ packages: unist-util-stringify-position: 4.0.0 dev: true - /vfile@4.2.1: - resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} - dependencies: - '@types/unist': 2.0.10 - is-buffer: 2.0.5 - unist-util-stringify-position: 2.0.3 - vfile-message: 2.0.4 - dev: true - /vfile@6.0.1: resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} dependencies: @@ -9216,7 +9347,15 @@ packages: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: false + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: true /wrap-ansi@9.0.0: resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} diff --git a/scripts/workflow/test-issue/call-maintainer.js b/scripts/workflow/test-issue/call-maintainer.mjs similarity index 87% rename from scripts/workflow/test-issue/call-maintainer.js rename to scripts/workflow/test-issue/call-maintainer.mjs index 406ba9f25f..76f8101c51 100644 --- a/scripts/workflow/test-issue/call-maintainer.js +++ b/scripts/workflow/test-issue/call-maintainer.mjs @@ -1,10 +1,9 @@ -const unified = require('unified'); -const parse = require('remark-parse'); -const got = require('got'); +import { unified } from 'unified'; +import remarkParse from 'remark-parse'; // @TODO maybe we could use label or some other better ways to distinguish bug/feature issues const matchTitle = ['路由地址', 'Routes']; -const maintainerURL = 'https://raw.githubusercontent.com/DIYgod/RSSHub/gh-pages/build/maintainer.json'; +const maintainerURL = 'https://raw.githubusercontent.com/DIYgod/RSSHub/gh-pages/build/maintainers.json'; const successTag = 'Bug Ping: Pinged'; const parseFailTag = 'Bug Ping: Parsing Failed'; const failTag = 'Bug Ping: Not Found'; @@ -15,7 +14,7 @@ const route = 'Route'; const dndUsernames = new Set([]); async function parseBodyRoutes(body, core) { - const ast = await unified().use(parse).parse(body); + const ast = await unified().use(remarkParse).parse(body); // Is this a bug report? const title = ast.children[0].children[0].value.trim(); @@ -44,10 +43,8 @@ async function parseBodyRoutes(body, core) { } async function getMaintainersByRoutes(routes, core) { - // TODO: change me when https://github.com/actions/github-script is run on node20 - // const response = await fetch(maintainerURL); - // const maintainers = await response.json(); - const maintainers = await got(maintainerURL).json(); + const response = await fetch(maintainerURL); + const maintainers = await response.json(); return routes.map((e) => { const m = maintainers[e]; @@ -59,9 +56,9 @@ async function getMaintainersByRoutes(routes, core) { }); } -module.exports = async ({ github, context, core }) => { +export default async function callMaintainer({ github, context, core }) { const body = context.payload.issue.body; - const issue_facts = { + const issueFacts = { issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, @@ -70,7 +67,7 @@ module.exports = async ({ github, context, core }) => { const addLabels = (labels) => github.rest.issues .addLabels({ - ...issue_facts, + ...issueFacts, labels, }) .catch((error) => { @@ -79,7 +76,7 @@ module.exports = async ({ github, context, core }) => { const updateIssueState = (state) => github.rest.issues .update({ - ...issue_facts, + ...issueFacts, state, }) .catch((error) => { @@ -138,7 +135,7 @@ module.exports = async ({ github, context, core }) => { } } - const labels = [`Count: ${successCount}/${routes.length}`]; + const labels = ['']; if (failedCount > 0) { labels.push(failTag); @@ -160,14 +157,14 @@ module.exports = async ({ github, context, core }) => { // Reply to the issue and notify the maintainers (if any) await github.rest.issues .createComment({ - ...issue_facts, + ...issueFacts, body: `${comments} > To maintainers: if you are not willing to be disturbed, list your username in \`scripts/workflow/test-issue/call-maintainer.js\`. In this way, your username will be wrapped in an inline code block when tagged so you will not be notified. -如果所有路由都无法匹配,issue 将会被自动关闭。如果 issue 和路由无关,请使用 \`NOROUTE\` 关键词,或者留下评论。我们会重新审核。 If all routes can not be found, the issue will be closed automatically. Please use \`NOROUTE\` for a route-irrelevant issue or leave a comment if it is a mistake. +如果所有路由都无法匹配,issue 将会被自动关闭。如果 issue 和路由无关,请使用 \`NOROUTE\` 关键词,或者留下评论。我们会重新审核。 `, }) .catch((error) => { @@ -177,4 +174,4 @@ If all routes can not be found, the issue will be closed automatically. Please u if (failedCount && emptyCount === 0 && successCount === 0) { await updateIssueState('closed'); } -}; +} diff --git a/scripts/workflow/test-route/identify.js b/scripts/workflow/test-route/identify.mjs similarity index 77% rename from scripts/workflow/test-route/identify.js rename to scripts/workflow/test-route/identify.mjs index 4a5199ff2c..4aa342d8c4 100644 --- a/scripts/workflow/test-route/identify.js +++ b/scripts/workflow/test-route/identify.mjs @@ -1,14 +1,15 @@ const noFound = 'Auto: Route No Found'; +const testFailed = 'Auto: Route Test Failed'; const allowedUser = new Set(['dependabot[bot]', 'pull[bot]']); // dependabot and downstream PR requested by pull[bot] -module.exports = async ({ github, context, core }, body, number, sender) => { +export default async function identify({ github, context, core }, body, number, sender) { core.debug(`sender: ${sender}`); core.debug(`body: ${body}`); // Remove all HTML comments before performing the match const bodyNoCmts = body.replaceAll(//g, ''); const m = bodyNoCmts.match(/```routes\s+([\S\s]*?)```/); core.debug(`match: ${m}`); - let res = null; + let routes = null; const issueFacts = { owner: context.repo.owner, @@ -31,11 +32,11 @@ module.exports = async ({ github, context, core }, body, number, sender) => { core.warning(error); }); - const removeLabel = () => + const removeLabel = (labelName = noFound) => github.rest.issues .removeLabel({ ...issueFacts, - name: noFound, + name: labelName, }) .catch((error) => { core.warning(error); @@ -80,8 +81,13 @@ module.exports = async ({ github, context, core }, body, number, sender) => { .catch((error) => { core.warning(error); }); - if (pr.pull_request && pr.state === 'closed') { - await updatePrState('open'); + if (pr.pull_request) { + if (pr.state === 'closed') { + await updatePrState('open'); + } + if (pr.labels.some((e) => e.name === testFailed)) { + await removeLabel(testFailed); + } } if (allowedUser.has(sender)) { @@ -94,19 +100,25 @@ module.exports = async ({ github, context, core }, body, number, sender) => { } if (m && m[1]) { - res = m[1].trim().split(/\r?\n/); - core.info(`routes detected: ${res}`); + routes = m[1].trim().split(/\r?\n/); + core.info(`routes detected: ${routes}`); - if (res.length && res[0] === 'NOROUTE') { + if (routes.length && routes[0] === 'NOROUTE') { core.info('PR stated no route, passing'); await removeLabel(); await addLabels(['Auto: Route Test Skipped']); return; - } else if (res.length && !res.some((e) => e.includes('/:'))) { + } else if (routes.length) { + if (routes.some((e) => e.includes('/:'))) { + await addLabels([noFound]); + return createComment(`Please use actual values in \`routes\` section instead of path parameters. + 请在 \`routes\` 部分使用实际值而不是路径参数。`); + } + core.exportVariable('TEST_CONTINUE', true); await removeLabel(); - return res; + return routes; } } @@ -119,4 +131,4 @@ module.exports = async ({ github, context, core }, body, number, sender) => { } throw new Error('Please follow the PR rules: failed to detect route'); -}; +} diff --git a/scripts/workflow/test-route/test.js b/scripts/workflow/test-route/test.js deleted file mode 100644 index 88a6f84590..0000000000 --- a/scripts/workflow/test-route/test.js +++ /dev/null @@ -1,103 +0,0 @@ -/* eslint-disable no-await-in-loop */ - -module.exports = async ({ github, context, core, got }, baseUrl, routes, number) => { - if (routes[0] === 'NOROUTE') { - return; - } - - const links = routes.map((e) => { - const l = e.startsWith('/') ? e : `/${e}`; - return `${baseUrl}${l}`; - }); - - let com_l = []; - let com = `Successfully [generated](${process.env.GITHUB_SERVER_URL}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}) as following:\n`; - - for (const lks of links) { - core.info(`testing route: ${lks}`); - // Intended, one at a time - let success = false; - let detail; - try { - // TODO: change me when https://github.com/actions/github-script is run on node20 - // const res = await fetch(lks); - // if (!res.ok) { - // throw res; - // } - // success = true; - // detail = (await res.text()).replace(/\s+(\n|$)/g, '\n'); - const res = await got(lks); - if (res && res.body) { - success = true; - detail = res.body.replaceAll(/\s+(\n|$)/g, '\n'); - } - } catch (error) { - // TODO: change me when https://github.com/actions/github-script is run on node20 - // detail = `HTTPError: Response code ${err.status} (${err.statusText})`; - // const res = await err.text(); - // const errInfoList = err.body && res.match(/(?<=
)(.+?)(?=<\/pre>)/gs);
-            detail = error.toString();
-            const errInfoList = error.response && error.response.body && error.response.body.match(/(?<=
)(.+?)(?=<\/pre>)/gs);
-            if (errInfoList) {
-                detail += '\n\n';
-                detail += errInfoList
-                    .slice(0, 3)
-                    .map((e) => e.trim())
-                    .join('\n');
-            }
-        }
-
-        let temp_com = `
-
-${lks} - ${success ? 'Success ✔️' : 'Failed ❌'} - -\`\`\`${success ? 'rss' : ''}`; - temp_com += ` -${detail.slice(0, 65300 - temp_com.length)} -\`\`\` -
-`; - if (com.length + temp_com.length >= 65500) { - com += '\n\n...'; - com_l.push(com); - com = temp_com; - } else { - com += temp_com; - } - } - - if (com.length > 0) { - com_l.push(com); - } - - if (com_l.length >= 5) { - com_l = com_l.slice(0, 5); - } - - if (process.env.PULL_REQUEST) { - await github.rest.issues - .addLabels({ - issue_number: number, - owner: context.repo.owner, - repo: context.repo.repo, - labels: ['Auto: Route Test Complete'], - }) - .catch((error) => { - core.warning(error); - }); - } - - for (const com_s of com_l) { - // Intended, one at a time - await github.rest.issues - .createComment({ - issue_number: number, - owner: context.repo.owner, - repo: context.repo.repo, - body: com_s, - }) - .catch((error) => { - core.warning(error); - }); - } -}; diff --git a/scripts/workflow/test-route/test.mjs b/scripts/workflow/test-route/test.mjs new file mode 100644 index 0000000000..8fc1966f1b --- /dev/null +++ b/scripts/workflow/test-route/test.mjs @@ -0,0 +1,92 @@ +import jsBeautify from 'js-beautify'; + +export default async function test({ github, context, core }, baseUrl, routes, number) { + if (routes[0] === 'NOROUTE') { + return; + } + + const links = routes.map((e) => { + const l = e.startsWith('/') ? e : `/${e}`; + return `${baseUrl}${l}`; + }); + + let commentList = []; + let comment = `Successfully [generated](${process.env.GITHUB_SERVER_URL}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}) as following:\n`; + + for await (const lks of links) { + core.info(`testing route: ${lks}`); + // Intended, one at a time + let success = false; + let detail; + + const res = await fetch(lks); + const body = await res.text(); + if (res.ok) { + success = true; + detail = jsBeautify.html(body.replaceAll(/\s+(\n|$)/g, '\n'), { indent_size: 2 }); + } else { + detail = `HTTPError: Response code ${res.status} (${res.statusText})`; + const errInfoList = body && body.match(/(?<=

)(.+?)(?=<\/p>)/gs); + if (errInfoList) { + detail += '\n\n'; + detail += errInfoList + .slice(0, 5) + .map((e) => (e.length > 1000 ? e.slice(0, 1000) + '...' : e).trim()) + .join('\n'); + } + } + + let routeFeedback = ` +

+${lks} - ${success ? 'Success ✔️' : 'Failed ❌'} + +\`\`\`${success ? 'rss' : ''}`; + routeFeedback += ` +${detail.slice(0, 65300 - routeFeedback.length)} +\`\`\` +
+`; + if (comment.length + routeFeedback.length >= 65500) { + comment += '\n\n...'; + commentList.push(comment); + comment = routeFeedback; + } else { + comment += routeFeedback; + } + } + + if (comment.length > 0) { + commentList.push(comment); + } + + if (commentList.length >= 5) { + commentList = commentList.slice(0, 5); + } + + if (process.env.PULL_REQUEST) { + await github.rest.issues + .addLabels({ + issue_number: number, + owner: context.repo.owner, + repo: context.repo.repo, + labels: ['Auto: Route Test Complete'], + }) + .catch((error) => { + core.warning(error); + }); + } + + for await (const comment of commentList) { + // Intended, one at a time + await github.rest.issues + .createComment({ + issue_number: number, + owner: context.repo.owner, + repo: context.repo.repo, + body: comment, + }) + .catch((error) => { + core.warning(error); + }); + } +} From 76bc7216edefc3c38423b32a31a5cc737811e954 Mon Sep 17 00:00:00 2001 From: Tony Date: Sat, 23 Mar 2024 12:42:17 +0800 Subject: [PATCH 07/99] fix(radar): radar rule typing --- lib/routes/booru/mmda.ts | 8 +++++--- lib/routes/modrinth/versions.ts | 36 +++++++++++++++++---------------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/lib/routes/booru/mmda.ts b/lib/routes/booru/mmda.ts index a58b021bd4..664cc1bb26 100644 --- a/lib/routes/booru/mmda.ts +++ b/lib/routes/booru/mmda.ts @@ -21,9 +21,11 @@ export const route: Route = { supportPodcast: false, supportScihub: false, }, - radar: { - source: ['mmda.booru.org/index.php'], - }, + radar: [ + { + source: ['mmda.booru.org/index.php'], + }, + ], name: 'MMDArchive 标签查询', maintainers: ['N78Wy'], handler, diff --git a/lib/routes/modrinth/versions.ts b/lib/routes/modrinth/versions.ts index f5023665df..e7ba723c16 100644 --- a/lib/routes/modrinth/versions.ts +++ b/lib/routes/modrinth/versions.ts @@ -37,23 +37,25 @@ export const route: Route = { supportPodcast: false, supportScihub: false, }, - radar: { - source: [ - 'modrinth.com/mod/:id/*', - 'modrinth.com/plugin/:id/*', - 'modrinth.com/datapack/:id/*', - 'modrinth.com/shader/:id/*', - 'modrinth.com/resourcepack/:id/*', - 'modrinth.com/modpack/:id/*', - 'modrinth.com/mod/:id', - 'modrinth.com/plugin/:id', - 'modrinth.com/datapack/:id', - 'modrinth.com/shader/:id', - 'modrinth.com/resourcepack/:id', - 'modrinth.com/modpack/:id', - ], - target: '/project/:id/versions', - }, + radar: [ + { + source: [ + 'modrinth.com/mod/:id/*', + 'modrinth.com/plugin/:id/*', + 'modrinth.com/datapack/:id/*', + 'modrinth.com/shader/:id/*', + 'modrinth.com/resourcepack/:id/*', + 'modrinth.com/modpack/:id/*', + 'modrinth.com/mod/:id', + 'modrinth.com/plugin/:id', + 'modrinth.com/datapack/:id', + 'modrinth.com/shader/:id', + 'modrinth.com/resourcepack/:id', + 'modrinth.com/modpack/:id', + ], + target: '/project/:id/versions', + }, + ], name: 'Project versions', maintainers: ['SettingDust'], handler, From e7fb557a369b3af8613cf5fbeda1808c50943eaf Mon Sep 17 00:00:00 2001 From: qixingchen <4182240+Qixingchen@users.noreply.github.com> Date: Sun, 24 Mar 2024 02:05:42 +0800 Subject: [PATCH 08/99] fix(route): bilibli/user/collection disableEmbed (#14929) --- lib/routes/bilibili/user-collection.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/routes/bilibili/user-collection.ts b/lib/routes/bilibili/user-collection.ts index 56c2d961be..0d46ade10f 100644 --- a/lib/routes/bilibili/user-collection.ts +++ b/lib/routes/bilibili/user-collection.ts @@ -3,6 +3,7 @@ import got from '@/utils/got'; import cache from './cache'; import utils from './utils'; import { parseDate } from '@/utils/parse-date'; +import { queryToBoolean } from '@/utils/readable-social'; const notFoundData = { title: '此 bilibili 频道不存在', @@ -15,7 +16,7 @@ export const route: Route = { parameters: { uid: '用户 id, 可在 UP 主主页中找到', sid: '合集 id, 可在合集页面的 URL 中找到', - disableEmbed: '默认为开启内嵌视频, 任意值为关闭', + disableEmbed: '空,0与false为开启内嵌视频, 其他任意值为关闭', sortReverse: '默认:默认排序 1:升序排序', page: '页码, 默认1', }, @@ -35,7 +36,7 @@ export const route: Route = { async function handler(ctx) { const uid = Number.parseInt(ctx.req.param('uid')); const sid = Number.parseInt(ctx.req.param('sid')); - const disableEmbed = ctx.req.param('disableEmbed'); + const disableEmbed = queryToBoolean(ctx.req.param('disableEmbed')); const sortReverse = Number.parseInt(ctx.req.param('sortReverse')) === 1; const page = ctx.req.param('page') ? Number.parseInt(ctx.req.param('page')) : 1; const limit = ctx.req.query('limit') ?? 25; From 63adaee7f28666b2f48510f4fcfb3db2d3ec7d78 Mon Sep 17 00:00:00 2001 From: Tony Date: Sun, 24 Mar 2024 05:06:06 +0800 Subject: [PATCH 09/99] chore: add typo check in build routes --- scripts/workflow/build-routes.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/workflow/build-routes.ts b/scripts/workflow/build-routes.ts index 02928a5567..af441dfd5f 100644 --- a/scripts/workflow/build-routes.ts +++ b/scripts/workflow/build-routes.ts @@ -94,7 +94,11 @@ function generateMd(lang) { const md = {}; for (const category in docs) { const nameObj = categories.find((c) => c.link.includes(category)); - md[category] = `# ${`${nameObj!.icon} ${nameObj![lang]}`}\n\n`; + if (!nameObj) { + throw new Error(`Category not found: ${category}, please double check your spelling.`); + } + + md[category] = `# ${`${nameObj.icon} ${nameObj[lang]}`}\n\n`; const namespaces = Object.keys(docs[category]).sort((a, b) => { const aname = docs[category][a].name[0]; From e8b0d7d2622ec43878e64706f8b89f6f1a2fee21 Mon Sep 17 00:00:00 2001 From: Tony Date: Sun, 24 Mar 2024 13:14:41 +0800 Subject: [PATCH 10/99] chore: push type changes to docs --- .github/workflows/build-assets.yml | 2 ++ lib/routes/2023game/index.ts | 6 +++--- lib/routes/bluestacks/release.ts | 6 +++--- lib/routes/cas/mesalab/kb.ts | 6 +++--- lib/routes/ouc/hqsz.ts | 1 + lib/routes/telegram/blog.ts | 6 +++--- lib/types.ts | 32 +++++++++++++++++++++++++++--- 7 files changed, 44 insertions(+), 15 deletions(-) diff --git a/.github/workflows/build-assets.yml b/.github/workflows/build-assets.yml index bd725fea94..0afe56e466 100644 --- a/.github/workflows/build-assets.yml +++ b/.github/workflows/build-assets.yml @@ -57,6 +57,8 @@ jobs: run: | cp -r ./assets/build/docs/en/* ./rsshub-docs/src/routes cp -r ./assets/build/docs/zh/* ./rsshub-docs/src/zh/routes + cp ./lib/types.ts ./rsshub-docs/.vitepress/theme/types.ts + cp ./scripts/workflow/data.ts ./rsshub-docs/.vitepress/config/data.ts - name: Commit docs run: | cd rsshub-docs diff --git a/lib/routes/2023game/index.ts b/lib/routes/2023game/index.ts index ab94ff4069..55d900fd09 100644 --- a/lib/routes/2023game/index.ts +++ b/lib/routes/2023game/index.ts @@ -31,9 +31,9 @@ export const route: Route = { | ps4 | sgame | 3ds | psv | jiaocheng | ps3yx | zhuji.md | zhangji.psp | pcgame | zhangji | zhuji | ps4.psjc | ps41.ps4pkg | nsaita.cundang | nsaita.pojie | nsaita.buding | nsaita.zhutie | nsaita.zhuti |`, }; -async function handler(ctx?: Context): Promise { - const category = (ctx!.req.param('category') ?? 'sgame').replaceAll('.', '/'); - const tab = ctx?.req.param('tab') ?? 'all'; +async function handler(ctx: Context): Promise { + const category = (ctx.req.param('category') ?? 'sgame').replaceAll('.', '/'); + const tab = ctx.req.param('tab') ?? 'all'; const currentUrl = `https://www.2023game.com/${category}/`; diff --git a/lib/routes/bluestacks/release.ts b/lib/routes/bluestacks/release.ts index 5b3ddeec14..5f12893799 100644 --- a/lib/routes/bluestacks/release.ts +++ b/lib/routes/bluestacks/release.ts @@ -1,6 +1,6 @@ import { Route } from '@/types'; import cache from '@/utils/cache'; -import cherrio from 'cheerio'; +import * as cheerio from 'cheerio'; import { parseDate } from '@/utils/parse-date'; import puppeteer from '@/utils/puppeteer'; @@ -43,7 +43,7 @@ async function handler() { const res = await page.evaluate(() => document.documentElement.innerHTML); await page.close(); - const $ = cherrio.load(res); + const $ = cheerio.load(res); const items = $('div h3 a') .toArray() @@ -67,7 +67,7 @@ async function handler() { waitUntil: 'domcontentloaded', }); const res = await page.evaluate(() => document.documentElement.innerHTML); - const $ = cherrio.load(res); + const $ = cheerio.load(res); await page.close(); item.description = $('div.article__body').html(); diff --git a/lib/routes/cas/mesalab/kb.ts b/lib/routes/cas/mesalab/kb.ts index 9cf63ca5d3..346aacc2a4 100644 --- a/lib/routes/cas/mesalab/kb.ts +++ b/lib/routes/cas/mesalab/kb.ts @@ -1,6 +1,6 @@ import { Route } from '@/types'; import cache from '@/utils/cache'; -import cherrio from 'cheerio'; +import * as cheerio from 'cheerio'; import got from '@/utils/got'; import { parseDate } from '@/utils/parse-date'; import timezone from '@/utils/timezone'; @@ -34,7 +34,7 @@ async function handler() { const url = `${homepage}/f/article/articleList?pageNo=1&pageSize=15&createTimeSort=DESC`; const response = await got(url); - const $ = cherrio.load(response.data); + const $ = cheerio.load(response.data); const articles = $('.aw-item').toArray(); const items = await Promise.all( @@ -45,7 +45,7 @@ async function handler() { return cache.tryGet(link, async () => { const result = await got(link); - const $ = cherrio.load(result.data); + const $ = cheerio.load(result.data); return { title, author: $('.user_name').text(), diff --git a/lib/routes/ouc/hqsz.ts b/lib/routes/ouc/hqsz.ts index 33dd96832f..9c7fc635c5 100644 --- a/lib/routes/ouc/hqsz.ts +++ b/lib/routes/ouc/hqsz.ts @@ -2,6 +2,7 @@ import { parseDate } from '@/utils/parse-date'; import got from '@/utils/got'; import cache from '@/utils/cache'; import CryptoJS from 'crypto-js/crypto-js'; +import { Route } from '@/types'; export const route: Route = { path: '/hqsz', diff --git a/lib/routes/telegram/blog.ts b/lib/routes/telegram/blog.ts index 28b0253ea1..661caed28c 100644 --- a/lib/routes/telegram/blog.ts +++ b/lib/routes/telegram/blog.ts @@ -1,6 +1,6 @@ import { Route } from '@/types'; import cache from '@/utils/cache'; -import cherrio from 'cheerio'; +import * as cheerio from 'cheerio'; import got from '@/utils/got'; import { parseDate } from '@/utils/parse-date'; @@ -32,7 +32,7 @@ async function handler() { const link = 'https://telegram.org/blog'; const res = await got(link); - const $$ = cherrio.load(res.body); + const $$ = cheerio.load(res.body); const items = await Promise.all( $$('.dev_blog_card_link_wrap') @@ -42,7 +42,7 @@ async function handler() { const link = 'https://telegram.org' + $.attr('href'); return cache.tryGet(link, async () => { const result = await got(link); - const $ = cherrio.load(result.body); + const $ = cheerio.load(result.body); return { title: $('#dev_page_title').text(), link, diff --git a/lib/types.ts b/lib/types.ts index c5472e36c9..0c7c3541c0 100644 --- a/lib/types.ts +++ b/lib/types.ts @@ -1,5 +1,31 @@ import type { Context } from 'hono'; +// Make sure it's synchronise with scripts/workflow/data.ts +type Category = + | 'social-media' + | 'new-media' + | 'traditional-media' + | 'bbs' + | 'blog' + | 'programming' + | 'design' + | 'live' + | 'multimedia' + | 'picture' + | 'anime' + | 'program-update' + | 'university' + | 'forecast' + | 'travel' + | 'shopping' + | 'game' + | 'reading' + | 'government' + | 'study' + | 'journal' + | 'finance' + | 'other'; + // rss export type DataItem = { title: string; @@ -72,7 +98,7 @@ interface NamespaceItem { /** * The classification of the namespace, which will be written into the corresponding classification document */ - categories?: string[]; + categories?: Category[]; /** * Hints and additional explanations for users using this namespace, it will be inserted into the documentation @@ -117,7 +143,7 @@ interface RouteItem { /** * The handler function of the route */ - handler: (ctx?: Context) => Promise | Data; + handler: (ctx: Context) => Promise | Data; /** * An example URL of the route @@ -137,7 +163,7 @@ interface RouteItem { /** * The classification of the route, which will be written into the corresponding classification documentation */ - categories?: string[]; + categories?: Category[]; /** * Special features of the route, such as what configuration items it depends on, whether it is strict anti-crawl, whether it supports a certain function and so on From 68456e5b0f9265dc16b0c455ea4889d13ea699af Mon Sep 17 00:00:00 2001 From: Mg Pig Date: Sun, 24 Mar 2024 18:04:05 +0800 Subject: [PATCH 11/99] feat(route): Add appstorrent (#14908) * feat(route): Add appstorrent * feat(route): appstorrent apply suggestions from code review Co-authored-by: Tony * fix(route): fix and organize appstorrent imports --------- --- lib/routes/appstorrent/namespace.ts | 6 ++ lib/routes/appstorrent/programs.ts | 91 +++++++++++++++++++ .../appstorrent/templates/description.art | 22 +++++ 3 files changed, 119 insertions(+) create mode 100644 lib/routes/appstorrent/namespace.ts create mode 100644 lib/routes/appstorrent/programs.ts create mode 100644 lib/routes/appstorrent/templates/description.art diff --git a/lib/routes/appstorrent/namespace.ts b/lib/routes/appstorrent/namespace.ts new file mode 100644 index 0000000000..3b5b12a004 --- /dev/null +++ b/lib/routes/appstorrent/namespace.ts @@ -0,0 +1,6 @@ +import type { Namespace } from '@/types'; + +export const namespace: Namespace = { + name: 'AppsTorrent', + url: 'appstorrent.ru', +}; diff --git a/lib/routes/appstorrent/programs.ts b/lib/routes/appstorrent/programs.ts new file mode 100644 index 0000000000..ad9d40b86e --- /dev/null +++ b/lib/routes/appstorrent/programs.ts @@ -0,0 +1,91 @@ +import { Data, DataItem, Route } from '@/types'; +import cache from '@/utils/cache'; +import got, { Options } from '@/utils/got'; +import { getCurrentPath } from '@/utils/helpers'; +import { parseDate } from '@/utils/parse-date'; +import { art } from '@/utils/render'; +import { load } from 'cheerio'; +import dayjs from 'dayjs'; +import { Context } from 'hono'; +import * as path from 'node:path'; +const __dirname = getCurrentPath(import.meta.url); + +export const route: Route = { + path: '/programs', + categories: ['program-update'], + example: '/appstorrent/programs', + name: 'Programs', + maintainers: ['xzzpig'], + handler, + url: 'appstorrent.ru/programs/', +}; + +async function handler(ctx?: Context): Promise { + const limit = ctx?.req.query('limit') ? Number.parseInt(ctx?.req.query('limit') ?? '20') : 20; + const baseUrl = 'https://appstorrent.ru'; + const currentUrl = `${baseUrl}/programs/`; + const gotOptions: Options = { + http2: true, + }; + + const response = await got(currentUrl, gotOptions); + const $ = load(response.data as any); + + const selector = 'article.soft-item:not(.locked)'; + const list = $(selector) + .slice(0, limit) + .toArray() + .map((item) => { + const $item = $(item); + return { + title: $item.find('.subtitle').text().trim(), + link: $item.find('.subtitle a').attr('href')!, + category: [$item.find('.info .category').text().trim()], + version: $item.find('.version').text(), + architecture: $item.find('.architecture').text().trim(), + size: $item.find('.size').text().trim(), + }; + }); + + const items: DataItem[] = await Promise.all( + list.map( + (item) => + cache.tryGet(item.link, async () => { + const response = await got(item.link, gotOptions); + const $ = load(response.data as any); + + const pubDate = parseDate($('.tech-info .date-news a').attr('href')?.replace('https://appstorrent.ru/', '') ?? ''); + + return { + title: item.title, + link: item.link, + category: item.category, + pubDate, + description: art(path.join(__dirname, 'templates/description.art'), { + cover: baseUrl + $('.main-title img').attr('src')?.trim(), + title: item.title, + pubDate: dayjs(pubDate).format('YYYY-MM-DD'), + version: item.version, + architecture: item.architecture, + compatibility: $('div.right > div.info > div.right-container > div:nth-child(5) > div > span:nth-child(2) > a').text(), + size: item.size, + activation: $('div.right > div.info > div.right-container > div:nth-child(4) > div > span:nth-child(2) > a').text(), + description: $('.content .body-content').first().text(), + changelog: $('.content .body-content').last().text(), + screenshots: $('.screenshots img') + .toArray() + .map((img) => $(img).attr('src')) + .map((src) => baseUrl + src), + }), + } as DataItem; + }) as Promise + ) + ); + + return { + title: $('title').text(), + link: currentUrl.toString(), + allowEmpty: true, + item: items, + }; +} diff --git a/lib/routes/appstorrent/templates/description.art b/lib/routes/appstorrent/templates/description.art new file mode 100644 index 0000000000..2e86e16825 --- /dev/null +++ b/lib/routes/appstorrent/templates/description.art @@ -0,0 +1,22 @@ +

+ +

{{ title }}


+Public Date: {{pubDate}}
+Version: {{version}}
+Architecture: {{architecture}}
+Compactibility: {{compatibility}}
+Size: {{size}}
+Activation: {{activation}}
+

+Description: +

+{{ description }} +

+Change Log: +

+{{ changelog }} +

+Screenshots +{{each screenshots}} + +{{/each}} \ No newline at end of file From 2fc3b3a3360b4533811461f6682033419c5d6d5d Mon Sep 17 00:00:00 2001 From: cnkmmk <22782790+cnkmmk@users.noreply.github.com> Date: Sun, 24 Mar 2024 18:36:11 +0800 Subject: [PATCH 12/99] =?UTF-8?q?feat(route):=20add=20dbaplus=E7=A4=BE?= =?UTF-8?q?=E7=BE=A4=20(#14925)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(route): add dbaplus社群 * fix(route): fix dbaplus * fix(route): fix dbaplus社群 * Update rss.ts * Update rss.ts * Update rss.ts --------- Co-authored-by: pull[bot] <39814207+pull[bot]@users.noreply.github.com> --- lib/routes/dbaplus/namespace.ts | 6 +++++ lib/routes/dbaplus/rss.ts | 48 +++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 lib/routes/dbaplus/namespace.ts create mode 100644 lib/routes/dbaplus/rss.ts diff --git a/lib/routes/dbaplus/namespace.ts b/lib/routes/dbaplus/namespace.ts new file mode 100644 index 0000000000..5de237b67c --- /dev/null +++ b/lib/routes/dbaplus/namespace.ts @@ -0,0 +1,6 @@ +import type { Namespace } from '@/types'; + +export const namespace: Namespace = { + name: 'dbaplus社群', + url: 'dbaplus.cn', +}; diff --git a/lib/routes/dbaplus/rss.ts b/lib/routes/dbaplus/rss.ts new file mode 100644 index 0000000000..f94576c35a --- /dev/null +++ b/lib/routes/dbaplus/rss.ts @@ -0,0 +1,48 @@ +import { Route } from '@/types'; +import { parseDate } from '@/utils/parse-date'; +import got from '@/utils/got'; +import { load } from 'cheerio'; + +export const route: Route = { + path: '/', + categories: ['programming'], + example: '/dbaplus', + radar: [ + { + source: ['dbaplus.cn/'], + }, + ], + name: '最新文章', + maintainers: ['cnkmmk'], + handler, + url: 'dbaplus.cn/', +}; + +async function handler() { + const url = 'https://dbaplus.cn'; + const response = await got(`${url}/news-9-1.html`); + const $ = load(response.data); + + const list = $('div.col-xs-12.col-md-8.pd30 > div.panel.panel-default.categeay > div.panel-body > ul.media-list.clearfix > li.media') + .map((i, e) => { + const element = $(e); + const title = element.find('h3 > a').text(); + const link = element.find('h3 > a').attr('href'); + const description = element.find('div.mt10.geay').text(); + const dateraw = element.find('span.time').text(); + + return { + title, + description, + link, + pubDate: parseDate(dateraw, 'YYYY年MM月DD日'), + }; + }) + .get(); + + return { + title: 'dbaplus社群', + link: url, + item: list, + }; +} From b774c608584da2adf03cf0a292c56e2b995a0986 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Sun, 24 Mar 2024 11:00:03 +0000 Subject: [PATCH 13/99] test: add full routes test (#14934) * test: add critical routes test * fix: youtube channels config * test: add full routes test * test: output full routes test result * test: build routes before test * test: use one reporter * test: fix cache test errors * test: fix cache test errors * chore: puppeteerrc.cjs * chore: puppeteerrc.cjs * chore: puppeteerrc.cjs * fix: build script * chore: puppeteerrc rename * test: route test names * chore: pass test result to docs --- .github/workflows/build-assets.yml | 6 +- .github/workflows/test.yml | 5 +- .puppeteerrc.js => .puppeteerrc.cjs | 0 Dockerfile | 2 +- lib/middleware/cache.test.ts | 15 +--- lib/registry.test.ts | 59 +------------- lib/registry.ts | 15 +--- lib/routes.test.ts | 78 ++++++++++++++++++ lib/routes/afdian/dynamic.ts | 1 + lib/routes/bilibili/dynamic.ts | 1 - lib/routes/test/index.ts | 10 +-- lib/routes/youtube/channel.ts | 7 +- package.json | 16 ++-- pnpm-lock.yaml | 11 --- scripts/workflow/build-docs.ts | 122 ++++++++++++++++++++++++++++ scripts/workflow/build-routes.ts | 88 +------------------- tsconfig.json | 9 +- 17 files changed, 247 insertions(+), 198 deletions(-) rename .puppeteerrc.js => .puppeteerrc.cjs (100%) create mode 100644 lib/routes.test.ts create mode 100644 scripts/workflow/build-docs.ts diff --git a/.github/workflows/build-assets.yml b/.github/workflows/build-assets.yml index 0afe56e466..3b1f4febcd 100644 --- a/.github/workflows/build-assets.yml +++ b/.github/workflows/build-assets.yml @@ -33,7 +33,11 @@ jobs: - name: Install dependencies (yarn) run: pnpm i - name: Build assets - run: npm run build + run: pnpm build + - name: Build full routes test result + run: pnpm vitest:fullroutes + - name: Build docs + run: pnpm build:docs - name: Commit files run: | git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 523d0c80f8..30a978ed75 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -5,7 +5,6 @@ on: branches-ignore: - 'dependabot/**' paths: - - 'test/**' - 'lib/**' - 'package.json' - 'pnpm-lock.yaml' @@ -43,6 +42,8 @@ jobs: run: pnpm i - name: Run postinstall script for dependencies run: pnpm rb + - name: Build routes + run: pnpm build - name: Test all and generate coverage run: pnpm run vitest:coverage env: @@ -84,6 +85,8 @@ jobs: run: pnpm i - name: Run postinstall script for dependencies run: pnpm rb + - name: Build routes + run: pnpm build - name: Install Chromium if: ${{ matrix.chromium.dependency != '' }} # 'chromium-browser' from Ubuntu APT repo is a dummy package. Its version (85.0.4183.83) means diff --git a/.puppeteerrc.js b/.puppeteerrc.cjs similarity index 100% rename from .puppeteerrc.js rename to .puppeteerrc.cjs diff --git a/Dockerfile b/Dockerfile index 22a31a8bf3..228cf0c493 100644 --- a/Dockerfile +++ b/Dockerfile @@ -84,7 +84,7 @@ FROM node:21-bookworm-slim AS chromium-downloader # Yeah, downloading Chromium never needs those dependencies below. WORKDIR /app -COPY ./.puppeteerrc.js /app/ +COPY ./.puppeteerrc.cjs /app/ COPY --from=dep-version-parser /ver/.puppeteer_version /app/.puppeteer_version ARG TARGETPLATFORM diff --git a/lib/middleware/cache.test.ts b/lib/middleware/cache.test.ts index bb526daab7..7edce9fc5b 100644 --- a/lib/middleware/cache.test.ts +++ b/lib/middleware/cache.test.ts @@ -1,23 +1,16 @@ -import { describe, expect, it, vi, afterEach, afterAll, beforeAll } from 'vitest'; +import { describe, expect, it, vi, afterEach } from 'vitest'; import Parser from 'rss-parser'; import wait from '@/utils/wait'; +process.env.CACHE_EXPIRE = '1'; +process.env.CACHE_CONTENT_EXPIRE = '3'; + const parser = new Parser(); -beforeAll(() => { - process.env.CACHE_EXPIRE = '1'; - process.env.CACHE_CONTENT_EXPIRE = '3'; -}); - afterEach(() => { - delete process.env.CACHE_TYPE; vi.resetModules(); }); -afterAll(() => { - delete process.env.CACHE_EXPIRE; -}); - describe('cache', () => { it('memory', async () => { process.env.CACHE_TYPE = 'memory'; diff --git a/lib/registry.test.ts b/lib/registry.test.ts index ebc5c7526d..d168eb5990 100644 --- a/lib/registry.test.ts +++ b/lib/registry.test.ts @@ -1,55 +1,8 @@ -import { describe, expect, it, afterAll } from 'vitest'; -process.env.SOCKET = 'socket'; - +import { describe, expect, it } from 'vitest'; import app from '@/app'; -import Parser from 'rss-parser'; -const parser = new Parser(); import { config } from '@/config'; -afterAll(() => { - delete process.env.SOCKET; -}); - -async function checkRSS(response) { - const checkDate = (date) => { - expect(date).toEqual(expect.any(String)); - expect(Date.parse(date)).toEqual(expect.any(Number)); - expect(Date.now() - +new Date(date)).toBeGreaterThan(-1000 * 60 * 60 * 24 * 5); - expect(Date.now() - +new Date(date)).toBeLessThan(1000 * 60 * 60 * 24 * 30 * 12 * 10); - }; - - const parsed = await parser.parseString(await response.text()); - - expect(parsed).toEqual(expect.any(Object)); - expect(parsed.title).toEqual(expect.any(String)); - expect(parsed.title).not.toBe('RSSHub'); - expect(parsed.description).toEqual(expect.any(String)); - expect(parsed.link).toEqual(expect.any(String)); - expect(parsed.lastBuildDate).toEqual(expect.any(String)); - expect(parsed.ttl).toEqual(Math.trunc(config.cache.routeExpire / 60) + ''); - expect(parsed.items).toEqual(expect.any(Array)); - checkDate(parsed.lastBuildDate); - - // check items - const guids: (string | undefined)[] = []; - for (const item of parsed.items) { - expect(item).toEqual(expect.any(Object)); - expect(item.title).toEqual(expect.any(String)); - expect(item.link).toEqual(expect.any(String)); - expect(item.content).toEqual(expect.any(String)); - expect(item.guid).toEqual(expect.any(String)); - if (item.pubDate) { - expect(item.pubDate).toEqual(expect.any(String)); - checkDate(item.pubDate); - } - - // guid must be unique - expect(guids).not.toContain(item.guid); - guids.push(item.guid); - } -} - -describe('router', () => { +describe('registry', () => { // root it(`/`, async () => { const response = await app.request('/'); @@ -58,14 +11,6 @@ describe('router', () => { expect(response.headers.get('cache-control')).toBe('no-cache'); }); - // route - it(`/test/1`, async () => { - const response = await app.request('/test/1'); - expect(response.status).toBe(200); - - await checkRSS(response); - }); - // robots.txt it('/robots.txt', async () => { config.disallowRobot = false; diff --git a/lib/registry.ts b/lib/registry.ts index 0fef532aed..74101502df 100644 --- a/lib/registry.ts +++ b/lib/registry.ts @@ -7,8 +7,6 @@ import { serveStatic } from '@hono/node-server/serve-static'; import index from '@/routes/index'; import robotstxt from '@/routes/robots.txt'; -import { namespace as testNamespace } from './routes/test/namespace'; -import { route as testRoute } from '@/routes/test/index'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); @@ -27,18 +25,9 @@ let namespaces: Record< switch (process.env.NODE_ENV) { case 'test': - modules = { - '/test/namespace.ts': { - namespace: testNamespace, - }, - '/test/index.ts': { - route: testRoute, - }, - }; - break; case 'production': - // eslint-disable-next-line n/no-unpublished-require - namespaces = require('../assets/build/routes.json'); + // @ts-expect-error + namespaces = await import('../assets/build/routes.json'); break; default: modules = directoryImport({ diff --git a/lib/routes.test.ts b/lib/routes.test.ts new file mode 100644 index 0000000000..20fedf119b --- /dev/null +++ b/lib/routes.test.ts @@ -0,0 +1,78 @@ +import { describe, expect, it } from 'vitest'; +import app from '@/app'; +import Parser from 'rss-parser'; +const parser = new Parser(); +import { config } from '@/config'; + +process.env.ALLOW_USER_SUPPLY_UNSAFE_DOMAIN = 'true'; + +const routes = { + '/test/:id': '/test/1', +}; +if (process.env.FULL_ROUTES_TEST) { + const { namespaces } = await import('@/registry'); + for (const namespace in namespaces) { + for (const route in namespaces[namespace].routes) { + const requireConfig = namespaces[namespace].routes[route].features?.requireConfig; + let configs; + if (typeof requireConfig !== 'boolean') { + configs = requireConfig + ?.filter((config) => !config.optional) + .map((config) => config.name) + .filter((name) => name !== 'ALLOW_USER_SUPPLY_UNSAFE_DOMAIN'); + } + if (namespaces[namespace].routes[route].example && !configs?.length) { + routes[`/${namespace}${route}`] = namespaces[namespace].routes[route].example; + } + } + } +} + +async function checkRSS(response) { + const checkDate = (date) => { + expect(date).toEqual(expect.any(String)); + expect(Date.parse(date)).toEqual(expect.any(Number)); + expect(Date.now() - +new Date(date)).toBeGreaterThan(-1000 * 60 * 60 * 24 * 5); + expect(Date.now() - +new Date(date)).toBeLessThan(1000 * 60 * 60 * 24 * 30 * 12 * 10); + }; + + const parsed = await parser.parseString(await response.text()); + + expect(parsed).toEqual(expect.any(Object)); + expect(parsed.title).toEqual(expect.any(String)); + expect(parsed.title).not.toBe('RSSHub'); + expect(parsed.description).toEqual(expect.any(String)); + expect(parsed.link).toEqual(expect.any(String)); + expect(parsed.lastBuildDate).toEqual(expect.any(String)); + expect(parsed.ttl).toEqual(Math.trunc(config.cache.routeExpire / 60) + ''); + expect(parsed.items).toEqual(expect.any(Array)); + checkDate(parsed.lastBuildDate); + + // check items + const guids: (string | undefined)[] = []; + for (const item of parsed.items) { + expect(item).toEqual(expect.any(Object)); + expect(item.title).toEqual(expect.any(String)); + expect(item.link).toEqual(expect.any(String)); + expect(item.content).toEqual(expect.any(String)); + expect(item.guid).toEqual(expect.any(String)); + if (item.pubDate) { + expect(item.pubDate).toEqual(expect.any(String)); + checkDate(item.pubDate); + } + + // guid must be unique + expect(guids).not.toContain(item.guid); + guids.push(item.guid); + } +} + +describe('routes', () => { + for (const route in routes) { + it.concurrent(route, async () => { + const response = await app.request(routes[route]); + expect(response.status).toBe(200); + await checkRSS(response); + }); + } +}); diff --git a/lib/routes/afdian/dynamic.ts b/lib/routes/afdian/dynamic.ts index f69f6edc1a..2819a48a9e 100644 --- a/lib/routes/afdian/dynamic.ts +++ b/lib/routes/afdian/dynamic.ts @@ -1,4 +1,5 @@ import got from '@/utils/got'; +import type { Route } from '@/types'; export const route: Route = { path: '/dynamic/:uid?', diff --git a/lib/routes/bilibili/dynamic.ts b/lib/routes/bilibili/dynamic.ts index 0420620a69..8e127506eb 100644 --- a/lib/routes/bilibili/dynamic.ts +++ b/lib/routes/bilibili/dynamic.ts @@ -121,7 +121,6 @@ async function handler(ctx) { headers: { Referer: `https://space.bilibili.com/${uid}/`, }, - transformResponse: [(data) => data], }); const cards = JSONbig.parse(response.body).data.cards; diff --git a/lib/routes/test/index.ts b/lib/routes/test/index.ts index 52c884ea0d..752fad5957 100644 --- a/lib/routes/test/index.ts +++ b/lib/routes/test/index.ts @@ -79,13 +79,9 @@ async function handler(ctx) { break; case 'cache': { - const description = await cache.tryGet( - 'test', - () => ({ - text: `Cache${++cacheIndex}`, - }), - config.cache.routeExpire * 2 - ); + const description = await cache.tryGet('test', () => ({ + text: `Cache${++cacheIndex}`, + })); item.push({ title: 'Cache Title', description: description.text, diff --git a/lib/routes/youtube/channel.ts b/lib/routes/youtube/channel.ts index 426958bc44..dbfb5d1bbd 100644 --- a/lib/routes/youtube/channel.ts +++ b/lib/routes/youtube/channel.ts @@ -10,7 +10,12 @@ export const route: Route = { example: '/youtube/channel/UCDwDMPOZfxVV0x_dz0eQ8KQ', parameters: { id: 'YouTube channel id', embed: 'Default to embed the video, set to any value to disable embedding' }, features: { - requireConfig: false, + requireConfig: [ + { + name: 'YOUTUBE_KEY', + description: ' YouTube API Key, support multiple keys, split them with `,`, [API Key application](https://console.developers.google.com/)', + }, + ], requirePuppeteer: false, antiCrawler: false, supportBT: false, diff --git a/package.json b/package.json index f893d3a7a7..d3cedaeed5 100644 --- a/package.json +++ b/package.json @@ -19,20 +19,23 @@ "files": [ "lib" ], + "type": "module", "scripts": { "build": "tsx scripts/workflow/build-routes.ts", - "dev": "cross-env NODE_ENV=dev tsx watch --no-cache lib/index.ts", - "dev:cache": "cross-env NODE_ENV=production tsx watch lib/index.ts", + "build:docs": "tsx scripts/workflow/build-docs.ts", + "dev": "NODE_ENV=dev tsx watch --no-cache lib/index.ts", + "dev:cache": "NODE_ENV=production tsx watch lib/index.ts", "format": "eslint --cache --fix \"**/*.{ts,js,yml}\" && prettier \"**/*.{ts,js,json}\" --write", "format:check": "eslint --cache \"**/*.{ts,js,yml}\" && prettier \"**/*.{ts,js,json}\" --check", "format:staged": "lint-staged", - "vitest": "cross-env NODE_ENV=test vitest", - "vitest:coverage": "cross-env NODE_ENV=test vitest --coverage.enabled --reporter=junit", - "vitest:watch": "cross-env NODE_ENV=test vitest --watch", + "vitest": "NODE_ENV=test vitest", + "vitest:fullroutes": "NODE_ENV=test FULL_ROUTES_TEST=true vitest --reporter=json --reporter=default --outputFile=\"./assets/build/test-full-routes.json\" routes", + "vitest:coverage": "NODE_ENV=test vitest --coverage.enabled --reporter=junit", + "vitest:watch": "NODE_ENV=test vitest --watch", "lint": "eslint --cache .", "prepare": "husky || true", "profiling": "NODE_ENV=production tsx --prof lib/index.ts", - "start": "cross-env NODE_ENV=production tsx lib/index.ts", + "start": "NODE_ENV=production tsx lib/index.ts", "test": "npm run format:check && npm run vitest:coverage" }, "lint-staged": { @@ -147,7 +150,6 @@ "@typescript-eslint/parser": "7.3.1", "@vercel/nft": "0.26.4", "@vitest/coverage-v8": "1.4.0", - "cross-env": "7.0.3", "eslint": "8.57.0", "eslint-config-prettier": "9.1.0", "eslint-nibble": "8.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 76e6faa3aa..243f04630a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -301,9 +301,6 @@ devDependencies: '@vitest/coverage-v8': specifier: 1.4.0 version: 1.4.0(vitest@1.4.0) - cross-env: - specifier: 7.0.3 - version: 7.0.3 eslint: specifier: 8.57.0 version: 8.57.0 @@ -3901,14 +3898,6 @@ packages: typescript: 5.4.3 dev: false - /cross-env@7.0.3: - resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} - engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} - hasBin: true - dependencies: - cross-spawn: 7.0.3 - dev: true - /cross-spawn@5.1.0: resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} dependencies: diff --git a/scripts/workflow/build-docs.ts b/scripts/workflow/build-docs.ts new file mode 100644 index 0000000000..8f019ac928 --- /dev/null +++ b/scripts/workflow/build-docs.ts @@ -0,0 +1,122 @@ +import { namespaces } from '../../lib/registry'; +import fs from 'node:fs'; +import * as path from 'node:path'; +import { categories } from './data'; +import fullTests from '../../assets/build/test-full-routes.json'; +import { getCurrentPath } from '../../lib/utils/helpers'; + +const testResult = fullTests.testResults[0].assertionResults; + +const __dirname = getCurrentPath(import.meta.url); + +const docs = {}; + +for (const namespace in namespaces) { + let defaultCategory = namespaces[namespace].categories?.[0]; + if (!defaultCategory) { + for (const path in namespaces[namespace].routes) { + if (namespaces[namespace].routes[path].categories) { + defaultCategory = namespaces[namespace].routes[path].categories[0]; + break; + } + } + } + if (!defaultCategory) { + defaultCategory = 'other'; + } + for (const path in namespaces[namespace].routes) { + const realPath = `/${namespace}${path}`; + const data = namespaces[namespace].routes[path]; + const categories = data.categories || namespaces[namespace].categories || [defaultCategory]; + // docs.json + for (const category of categories) { + if (!docs[category]) { + docs[category] = {}; + } + if (!docs[category][namespace]) { + docs[category][namespace] = { + routes: {}, + }; + } + docs[category][namespace].name = namespaces[namespace].name; + docs[category][namespace].url = namespaces[namespace].url; + docs[category][namespace].description = namespaces[namespace].description; + docs[category][namespace].routes[realPath] = data; + } + } +} + +// Generate markdown +const pinyinCompare = new Intl.Collator('zh-Hans-CN-u-co-pinyin').compare; +const isASCII = (str) => /^[\u0000-\u007F]*$/.test(str); + +function generateMd(lang) { + const md = {}; + for (const category in docs) { + const nameObj = categories.find((c) => c.link.includes(category)); + if (!nameObj) { + throw new Error(`Category not found: ${category}, please double check your spelling.`); + } + + md[category] = `# ${`${nameObj.icon} ${nameObj[lang]}`}\n\n`; + + const namespaces = Object.keys(docs[category]).sort((a, b) => { + const aname = docs[category][a].name[0]; + const bname = docs[category][b].name[0]; + const ia = isASCII(aname); + const ib = isASCII(bname); + if (ia && ib) { + return aname.toLowerCase() < bname.toLowerCase() ? -1 : 1; + } else if (ia || ib) { + return ia > ib ? -1 : 1; + } else { + return pinyinCompare(aname, bname); + } + }); + for (const namespace of namespaces) { + if (docs[category][namespace].name === 'Unknown') { + docs[category][namespace].name = namespace; + } + md[category] += `## ${docs[category][namespace].name || namespace} ${docs[category][namespace].url ? `` : ''}\n\n`; + if (docs[category][namespace].description) { + md[category] += `${docs[category][namespace].description}\n\n`; + } + + const realPaths = Object.keys(docs[category][namespace].routes).sort((a, b) => { + const aname = docs[category][namespace].routes[a].name[0]; + const bname = docs[category][namespace].routes[b].name[0]; + const ia = isASCII(aname); + const ib = isASCII(bname); + if (ia && ib) { + return aname.toLowerCase() < bname.toLowerCase() ? -1 : 1; + } else if (ia || ib) { + return ia > ib ? -1 : 1; + } else { + return pinyinCompare(aname, bname); + } + }); + + for (const realPath of realPaths) { + const data = docs[category][namespace].routes[realPath]; + const test = testResult.find((t) => t.title === realPath); + const parsedTest = test + ? { + code: test.status === 'passed' ? 0 : 1, + message: test.failureMessages?.[0], + } + : undefined; + md[category] += `### ${data.name} ${data.url || docs[category][namespace].url ? `` : ''}\n\n`; + md[category] += `\n\n`; + if (data.description) { + md[category] += `${data.description}\n\n`; + } + } + } + } + fs.mkdirSync(path.join(__dirname, `../../assets/build/docs/${lang}`), { recursive: true }); + for (const category in md) { + fs.writeFileSync(path.join(__dirname, `../../assets/build/docs/${lang}/${category}.md`), md[category]); + } +} +generateMd('en'); +generateMd('zh'); diff --git a/scripts/workflow/build-routes.ts b/scripts/workflow/build-routes.ts index af441dfd5f..3a4634cc1f 100644 --- a/scripts/workflow/build-routes.ts +++ b/scripts/workflow/build-routes.ts @@ -4,7 +4,9 @@ import { parse } from 'tldts'; import fs from 'node:fs'; import * as path from 'node:path'; import toSource from 'tosource'; -import { categories } from './data'; + +import { getCurrentPath } from '../../lib/utils/helpers'; +const __dirname = getCurrentPath(import.meta.url); const maintainers: Record = {}; const radar: { @@ -13,7 +15,6 @@ const radar: { [subdomain: string]: RadarItem[] | string; }; } = {}; -const docs = {}; for (const namespace in namespaces) { let defaultCategory = namespaces[namespace].categories?.[0]; @@ -63,21 +64,6 @@ for (const namespace in namespaces) { } } } - // docs.json - for (const category of categories) { - if (!docs[category]) { - docs[category] = {}; - } - if (!docs[category][namespace]) { - docs[category][namespace] = { - routes: {}, - }; - } - docs[category][namespace].name = namespaces[namespace].name; - docs[category][namespace].url = namespaces[namespace].url; - docs[category][namespace].description = namespaces[namespace].description; - docs[category][namespace].routes[realPath] = data; - } } } @@ -85,71 +71,3 @@ fs.writeFileSync(path.join(__dirname, '../../assets/build/radar-rules.json'), JS fs.writeFileSync(path.join(__dirname, '../../assets/build/radar-rules.js'), `(${toSource(radar)})`); fs.writeFileSync(path.join(__dirname, '../../assets/build/maintainers.json'), JSON.stringify(maintainers, null, 2)); fs.writeFileSync(path.join(__dirname, '../../assets/build/routes.json'), JSON.stringify(namespaces, null, 2)); - -// Generate markdown -const pinyinCompare = new Intl.Collator('zh-Hans-CN-u-co-pinyin').compare; -const isASCII = (str) => /^[\u0000-\u007F]*$/.test(str); - -function generateMd(lang) { - const md = {}; - for (const category in docs) { - const nameObj = categories.find((c) => c.link.includes(category)); - if (!nameObj) { - throw new Error(`Category not found: ${category}, please double check your spelling.`); - } - - md[category] = `# ${`${nameObj.icon} ${nameObj[lang]}`}\n\n`; - - const namespaces = Object.keys(docs[category]).sort((a, b) => { - const aname = docs[category][a].name[0]; - const bname = docs[category][b].name[0]; - const ia = isASCII(aname); - const ib = isASCII(bname); - if (ia && ib) { - return aname.toLowerCase() < bname.toLowerCase() ? -1 : 1; - } else if (ia || ib) { - return ia > ib ? -1 : 1; - } else { - return pinyinCompare(aname, bname); - } - }); - for (const namespace of namespaces) { - if (docs[category][namespace].name === 'Unknown') { - docs[category][namespace].name = namespace; - } - md[category] += `## ${docs[category][namespace].name || namespace} ${docs[category][namespace].url ? `` : ''}\n\n`; - if (docs[category][namespace].description) { - md[category] += `${docs[category][namespace].description}\n\n`; - } - - const realPaths = Object.keys(docs[category][namespace].routes).sort((a, b) => { - const aname = docs[category][namespace].routes[a].name[0]; - const bname = docs[category][namespace].routes[b].name[0]; - const ia = isASCII(aname); - const ib = isASCII(bname); - if (ia && ib) { - return aname.toLowerCase() < bname.toLowerCase() ? -1 : 1; - } else if (ia || ib) { - return ia > ib ? -1 : 1; - } else { - return pinyinCompare(aname, bname); - } - }); - - for (const realPath of realPaths) { - const data = docs[category][namespace].routes[realPath]; - md[category] += `### ${data.name} ${data.url || docs[category][namespace].url ? `` : ''}\n\n`; - md[category] += `\n\n`; - if (data.description) { - md[category] += `${data.description}\n\n`; - } - } - } - } - fs.mkdirSync(path.join(__dirname, `../../assets/build/docs/${lang}`), { recursive: true }); - for (const category in md) { - fs.writeFileSync(path.join(__dirname, `../../assets/build/docs/${lang}/${category}.md`), md[category]); - } -} -generateMd('en'); -generateMd('zh'); diff --git a/tsconfig.json b/tsconfig.json index 5135a96656..20bc583435 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "target": "ESNext", "module": "ESNext", - "moduleResolution": "Bundler", + "moduleResolution": "node", "strict": true, "jsx": "react-jsx", "jsxImportSource": "hono/jsx", @@ -11,7 +11,12 @@ }, "esModuleInterop": true, "noImplicitAny": false, - "outDir": "./dist" + "outDir": "./dist", + "skipLibCheck": true, + "noEmit": true, + "incremental": true, + "resolveJsonModule": true, + "isolatedModules": true }, "include": ["./lib/**/*", "./api/vercel.ts"], "exclude": ["node_modules", "*.test.*"] From cd0d3f9df7c81565fc133ef4f74b87f745466939 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Sun, 24 Mar 2024 19:17:29 +0800 Subject: [PATCH 14/99] chore: fix timeout and ignore eslint --- .eslintignore | 2 +- .github/workflows/build-assets.yml | 2 +- .prettierignore | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 .prettierignore diff --git a/.eslintignore b/.eslintignore index 5b176d4301..f34dd213c3 100644 --- a/.eslintignore +++ b/.eslintignore @@ -2,4 +2,4 @@ coverage .vscode docker-compose.yml !/.github -!/docs/.vuepress +lib/routes-deprecated diff --git a/.github/workflows/build-assets.yml b/.github/workflows/build-assets.yml index 3b1f4febcd..d435703bf7 100644 --- a/.github/workflows/build-assets.yml +++ b/.github/workflows/build-assets.yml @@ -15,7 +15,7 @@ jobs: build: runs-on: ubuntu-latest name: Build assets - timeout-minutes: 5 + timeout-minutes: 60 permissions: contents: write steps: diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000000..6bfa0646ef --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +lib/routes-deprecated From 3a15e006433570224f57ace8d38f0264e5e8409b Mon Sep 17 00:00:00 2001 From: DIYgod Date: Sun, 24 Mar 2024 19:20:39 +0800 Subject: [PATCH 15/99] chore: ignore files for eslint --- .eslintignore | 3 +++ .prettierignore | 3 +++ 2 files changed, 6 insertions(+) diff --git a/.eslintignore b/.eslintignore index f34dd213c3..c0bb49c95c 100644 --- a/.eslintignore +++ b/.eslintignore @@ -3,3 +3,6 @@ coverage docker-compose.yml !/.github lib/routes-deprecated +lib/router.js +babel.config.js +scripts/docker/minify-docker.js diff --git a/.prettierignore b/.prettierignore index 6bfa0646ef..b6b684c5ac 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1 +1,4 @@ lib/routes-deprecated +lib/router.js +babel.config.js +scripts/docker/minify-docker.js From fbdfcd2078cc5ecf6d9689697873d4e7097668ef Mon Sep 17 00:00:00 2001 From: DIYgod Date: Sun, 24 Mar 2024 20:36:49 +0800 Subject: [PATCH 16/99] chore: add continue-on-error: true --- .github/workflows/build-assets.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-assets.yml b/.github/workflows/build-assets.yml index d435703bf7..26411d1c68 100644 --- a/.github/workflows/build-assets.yml +++ b/.github/workflows/build-assets.yml @@ -35,6 +35,7 @@ jobs: - name: Build assets run: pnpm build - name: Build full routes test result + continue-on-error: true run: pnpm vitest:fullroutes - name: Build docs run: pnpm build:docs From 18f50bb4daeffa01c48de5d69c05fb80800efd6d Mon Sep 17 00:00:00 2001 From: DIYgod Date: Sun, 24 Mar 2024 21:11:38 +0800 Subject: [PATCH 17/99] fix: remove require.main --- lib/routes/telegram/tglib/client.ts | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/lib/routes/telegram/tglib/client.ts b/lib/routes/telegram/tglib/client.ts index d135afb458..6d01710f96 100644 --- a/lib/routes/telegram/tglib/client.ts +++ b/lib/routes/telegram/tglib/client.ts @@ -1,4 +1,3 @@ -import readline from 'node:readline/promises'; import { Api, TelegramClient } from 'telegram'; import { UserAuthParams } from 'telegram/client/auth'; import { StringSession } from 'telegram/sessions'; @@ -187,20 +186,3 @@ function streamDocument(obj, thumbSize = '', offset, limit) { } export { client, getMediaLink, decodeMedia, getFilename, streamDocument, streamThumbnail }; - -if (require.main === module) { - Promise.resolve().then(async () => { - const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); - const client = await getClient( - { - phoneNumber: () => rl.question('Please enter your phone number: '), - password: () => rl.question('Please enter your password: '), - phoneCode: () => rl.question('Please enter the code you received: '), - onError: (err) => process.stderr.write(err.toString()), - }, - '' - ); - process.stdout.write(`TELEGRAM_SESSION=${client.session.save()}\n`); - process.exit(0); - }); -} From 8817829e20bcbb1804eec24229dfbab1d8115b83 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Sun, 24 Mar 2024 21:14:25 +0800 Subject: [PATCH 18/99] fix: build docs --- scripts/workflow/build-docs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/workflow/build-docs.ts b/scripts/workflow/build-docs.ts index 8f019ac928..586f6ef0f8 100644 --- a/scripts/workflow/build-docs.ts +++ b/scripts/workflow/build-docs.ts @@ -106,7 +106,7 @@ function generateMd(lang) { } : undefined; md[category] += `### ${data.name} ${data.url || docs[category][namespace].url ? `` : ''}\n\n`; - md[category] += `\n\n`; + md[category] += `\n\n`; if (data.description) { md[category] += `${data.description}\n\n`; } From f837345f36c5c34a6bb8540e7a4259ab7d110e81 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Sun, 24 Mar 2024 21:20:18 +0800 Subject: [PATCH 19/99] fix: remove require --- lib/utils/proxy/index.ts | 8 ++++---- lib/utils/puppeteer.ts | 25 +------------------------ 2 files changed, 5 insertions(+), 28 deletions(-) diff --git a/lib/utils/proxy/index.ts b/lib/utils/proxy/index.ts index b307f84cda..b49730693b 100644 --- a/lib/utils/proxy/index.ts +++ b/lib/utils/proxy/index.ts @@ -1,4 +1,7 @@ import { config } from '@/config'; +import { PacProxyAgent } from 'pac-proxy-agent'; +import { HttpsProxyAgent } from 'https-proxy-agent'; +import { SocksProxyAgent } from 'socks-proxy-agent'; const proxyIsPAC = config.pacUri || config.pacScript; @@ -20,16 +23,13 @@ if (proxyIsPAC) { proxyUrlHandler = proxy.proxyUrlHandler; } -let agent = null; +let agent: PacProxyAgent | HttpsProxyAgent | SocksProxyAgent | null = null; if (proxyIsPAC) { - const { PacProxyAgent } = require('pac-proxy-agent'); agent = new PacProxyAgent(`pac+${proxyUri}`); } else if (proxyUri) { if (proxyUri.startsWith('http')) { - const { HttpsProxyAgent } = require('https-proxy-agent'); agent = new HttpsProxyAgent(proxyUri); } else if (proxyUri.startsWith('socks')) { - const { SocksProxyAgent } = require('socks-proxy-agent'); agent = new SocksProxyAgent(proxyUri); } } diff --git a/lib/utils/puppeteer.ts b/lib/utils/puppeteer.ts index 9ad470f91e..24c3616324 100644 --- a/lib/utils/puppeteer.ts +++ b/lib/utils/puppeteer.ts @@ -2,8 +2,7 @@ import { config } from '@/config'; import puppeteer from 'puppeteer'; import logger from './logger'; import proxy from './proxy'; - -const proxyChain = require('proxy-chain'); +import proxyChain from 'proxy-chain'; import { type PuppeteerExtra, addExtra } from 'puppeteer-extra'; import StealthPlugin from 'puppeteer-extra-plugin-stealth'; @@ -27,28 +26,6 @@ const outPuppeteer = async ( let insidePuppeteer: PuppeteerExtra | typeof puppeteer = puppeteer; if (extraOptions.stealth) { insidePuppeteer = addExtra(puppeteer); - - // workaround for vercel/nft #54, #283, #304 - require('puppeteer-extra-plugin-stealth/evasions/chrome.app'); - require('puppeteer-extra-plugin-stealth/evasions/chrome.csi'); - require('puppeteer-extra-plugin-stealth/evasions/chrome.loadTimes'); - require('puppeteer-extra-plugin-stealth/evasions/chrome.runtime'); - require('puppeteer-extra-plugin-stealth/evasions/defaultArgs'); - require('puppeteer-extra-plugin-stealth/evasions/iframe.contentWindow'); - require('puppeteer-extra-plugin-stealth/evasions/media.codecs'); - require('puppeteer-extra-plugin-stealth/evasions/navigator.hardwareConcurrency'); - require('puppeteer-extra-plugin-stealth/evasions/navigator.languages'); - require('puppeteer-extra-plugin-stealth/evasions/navigator.permissions'); - require('puppeteer-extra-plugin-stealth/evasions/navigator.plugins'); - require('puppeteer-extra-plugin-stealth/evasions/navigator.vendor'); - require('puppeteer-extra-plugin-stealth/evasions/navigator.webdriver'); - require('puppeteer-extra-plugin-stealth/evasions/sourceurl'); - require('puppeteer-extra-plugin-stealth/evasions/user-agent-override'); - require('puppeteer-extra-plugin-stealth/evasions/webgl.vendor'); - require('puppeteer-extra-plugin-stealth/evasions/window.outerdimensions'); - require('puppeteer-extra-plugin-user-preferences'); - require('puppeteer-extra-plugin-user-data-dir'); - insidePuppeteer.use(StealthPlugin()); } From d22a63c6d073bd61989bcad7837256c4b605965d Mon Sep 17 00:00:00 2001 From: DIYgod Date: Sun, 24 Mar 2024 22:36:21 +0800 Subject: [PATCH 20/99] chore: schedule test full routes --- .github/workflows/build-assets.yml | 9 ------ .github/workflows/test-full-routes.yml | 44 ++++++++++++++++++++++++++ scripts/workflow/build-docs.ts | 2 +- 3 files changed, 45 insertions(+), 10 deletions(-) create mode 100644 .github/workflows/test-full-routes.yml diff --git a/.github/workflows/build-assets.yml b/.github/workflows/build-assets.yml index 26411d1c68..7ef73eafe3 100644 --- a/.github/workflows/build-assets.yml +++ b/.github/workflows/build-assets.yml @@ -34,17 +34,8 @@ jobs: run: pnpm i - name: Build assets run: pnpm build - - name: Build full routes test result - continue-on-error: true - run: pnpm vitest:fullroutes - name: Build docs run: pnpm build:docs - - name: Commit files - run: | - git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com" - git config --local user.name "github-actions[bot]" - git status - git diff-index --quiet HEAD || (git commit -m "chore: auto build" -a --no-verify && git push "https://${GITHUB_ACTOR}:${{ secrets.GITHUB_TOKEN }}@github.com/${GITHUB_REPOSITORY}.git" HEAD:master) - name: Deploy uses: peaceiris/actions-gh-pages@v3 with: diff --git a/.github/workflows/test-full-routes.yml b/.github/workflows/test-full-routes.yml new file mode 100644 index 0000000000..9e342975df --- /dev/null +++ b/.github/workflows/test-full-routes.yml @@ -0,0 +1,44 @@ +name: Build assets + +on: + workflow_dispatch: + schedule: + - cron: '0 0 * * *' + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-latest + name: Build assets + timeout-minutes: 60 + permissions: + contents: write + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Install pnpm + uses: pnpm/action-setup@v3 + with: + version: 8 + - name: Use Node.js Active LTS + uses: actions/setup-node@v4 + with: + node-version: lts/* + cache: 'pnpm' + - name: Install dependencies (yarn) + run: pnpm i + - name: Build assets + run: pnpm build + - name: Build full routes test result + continue-on-error: true + run: pnpm vitest:fullroutes + - name: Deploy + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./assets + user_name: 'github-actions[bot]' + user_email: '41898282+github-actions[bot]@users.noreply.github.com' + keep_files: true diff --git a/scripts/workflow/build-docs.ts b/scripts/workflow/build-docs.ts index 586f6ef0f8..43384e1525 100644 --- a/scripts/workflow/build-docs.ts +++ b/scripts/workflow/build-docs.ts @@ -2,9 +2,9 @@ import { namespaces } from '../../lib/registry'; import fs from 'node:fs'; import * as path from 'node:path'; import { categories } from './data'; -import fullTests from '../../assets/build/test-full-routes.json'; import { getCurrentPath } from '../../lib/utils/helpers'; +const fullTests = await (await fetch('https://raw.githubusercontent.com/DIYgod/RSSHub/gh-pages/build/test-full-routes.json')).json(); const testResult = fullTests.testResults[0].assertionResults; const __dirname = getCurrentPath(import.meta.url); From 7ac4ffd1ae28753fa2b7f7a77564152da7a0c52f Mon Sep 17 00:00:00 2001 From: Jia Chen Date: Mon, 25 Mar 2024 00:27:11 +0800 Subject: [PATCH 21/99] feat(route): recover route blogread/newest (#14937) * feat(route): recover route blogread/newest * fix(route): Update lib/routes/blogread/index.ts * Update lib/routes/blogread/index.ts --------- --- lib/router.js | 3 -- .../newest.js => routes/blogread/index.ts} | 29 ++++++++++++++----- lib/routes/blogread/namespace.ts | 6 ++++ 3 files changed, 28 insertions(+), 10 deletions(-) rename lib/{routes-deprecated/blogread/newest.js => routes/blogread/index.ts} (52%) create mode 100644 lib/routes/blogread/namespace.ts diff --git a/lib/router.js b/lib/router.js index 6acc307b7a..215bd0e567 100644 --- a/lib/router.js +++ b/lib/router.js @@ -379,9 +379,6 @@ router.get('/geekpark/breakingnews', lazyloadRouteHandler('./routes/geekpark/bre // 香港天文台 router.get('/hko/weather', lazyloadRouteHandler('./routes/hko/weather')); -// 技术头条 -router.get('/blogread/newest', lazyloadRouteHandler('./routes/blogread/newest')); - // gnn游戏新闻 router.get('/gnn/gnn', lazyloadRouteHandler('./routes/gnn/gnn')); diff --git a/lib/routes-deprecated/blogread/newest.js b/lib/routes/blogread/index.ts similarity index 52% rename from lib/routes-deprecated/blogread/newest.js rename to lib/routes/blogread/index.ts index 8e1872b2cc..bef75385ca 100644 --- a/lib/routes-deprecated/blogread/newest.js +++ b/lib/routes/blogread/index.ts @@ -1,8 +1,23 @@ -const got = require('@/utils/got'); -const cheerio = require('cheerio'); +import { Route } from '@/types'; +import got from '@/utils/got'; +import * as cheerio from 'cheerio'; -module.exports = async (ctx) => { - const url = 'http://blogread.cn/news/newest.php'; +export const route: Route = { + path: '/newest', + categories: ['programming'], + example: '/blogread/newest', + radar: [ + { + source: ['blogread.cn/news/newest.php'], + }, + ], + name: '最新文章', + maintainers: ['fashioncj'], + handler, +}; + +async function handler() { + const url = 'https://blogread.cn/news/newest.php'; const response = await got({ method: 'get', url, @@ -12,19 +27,19 @@ module.exports = async (ctx) => { .map((index, elem) => { elem = $(elem); const $link = elem.find('dt a'); - return { title: $link.text(), description: elem.find('dd').eq(0).text(), link: $link.attr('href'), author: elem.find('.small a').eq(0).text(), + pubDate: elem.find('dd').eq(1).text().split('\n')[2], }; }) .get(); - ctx.state.data = { + return { title: '技术头条', link: url, item: resultItem, }; -}; +} diff --git a/lib/routes/blogread/namespace.ts b/lib/routes/blogread/namespace.ts new file mode 100644 index 0000000000..7f56723d33 --- /dev/null +++ b/lib/routes/blogread/namespace.ts @@ -0,0 +1,6 @@ +import type { Namespace } from '@/types'; + +export const namespace: Namespace = { + name: '技术头条', + url: 'blogread.cn', +}; From 81bf135e96b42ad449c648afa2aa42d18d976f36 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Mon, 25 Mar 2024 02:00:47 +0800 Subject: [PATCH 22/99] fix: ofetch searchParams and form --- lib/routes/pixiv/token.ts | 35 ++++++++++++++--------------------- lib/utils/got.ts | 20 +++++++++++++------- 2 files changed, 27 insertions(+), 28 deletions(-) diff --git a/lib/routes/pixiv/token.ts b/lib/routes/pixiv/token.ts index ac0d9e5425..98356a0579 100644 --- a/lib/routes/pixiv/token.ts +++ b/lib/routes/pixiv/token.ts @@ -15,34 +15,27 @@ const refreshToken = (tryGet) => tryGet( 'pixiv:accessToken', () => - got - .post('https://oauth.secure.pixiv.net/auth/token', { - form: { - ...authorizationInfo, - get_secure_url: 1, - grant_type: 'refresh_token', - refresh_token: config.pixiv.refreshToken, - }, - headers: { - ...maskHeader, - }, - responseType: 'json', - resolveBodyOnly: true, - }) - .catch((error) => { - logger.error('Pixiv refresh token failed.'); - logger.error(error); - }), + got.post('https://oauth.secure.pixiv.net/auth/token', { + form: { + ...authorizationInfo, + get_secure_url: 1, + grant_type: 'refresh_token', + refresh_token: config.pixiv.refreshToken, + }, + headers: { + ...maskHeader, + }, + }), 3600, false ); async function getToken(tryGet) { - const result = await refreshToken(tryGet); + const { data } = await refreshToken(tryGet); // let expireTime; - if (result && result.access_token) { + if (data && data.access_token) { logger.debug('Pixiv refresh token success.'); - token = result.access_token; + token = data.access_token; // expireTime = result.expires_in; } // } else { diff --git a/lib/utils/got.ts b/lib/utils/got.ts index 6701fd5021..a602fab3a5 100644 --- a/lib/utils/got.ts +++ b/lib/utils/got.ts @@ -9,12 +9,7 @@ const gotofetch = ofetch.create({ }); const getFakeGot = (defaultOptions?: any) => { - const fakeGot = (request, options) => { - if (options?.hooks?.beforeRequest) { - for (const hook of options.hooks.beforeRequest) { - hook(options); - } - } + const fakeGot = (request, options?: any) => { if (!(typeof request === 'string' || request instanceof Request) && request.url) { options = { ...request, @@ -22,6 +17,12 @@ const getFakeGot = (defaultOptions?: any) => { }; request = request.url; } + if (options?.hooks?.beforeRequest) { + for (const hook of options.hooks.beforeRequest) { + hook(options); + } + delete options.hooks; + } options = { ...defaultOptions, @@ -30,6 +31,7 @@ const getFakeGot = (defaultOptions?: any) => { if (options?.json && !options.body) { options.body = options.json; + delete options.json; } if (options?.form && !options.body) { const body = new FormData(); @@ -40,7 +42,11 @@ const getFakeGot = (defaultOptions?: any) => { if (!options.headers) { options.headers = {}; } - options.headers['Content-Type'] = 'application/x-www-form-urlencoded'; + delete options.form; + } + if (options?.searchParams) { + request += '?' + new URLSearchParams(options.searchParams).toString(); + delete options.searchParams; } return gotofetch(request, options); From 0fea009f70e7782453c2c43bf35e12e20d260d92 Mon Sep 17 00:00:00 2001 From: Ethan Shen <42264778+nczitzk@users.noreply.github.com> Date: Mon, 25 Mar 2024 02:12:49 +0800 Subject: [PATCH 23/99] feat(route): add 1x.com (#14936) * feat(route): add 1x.com * fix radar * fix example --- lib/routes-deprecated/1x/index.js | 69 -------------- lib/routes/1x/index.ts | 121 ++++++++++++++++++++++++ lib/routes/1x/namespace.ts | 8 ++ lib/routes/1x/templates/description.art | 17 ++++ 4 files changed, 146 insertions(+), 69 deletions(-) delete mode 100644 lib/routes-deprecated/1x/index.js create mode 100644 lib/routes/1x/index.ts create mode 100644 lib/routes/1x/namespace.ts create mode 100644 lib/routes/1x/templates/description.art diff --git a/lib/routes-deprecated/1x/index.js b/lib/routes-deprecated/1x/index.js deleted file mode 100644 index fee5008011..0000000000 --- a/lib/routes-deprecated/1x/index.js +++ /dev/null @@ -1,69 +0,0 @@ -const got = require('@/utils/got'); -const cheerio = require('cheerio'); - -const categories = { - latest: 'latest', - popular: 'popular', - published: 'published', - abstract: 'latest:15:', - action: 'latest:1:', - animals: 'latest:21:', - architecture: 'latest:11:', - conceptual: 'latest:17:', - 'creative-edit': 'latest:10:', - documentary: 'latest:8:', - everyday: 'latest:14:', - 'fine-art-nude': 'latest:12:', - humour: 'latest:3:', - landscape: 'latest:6:', - macro: 'latest:2:', - mood: 'latest:4:', - night: 'latest:9:', - performance: 'latest:19:', - portrait: 'latest:13:', - 'still-life': 'latest:18:', - street: 'latest:7:', - underwater: 'latest:20:', - wildlife: 'latest:5:', -}; - -module.exports = async (ctx) => { - const category = ctx.params.category || 'latest'; - - const rootUrl = `https://1x.com`; - const currentUrl = `${rootUrl}/gallery/${category}`; - const apiUrl = `${rootUrl}/backend/lm.php?style=normal&mode=${categories[category]}&from=0&autoload=`; - const response = await got({ - method: 'get', - url: apiUrl, - }); - - const $ = cheerio.load(response.data); - - const items = $('root data') - .html() - .split('\n') - .slice(0, -1) - .map((item) => { - item = $(item); - - const id = item - .find('.photos-feed-image') - .attr('id') - .match(/img-(\d+)/)[1]; - - return { - guid: id, - link: `${rootUrl}/photo/${id}`, - author: item.find('.photos-feed-data-name').eq(0).text(), - title: item.find('.photos-feed-data-title').text() || 'Untitled', - description: ``, - }; - }); - - ctx.state.data = { - title: `${category} - 1X`, - link: currentUrl, - item: items, - }; -}; diff --git a/lib/routes/1x/index.ts b/lib/routes/1x/index.ts new file mode 100644 index 0000000000..f978ff5519 --- /dev/null +++ b/lib/routes/1x/index.ts @@ -0,0 +1,121 @@ +import { Route } from '@/types'; +import { getCurrentPath } from '@/utils/helpers'; +const __dirname = getCurrentPath(import.meta.url); + +import got from '@/utils/got'; +import { load } from 'cheerio'; +import { art } from '@/utils/render'; +import * as path from 'node:path'; + +export const handler = async (ctx) => { + const { category = 'latest/awarded' } = ctx.req.param(); + const limit = ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit'), 10) : 30; + + const rootUrl = 'https://1x.com'; + const currentUrl = new URL(`gallery/${category}`, rootUrl).href; + + const { data: currentResponse } = await got(currentUrl); + + const $ = load(currentResponse); + + const language = $('html').prop('lang'); + const apiUrl = new URL(`backend/lm2.php?style=normal&mode=${$('input#lm_mode').prop('value')}`, rootUrl).href; + + const { data: response } = await got(apiUrl); + + const $$ = load(response); + + const items = $$('div.photos-feed-item') + .slice(0, limit) + .toArray() + .map((item) => { + item = $(item); + + const title = item.find('span.photos-feed-data-title').first().text() || 'Untitled'; + const image = item.find('img').prop('src'); + const author = item.find('span.photos-feed-data-name').first().text(); + + const text = `${title} by ${author}`; + + const description = art(path.join(__dirname, 'templates/description.art'), { + images: image + ? [ + { + src: image, + alt: title, + }, + ] + : undefined, + description: text, + }); + + const id = item.find('img[id]').prop('id').split(/-/).pop(); + const guid = `1x-${id}`; + + return { + title, + description, + link: new URL(`photo/${id}`, rootUrl).href, + author, + guid, + id: guid, + content: { + html: description, + text, + }, + image, + banner: image, + language, + enclosure_url: image, + enclosure_type: image ? `image/${image.split(/\./).pop()}` : undefined, + enclosure_title: title, + }; + }); + + const image = new URL($('img.themedlogo').prop('src'), rootUrl).href; + + return { + title: $('title').text(), + description: $('meta[name="description"]').prop('content'), + link: currentUrl, + item: items, + allowEmpty: true, + image, + author: $('meta[property="og:site_name"]').prop('content'), + language, + }; +}; + +export const route: Route = { + path: '/:category{.+}?', + name: 'Gallery', + url: '1x.com', + maintainers: ['nczitzk'], + handler, + example: '/1x/latest/awarded', + parameters: { category: 'Category, Latest Awarded by default' }, + description: `::: tip +Fill in the field in the path with the part of the corresponding page URL after \`https://1x.com/gallery/\` or \`https://1x.com/photo/\`. Here are the examples: + +If you subscribe to [Abstract Awarded](https://1x.com/gallery/abstract/awarded), you should fill in the path with the part \`abstract/awarded\` from the page URL \`https://1x.com/gallery/abstract/awarded\`. In this case, the route will be [\`/1x/abstract/awarded\`](https://rsshub.app/1x/abstract/awarded). + +If you subscribe to [Wildlife Published](https://1x.com/gallery/wildlife/published), you should fill in the path with the part \`wildlife/published\` from the page URL \`https://1x.com/gallery/wildlife/published\`. In this case, the route will be [\`/1x/wildlife/published\`](https://rsshub.app/1x/wildlife/published). +:::`, + categories: ['design', 'picture'], + + features: { + requireConfig: false, + requirePuppeteer: false, + antiCrawler: false, + supportRadar: true, + supportBT: false, + supportPodcast: false, + supportScihub: false, + }, + radar: [ + { + source: ['/gallery/:category*', '/photos/:category*'], + target: '/1x/:category', + }, + ], +}; diff --git a/lib/routes/1x/namespace.ts b/lib/routes/1x/namespace.ts new file mode 100644 index 0000000000..4e8cc283eb --- /dev/null +++ b/lib/routes/1x/namespace.ts @@ -0,0 +1,8 @@ +import type { Namespace } from '@/types'; + +export const namespace: Namespace = { + name: '1x.com', + url: '1x.com', + categories: ['design', 'picture'], + description: '1x.com • In Pursuit of the Sublime. Browse 200,000 curated photos from photographers all over the world.', +}; diff --git a/lib/routes/1x/templates/description.art b/lib/routes/1x/templates/description.art new file mode 100644 index 0000000000..dfab19230c --- /dev/null +++ b/lib/routes/1x/templates/description.art @@ -0,0 +1,17 @@ +{{ if images }} + {{ each images image }} + {{ if image?.src }} +
+ {{ image.alt }} +
+ {{ /if }} + {{ /each }} +{{ /if }} + +{{ if description }} + {{@ description }} +{{ /if }} \ No newline at end of file From a7053991e982ebf29d121ba3285a2f1ae55396be Mon Sep 17 00:00:00 2001 From: Tony Date: Mon, 25 Mar 2024 02:22:24 +0800 Subject: [PATCH 24/99] chore: update CI name --- .github/workflows/test-full-routes.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-full-routes.yml b/.github/workflows/test-full-routes.yml index 9e342975df..eddbf5aae5 100644 --- a/.github/workflows/test-full-routes.yml +++ b/.github/workflows/test-full-routes.yml @@ -1,4 +1,4 @@ -name: Build assets +name: Build assets (Full Routes Test Result) on: workflow_dispatch: From 970ad011d049dfdc061cb02ec6e2138c2c591d44 Mon Sep 17 00:00:00 2001 From: Asuna Date: Mon, 25 Mar 2024 22:48:11 +0800 Subject: [PATCH 25/99] fix: update bilibili dynamic API to v2 from v1 (#14957) --- lib/routes/bilibili/dynamic.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/routes/bilibili/dynamic.ts b/lib/routes/bilibili/dynamic.ts index 8e127506eb..7873ccb464 100644 --- a/lib/routes/bilibili/dynamic.ts +++ b/lib/routes/bilibili/dynamic.ts @@ -117,7 +117,7 @@ async function handler(ctx) { const response = await got({ method: 'get', - url: `https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/space_history?host_uid=${uid}`, + url: `https://api.vc.bilibili.com/dynamic_svr/v2/dynamic_svr/space_history?host_uid=${uid}`, headers: { Referer: `https://space.bilibili.com/${uid}/`, }, From 6e75de7946da02608aa7984a405c8413632e1ed4 Mon Sep 17 00:00:00 2001 From: lyqluis <39592732+lyqluis@users.noreply.github.com> Date: Mon, 25 Mar 2024 22:57:46 +0800 Subject: [PATCH 26/99] fix(route): /163/dy2/:id pic shows correctly (#14955) --- lib/routes/163/dy2.ts | 7 ++++--- lib/routes/163/utils.ts | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/routes/163/dy2.ts b/lib/routes/163/dy2.ts index 50d7ebf902..527e94083f 100644 --- a/lib/routes/163/dy2.ts +++ b/lib/routes/163/dy2.ts @@ -11,7 +11,7 @@ export const route: Route = { path: '/dy2/:id', categories: ['new-media'], example: '/163/dy2/T1555591616739', - parameters: { id: 'id,该网易号主页网址最后一项html的文件名' }, + parameters: { id: 'id,该网易号主页网址最后一项 html 的文件名' }, features: { requireConfig: false, requirePuppeteer: false, @@ -21,7 +21,7 @@ export const route: Route = { supportScihub: false, }, name: '网易号(通用)', - maintainers: ['mjysci'], + maintainers: ['mjysci', 'lyqluis'], handler, description: `优先使用方法一,若是网易号搜索页面搜不到的小众网易号(文章页面不含\`data-wemediaid\`)则可使用此法。 触发反爬会只抓取到标题,建议自建。`, @@ -43,11 +43,12 @@ async function handler(ctx) { .toArray() .map((item) => { item = $(item); + const itemImg = item.find('a.img img'); return { title: item.find('h4 a').text(), link: item.find('a').first().attr('href'), pubDate: timezone(parseDate(item.find('.time').text()), 8), - imgsrc: item.find('a img').attr('src'), + imgsrc: itemImg.attr('src') ?? itemImg.attr('_src'), }; }); diff --git a/lib/routes/163/utils.ts b/lib/routes/163/utils.ts index 61fa5beae9..b9f9bc7d82 100644 --- a/lib/routes/163/utils.ts +++ b/lib/routes/163/utils.ts @@ -26,8 +26,9 @@ const parseDyArticle = (charset, item, tryGet) => } }); + const imgUrl = new URL(item.imgsrc); item.description = art(path.join(__dirname, 'templates/dy.art'), { - imgsrc: item.imgsrc?.split('?')[0], + imgsrc: imgUrl.searchParams.get('url'), postBody: $('.post_body').html(), }); From 0ffd4a241dd15925f5cad5d699d16255f4085ec4 Mon Sep 17 00:00:00 2001 From: Tony Date: Mon, 25 Mar 2024 23:11:08 +0800 Subject: [PATCH 27/99] chore: fix build assets action --- .github/workflows/build-assets.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-assets.yml b/.github/workflows/build-assets.yml index 7ef73eafe3..4f2c38621e 100644 --- a/.github/workflows/build-assets.yml +++ b/.github/workflows/build-assets.yml @@ -34,8 +34,6 @@ jobs: run: pnpm i - name: Build assets run: pnpm build - - name: Build docs - run: pnpm build:docs - name: Deploy uses: peaceiris/actions-gh-pages@v3 with: @@ -43,6 +41,10 @@ jobs: publish_dir: ./assets user_name: 'github-actions[bot]' user_email: '41898282+github-actions[bot]@users.noreply.github.com' + # prevent deleting build/test-full-routes.json which will break build:docs + keep_files: true + - name: Build docs + run: pnpm build:docs - name: Checkout docs uses: actions/checkout@v4 with: From 95a5e5025464fa7a523231b5edfbd696cf7ee95f Mon Sep 17 00:00:00 2001 From: LMark <40017222+ladeng07@users.noreply.github.com> Date: Mon, 25 Mar 2024 23:55:33 +0800 Subject: [PATCH 28/99] =?UTF-8?q?feat(route):=20Add=20=E5=8C=97=E4=BA=AC?= =?UTF-8?q?=E5=B8=88=E8=8C=83=E5=A4=A7=E5=AD=A6=E6=95=99=E5=8A=A1=E9=83=A8?= =?UTF-8?q?=20(#14959)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/routes/bnu/jwb.ts | 56 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 lib/routes/bnu/jwb.ts diff --git a/lib/routes/bnu/jwb.ts b/lib/routes/bnu/jwb.ts new file mode 100644 index 0000000000..5d190eeacf --- /dev/null +++ b/lib/routes/bnu/jwb.ts @@ -0,0 +1,56 @@ +import got from '@/utils/got'; +import { load } from 'cheerio'; +import { parseDate } from '@/utils/parse-date'; +import cache from '@/utils/cache'; + +export const route: Route = { + path: '/jwb', + categories: ['university'], + example: '/bnu/jwb', + parameters: {}, + radar: [ + { + source: ['jwb.bnu.edu.cn'], + }, + ], + name: '教务部(研究生院)', + maintainers: ['ladeng07'], + handler, + url: 'jwb.bnu.edu.cn/tzgg/index.htm', +}; + +async function handler() { + const link = 'https://jwb.bnu.edu.cn/tzgg/index.htm'; + const response = await got(link); + const $ = load(response.data); + const list = $('.article-list .boxlist ul li') + .toArray() + .map((e) => { + e = $(e); + const a = e.find('a'); + return { + title: e.find('a span').text(), + link: a.attr('href').startsWith('http') ? a.attr('href') : 'https://jwb.bnu.edu.cn' + a.attr('href').substring(2), + pubDate: parseDate(e.find('span.fr.text-muted').text(), 'YYYY-MM-DD'), + }; + }); + + const out = await Promise.all( + list.map((item) => + cache.tryGet(item.link, async () => { + const response = await got(item.link); + const $ = load(response.data); + item.author = '北京师范大学教务部'; + item.description = $('.contenttxt').html(); + return item; + }) + ) + ); + + return { + title: '北京师范大学教务部', + link, + description: '北京师范大学教务部最新通知', + item: out, + }; +} From d190d9d7001c0afeccc5c5787fa3d1b6c503ba8e Mon Sep 17 00:00:00 2001 From: DIYgod Date: Tue, 26 Mar 2024 00:33:36 +0800 Subject: [PATCH 29/99] test: ofetch got --- lib/routes/bloomberg/utils.ts | 4 ++-- lib/routes/gov/chinatax/latest.ts | 2 +- lib/routes/line/utils.ts | 2 +- lib/routes/phoronix/index.ts | 2 +- lib/routes/wechat/feeddd.ts | 2 +- lib/routes/wfu/news.ts | 2 +- lib/utils/got.test.ts | 8 ++------ package.json | 2 +- pnpm-lock.yaml | 19 ++++++++----------- 9 files changed, 18 insertions(+), 25 deletions(-) diff --git a/lib/routes/bloomberg/utils.ts b/lib/routes/bloomberg/utils.ts index b48da12585..0bcbbefc76 100644 --- a/lib/routes/bloomberg/utils.ts +++ b/lib/routes/bloomberg/utils.ts @@ -99,7 +99,7 @@ const parseArticle = (item) => res = await got(apiUrl, { headers }); } catch (error) { // fallback - if (error.name && (error.name === 'HTTPError' || error.name === 'RequestError')) { + if (error.name && (error.name === 'HTTPError' || error.name === 'RequestError' || error.name === 'FetchError')) { try { res = await got(item.link, { headers }); } catch { @@ -214,7 +214,7 @@ const parseReactRendererPage = async (res, api, item) => { return await parseStoryJson(res.data, item); } catch (error) { // fallback - if (error.name && (error.name === 'HTTPError' || error.name === 'RequestError')) { + if (error.name && (error.name === 'HTTPError' || error.name === 'RequestError' || error.name === 'FetchError')) { return { title: item.title, link: item.link, diff --git a/lib/routes/gov/chinatax/latest.ts b/lib/routes/gov/chinatax/latest.ts index 6b54a4c734..9999b6e496 100644 --- a/lib/routes/gov/chinatax/latest.ts +++ b/lib/routes/gov/chinatax/latest.ts @@ -56,7 +56,7 @@ async function handler() { item.description = content('#fontzoom').html(); return item; } catch (error) { - if (error.name === 'HTTPError') { + if (error.name === 'HTTPError' || error.name === 'FetchError') { item.description = error.message; return item; } diff --git a/lib/routes/line/utils.ts b/lib/routes/line/utils.ts index e55c00d46b..8d9712e488 100644 --- a/lib/routes/line/utils.ts +++ b/lib/routes/line/utils.ts @@ -29,7 +29,7 @@ const parseItems = (list, tryGet) => }); data = response.data; } catch (error) { - if (error instanceof got.HTTPError && error.response.statusCode === 404) { + if ((error.name === 'HTTPError' || error.name === 'FetchError') && error.response.statusCode === 404) { logger.error(`Error parsing article ${item.link}: ${error.message}`); return item; } diff --git a/lib/routes/phoronix/index.ts b/lib/routes/phoronix/index.ts index d4063906a3..e4413fd4b9 100644 --- a/lib/routes/phoronix/index.ts +++ b/lib/routes/phoronix/index.ts @@ -72,7 +72,7 @@ const webFetch = (url) => try { return webFetchCb(await got(url)); } catch (error) { - if (error.name === 'HTTPError' && error.response.statusCode === 404) { + if ((error.name === 'HTTPError' || error.name === 'FetchError') && error.response.statusCode === 404) { return '404'; } throw error; diff --git a/lib/routes/wechat/feeddd.ts b/lib/routes/wechat/feeddd.ts index d71c01a4f8..97a4a52c33 100644 --- a/lib/routes/wechat/feeddd.ts +++ b/lib/routes/wechat/feeddd.ts @@ -13,7 +13,7 @@ export default async (ctx) => { try { response = await got(apiUrl); } catch (error) { - if (error.name === 'HTTPError' && error.response.statusCode === 404) { + if ((error.name === 'HTTPError' || error.name === 'FetchError') && error.response.statusCode === 404) { throw new Error('该公众号不存在,有关如何获取公众号 id,详见 https://docs.rsshub.app/routes/new-media#wei-xin-gong-zhong-hao-feeddd-lai-yuan'); } throw error; diff --git a/lib/routes/wfu/news.ts b/lib/routes/wfu/news.ts index eefca4f5b5..b0bf76ff61 100644 --- a/lib/routes/wfu/news.ts +++ b/lib/routes/wfu/news.ts @@ -32,7 +32,7 @@ async function loadContent(link) { response = await got.get(link); } catch (error) { // 如果网络问题 直接出错 - if (error.name && (error.name === 'HTTPError' || error.name === 'RequestError')) { + if (error.name && (error.name === 'HTTPError' || error.name === 'RequestError' || error.name === 'FetchError')) { description = 'Page 404 Please Check!'; } return { description }; diff --git a/lib/utils/got.test.ts b/lib/utils/got.test.ts index 59d69c2348..3b3453a18d 100644 --- a/lib/utils/got.test.ts +++ b/lib/utils/got.test.ts @@ -34,7 +34,7 @@ describe('got', () => { try { await got.get('http://rsshub.test/testRerty'); } catch (error: any) { - expect(error.name).toBe('HTTPError'); + expect(error.name).toBe('FetchError'); } // retries @@ -52,11 +52,7 @@ describe('got', () => { test: 1, }, }); - expect(response1.statusCode).toBe(200); - // @ts-expect-error custom property - expect(response1.status).toBe(200); expect(response1.body).toBe('{"code": 0}'); - // @ts-expect-error custom property expect(response1.data.code).toBe(0); }); @@ -77,7 +73,7 @@ describe('got', () => { await got.get('http://rsshub.test/timeout'); throw new Error('Timeout Invalid'); } catch (error: any) { - expect(error.name).toBe('RequestError'); + expect(error.name).toBe('FetchError'); } expect(loggerSpy).toHaveBeenCalledWith(expect.stringContaining('http://rsshub.test/timeout')); diff --git a/package.json b/package.json index e4e3b74969..8b39596f56 100644 --- a/package.json +++ b/package.json @@ -164,7 +164,7 @@ "js-beautify": "1.15.1", "lint-staged": "15.2.2", "mockdate": "3.0.5", - "nock": "13.5.4", + "nock": "14.0.0-beta.5", "prettier": "3.2.5", "remark-parse": "11.0.0", "supertest": "6.3.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 004507bce8..0fe2cbb253 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -344,8 +344,8 @@ devDependencies: specifier: 3.0.5 version: 3.0.5 nock: - specifier: 13.5.4 - version: 13.5.4 + specifier: 14.0.0-beta.5 + version: 14.0.0-beta.5 prettier: specifier: 3.2.5 version: 3.2.5 @@ -2072,7 +2072,7 @@ packages: engines: {node: '>= 14'} dependencies: eslint: 8.57.0 - jschardet: 3.1.0 + jschardet: 3.1.2 lodash: 4.17.21 utf8: 3.0.0 transitivePeerDependencies: @@ -5963,8 +5963,8 @@ packages: resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} dev: false - /jschardet@3.1.0: - resolution: {integrity: sha512-MND0yjRsoQ/3iFXce7lqV/iBmqH9oWGUTlty36obRBZjhFDWCLKjXgfxY75wYfwlW7EFqw52tyziy/q4WsQmrA==} + /jschardet@3.1.2: + resolution: {integrity: sha512-mw3CBZGzW8nUBPYhFU2ztZ/kJ6NClQUQVpyzvFMfznZsoC///ZQ30J2RCUanNsr5yF22LqhgYr/lj807/ZleWA==} engines: {node: '>=0.1.90'} dev: true @@ -6886,15 +6886,12 @@ packages: lower-case: 1.1.4 dev: false - /nock@13.5.4: - resolution: {integrity: sha512-yAyTfdeNJGGBFxWdzSKCBYxs5FxLbCg5X5Q4ets974hcQzG1+qCxvIyOo4j2Ry6MUlhWVMX4OoYDefAIIwupjw==} - engines: {node: '>= 10.13'} + /nock@14.0.0-beta.5: + resolution: {integrity: sha512-u255tf4DYvyErTlPZA9uTfXghiZZy+NflUOFONPVKZ5tP0yaHwKig28zyFOLhu8y5YcCRC+V5vDk4HHileh2iw==} + engines: {node: '>= 18'} dependencies: - debug: 4.3.4 json-stringify-safe: 5.0.1 propagate: 2.0.1 - transitivePeerDependencies: - - supports-color dev: true /node-fetch-native@1.6.4: From 24020bb6ba8f8d9a514366bfcde35690b12b9b82 Mon Sep 17 00:00:00 2001 From: Zero Date: Tue, 26 Mar 2024 01:01:17 +0800 Subject: [PATCH 30/99] =?UTF-8?q?feat(route):=20Add=20=E6=B5=99=E6=B1=9F?= =?UTF-8?q?=E5=B7=A5=E4=B8=9A=E5=A4=A7=E5=AD=A6=E5=AE=98=E7=BD=91=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=20(#14911)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: 修复文档中浙江工业大学链接404 * feat(route): Add 浙江工业大学官网通知 * perf: change map IDs to real IDs * docs: Adjust zjut markdown forms * feat: add radar --------- Co-authored-by: pull[bot] <39814207+pull[bot]@users.noreply.github.com> --- lib/routes/zjut/da/index.ts | 1 + lib/routes/zjut/namespace.ts | 2 +- lib/routes/zjut/news.ts | 82 ++++++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 lib/routes/zjut/news.ts diff --git a/lib/routes/zjut/da/index.ts b/lib/routes/zjut/da/index.ts index ae52a1bbfe..4e6b3a978a 100644 --- a/lib/routes/zjut/da/index.ts +++ b/lib/routes/zjut/da/index.ts @@ -32,6 +32,7 @@ export const route: Route = { }, name: '设计与建筑学院', maintainers: ['yikZero'], + url: 'www.design.zjut.edu.cn', handler, description: `| 学院新闻 | 公告通知 | 科研申报 | 科研成果 | 文件与资源 | 学术交流 | | -------- | -------- | -------- | -------- | -------- | -------- | diff --git a/lib/routes/zjut/namespace.ts b/lib/routes/zjut/namespace.ts index 4c5f1fcd3b..6f7d00f6e4 100644 --- a/lib/routes/zjut/namespace.ts +++ b/lib/routes/zjut/namespace.ts @@ -2,5 +2,5 @@ import type { Namespace } from '@/types'; export const namespace: Namespace = { name: '浙江工业大学', - url: 'zjut.edu.cn', + url: 'www.zjut.edu.cn', }; diff --git a/lib/routes/zjut/news.ts b/lib/routes/zjut/news.ts new file mode 100644 index 0000000000..982be671c3 --- /dev/null +++ b/lib/routes/zjut/news.ts @@ -0,0 +1,82 @@ +import { Route } from '@/types'; +import { load } from 'cheerio'; +import cache from '@/utils/cache'; +import got from '@/utils/got'; +import { parseDate } from '@/utils/parse-date'; + +const host = 'http://www.news.zjut.edu.cn'; + +export const route: Route = { + path: '/news/:type', + categories: ['university'], + example: '/zjut/news/5414', + parameters: { type: '分类,见下表' }, + features: { + requireConfig: false, + requirePuppeteer: false, + antiCrawler: false, + supportBT: false, + supportPodcast: false, + supportScihub: false, + }, + name: '浙工大新闻', + maintainers: ['junbaor', 'yikZero'], + url: 'www.news.zjut.edu.cn', + handler, + radar: [ + { + source: ['www.news.zjut.edu.cn/:type/list.htm'], + }, + ], + description: `| 图片新闻 | 工大要闻 | 综合新闻 | 学术・探索 | 三创・人物 | 智库工大 | 美誉工大 | 葵园融媒 | +| -------- | -------- | -------- | ---------- | ---------- | -------- | -------- | -------- | +| 5414 | 5415 | 5416 | 5422 | 5423 | 5424 | 5425 | 5419 |`, +}; + +async function handler(ctx) { + const type = ctx.req.param('type'); + const listResponse = await got(`${host}/${type}/list.htm`, { + responseType: 'buffer', + }); + const $ = load(listResponse.data); + + const list = $('#l-container .news_list > li.news') + .map((index, item) => { + item = $(item); + const title = item.find('a').text(); + const link = item.find('a').attr('href'); + + const date = item.find("span[class='news_meta']").text(); + + return { + title, + description: '', + pubDate: parseDate(date), + link, + }; + }) + .get(); + + const items = await Promise.all( + list.map((item) => { + if (item.link.startsWith('http')) { + item.description = `${item.link}`; + return item; + } else { + return cache.tryGet(`${host}${item.link}`, async () => { + const itemsResponse = await got(`${host}${item.link}`); + const $ = load(itemsResponse.data); + item.link = `${host}${item.link}`; + item.description = $('div[class="wp_articlecontent"]').html(); + return item; + }); + } + }) + ); + + return { + title: `${$('.col_title h2').text()} - 浙江工业大学`, + link: `${host}/${type}/list.htm`, + item: items, + }; +} From 07c891caa65cd776e918c6bcdbc0acdbe4b15407 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Tue, 26 Mar 2024 01:15:06 +0800 Subject: [PATCH 31/99] feat: remove timeout test --- lib/utils/got.test.ts | 26 -------------------------- lib/utils/ofetch.ts | 2 +- 2 files changed, 1 insertion(+), 27 deletions(-) diff --git a/lib/utils/got.test.ts b/lib/utils/got.test.ts index 3b3453a18d..45a1be6218 100644 --- a/lib/utils/got.test.ts +++ b/lib/utils/got.test.ts @@ -55,30 +55,4 @@ describe('got', () => { expect(response1.body).toBe('{"code": 0}'); expect(response1.data.code).toBe(0); }); - - it('timeout', async () => { - process.env.REQUEST_TIMEOUT = '500'; - - const { default: got } = await import('@/utils/got'); - nock('http://rsshub.test') - .get('/timeout') - .delay(600) - .reply(() => [200, '{"code": 0}']); - - const logger = (await import('@/utils/logger')).default; - // @ts-expect-error unused - const loggerSpy = vi.spyOn(logger, 'error').mockReturnValue({}); - - try { - await got.get('http://rsshub.test/timeout'); - throw new Error('Timeout Invalid'); - } catch (error: any) { - expect(error.name).toBe('FetchError'); - } - expect(loggerSpy).toHaveBeenCalledWith(expect.stringContaining('http://rsshub.test/timeout')); - - loggerSpy.mockRestore(); - - delete process.env.REQUEST_TIMEOUT; - }); }); diff --git a/lib/utils/ofetch.ts b/lib/utils/ofetch.ts index c02204862f..d7a765e119 100644 --- a/lib/utils/ofetch.ts +++ b/lib/utils/ofetch.ts @@ -10,7 +10,7 @@ const rofetch = ofetch.create({ 'user-agent': config.ua, }, onRequestError({ request, error }) { - logger.error(`Request ${request.url} fail: ${error}`); + logger.error(`Request ${request} fail: ${error}`); }, }); From f1b8eb3cbcc0eb6543dbbc6c155d460238b98fc0 Mon Sep 17 00:00:00 2001 From: Mg Pig Date: Tue, 26 Mar 2024 01:21:57 +0800 Subject: [PATCH 32/99] =?UTF-8?q?feat(route):=20Add=20gamer520(=E5=85=A8?= =?UTF-8?q?=E7=90=83=E6=B8=B8=E6=88=8F=E4=BA=A4=E6=B5=81=E4=B8=AD=E5=BF=83?= =?UTF-8?q?)=20(#14909)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(route): Add gamer520(全球游戏交流中心) * feat(route): gamer520 change to use wordpress api * feat(route): gamer520 load categories via wp api & apply suggestions from code review * fix: typing --------- --- lib/routes/gamer520/index.ts | 85 ++++++++++++++++++++++++++++++++ lib/routes/gamer520/namespace.ts | 6 +++ 2 files changed, 91 insertions(+) create mode 100644 lib/routes/gamer520/index.ts create mode 100644 lib/routes/gamer520/namespace.ts diff --git a/lib/routes/gamer520/index.ts b/lib/routes/gamer520/index.ts new file mode 100644 index 0000000000..36ec51d6a3 --- /dev/null +++ b/lib/routes/gamer520/index.ts @@ -0,0 +1,85 @@ +import { Data, DataItem, Route } from '@/types'; +import cache from '@/utils/cache'; +import got from '@/utils/got'; +import { parseDate } from '@/utils/parse-date'; +import { Context } from 'hono'; + +export const route: Route = { + path: '/:category?/:order?', + categories: ['game'], + example: '/gamer520/switchyouxi', + parameters: { + category: '分类,见下表', + order: '排序,发布日期: date; 修改日期: modified', + }, + features: { + antiCrawler: true, + }, + name: '文章', + maintainers: ['xzzpig'], + handler, + url: 'www.gamer520.com/', + description: `分类 + + | 所有 | Switch 游戏下载 | 金手指 | 3A 巨作 | switch 主题 | PC 游戏 | + | ---- | --------------- | ---------- | ------- | ----------- | ------- | + | all | switchyouxi | jinshouzhi | 3ajuzuo | zhuti | pcgame |`, +}; + +interface Post { + id: number; + guid: { rendered: string }; + title: { rendered: string }; + date_gmt: string; + modified_gmt: string; + categories?: number[]; + content: { rendered: string }; +} + +interface Category { + id: number; + name: string; + link: string; + slug: string; +} + +async function getCategories(baseUrl: string): Promise { + return (await cache.tryGet('gamer520:categories', async () => { + const { data } = await got(`${baseUrl}/wp-json/wp/v2/categories`); + return data.map((category) => ({ slug: category.slug, id: category.id, name: category.name, link: category.link })); + })) as Category[]; +} + +async function handler(ctx: Context): Promise { + const baseUrl = 'https://www.gamer520.com'; + const categories = await getCategories(baseUrl); + + const category = ctx.req.param('category') ?? 'all'; + const order = ctx.req.param('order'); + const categoryId = categories.find((c) => c.slug === category)?.id; + + const { data } = (await got(`${baseUrl}/wp-json/wp/v2/posts`, { + searchParams: { + categories: categoryId, + orderby: order, + per_page: ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit') as string) : undefined, + }, + })) as unknown as { data: Post[] }; + + const items: DataItem[] = data.map((item) => ({ + guid: `gamer520:${item.id}`, + title: item.title.rendered, + link: item.guid.rendered, + pubDate: parseDate(item.date_gmt), + updated: parseDate(item.modified_gmt), + category: item.categories?.map((c) => categories.find((ca) => ca.id === c)?.name ?? '').filter((c) => c !== '') ?? [], + + description: item.content.rendered, + })); + + return { + title: '全球游戏交流中心-' + (categories.find((c) => c.slug === category)?.name ?? '所有'), + link: categories.find((c) => c.slug === category)?.link ?? baseUrl, + item: items, + }; +} diff --git a/lib/routes/gamer520/namespace.ts b/lib/routes/gamer520/namespace.ts new file mode 100644 index 0000000000..0f236a4cff --- /dev/null +++ b/lib/routes/gamer520/namespace.ts @@ -0,0 +1,6 @@ +import type { Namespace } from '@/types'; + +export const namespace: Namespace = { + name: '全球游戏交流中心', + url: 'www.gamer520.com', +}; From 6f477d053d1c42c8c0d305344db9d80fe5aea65e Mon Sep 17 00:00:00 2001 From: Mg Pig Date: Tue, 26 Mar 2024 01:36:32 +0800 Subject: [PATCH 33/99] =?UTF-8?q?feat(route):=20Add=203kns(3k-Switch?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E5=BA=93)=20(#14907)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(route): Add 3kns(3k-Switch游戏库) * feat(route): 3kns merge route parameters & apply suggestions from code review * fix: typings --------- --- lib/routes/3kns/index.ts | 121 ++++++++++++++++++++++ lib/routes/3kns/namespace.ts | 6 ++ lib/routes/3kns/templates/description.art | 9 ++ 3 files changed, 136 insertions(+) create mode 100644 lib/routes/3kns/index.ts create mode 100644 lib/routes/3kns/namespace.ts create mode 100644 lib/routes/3kns/templates/description.art diff --git a/lib/routes/3kns/index.ts b/lib/routes/3kns/index.ts new file mode 100644 index 0000000000..43ff51d69d --- /dev/null +++ b/lib/routes/3kns/index.ts @@ -0,0 +1,121 @@ +import { Data, DataItem, Route } from '@/types'; +import got from '@/utils/got'; +import { getCurrentPath } from '@/utils/helpers'; +import { parseDate } from '@/utils/parse-date'; +import { art } from '@/utils/render'; +import { load } from 'cheerio'; +import { Context } from 'hono'; +import * as path from 'node:path'; +const __dirname = getCurrentPath(import.meta.url); + +export const route: Route = { + path: '/:filters?/:order?', + categories: ['game'], + example: '/3kns/category=all&lang=all', + parameters: { + filters: '过滤器,可用参数见下表', + order: '排序,按高分排序:desc;按低分排序:asc', + }, + features: { + requireConfig: false, + requirePuppeteer: false, + antiCrawler: false, + supportBT: false, + supportPodcast: false, + supportScihub: false, + }, + name: '3k-Switch游戏库', + maintainers: ['xzzpig'], + handler, + url: 'www.3kns.com/', + description: `游戏类型(category) + + | 不限 | 角色扮演 | 动作冒险 | 策略游戏 | 模拟经营 | 即时战略 | 格斗类 | 射击游戏 | 休闲益智 | 体育运动 | 街机格斗 | 无双类 | 其他游戏 | 赛车竞速 | + | ---- | -------- | -------- | -------- | -------- | -------- | ------ | -------- | -------- | -------- | -------- | ------ | -------- | -------- | + | all | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | + + 游戏语言(language) + + | 不限 | 中文 | 英语 | 日语 | 其他 | 中文汉化 | 德语 | + | ---- | ---- | ---- | ---- | ---- | -------- | ---- | + | all | 1 | 2 | 3 | 4 | 5 | 6 | + + 游戏标签(tag) + + | 不限 | 热门 | 多人聚会 | 僵尸 | 体感 | 大作 | 音乐 | 三国 | RPG | 格斗 | 闯关 | 横版 | 科幻 | 棋牌 | 运输 | 无双 | 卡通动漫 | 日系 | 养成 | 恐怖 | 运动 | 乙女 | 街机 | 飞行模拟 | 解谜 | 海战 | 战争 | 跑酷 | 即时策略 | 射击 | 经营 | 益智 | 沙盒 | 模拟 | 冒险 | 竞速 | 休闲 | 动作 | 生存 | 独立 | 拼图 | 魔改 xci | 卡牌 | 塔防 | + | ---- | ---- | -------- | ---- | ---- | ---- | ---- | ---- | --- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | -------- | ---- | ---- | ---- | ---- | ---- | ---- | -------- | ---- | ---- | ---- | ---- | -------- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | -------- | ---- | ---- | + | all | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | + + 发售时间(pubDate) + + | 不限 | 2017 年 | 2018 年 | 2019 年 | 2020 年 | 2021 年 | 2022 年 | 2023 年 | 2024 年 | + | ---- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | + | all | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | + + 游戏集合(collection) + + | 不限 | 舞力全开 | 马里奥 | 生化危机 | 炼金工房 | 最终幻想 | 塞尔达 | 宝可梦 | 勇者斗恶龙 | 模拟器 | 秋之回忆 | 第一方 | 体感健身 | 开放世界 | 儿童乐园 | + | ---- | -------- | ------ | -------- | -------- | -------- | ------ | ------ | ---------- | ------ | -------- | ------ | -------- | -------- | -------- | + | all | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |`, +}; + +async function handler(ctx: Context): Promise { + const filters = new URLSearchParams(ctx.req.param('filters')); + const order = ctx.req.param('order'); + + const category = filters.get('category') ?? 'all'; + const language = filters.get('language') ?? 'all'; + const tag = filters.get('tag') ?? 'all'; + const pubDate = filters.get('pubDate') ?? 'all'; + const collection = filters.get('collection') ?? 'all'; + + const baseUrl = 'https://www.3kns.com/'; + const currentUrl = new URL(`${baseUrl}forum.php?mod=forumdisplay&fid=2&filter=sortid&typeid=0&sortid=1&searchsort=1&orderbystr=0`); + currentUrl.searchParams.set('dztgeshi', category); + currentUrl.searchParams.set('dztfenlei', language); + currentUrl.searchParams.set('nex_sg_tags', tag); + currentUrl.searchParams.set('deanbgbs', pubDate); + currentUrl.searchParams.set('nex_sg_stars', collection); + if (order !== undefined) { + currentUrl.searchParams.set('ascdescstr', order); + currentUrl.searchParams.set('orderbystr', 'nex_sg_score'); + } + + const response = await got(currentUrl); + const $ = load(response.data as any); + + const selector = `form .newItem`; + const items: DataItem[] = $(selector) + .toArray() + .map((item) => { + const $item = $(item); + const title = $item.find('.showname a').text().trim(); + const category = $item.find('.showtype').text().trim(); + const pubDate = ($item.find('.showdate').contents()[0] as any).data.trim(); + return { + title, + link: baseUrl + $item.find('.entry-media a').attr('href')!, + pubDate: parseDate(pubDate ?? ''), + category: [category], + description: + art(path.join(__dirname, 'templates/description.art'), { + cover: $item.find('.entry-media img').attr('src')?.trim().replace('.', baseUrl), + title, + tid: $item.find('.jb-chakan').text().trim(), + category, + language: $item.find('.jb-new').text().trim(), + pubDate, + system: $item.find('.jb-youxxx').text().trim(), + score: $item.find('.shownamep').text().trim(), + version: $item.find('.jb-youxbb').text().trim(), + }) ?? '', + }; + }); + + return { + title: $('title').text(), + link: currentUrl.toString(), + allowEmpty: true, + item: items, + }; +} diff --git a/lib/routes/3kns/namespace.ts b/lib/routes/3kns/namespace.ts new file mode 100644 index 0000000000..de8ffd266f --- /dev/null +++ b/lib/routes/3kns/namespace.ts @@ -0,0 +1,6 @@ +import type { Namespace } from '@/types'; + +export const namespace: Namespace = { + name: '3k-Switch游戏库', + url: 'www.3kns.com', +}; diff --git a/lib/routes/3kns/templates/description.art b/lib/routes/3kns/templates/description.art new file mode 100644 index 0000000000..e579f34f41 --- /dev/null +++ b/lib/routes/3kns/templates/description.art @@ -0,0 +1,9 @@ + +

{{ title }}

+

游戏TID:{{ tid }}

+

类型:{{ category }}

+

语言:{{ language }}

+

更新日期:{{ pubDate }}

+

系统要求:{{ system }}

+

{{ score }}

+

游戏版本:{{ version }}

From 607a9455e2d58f69d3cc8b65955cc713b77f7c14 Mon Sep 17 00:00:00 2001 From: Tony Date: Tue, 26 Mar 2024 02:36:27 +0800 Subject: [PATCH 34/99] fix(route): github user starred repos use reset api (#14960) --- lib/routes/github/star.ts | 12 ++--- lib/routes/github/starred-repos.ts | 76 ++++++++++-------------------- 2 files changed, 31 insertions(+), 57 deletions(-) diff --git a/lib/routes/github/star.ts b/lib/routes/github/star.ts index 9e7b892c66..309f513906 100644 --- a/lib/routes/github/star.ts +++ b/lib/routes/github/star.ts @@ -8,12 +8,12 @@ export const route: Route = { example: '/github/stars/DIYGod/RSSHub', parameters: { user: 'GitHub username', repo: 'GitHub repo name' }, features: { - requireConfig: false, - requirePuppeteer: false, - antiCrawler: false, - supportBT: false, - supportPodcast: false, - supportScihub: false, + requireConfig: [ + { + name: 'GITHUB_ACCESS_TOKEN', + description: 'GitHub Access Token', + }, + ], }, radar: [ { diff --git a/lib/routes/github/starred-repos.ts b/lib/routes/github/starred-repos.ts index 9324f1bbe3..ce56d6abe5 100644 --- a/lib/routes/github/starred-repos.ts +++ b/lib/routes/github/starred-repos.ts @@ -1,6 +1,8 @@ import { Route } from '@/types'; import got from '@/utils/got'; import { config } from '@/config'; +import md5 from '@/utils/md5'; +import { parseDate } from '@/utils/parse-date'; export const route: Route = { path: '/starred_repos/:user', @@ -8,12 +10,13 @@ export const route: Route = { example: '/github/starred_repos/DIYgod', parameters: { user: 'User name' }, features: { - requireConfig: false, - requirePuppeteer: false, - antiCrawler: false, - supportBT: false, - supportPodcast: false, - supportScihub: false, + requireConfig: [ + { + name: 'GITHUB_ACCESS_TOKEN', + optional: true, + description: 'To get more requests', + }, + ], }, radar: [ { @@ -26,62 +29,33 @@ export const route: Route = { }; async function handler(ctx) { - if (!config.github || !config.github.access_token) { - throw new Error('GitHub star RSS is disabled due to the lack of relevant config'); - } const user = ctx.req.param('user'); const host = `https://github.com/${user}?tab=stars`; - const url = 'https://api.github.com/graphql'; - const response = await got({ - method: 'post', - url, + const { data: response } = await got(`https://api.github.com/users/${user}/starred`, { headers: { - Authorization: `bearer ${config.github.access_token}`, - }, - json: { - query: ` - { - user(login: "${user}") { - starredRepositories(first: 10, orderBy: {direction: DESC, field: STARRED_AT}) { - edges { - starredAt - node { - name - description - url - openGraphImageUrl - primaryLanguage { - name - } - stargazers { - totalCount - } - } - } - } - } - } - `, + Accept: 'application/vnd.github.star+json', + Authorization: config.github?.access_token ? `Bearer ${config.github.access_token}` : undefined, }, }); - const data = response.data.data.user.starredRepositories.edges; + const data = response.map((repo) => ({ + title: `${user} starred ${repo.name}`, + author: user, + description: `${repo.description ?? 'No Description'}
+ Primary Language: ${repo.language ?? 'Primary Language'}
+ Stargazers: ${repo.stargazers_count}
+ `, + pubDate: parseDate(repo.starred_at), + link: repo.html_url, + })); return { allowEmpty: true, - title: `${user}’s starred repositories`, + title: `${user}'s starred repositories`, link: host, - description: `${user}’s starred repositories`, - item: data.map((repo) => ({ - title: `${user} starred ${repo.node.name}`, - author: user, - description: `${repo.node.description === null ? 'no description' : repo.node.description}
primary language: ${ - repo.node.primaryLanguage === null ? 'no primary language' : repo.node.primaryLanguage.name - }
stargazers: ${repo.node.stargazers.totalCount}
`, - pubDate: new Date(repo.starredAt), - link: repo.node.url, - })), + description: `${user}'s starred repositories`, + item: data, }; } From 6e53d7263cd96a80c63d347a032c0104ea1d98bf Mon Sep 17 00:00:00 2001 From: Tony Date: Tue, 26 Mar 2024 03:02:47 +0800 Subject: [PATCH 35/99] fix(core): accept header not working (#14961) --- lib/routes/github/starred-repos.ts | 5 +++-- lib/utils/request-wrapper.ts | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/routes/github/starred-repos.ts b/lib/routes/github/starred-repos.ts index ce56d6abe5..707d84e124 100644 --- a/lib/routes/github/starred-repos.ts +++ b/lib/routes/github/starred-repos.ts @@ -40,15 +40,16 @@ async function handler(ctx) { }, }); - const data = response.map((repo) => ({ + const data = response.map(({ starred_at, repo }) => ({ title: `${user} starred ${repo.name}`, author: user, description: `${repo.description ?? 'No Description'}
Primary Language: ${repo.language ?? 'Primary Language'}
Stargazers: ${repo.stargazers_count}
`, - pubDate: parseDate(repo.starred_at), + pubDate: parseDate(starred_at), link: repo.html_url, + category: repo.topics, })); return { diff --git a/lib/utils/request-wrapper.ts b/lib/utils/request-wrapper.ts index 98e0a3a2de..352f7d2dba 100644 --- a/lib/utils/request-wrapper.ts +++ b/lib/utils/request-wrapper.ts @@ -60,7 +60,7 @@ const requestWrapper = (url: string, options: http.RequestOptions = {}) => { } // Accept - if (!headersLowerCaseKeys.has('Accept')) { + if (!headersLowerCaseKeys.has('accept')) { options.headers.Accept = '*/*'; } From 25efba759638c9f9e41f0bbc90d8a2d670ff536d Mon Sep 17 00:00:00 2001 From: Tony Date: Tue, 26 Mar 2024 05:42:33 +0800 Subject: [PATCH 36/99] fix(route): guokr channel path (#14969) --- lib/routes/guokr/channel.ts | 58 ++++++++++++---------------------- lib/routes/guokr/scientific.ts | 40 +++++++---------------- lib/routes/guokr/utils.ts | 37 ++++++++++++++++++++++ 3 files changed, 68 insertions(+), 67 deletions(-) create mode 100644 lib/routes/guokr/utils.ts diff --git a/lib/routes/guokr/channel.ts b/lib/routes/guokr/channel.ts index 560308a1c1..ee52d5de17 100644 --- a/lib/routes/guokr/channel.ts +++ b/lib/routes/guokr/channel.ts @@ -1,15 +1,6 @@ import { Route } from '@/types'; -import cache from '@/utils/cache'; import got from '@/utils/got'; - -async function loadFullPage(id) { - const link = `https://apis.guokr.com/minisite/article/${id}.json`; - const content = await cache.tryGet(link, async () => { - const res = await got(link); - return res.data.result.content; - }); - return content; -} +import { parseList, parseItem } from './utils'; const channelMap = { calendar: 'pac', @@ -19,21 +10,13 @@ const channelMap = { }; export const route: Route = { - path: '/:channel', + path: '/column/:channel', categories: ['new-media'], - example: '/guokr/calendar', + example: '/guokr/column/calendar', parameters: { channel: '专栏类别' }, - features: { - requireConfig: false, - requirePuppeteer: false, - antiCrawler: false, - supportBT: false, - supportPodcast: false, - supportScihub: false, - }, radar: [ { - source: ['guokr.com/'], + source: ['guokr.com/:channel'], }, ], name: '果壳网专栏', @@ -48,29 +31,28 @@ export const route: Route = { async function handler(ctx) { const channel = channelMap[ctx.req.param('channel')] ?? ctx.req.param('channel'); - const response = await got(`https://www.guokr.com/apis/minisite/article.json?retrieve_type=by_wx&channel_key=${channel}&offset=0&limit=10`); - const items = response.data.result; + const { data: response } = await got(`https://www.guokr.com/apis/minisite/article.json`, { + searchParams: { + retrieve_type: 'by_wx', + channel_key: channel, + offset: 0, + limit: 10, + }, + }); + const result = parseList(response.result); - if (items.length === 0) { + if (result.length === 0) { throw new Error('Unknown channel'); } - const channel_name = items[0].channels[0].name; - const channel_url = items[0].channels[0].url; + const channelName = result[0].channels[0].name; + const channelUrl = result[0].channels[0].url; - const result = await Promise.all( - items.map(async (item) => ({ - title: item.title, - description: await loadFullPage(item.id), // Mercury 无法正确解析全文,故这里手动加载 - pubDate: item.date_published, - link: item.url, - author: item.author.nickname, - })) - ); + const items = await Promise.all(result.map((item) => parseItem(item))); return { - title: `果壳网 ${channel_name}`, - link: channel_url, - item: result, + title: `果壳网 ${channelName}`, + link: channelUrl, + item: items, }; } diff --git a/lib/routes/guokr/scientific.ts b/lib/routes/guokr/scientific.ts index bafe9a68aa..691f1cc4fb 100644 --- a/lib/routes/guokr/scientific.ts +++ b/lib/routes/guokr/scientific.ts @@ -1,21 +1,11 @@ import { Route } from '@/types'; -import cache from '@/utils/cache'; import got from '@/utils/got'; -import { load } from 'cheerio'; +import { parseList, parseItem } from './utils'; export const route: Route = { path: '/scientific', categories: ['new-media'], example: '/guokr/scientific', - parameters: {}, - features: { - requireConfig: false, - requirePuppeteer: false, - antiCrawler: false, - supportBT: false, - supportPodcast: false, - supportScihub: false, - }, radar: [ { source: ['guokr.com/scientific', 'guokr.com/'], @@ -28,29 +18,21 @@ export const route: Route = { }; async function handler() { - const response = await got('https://www.guokr.com/apis/minisite/article.json?retrieve_type=by_subject&limit=20&offset=0'); + const { data: response } = await got('https://www.guokr.com/beta/proxy/science_api/articles', { + searchParams: { + retrieve_type: 'by_category', + page: 1, + }, + }); - const result = response.data.result; + const result = parseList(response); + + const items = await Promise.all(result.map((item) => parseItem(item))); return { title: '果壳网 科学人', link: 'https://www.guokr.com/scientific', description: '果壳网 科学人', - item: await Promise.all( - result.map((item) => - cache.tryGet(item.url, async () => { - const res = await got(item.url); - const $ = load(res.data); - item.description = $('.eflYNZ #js_content').css('visibility', 'visible').html() ?? $('.bxHoEL').html(); - return { - title: item.title, - description: item.description, - pubDate: item.date_published, - link: item.url, - author: item.author.nickname, - }; - }) - ) - ), + item: items, }; } diff --git a/lib/routes/guokr/utils.ts b/lib/routes/guokr/utils.ts new file mode 100644 index 0000000000..8b0ed9d5f3 --- /dev/null +++ b/lib/routes/guokr/utils.ts @@ -0,0 +1,37 @@ +import { parseDate } from '@/utils/parse-date'; +import cache from '@/utils/cache'; +import got from '@/utils/got'; +import * as cheerio from 'cheerio'; + +export const parseList = (result) => + result.map((item) => ({ + title: item.title, + description: item.summary, + pubDate: parseDate(item.date_published), + link: `https://www.guokr.com/article/${item.id}/`, + author: item.author.nickname, + category: item.subject?.name, + id: item.id, + channels: item.channels, + })); + +export const parseItem = (item) => + cache.tryGet(item.link, async () => { + const { data: res } = await got(`https://apis.guokr.com/minisite/article/${item.id}.json`); + const $ = cheerio.load(res.result.content); + + $('#meta_content').remove(); + $('div').each((_, elem) => { + const $elem = $(elem); + $elem.attr('style', $elem.attr('style')?.replaceAll(/display:none;|visibility: hidden;/g, '')); + }); + $('img').each((_, elem) => { + const $elem = $(elem); + if ($elem.attr('data-src')) { + $elem.attr('src', $elem.attr('data-src')); + } + }); + item.description = $.html(); + + return item; + }); From a1f1196e38c472573e82873a99117181f6dc2e8c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 21:53:20 +0000 Subject: [PATCH 37/99] chore(deps): bump @tonyrl/rand-user-agent from 2.0.55 to 2.0.56 (#14962) * chore(deps): bump @tonyrl/rand-user-agent from 2.0.55 to 2.0.56 Bumps [@tonyrl/rand-user-agent](https://github.com/TonyRL/rand-user-agent) from 2.0.55 to 2.0.56. - [Release notes](https://github.com/TonyRL/rand-user-agent/releases) - [Commits](https://github.com/TonyRL/rand-user-agent/compare/v2.0.55...v2.0.56) --- updated-dependencies: - dependency-name: "@tonyrl/rand-user-agent" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * chore: fix pnpm install --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index d3cedaeed5..7b6356e1a9 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "@notionhq/client": "2.2.14", "@postlight/parser": "2.2.3", "@sentry/node": "7.108.0", - "@tonyrl/rand-user-agent": "2.0.55", + "@tonyrl/rand-user-agent": "2.0.56", "aes-js": "3.1.2", "art-template": "4.13.2", "bbcodejs": "0.0.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 243f04630a..8bc6719ff4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,8 +24,8 @@ dependencies: specifier: 7.108.0 version: 7.108.0 '@tonyrl/rand-user-agent': - specifier: 2.0.55 - version: 2.0.55 + specifier: 2.0.56 + version: 2.0.56 aes-js: specifier: 3.1.2 version: 3.1.2 @@ -2066,7 +2066,7 @@ packages: engines: {node: '>= 14'} dependencies: eslint: 8.57.0 - jschardet: 3.1.0 + jschardet: 3.1.2 lodash: 4.17.21 utf8: 3.0.0 transitivePeerDependencies: @@ -2483,8 +2483,8 @@ packages: defer-to-connect: 2.0.1 dev: false - /@tonyrl/rand-user-agent@2.0.55: - resolution: {integrity: sha512-P8FVnfhUH1v1stE5tpSD7oz5Gh+ifCnoznxvd4rk+kGchnMJHSmQUHWzOzEZHFqag9viWp54YIgsx+JBDgu21w==} + /@tonyrl/rand-user-agent@2.0.56: + resolution: {integrity: sha512-7C2zOyvJsU2BxYayw+w/KjtP/InxYHzRWOWUuPj3XP3SGfnUTpQjKvEuo5K0LB+0YqF62w65LjHGE7Aw1irtaA==} engines: {node: '>=14.16'} dev: false @@ -5953,8 +5953,8 @@ packages: resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} dev: false - /jschardet@3.1.0: - resolution: {integrity: sha512-MND0yjRsoQ/3iFXce7lqV/iBmqH9oWGUTlty36obRBZjhFDWCLKjXgfxY75wYfwlW7EFqw52tyziy/q4WsQmrA==} + /jschardet@3.1.2: + resolution: {integrity: sha512-mw3CBZGzW8nUBPYhFU2ztZ/kJ6NClQUQVpyzvFMfznZsoC///ZQ30J2RCUanNsr5yF22LqhgYr/lj807/ZleWA==} engines: {node: '>=0.1.90'} dev: true From 78dea212a728087471fd714df6602b538c347f15 Mon Sep 17 00:00:00 2001 From: Tony Date: Mon, 25 Mar 2024 21:56:21 +0000 Subject: [PATCH 38/99] chore: update pr test fail label name --- .github/workflows/docker-test-cont.yml | 2 +- .github/workflows/docker-test.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-test-cont.yml b/.github/workflows/docker-test-cont.yml index 4ab535a2d1..4ca787ee20 100644 --- a/.github/workflows/docker-test-cont.yml +++ b/.github/workflows/docker-test-cont.yml @@ -109,7 +109,7 @@ jobs: actions: 'add-labels' token: ${{ secrets.GITHUB_TOKEN }} issue-number: ${{ steps.source-run-info.outputs.pullRequestNumber }} - labels: 'Route Test: Failed' + labels: 'Auto: Route Test Failed' - name: Print Docker container logs if: (env.TEST_CONTINUE) diff --git a/.github/workflows/docker-test.yml b/.github/workflows/docker-test.yml index 99ac469926..727cf3d4af 100644 --- a/.github/workflows/docker-test.yml +++ b/.github/workflows/docker-test.yml @@ -60,7 +60,7 @@ jobs: actions: 'add-labels' token: ${{ secrets.GITHUB_TOKEN }} issue-number: ${{ github.event.pull_request.number }} - labels: 'Route Test: Failed' + labels: 'Auto: Route Test Failed' - name: Test Docker image run: bash scripts/docker/test-docker.sh From c7d1849c83107cd4dbbfe64e8104af793b5ee955 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Mar 2024 06:01:29 +0800 Subject: [PATCH 39/99] chore(deps-dev): bump @typescript-eslint/parser from 7.3.1 to 7.4.0 (#14963) * chore(deps-dev): bump @typescript-eslint/parser from 7.3.1 to 7.4.0 Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 7.3.1 to 7.4.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.4.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * chore: fix pnpm install --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 65 +++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 55 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 7b6356e1a9..13a1154d56 100644 --- a/package.json +++ b/package.json @@ -147,7 +147,7 @@ "@types/tiny-async-pool": "2.0.3", "@types/tough-cookie": "4.0.5", "@typescript-eslint/eslint-plugin": "7.3.1", - "@typescript-eslint/parser": "7.3.1", + "@typescript-eslint/parser": "7.4.0", "@vercel/nft": "0.26.4", "@vitest/coverage-v8": "1.4.0", "eslint": "8.57.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8bc6719ff4..ac0d315a22 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -291,10 +291,10 @@ devDependencies: version: 4.0.5 '@typescript-eslint/eslint-plugin': specifier: 7.3.1 - version: 7.3.1(@typescript-eslint/parser@7.3.1)(eslint@8.57.0)(typescript@5.4.3) + version: 7.3.1(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.3) '@typescript-eslint/parser': - specifier: 7.3.1 - version: 7.3.1(eslint@8.57.0)(typescript@5.4.3) + specifier: 7.4.0 + version: 7.4.0(eslint@8.57.0)(typescript@5.4.3) '@vercel/nft': specifier: 0.26.4 version: 0.26.4 @@ -2720,7 +2720,7 @@ packages: dev: false optional: true - /@typescript-eslint/eslint-plugin@7.3.1(@typescript-eslint/parser@7.3.1)(eslint@8.57.0)(typescript@5.4.3): + /@typescript-eslint/eslint-plugin@7.3.1(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.3): resolution: {integrity: sha512-STEDMVQGww5lhCuNXVSQfbfuNII5E08QWkvAw5Qwf+bj2WT+JkG1uc+5/vXA3AOYMDHVOSpL+9rcbEUiHIm2dw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -2732,7 +2732,7 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.3.1(eslint@8.57.0)(typescript@5.4.3) + '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.3) '@typescript-eslint/scope-manager': 7.3.1 '@typescript-eslint/type-utils': 7.3.1(eslint@8.57.0)(typescript@5.4.3) '@typescript-eslint/utils': 7.3.1(eslint@8.57.0)(typescript@5.4.3) @@ -2749,8 +2749,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@7.3.1(eslint@8.57.0)(typescript@5.4.3): - resolution: {integrity: sha512-Rq49+pq7viTRCH48XAbTA+wdLRrB/3sRq4Lpk0oGDm0VmnjBrAOVXH/Laalmwsv2VpekiEfVFwJYVk6/e8uvQw==} + /@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.4.3): + resolution: {integrity: sha512-ZvKHxHLusweEUVwrGRXXUVzFgnWhigo4JurEj0dGF1tbcGh6buL+ejDdjxOQxv6ytcY1uhun1p2sm8iWStlgLQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -2759,10 +2759,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 7.3.1 - '@typescript-eslint/types': 7.3.1 - '@typescript-eslint/typescript-estree': 7.3.1(typescript@5.4.3) - '@typescript-eslint/visitor-keys': 7.3.1 + '@typescript-eslint/scope-manager': 7.4.0 + '@typescript-eslint/types': 7.4.0 + '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.3) + '@typescript-eslint/visitor-keys': 7.4.0 debug: 4.3.4 eslint: 8.57.0 typescript: 5.4.3 @@ -2786,6 +2786,14 @@ packages: '@typescript-eslint/visitor-keys': 7.3.1 dev: true + /@typescript-eslint/scope-manager@7.4.0: + resolution: {integrity: sha512-68VqENG5HK27ypafqLVs8qO+RkNc7TezCduYrx8YJpXq2QGZ30vmNZGJJJC48+MVn4G2dCV8m5ZTVnzRexTVtw==} + engines: {node: ^18.18.0 || >=20.0.0} + dependencies: + '@typescript-eslint/types': 7.4.0 + '@typescript-eslint/visitor-keys': 7.4.0 + dev: true + /@typescript-eslint/type-utils@7.3.1(eslint@8.57.0)(typescript@5.4.3): resolution: {integrity: sha512-iFhaysxFsMDQlzJn+vr3OrxN8NmdQkHks4WaqD4QBnt5hsq234wcYdyQ9uquzJJIDAj5W4wQne3yEsYA6OmXGw==} engines: {node: ^18.18.0 || >=20.0.0} @@ -2816,6 +2824,11 @@ packages: engines: {node: ^18.18.0 || >=20.0.0} dev: true + /@typescript-eslint/types@7.4.0: + resolution: {integrity: sha512-mjQopsbffzJskos5B4HmbsadSJQWaRK0UxqQ7GuNA9Ga4bEKeiO6b2DnB6cM6bpc8lemaPseh0H9B/wyg+J7rw==} + engines: {node: ^18.18.0 || >=20.0.0} + dev: true + /@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.3): resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -2860,6 +2873,28 @@ packages: - supports-color dev: true + /@typescript-eslint/typescript-estree@7.4.0(typescript@5.4.3): + resolution: {integrity: sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 7.4.0 + '@typescript-eslint/visitor-keys': 7.4.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.6.0 + ts-api-utils: 1.2.1(typescript@5.4.3) + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.4.3): resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -2914,6 +2949,14 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /@typescript-eslint/visitor-keys@7.4.0: + resolution: {integrity: sha512-0zkC7YM0iX5Y41homUUeW1CHtZR01K3ybjM1l6QczoMuay0XKtrb93kv95AxUGwdjGr64nNqnOCwmEl616N8CA==} + engines: {node: ^18.18.0 || >=20.0.0} + dependencies: + '@typescript-eslint/types': 7.4.0 + eslint-visitor-keys: 3.4.3 + dev: true + /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true From 59f3dd65c39bf6a2181bb91559101a610c1e419f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 22:07:47 +0000 Subject: [PATCH 40/99] chore(deps): bump winston from 3.12.0 to 3.13.0 (#14964) * chore(deps): bump winston from 3.12.0 to 3.13.0 Bumps [winston](https://github.com/winstonjs/winston) from 3.12.0 to 3.13.0. - [Release notes](https://github.com/winstonjs/winston/releases) - [Changelog](https://github.com/winstonjs/winston/blob/master/CHANGELOG.md) - [Commits](https://github.com/winstonjs/winston/compare/v3.12.0...v3.13.0) --- updated-dependencies: - dependency-name: winston dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * chore: fix pnpm install --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 13a1154d56..707a3ef131 100644 --- a/package.json +++ b/package.json @@ -116,7 +116,7 @@ "tsx": "4.7.1", "twitter-api-v2": "1.16.1", "uuid": "9.0.1", - "winston": "3.12.0", + "winston": "3.13.0", "xxhash-wasm": "1.0.2", "zod": "3.22.4" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ac0d315a22..31c83d0188 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -204,8 +204,8 @@ dependencies: specifier: 9.0.1 version: 9.0.1 winston: - specifier: 3.12.0 - version: 3.12.0 + specifier: 3.13.0 + version: 3.13.0 xxhash-wasm: specifier: 1.0.2 version: 1.0.2 @@ -9341,8 +9341,8 @@ packages: triple-beam: 1.4.1 dev: false - /winston@3.12.0: - resolution: {integrity: sha512-OwbxKaOlESDi01mC9rkM0dQqQt2I8DAUMRLZ/HpbwvDXm85IryEHgoogy5fziQy38PntgZsLlhAYHz//UPHZ5w==} + /winston@3.13.0: + resolution: {integrity: sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==} engines: {node: '>= 12.0.0'} dependencies: '@colors/colors': 1.6.0 From b0ceee59344c75fdb46c0440880cac15b70c2c84 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 22:09:19 +0000 Subject: [PATCH 41/99] chore(deps): bump puppeteer from 22.6.0 to 22.6.1 (#14966) * chore(deps): bump puppeteer from 22.6.0 to 22.6.1 Bumps [puppeteer](https://github.com/puppeteer/puppeteer) from 22.6.0 to 22.6.1. - [Release notes](https://github.com/puppeteer/puppeteer/releases) - [Changelog](https://github.com/puppeteer/puppeteer/blob/main/release-please-config.json) - [Commits](https://github.com/puppeteer/puppeteer/compare/puppeteer-v22.6.0...puppeteer-v22.6.1) --- updated-dependencies: - dependency-name: puppeteer dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * chore: fix pnpm install --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 57 ++++++++++++++++++-------------------------------- 2 files changed, 21 insertions(+), 38 deletions(-) diff --git a/package.json b/package.json index 707a3ef131..c5924f0558 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,7 @@ "otplib": "12.0.1", "pac-proxy-agent": "7.0.1", "proxy-chain": "2.4.0", - "puppeteer": "22.6.0", + "puppeteer": "22.6.1", "puppeteer-extra": "3.3.6", "puppeteer-extra-plugin-stealth": "2.11.2", "puppeteer-extra-plugin-user-data-dir": "2.4.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 31c83d0188..59734e5e2c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -141,11 +141,11 @@ dependencies: specifier: 2.4.0 version: 2.4.0 puppeteer: - specifier: 22.6.0 - version: 22.6.0(typescript@5.4.3) + specifier: 22.6.1 + version: 22.6.1(typescript@5.4.3) puppeteer-extra: specifier: 3.3.6 - version: 3.3.6(puppeteer@22.6.0) + version: 3.3.6(puppeteer@22.6.1) puppeteer-extra-plugin-stealth: specifier: 2.11.2 version: 2.11.2(puppeteer-extra@3.3.6) @@ -400,23 +400,15 @@ packages: /@babel/code-frame@7.0.0: resolution: {integrity: sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==} dependencies: - '@babel/highlight': 7.23.4 + '@babel/highlight': 7.24.2 dev: true - /@babel/code-frame@7.23.5: - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 - /@babel/code-frame@7.24.2: resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.24.2 picocolors: 1.0.0 - dev: true /@babel/compat-data@7.24.1: resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==} @@ -665,14 +657,6 @@ packages: - supports-color dev: true - /@babel/highlight@7.23.4: - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - /@babel/highlight@7.24.2: resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} engines: {node: '>=6.9.0'} @@ -681,7 +665,6 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.0 - dev: true /@babel/parser@7.23.9: resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} @@ -1613,7 +1596,7 @@ packages: resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.24.2 '@babel/parser': 7.24.1 '@babel/types': 7.24.0 dev: true @@ -3689,8 +3672,8 @@ packages: engines: {node: '>=10'} dev: true - /chromium-bidi@0.5.13(devtools-protocol@0.0.1262051): - resolution: {integrity: sha512-OHbYCetDxdW/xmlrafgOiLsIrw4Sp1BEeolbZ1UGJO5v/nekQOJBj/Kzyw6sqKcAVabUTo0GS3cTYgr6zIf00g==} + /chromium-bidi@0.5.14(devtools-protocol@0.0.1262051): + resolution: {integrity: sha512-zm4mX61/U4KXs+S/0WIBHpOWqtpW6FPv1i7n4UZqDDc5LOQ9/Y1MAnB95nO7i/lFFuijLjpe1XMdNcqDqwlH5w==} peerDependencies: devtools-protocol: '*' dependencies: @@ -7247,7 +7230,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.24.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -7540,12 +7523,12 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - /puppeteer-core@22.6.0: - resolution: {integrity: sha512-xclyGFhxHfZ9l62uXFm+JpgtJHLIZ1qHc7iR4eaIqBNKA5Dg2sDr8yvylfCx5bMN89QWIaxpV6IHsy0qUynK/g==} + /puppeteer-core@22.6.1: + resolution: {integrity: sha512-rShSd0xtyDSEJYys5nnzQnnwtrafQWg/lWCppyjZIIbYadWP8B1u0XJD/Oe+Xgw8v1hLHX0loNoA0ItRmNLnBg==} engines: {node: '>=18'} dependencies: '@puppeteer/browsers': 2.2.0 - chromium-bidi: 0.5.13(devtools-protocol@0.0.1262051) + chromium-bidi: 0.5.14(devtools-protocol@0.0.1262051) debug: 4.3.4 devtools-protocol: 0.0.1262051 ws: 8.16.0 @@ -7568,7 +7551,7 @@ packages: optional: true dependencies: debug: 4.3.4 - puppeteer-extra: 3.3.6(puppeteer@22.6.0) + puppeteer-extra: 3.3.6(puppeteer@22.6.1) puppeteer-extra-plugin: 3.2.3(puppeteer-extra@3.3.6) puppeteer-extra-plugin-user-preferences: 2.4.1(puppeteer-extra@3.3.6) transitivePeerDependencies: @@ -7589,7 +7572,7 @@ packages: dependencies: debug: 4.3.4 fs-extra: 10.1.0 - puppeteer-extra: 3.3.6(puppeteer@22.6.0) + puppeteer-extra: 3.3.6(puppeteer@22.6.1) puppeteer-extra-plugin: 3.2.3(puppeteer-extra@3.3.6) rimraf: 3.0.2 transitivePeerDependencies: @@ -7610,7 +7593,7 @@ packages: dependencies: debug: 4.3.4 deepmerge: 4.3.1 - puppeteer-extra: 3.3.6(puppeteer@22.6.0) + puppeteer-extra: 3.3.6(puppeteer@22.6.1) puppeteer-extra-plugin: 3.2.3(puppeteer-extra@3.3.6) puppeteer-extra-plugin-user-data-dir: 2.4.1(puppeteer-extra@3.3.6) transitivePeerDependencies: @@ -7632,12 +7615,12 @@ packages: '@types/debug': 4.1.12 debug: 4.3.4 merge-deep: 3.0.3 - puppeteer-extra: 3.3.6(puppeteer@22.6.0) + puppeteer-extra: 3.3.6(puppeteer@22.6.1) transitivePeerDependencies: - supports-color dev: false - /puppeteer-extra@3.3.6(puppeteer@22.6.0): + /puppeteer-extra@3.3.6(puppeteer@22.6.1): resolution: {integrity: sha512-rsLBE/6mMxAjlLd06LuGacrukP2bqbzKCLzV1vrhHFavqQE/taQ2UXv3H5P0Ls7nsrASa+6x3bDbXHpqMwq+7A==} engines: {node: '>=8'} peerDependencies: @@ -7655,13 +7638,13 @@ packages: '@types/debug': 4.1.12 debug: 4.3.4 deepmerge: 4.3.1 - puppeteer: 22.6.0(typescript@5.4.3) + puppeteer: 22.6.1(typescript@5.4.3) transitivePeerDependencies: - supports-color dev: false - /puppeteer@22.6.0(typescript@5.4.3): - resolution: {integrity: sha512-TYeza4rl1YXfxqUVw/0hWUWYX5cicnf6qu5kkDV+t7QrESCjMoSNnva4ZA/MRGQ03HnB9BOFw9nxs/SKek5KDA==} + /puppeteer@22.6.1(typescript@5.4.3): + resolution: {integrity: sha512-736QHNKtPD4tPeFbIn73E4l0CWsLzvRFlm0JsLG/VsyM8Eh0FRFNmMp+M3+GSMwdmYxqOVpTgzB6VQDxWxu8xQ==} engines: {node: '>=18'} hasBin: true requiresBuild: true @@ -7669,7 +7652,7 @@ packages: '@puppeteer/browsers': 2.2.0 cosmiconfig: 9.0.0(typescript@5.4.3) devtools-protocol: 0.0.1262051 - puppeteer-core: 22.6.0 + puppeteer-core: 22.6.1 transitivePeerDependencies: - bufferutil - supports-color From 44d5691d3753063170e8506dc5d5318d3e69df50 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 22:23:18 +0000 Subject: [PATCH 42/99] chore(deps-dev): bump @typescript-eslint/eslint-plugin from 7.3.1 to 7.4.0 (#14965) * chore(deps-dev): bump @typescript-eslint/eslint-plugin Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 7.3.1 to 7.4.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.4.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * chore: fix pnpm install --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 77 +++++++++++--------------------------------------- 2 files changed, 18 insertions(+), 61 deletions(-) diff --git a/package.json b/package.json index c5924f0558..e0b9d2a76f 100644 --- a/package.json +++ b/package.json @@ -146,7 +146,7 @@ "@types/supertest": "6.0.2", "@types/tiny-async-pool": "2.0.3", "@types/tough-cookie": "4.0.5", - "@typescript-eslint/eslint-plugin": "7.3.1", + "@typescript-eslint/eslint-plugin": "7.4.0", "@typescript-eslint/parser": "7.4.0", "@vercel/nft": "0.26.4", "@vitest/coverage-v8": "1.4.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 59734e5e2c..c15b5e0b36 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -290,8 +290,8 @@ devDependencies: specifier: 4.0.5 version: 4.0.5 '@typescript-eslint/eslint-plugin': - specifier: 7.3.1 - version: 7.3.1(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.3) + specifier: 7.4.0 + version: 7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.3) '@typescript-eslint/parser': specifier: 7.4.0 version: 7.4.0(eslint@8.57.0)(typescript@5.4.3) @@ -2703,8 +2703,8 @@ packages: dev: false optional: true - /@typescript-eslint/eslint-plugin@7.3.1(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.3): - resolution: {integrity: sha512-STEDMVQGww5lhCuNXVSQfbfuNII5E08QWkvAw5Qwf+bj2WT+JkG1uc+5/vXA3AOYMDHVOSpL+9rcbEUiHIm2dw==} + /@typescript-eslint/eslint-plugin@7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.3): + resolution: {integrity: sha512-yHMQ/oFaM7HZdVrVm/M2WHaNPgyuJH4WelkSVEWSSsir34kxW2kDJCxlXRhhGWEsMN0WAW/vLpKfKVcm8k+MPw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -2716,10 +2716,10 @@ packages: dependencies: '@eslint-community/regexpp': 4.10.0 '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.3) - '@typescript-eslint/scope-manager': 7.3.1 - '@typescript-eslint/type-utils': 7.3.1(eslint@8.57.0)(typescript@5.4.3) - '@typescript-eslint/utils': 7.3.1(eslint@8.57.0)(typescript@5.4.3) - '@typescript-eslint/visitor-keys': 7.3.1 + '@typescript-eslint/scope-manager': 7.4.0 + '@typescript-eslint/type-utils': 7.4.0(eslint@8.57.0)(typescript@5.4.3) + '@typescript-eslint/utils': 7.4.0(eslint@8.57.0)(typescript@5.4.3) + '@typescript-eslint/visitor-keys': 7.4.0 debug: 4.3.4 eslint: 8.57.0 graphemer: 1.4.0 @@ -2761,14 +2761,6 @@ packages: '@typescript-eslint/visitor-keys': 6.21.0 dev: true - /@typescript-eslint/scope-manager@7.3.1: - resolution: {integrity: sha512-fVS6fPxldsKY2nFvyT7IP78UO1/I2huG+AYu5AMjCT9wtl6JFiDnsv4uad4jQ0GTFzcUV5HShVeN96/17bTBag==} - engines: {node: ^18.18.0 || >=20.0.0} - dependencies: - '@typescript-eslint/types': 7.3.1 - '@typescript-eslint/visitor-keys': 7.3.1 - dev: true - /@typescript-eslint/scope-manager@7.4.0: resolution: {integrity: sha512-68VqENG5HK27ypafqLVs8qO+RkNc7TezCduYrx8YJpXq2QGZ30vmNZGJJJC48+MVn4G2dCV8m5ZTVnzRexTVtw==} engines: {node: ^18.18.0 || >=20.0.0} @@ -2777,8 +2769,8 @@ packages: '@typescript-eslint/visitor-keys': 7.4.0 dev: true - /@typescript-eslint/type-utils@7.3.1(eslint@8.57.0)(typescript@5.4.3): - resolution: {integrity: sha512-iFhaysxFsMDQlzJn+vr3OrxN8NmdQkHks4WaqD4QBnt5hsq234wcYdyQ9uquzJJIDAj5W4wQne3yEsYA6OmXGw==} + /@typescript-eslint/type-utils@7.4.0(eslint@8.57.0)(typescript@5.4.3): + resolution: {integrity: sha512-247ETeHgr9WTRMqHbbQdzwzhuyaJ8dPTuyuUEMANqzMRB1rj/9qFIuIXK7l0FX9i9FXbHeBQl/4uz6mYuCE7Aw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -2787,8 +2779,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 7.3.1(typescript@5.4.3) - '@typescript-eslint/utils': 7.3.1(eslint@8.57.0)(typescript@5.4.3) + '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.3) + '@typescript-eslint/utils': 7.4.0(eslint@8.57.0)(typescript@5.4.3) debug: 4.3.4 eslint: 8.57.0 ts-api-utils: 1.2.1(typescript@5.4.3) @@ -2802,11 +2794,6 @@ packages: engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/types@7.3.1: - resolution: {integrity: sha512-2tUf3uWggBDl4S4183nivWQ2HqceOZh1U4hhu4p1tPiIJoRRXrab7Y+Y0p+dozYwZVvLPRI6r5wKe9kToF9FIw==} - engines: {node: ^18.18.0 || >=20.0.0} - dev: true - /@typescript-eslint/types@7.4.0: resolution: {integrity: sha512-mjQopsbffzJskos5B4HmbsadSJQWaRK0UxqQ7GuNA9Ga4bEKeiO6b2DnB6cM6bpc8lemaPseh0H9B/wyg+J7rw==} engines: {node: ^18.18.0 || >=20.0.0} @@ -2834,28 +2821,6 @@ packages: - supports-color dev: true - /@typescript-eslint/typescript-estree@7.3.1(typescript@5.4.3): - resolution: {integrity: sha512-tLpuqM46LVkduWP7JO7yVoWshpJuJzxDOPYIVWUUZbW+4dBpgGeUdl/fQkhuV0A8eGnphYw3pp8d2EnvPOfxmQ==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 7.3.1 - '@typescript-eslint/visitor-keys': 7.3.1 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.6.0 - ts-api-utils: 1.2.1(typescript@5.4.3) - typescript: 5.4.3 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/typescript-estree@7.4.0(typescript@5.4.3): resolution: {integrity: sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg==} engines: {node: ^18.18.0 || >=20.0.0} @@ -2897,8 +2862,8 @@ packages: - typescript dev: true - /@typescript-eslint/utils@7.3.1(eslint@8.57.0)(typescript@5.4.3): - resolution: {integrity: sha512-jIERm/6bYQ9HkynYlNZvXpzmXWZGhMbrOvq3jJzOSOlKXsVjrrolzWBjDW6/TvT5Q3WqaN4EkmcfdQwi9tDjBQ==} + /@typescript-eslint/utils@7.4.0(eslint@8.57.0)(typescript@5.4.3): + resolution: {integrity: sha512-NQt9QLM4Tt8qrlBVY9lkMYzfYtNz8/6qwZg8pI3cMGlPnj6mOpRxxAm7BMJN9K0AiY+1BwJ5lVC650YJqYOuNg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -2906,9 +2871,9 @@ packages: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 7.3.1 - '@typescript-eslint/types': 7.3.1 - '@typescript-eslint/typescript-estree': 7.3.1(typescript@5.4.3) + '@typescript-eslint/scope-manager': 7.4.0 + '@typescript-eslint/types': 7.4.0 + '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.3) eslint: 8.57.0 semver: 7.6.0 transitivePeerDependencies: @@ -2924,14 +2889,6 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@typescript-eslint/visitor-keys@7.3.1: - resolution: {integrity: sha512-9RMXwQF8knsZvfv9tdi+4D/j7dMG28X/wMJ8Jj6eOHyHWwDW4ngQJcqEczSsqIKKjFiLFr40Mnr7a5ulDD3vmw==} - engines: {node: ^18.18.0 || >=20.0.0} - dependencies: - '@typescript-eslint/types': 7.3.1 - eslint-visitor-keys: 3.4.3 - dev: true - /@typescript-eslint/visitor-keys@7.4.0: resolution: {integrity: sha512-0zkC7YM0iX5Y41homUUeW1CHtZR01K3ybjM1l6QczoMuay0XKtrb93kv95AxUGwdjGr64nNqnOCwmEl616N8CA==} engines: {node: ^18.18.0 || >=20.0.0} From f37c25463c743133735c47656051040aee16749c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 22:37:59 +0000 Subject: [PATCH 43/99] chore(deps): bump hono from 4.1.3 to 4.1.4 (#14967) * chore(deps): bump hono from 4.1.3 to 4.1.4 Bumps [hono](https://github.com/honojs/hono) from 4.1.3 to 4.1.4. - [Release notes](https://github.com/honojs/hono/releases) - [Commits](https://github.com/honojs/hono/compare/v4.1.3...v4.1.4) --- updated-dependencies: - dependency-name: hono dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * chore: fix pnpm install --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index e0b9d2a76f..f45a3bf6dc 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "git-rev-sync": "3.0.2", "googleapis": "134.0.0", "got": "14.2.1", - "hono": "4.1.3", + "hono": "4.1.4", "html-to-text": "9.0.5", "https-proxy-agent": "7.0.4", "iconv-lite": "0.6.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c15b5e0b36..24efd586c6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,10 +10,10 @@ dependencies: version: 1.8.2 '@hono/swagger-ui': specifier: 0.2.1 - version: 0.2.1(hono@4.1.3) + version: 0.2.1(hono@4.1.4) '@hono/zod-openapi': specifier: 0.9.9 - version: 0.9.9(hono@4.1.3)(zod@3.22.4) + version: 0.9.9(hono@4.1.4)(zod@3.22.4) '@notionhq/client': specifier: 2.2.14 version: 2.2.14 @@ -78,8 +78,8 @@ dependencies: specifier: 14.2.1 version: 14.2.1 hono: - specifier: 4.1.3 - version: 4.1.3 + specifier: 4.1.4 + version: 4.1.4 html-to-text: specifier: 9.0.5 version: 9.0.5 @@ -1884,15 +1884,15 @@ packages: engines: {node: '>=18.14.1'} dev: false - /@hono/swagger-ui@0.2.1(hono@4.1.3): + /@hono/swagger-ui@0.2.1(hono@4.1.4): resolution: {integrity: sha512-wBxVMRe3/v8xH4o6icmwztiIq0DG0s7+jHVMHVUAoFFCWEQNL2iskMmQtrhSDtsFmBZUeUFQUaaJ6Ir6DOmHLA==} peerDependencies: hono: '*' dependencies: - hono: 4.1.3 + hono: 4.1.4 dev: false - /@hono/zod-openapi@0.9.9(hono@4.1.3)(zod@3.22.4): + /@hono/zod-openapi@0.9.9(hono@4.1.4)(zod@3.22.4): resolution: {integrity: sha512-Icak3c8WKNS1gFDWmYs2zJ7ra3js9lDeAXNPf5h3fa0SnJQcjcCrLaG6EZPPAbW92HRwCDeQt8yA/ZVp17HPFg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -1900,18 +1900,18 @@ packages: zod: 3.* dependencies: '@asteasolutions/zod-to-openapi': 5.5.0(zod@3.22.4) - '@hono/zod-validator': 0.1.11(hono@4.1.3)(zod@3.22.4) - hono: 4.1.3 + '@hono/zod-validator': 0.1.11(hono@4.1.4)(zod@3.22.4) + hono: 4.1.4 zod: 3.22.4 dev: false - /@hono/zod-validator@0.1.11(hono@4.1.3)(zod@3.22.4): + /@hono/zod-validator@0.1.11(hono@4.1.4)(zod@3.22.4): resolution: {integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==} peerDependencies: hono: '>=3.9.0' zod: ^3.19.1 dependencies: - hono: 4.1.3 + hono: 4.1.4 zod: 3.22.4 dev: false @@ -5407,8 +5407,8 @@ packages: resolution: {integrity: sha512-4FP6J0oI8jqb6gLLl9tSwVdosWJ/AKSGJ+HwYf6Ixe4MUcEkst4uWzpVQrNOCin0fzTRQbXV8ePheU8WiiDYBw==} dev: false - /hono@4.1.3: - resolution: {integrity: sha512-V0I6qCw0gn2MA4LLtyXe6oD3/7ToeQf5Zv98o7uSuLuViQgWHJeYoYrZ4NbXhOtg4SaZjNJJm1+XuFB3LN+j6A==} + /hono@4.1.4: + resolution: {integrity: sha512-JcdAKRBHjWO5OEkEW6Lv5NUr4QLl4InshCIUnHwGY7hymCxmV1Ji/eAAr1hclQixWc3I7ZljMHXwIedNWRAcqA==} engines: {node: '>=16.0.0'} dev: false From 357db65cbff1cd9bcc433b562bfc03d026f553e0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 22:54:58 +0000 Subject: [PATCH 44/99] chore(deps): bump @hono/node-server from 1.8.2 to 1.9.0 (#14968) * chore(deps): bump @hono/node-server from 1.8.2 to 1.9.0 Bumps [@hono/node-server](https://github.com/honojs/node-server) from 1.8.2 to 1.9.0. - [Release notes](https://github.com/honojs/node-server/releases) - [Commits](https://github.com/honojs/node-server/compare/v1.8.2...v1.9.0) --- updated-dependencies: - dependency-name: "@hono/node-server" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * chore: fix pnpm install --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index f45a3bf6dc..1fd6485821 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "*.yml": "eslint --cache --fix" }, "dependencies": { - "@hono/node-server": "1.8.2", + "@hono/node-server": "1.9.0", "@hono/swagger-ui": "0.2.1", "@hono/zod-openapi": "0.9.9", "@notionhq/client": "2.2.14", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 24efd586c6..db69f0c9f4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,8 +6,8 @@ settings: dependencies: '@hono/node-server': - specifier: 1.8.2 - version: 1.8.2 + specifier: 1.9.0 + version: 1.9.0 '@hono/swagger-ui': specifier: 0.2.1 version: 0.2.1(hono@4.1.4) @@ -1879,8 +1879,8 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@hono/node-server@1.8.2: - resolution: {integrity: sha512-h8l2TBLCPHZBUrrkosZ6L5CpBLj6zdESyF4B+zngiCDF7aZFQJ0alVbLx7jn8PCVi9EyoFf8a4hOZFi1tD95EA==} + /@hono/node-server@1.9.0: + resolution: {integrity: sha512-oJjk7WXBlENeHhWiMqSyxPIZ3Kmf5ZYxqdlcSIXyN8Rn50bNJsPl99G4POBS03Jxh56FdfRJ0SEnC8mAVIiavQ==} engines: {node: '>=18.14.1'} dev: false From fb17ebaa397650bd61012881af320afdfb9a06d4 Mon Sep 17 00:00:00 2001 From: lyqluis <39592732+lyqluis@users.noreply.github.com> Date: Tue, 26 Mar 2024 12:09:02 +0800 Subject: [PATCH 45/99] fix(route): /smzdm/article/:uid (#14975) --- lib/routes/smzdm/article.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/routes/smzdm/article.ts b/lib/routes/smzdm/article.ts index 45bcef75fa..c8457ea73f 100644 --- a/lib/routes/smzdm/article.ts +++ b/lib/routes/smzdm/article.ts @@ -9,7 +9,7 @@ export const route: Route = { path: '/article/:uid', categories: ['shopping'], example: '/smzdm/article/6902738986', - parameters: { uid: '用户id,网址上直接可以看到' }, + parameters: { uid: '用户 id,网址上直接可以看到' }, features: { requireConfig: false, requirePuppeteer: false, @@ -33,7 +33,7 @@ async function handler(ctx) { const response = await got(link); const $ = load(response.data); - const title = $('.info-stuff-nickname').text(); + const title = $('.info-stuff-nickname a').text(); const list = $('.pandect-content-stuff') .toArray() From efe156d61ab7e69d20038ef0bfb0fad5979b9189 Mon Sep 17 00:00:00 2001 From: Enoch Ma Date: Tue, 26 Mar 2024 05:28:38 +0100 Subject: [PATCH 46/99] fix(route): use publishedAt (AEON) (#14973) --- lib/routes/aeon/category.ts | 1 - lib/routes/aeon/type.ts | 1 - lib/routes/aeon/utils.ts | 3 +++ 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/routes/aeon/category.ts b/lib/routes/aeon/category.ts index 95938ea101..b2a7072115 100644 --- a/lib/routes/aeon/category.ts +++ b/lib/routes/aeon/category.ts @@ -38,7 +38,6 @@ async function handler(ctx) { title: item.node.title, author: item.node.authors.map((author) => author.displayName).join(', '), link: `https://aeon.co/${item.node.type.toLowerCase()}s/${item.node.slug}`, - pubDate: item.node.createdAt, })); const items = await getData(ctx, list); diff --git a/lib/routes/aeon/type.ts b/lib/routes/aeon/type.ts index 56321d4b32..02dc0e277b 100644 --- a/lib/routes/aeon/type.ts +++ b/lib/routes/aeon/type.ts @@ -45,7 +45,6 @@ async function handler(ctx) { const list = data.props.pageProps.articles.map((item) => ({ title: item.title, link: `https://aeon.co/${binaryType}/${item.slug}`, - pubDate: item.createdAt, })); const items = await getData(ctx, list); diff --git a/lib/routes/aeon/utils.ts b/lib/routes/aeon/utils.ts index c24e7f0183..5afcb4f57f 100644 --- a/lib/routes/aeon/utils.ts +++ b/lib/routes/aeon/utils.ts @@ -16,6 +16,9 @@ const getData = async (ctx, list) => { const data = JSON.parse($('script#__NEXT_DATA__').text()); const type = data.props.pageProps.article.type.toLowerCase(); + + item.pubDate = new Date(data.props.pageProps.article.publishedAt).toUTCString(); + if (type === 'video') { item.description = art(path.join(__dirname, 'templates/video.art'), { article: data.props.pageProps.article }); } else { From 808c1f2d82989bcd5b6f1a7b62277b133a548f8f Mon Sep 17 00:00:00 2001 From: LMark <40017222+ladeng07@users.noreply.github.com> Date: Tue, 26 Mar 2024 21:09:59 +0800 Subject: [PATCH 47/99] fix(route): fix the namespace for BJFU (#14980) --- lib/routes/bjfu/namespace.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/routes/bjfu/namespace.ts b/lib/routes/bjfu/namespace.ts index 9fb4169244..a23862f818 100644 --- a/lib/routes/bjfu/namespace.ts +++ b/lib/routes/bjfu/namespace.ts @@ -1,6 +1,6 @@ import type { Namespace } from '@/types'; export const namespace: Namespace = { - name: '北京师范大学', + name: '北京林业大学', url: 'graduate.bjfu.edu.cn', }; From 288f1d1fd745a72f0bdcce5a596d74cea2738d75 Mon Sep 17 00:00:00 2001 From: Enoch Ma Date: Tue, 26 Mar 2024 15:33:48 +0100 Subject: [PATCH 48/99] feat(route): support category and fix time (twreporter) (#14974) * support category and fix time(twreporter) * html -> text * simplification * update list of entries --------- --- lib/routes/twreporter/category.ts | 63 ++++++++++++++++++++++++++ lib/routes/twreporter/fetch-article.ts | 14 +++--- 2 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 lib/routes/twreporter/category.ts diff --git a/lib/routes/twreporter/category.ts b/lib/routes/twreporter/category.ts new file mode 100644 index 0000000000..c09e8b92dc --- /dev/null +++ b/lib/routes/twreporter/category.ts @@ -0,0 +1,63 @@ +import { Route } from '@/types'; +import cache from '@/utils/cache'; +import { load } from 'cheerio'; +import got from '@/utils/got'; + +import fetch from './fetch-article'; + +export const route: Route = { + path: '/category/:category', + categories: ['new-media'], + example: '/twreporter/category/world', + parameters: { category: 'Category' }, + features: { + requireConfig: false, + requirePuppeteer: false, + antiCrawler: false, + supportBT: false, + supportPodcast: false, + supportScihub: false, + }, + radar: [ + { + source: ['twreporter.org/:category'], + }, + ], + name: '分類', + maintainers: ['emdoe'], + handler, + url: 'twreporter.org/', +}; + +async function handler(ctx) { + const baseURL = 'https://www.twreporter.org'; + const url = baseURL + `/categories/${ctx.req.param('category')}`; + const res = await got(url); + const $ = load(res.data); + + const regexp = /^window\.__REDUX_STATE__=(.*);$/gm; + const raw = $('script[charset="UTF-8"]').text().replaceAll(regexp, '$1'); + const posts = JSON.parse(raw).entities.posts; + + const list = posts.allIds.map((id) => ({ + link: baseURL + '/a/' + posts.byId[id].slug, + title: posts.byId[id].title, + })); + const category = posts.byId[posts.allIds[0]].category_set[0].category.name; + + const out = await Promise.all( + list.map((item) => + cache.tryGet(item.link, async () => { + const single = await fetch(item.link); + single.title = item.title; + return single; + }) + ) + ); + + return { + title: `報導者 | ${category}`, + link: url, + item: out, + }; +} diff --git a/lib/routes/twreporter/fetch-article.ts b/lib/routes/twreporter/fetch-article.ts index ea635bbd23..a9bca8d4c0 100644 --- a/lib/routes/twreporter/fetch-article.ts +++ b/lib/routes/twreporter/fetch-article.ts @@ -7,6 +7,12 @@ export default async function fetch(address) { const capture = load(res.data); capture('.gIMvvS').remove(); + let time = capture('.gzaDTq').text(); + // For `photography` + if (!time) { + time = capture('.fEZfRw').text(); + } + let metaInfoBox = capture('.ffAPnj') .filter((index) => index === 0) .get(); @@ -19,12 +25,6 @@ export default async function fetch(address) { } const acquire = load(metaInfoBox); - let time = acquire('.gimsRe').text(); - - // For `photography` - if (!time) { - time = acquire('.kHluJP').text(); - } // # Author(s) of the article // // There exists two formats for this section. @@ -62,6 +62,6 @@ export default async function fetch(address) { description: contents, link: address, guid: address, - pubDate: parseDate(time, 'M/D/YYYY'), + pubDate: parseDate(time, 'YYYY/M/D'), }; } From eab38324f2489d8b324b304a55b1a2ec63b28fa3 Mon Sep 17 00:00:00 2001 From: KidLoveToPlay <63667585+Yamico@users.noreply.github.com> Date: Wed, 27 Mar 2024 01:35:24 +0800 Subject: [PATCH 49/99] feat(route): add ntdm (#14979) --- lib/routes/ntdm/namespace.ts | 6 ++++ lib/routes/ntdm/utils.ts | 3 ++ lib/routes/ntdm/video.ts | 57 ++++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 lib/routes/ntdm/namespace.ts create mode 100644 lib/routes/ntdm/utils.ts create mode 100644 lib/routes/ntdm/video.ts diff --git a/lib/routes/ntdm/namespace.ts b/lib/routes/ntdm/namespace.ts new file mode 100644 index 0000000000..a831c05040 --- /dev/null +++ b/lib/routes/ntdm/namespace.ts @@ -0,0 +1,6 @@ +import type { Namespace } from '@/types'; + +export const namespace: Namespace = { + name: 'NT动漫', + url: 'www.ntdm9.com', +}; diff --git a/lib/routes/ntdm/utils.ts b/lib/routes/ntdm/utils.ts new file mode 100644 index 0000000000..080321acfb --- /dev/null +++ b/lib/routes/ntdm/utils.ts @@ -0,0 +1,3 @@ +const rootUrl = 'https://www.ntdm9.com'; + +export { rootUrl }; diff --git a/lib/routes/ntdm/video.ts b/lib/routes/ntdm/video.ts new file mode 100644 index 0000000000..a3187e5ab0 --- /dev/null +++ b/lib/routes/ntdm/video.ts @@ -0,0 +1,57 @@ +import { Route } from '@/types'; +import got from '@/utils/got'; +import { rootUrl } from './utils'; +import cheerio from 'cheerio'; + +export const route: Route = { + path: '/video/:id', + categories: ['anime'], + example: '/ntdm/video/20200035', + parameters: { id: '番剧 id,对应详情 URL 中找到' }, + features: { + requireConfig: false, + requirePuppeteer: false, + antiCrawler: false, + supportBT: false, + supportPodcast: false, + supportScihub: false, + }, + radar: [ + { + source: ['ntdm9.com/video/:id'], + }, + ], + name: '番剧详情', + maintainers: ['alexhere'], + handler, +}; + +async function handler(ctx) { + const id = ctx.req.param('id'); + const url = `${rootUrl}/video/${id}.html`; + const response = await got(url); + const $ = cheerio.load(response.data); + + const dmtitle = $('.detail_imform_name').text(); + const dmdesc = $('.detail_imform_desc_pre').text(); + + const items = $('.movurl.mod ul') + .first() + .find('li') + .toArray() + .map((item) => { + item = $(item); + const a = item.find('a'); + return { + title: a.text(), + link: `${rootUrl}${a.attr('href')}` + }; + }) + .reverse(); + return { + title: `NT动漫 - ${dmtitle}`, + link: `${rootUrl}/video/${id}.html`, + description: dmdesc, + item: items, + }; +} From 74fddc4f4bb64b9edcc95d888bb400f90c6f3e34 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 26 Mar 2024 17:37:04 +0000 Subject: [PATCH 50/99] style: auto format --- lib/routes/ntdm/video.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/routes/ntdm/video.ts b/lib/routes/ntdm/video.ts index a3187e5ab0..2c0bcdd11f 100644 --- a/lib/routes/ntdm/video.ts +++ b/lib/routes/ntdm/video.ts @@ -44,7 +44,7 @@ async function handler(ctx) { const a = item.find('a'); return { title: a.text(), - link: `${rootUrl}${a.attr('href')}` + link: `${rootUrl}${a.attr('href')}`, }; }) .reverse(); From eec2a719534e9a832e92f350bc6aa295c1274686 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Wed, 27 Mar 2024 14:26:20 +0800 Subject: [PATCH 51/99] test: setup msw --- lib/config.test.ts | 6 -- lib/config.ts | 7 +- lib/setup.test.ts | 26 +++++++ package.json | 1 + pnpm-lock.yaml | 190 +++++++++++++++++++++++++++++++++++++++++++-- vitest.config.ts | 1 + 6 files changed, 215 insertions(+), 16 deletions(-) create mode 100644 lib/setup.test.ts diff --git a/lib/config.test.ts b/lib/config.test.ts index 1d59fd0f92..edf38055a6 100644 --- a/lib/config.test.ts +++ b/lib/config.test.ts @@ -1,5 +1,4 @@ import { describe, expect, it, afterEach, vi } from 'vitest'; -import nock from 'nock'; afterEach(() => { vi.resetModules(); @@ -93,11 +92,6 @@ describe('config', () => { it('remote config', async () => { process.env.REMOTE_CONFIG = 'http://rsshub.test/config'; - nock(/rsshub\.test/) - .get('/config') - .reply(200, { - UA: 'test', - }); const { config } = await import('./config'); await new Promise((resolve) => setTimeout(resolve, 100)); expect(config.ua).toBe('test'); diff --git a/lib/config.ts b/lib/config.ts index d99935c457..2be41d9e52 100644 --- a/lib/config.ts +++ b/lib/config.ts @@ -1,6 +1,6 @@ import 'dotenv/config'; import randUserAgent from '@/utils/rand-user-agent'; -import got from 'got'; +import { ofetch } from 'ofetch'; let envs = process.env; @@ -634,9 +634,8 @@ const calculateValue = () => { calculateValue(); if (envs.REMOTE_CONFIG) { - got.get(envs.REMOTE_CONFIG) - .then(async (response) => { - const data = JSON.parse(response.body); + ofetch(envs.REMOTE_CONFIG) + .then(async (data) => { if (data) { envs = Object.assign(envs, data); calculateValue(); diff --git a/lib/setup.test.ts b/lib/setup.test.ts new file mode 100644 index 0000000000..78a827a50b --- /dev/null +++ b/lib/setup.test.ts @@ -0,0 +1,26 @@ +import { beforeAll, afterAll, afterEach } from 'vitest'; +import { setupServer } from 'msw/node'; +import { http, HttpResponse } from 'msw'; + +const server = setupServer( + http.post(`https://api.openai.com/v1/chat/completions`, () => + HttpResponse.json({ + choices: [ + { + message: { + content: 'Summary of the article.', + }, + }, + ], + }) + ), + http.get(`http://rsshub.test/config`, () => + HttpResponse.json({ + UA: 'test', + }) + ) +); + +beforeAll(() => server.listen()); +afterAll(() => server.close()); +afterEach(() => server.resetHandlers()); diff --git a/package.json b/package.json index 8b39596f56..24a513b9f9 100644 --- a/package.json +++ b/package.json @@ -164,6 +164,7 @@ "js-beautify": "1.15.1", "lint-staged": "15.2.2", "mockdate": "3.0.5", + "msw": "2.2.12", "nock": "14.0.0-beta.5", "prettier": "3.2.5", "remark-parse": "11.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0fe2cbb253..a950c73b73 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -343,6 +343,9 @@ devDependencies: mockdate: specifier: 3.0.5 version: 3.0.5 + msw: + specifier: 2.2.12 + version: 2.2.12(typescript@5.4.3) nock: specifier: 14.0.0-beta.5 version: 14.0.0-beta.5 @@ -1664,6 +1667,18 @@ packages: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true + /@bundled-es-modules/cookie@2.0.0: + resolution: {integrity: sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==} + dependencies: + cookie: 0.5.0 + dev: true + + /@bundled-es-modules/statuses@1.0.1: + resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} + dependencies: + statuses: 2.0.1 + dev: true + /@colors/colors@1.6.0: resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} engines: {node: '>=0.1.90'} @@ -1966,6 +1981,39 @@ packages: lodash: 4.17.21 dev: true + /@inquirer/confirm@3.1.0: + resolution: {integrity: sha512-nH5mxoTEoqk6WpoBz80GMpDSm9jH5V9AF8n+JZAZfMzd9gHeEG9w1o3KawPRR72lfzpP+QxBHLkOKLEApwhDiQ==} + engines: {node: '>=18'} + dependencies: + '@inquirer/core': 7.1.0 + '@inquirer/type': 1.2.1 + dev: true + + /@inquirer/core@7.1.0: + resolution: {integrity: sha512-FRCiDiU54XHt5B/D8hX4twwZuzSP244ANHbu3R7CAsJfiv1dUOz24ePBgCZjygEjDUi6BWIJuk4eWLKJ7LATUw==} + engines: {node: '>=18'} + dependencies: + '@inquirer/type': 1.2.1 + '@types/mute-stream': 0.0.4 + '@types/node': 20.11.30 + '@types/wrap-ansi': 3.0.0 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-spinners: 2.9.2 + cli-width: 4.1.0 + figures: 3.2.0 + mute-stream: 1.0.0 + run-async: 3.0.0 + signal-exit: 4.1.0 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: true + + /@inquirer/type@1.2.1: + resolution: {integrity: sha512-xwMfkPAxeo8Ji/IxfUSqzRi0/+F2GIqJmpc5/thelgMGsjNZcjDDRBO9TLXT1s/hdx/mK5QbVIvgoLIFgXhTMQ==} + engines: {node: '>=18'} + dev: true + /@ioredis/commands@1.2.0: resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} dev: false @@ -2079,6 +2127,23 @@ packages: - supports-color dev: true + /@mswjs/cookies@1.1.0: + resolution: {integrity: sha512-0ZcCVQxifZmhwNBoQIrystCb+2sWBY2Zw8lpfJBPCHGCA/HWqehITeCRVIv4VMy8MPlaHo2w2pTHFV2pFfqKPw==} + engines: {node: '>=18'} + dev: true + + /@mswjs/interceptors@0.26.13: + resolution: {integrity: sha512-1vsdtQfcd2ot01rGsxnbQn5fi3rY/Ien4zwacIrGi421UvYNBeoaVUg2qWYXt4S1t92K+vf46XjhUxC0+B9GtA==} + engines: {node: '>=18'} + dependencies: + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/logger': 0.3.0 + '@open-draft/until': 2.1.0 + is-node-process: 1.2.0 + outvariant: 1.4.2 + strict-event-emitter: 0.5.1 + dev: true + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -2114,6 +2179,21 @@ packages: resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} dev: true + /@open-draft/deferred-promise@2.2.0: + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + dev: true + + /@open-draft/logger@0.3.0: + resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} + dependencies: + is-node-process: 1.2.0 + outvariant: 1.4.2 + dev: true + + /@open-draft/until@2.1.0: + resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + dev: true + /@otplib/core@12.0.1: resolution: {integrity: sha512-4sGntwbA/AC+SbPhbsziRiD+jNDdIzsZ3JUyfZwjtKyc/wufl1pnSIaG4Uqx8ymPagujub0o92kgBnB89cuAMA==} dev: false @@ -2513,6 +2593,10 @@ packages: resolution: {integrity: sha512-V+pm3stv1Mvz8fSKJJod6CglNGVqEQ6OyuqitoDkWywEODM/eJd1eSuIp9xt6DrX8BWZ2eDSIzbw1tPCUTvGbQ==} dev: false + /@types/cookie@0.6.0: + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + dev: true + /@types/cookiejar@2.1.5: resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} dev: true @@ -2641,6 +2725,12 @@ packages: /@types/ms@0.7.34: resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + /@types/mute-stream@0.0.4: + resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} + dependencies: + '@types/node': 20.11.30 + dev: true + /@types/node-fetch@2.6.11: resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} dependencies: @@ -2688,6 +2778,10 @@ packages: resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} dev: true + /@types/statuses@2.0.5: + resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==} + dev: true + /@types/superagent@8.1.3: resolution: {integrity: sha512-R/CfN6w2XsixLb1Ii8INfn+BT9sGPvw74OavfkW4SwY+jeUcAwLZv2+bXLJkndnimxjEBm0RPHgcjW9pLCa8cw==} dependencies: @@ -2718,6 +2812,10 @@ packages: resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} dev: true + /@types/wrap-ansi@3.0.0: + resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} + dev: true + /@types/yauzl@2.10.3: resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} requiresBuild: true @@ -3731,6 +3829,11 @@ packages: engines: {node: '>= 10'} dev: true + /cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + dev: true + /clipboardy@1.2.2: resolution: {integrity: sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw==} engines: {node: '>=4'} @@ -3746,7 +3849,6 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: false /clone-deep@0.2.4: resolution: {integrity: sha512-we+NuQo2DHhSl+DP6jlUiAhyAjBQrYnpOk15rN6c6JSPScjiCLh8IbSU+VTcph6YS3o7mASE8a0+gbZ7ChLpgg==} @@ -3862,6 +3964,11 @@ packages: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: true + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: true + /cookiejar@2.1.4: resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} dev: true @@ -5119,7 +5226,6 @@ packages: /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - dev: false /get-east-asian-width@1.2.0: resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} @@ -5347,6 +5453,11 @@ packages: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true + /graphql@16.8.1: + resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + dev: true + /gtoken@7.1.0: resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} engines: {node: '>=14.0.0'} @@ -5421,6 +5532,10 @@ packages: hasBin: true dev: false + /headers-polyfill@4.0.3: + resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} + dev: true + /heap@0.2.7: resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} dev: false @@ -5813,6 +5928,10 @@ packages: engines: {node: '>=0.10.0'} dev: false + /is-node-process@1.2.0: + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + dev: true + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -6858,10 +6977,46 @@ packages: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: false + /msw@2.2.12(typescript@5.4.3): + resolution: {integrity: sha512-thmjEipUvr+XGawcNOh4T8+T2TN3qKWPfF0Ewx6ub1HIATXBsjOhnjV6Wx2BmmFThKEtYYC+RygrvkpG4DzoZw==} + engines: {node: '>=18'} + hasBin: true + requiresBuild: true + peerDependencies: + typescript: '>= 4.7.x' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@bundled-es-modules/cookie': 2.0.0 + '@bundled-es-modules/statuses': 1.0.1 + '@inquirer/confirm': 3.1.0 + '@mswjs/cookies': 1.1.0 + '@mswjs/interceptors': 0.26.13 + '@open-draft/until': 2.1.0 + '@types/cookie': 0.6.0 + '@types/statuses': 2.0.5 + chalk: 4.1.2 + graphql: 16.8.1 + headers-polyfill: 4.0.3 + is-node-process: 1.2.0 + outvariant: 1.4.2 + path-to-regexp: 6.2.1 + strict-event-emitter: 0.5.1 + type-fest: 4.14.0 + typescript: 5.4.3 + yargs: 17.7.2 + dev: true + /mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} dev: true + /mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + /nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -7124,6 +7279,10 @@ packages: '@otplib/preset-v11': 12.0.1 dev: false + /outvariant@1.4.2: + resolution: {integrity: sha512-Ou3dJ6bA/UJ5GVHxah4LnqDwZRwAmWxrG3wtrHrbGnP4RnLCtA64A4F+ae7Y8ww660JaddSoArUR5HjipWSHAQ==} + dev: true + /p-cancelable@3.0.0: resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} engines: {node: '>=12.20'} @@ -7290,6 +7449,10 @@ packages: minipass: 5.0.0 dev: true + /path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + dev: true + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -7908,7 +8071,6 @@ packages: /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - dev: false /requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} @@ -8017,6 +8179,11 @@ packages: engines: {node: '>=0.12.0'} dev: true + /run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + dev: true + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: @@ -8341,6 +8508,11 @@ packages: resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} dev: false + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: true + /std-env@3.7.0: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} dev: true @@ -8369,6 +8541,10 @@ packages: bare-events: 2.2.0 dev: false + /strict-event-emitter@0.5.1: + resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} + dev: true + /strict-uri-encode@2.0.0: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} @@ -8870,6 +9046,11 @@ packages: engines: {node: '>=14.16'} dev: true + /type-fest@4.14.0: + resolution: {integrity: sha512-on5/Cw89wwqGZQu+yWO0gGMGu8VNxsaW9SB2HE8yJjllEk7IDTwnSN1dUVldYILhYPN5HzD7WAaw2cc/jBfn0Q==} + engines: {node: '>=16'} + dev: true + /type@1.2.0: resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} dev: false @@ -9434,7 +9615,6 @@ packages: /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - dev: false /yaeti@0.0.6: resolution: {integrity: sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==} @@ -9475,7 +9655,6 @@ packages: /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - dev: false /yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} @@ -9488,7 +9667,6 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - dev: false /yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} diff --git a/vitest.config.ts b/vitest.config.ts index 2a4074bea7..bc2deb5f5f 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -10,5 +10,6 @@ export default defineConfig({ exclude: ['lib/routes/**', 'lib/routes-deprecated/**'], }, testTimeout: 10000, + setupFiles: ['./lib/setup.test.ts'], }, }); From 8c0534393f9eb4366a0cb048d55b05d77386b3f8 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Wed, 27 Mar 2024 14:40:42 +0800 Subject: [PATCH 52/99] feat: use ofetch in parameter common-config wechat-mp --- lib/middleware/parameter.ts | 11 +++++------ lib/utils/common-config.ts | 12 ++++++------ lib/utils/wechat-mp.ts | 14 ++++++-------- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/lib/middleware/parameter.ts b/lib/middleware/parameter.ts index 1933889128..025f6b405c 100644 --- a/lib/middleware/parameter.ts +++ b/lib/middleware/parameter.ts @@ -1,7 +1,7 @@ import * as entities from 'entities'; import { load, type CheerioAPI, type Element } from 'cheerio'; import { simplecc } from 'simplecc-wasm'; -import got from '@/utils/got'; +import ofetch from '@/utils/ofetch'; import { config } from '@/config'; import { RE2JS } from 're2js'; import markdownit from 'markdown-it'; @@ -34,8 +34,9 @@ const resolveRelativeLink = ($: CheerioAPI, elem: Element, attr: string, baseUrl const summarizeArticle = async (articleText: string) => { const apiUrl = `${config.openai.endpoint}/chat/completions`; - const response = await got.post(apiUrl, { - json: { + const response = await ofetch(apiUrl, { + method: 'POST', + body: { model: config.openai.model, max_tokens: config.openai.maxTokens, messages: [ @@ -49,7 +50,6 @@ const summarizeArticle = async (articleText: string) => { }, }); - // @ts-expect-error custom field return response.data.choices[0].message.content; }; @@ -305,8 +305,7 @@ const middleware: MiddlewareHandler = async (ctx, next) => { if (link) { // if parser failed, return default description and not report error try { - // @ts-expect-error custom field - const { data: res } = await got(link); + const res = await ofetch(link); const $ = load(res); const result = await Parser.parse(link, { html: $.html(), diff --git a/lib/utils/common-config.ts b/lib/utils/common-config.ts index 65e84d2094..74d1b7c2bf 100644 --- a/lib/utils/common-config.ts +++ b/lib/utils/common-config.ts @@ -1,5 +1,5 @@ -import cheerio from 'cheerio'; -import got from '@/utils/got'; +import { load } from 'cheerio'; +import ofetch from '@/utils/ofetch'; import iconv from 'iconv-lite'; function transElemText($, prop) { @@ -37,8 +37,8 @@ function getProp(data, prop, $) { } async function buildData(data) { - const response = await got.get(data.url); - const contentType = response.headers['content-type'] || ''; + const response = await ofetch.raw(data.url); + const contentType = response.headers.get('content-type') || ''; // 若没有指定编码,则默认utf-8 let charset = 'utf-8'; for (const attr of contentType.split(';')) { @@ -47,8 +47,8 @@ async function buildData(data) { } } // @ts-expect-error custom property - const responseData = charset === 'utf-8' ? response.data : iconv.decode((await got.get({ url: data.url, responseType: 'buffer' })).data, charset); - const $ = cheerio.load(responseData); + const responseData = charset === 'utf-8' ? response._data : iconv.decode(await ofetch(data.url, { responseType: 'buffer' }), charset); + const $ = load(responseData); const $item = $(data.item.item); // 这里应该是可以通过参数注入一些代码的,不过应该无伤大雅 return { diff --git a/lib/utils/wechat-mp.ts b/lib/utils/wechat-mp.ts index ae03957b8d..0615ab1c94 100644 --- a/lib/utils/wechat-mp.ts +++ b/lib/utils/wechat-mp.ts @@ -25,7 +25,7 @@ * For more details of these functions, please refer to the jsDoc in the source code. */ -import got from '@/utils/got'; +import ofetch from '@/utils/ofetch'; import { load, type Cheerio, type Element } from 'cheerio'; import { parseDate } from '@/utils/parse-date'; import cache from '@/utils/cache'; @@ -196,9 +196,8 @@ const normalizeUrl = (url, bypassHostCheck = false) => { const fetchArticle = (url, bypassHostCheck = false) => { url = normalizeUrl(url, bypassHostCheck); return cache.tryGet(url, async () => { - const response = await got(url); - // @ts-expect-error custom field - const $ = load(response.data); + const data = await ofetch(url); + const $ = load(data); const title = ($('meta[property="og:title"]').attr('content') || '').replaceAll('\\r', '').replaceAll('\\n', ' '); const author = $('meta[name=author]').attr('content'); @@ -209,9 +208,8 @@ const fetchArticle = (url, bypassHostCheck = false) => { const originalUrl = detectOriginalArticleUrl($); if (originalUrl) { // try to fetch the description from the original article - const originalResponse = await got(normalizeUrl(originalUrl, bypassHostCheck)); - // @ts-expect-error custom field - const original$ = load(originalResponse.data); + const data = await ofetch(normalizeUrl(originalUrl, bypassHostCheck)); + const original$ = load(data); description += fixArticleContent(original$('#js_content')); } @@ -230,7 +228,7 @@ const fetchArticle = (url, bypassHostCheck = false) => { let mpName = $('.profile_nickname').first().text(); mpName = mpName && mpName.trim(); - return { title, author, description, summary, pubDate, mpName, link: response.url }; + return { title, author, description, summary, pubDate, mpName, link: url }; }) as Promise<{ title: string; author: string; From 760f48b8cf499143859c6e15ce07f30f5171f440 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Wed, 27 Mar 2024 14:49:43 +0800 Subject: [PATCH 53/99] test: fix common-config test --- lib/setup.test.ts | 18 ++++++++++++++++-- lib/utils/common-config.test.ts | 18 ------------------ 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/lib/setup.test.ts b/lib/setup.test.ts index 78a827a50b..df52b0f674 100644 --- a/lib/setup.test.ts +++ b/lib/setup.test.ts @@ -1,4 +1,4 @@ -import { beforeAll, afterAll, afterEach } from 'vitest'; +import { afterAll, afterEach } from 'vitest'; import { setupServer } from 'msw/node'; import { http, HttpResponse } from 'msw'; @@ -18,9 +18,23 @@ const server = setupServer( HttpResponse.json({ UA: 'test', }) + ), + http.get(`http://rsshub.test/buildData`, () => + HttpResponse.text(`
+
    +
  • + 1 +
    RSSHub1
    +
  • +
  • + 2 +
    RSSHub2
    +
  • +
+
`) ) ); +server.listen(); -beforeAll(() => server.listen()); afterAll(() => server.close()); afterEach(() => server.resetHandlers()); diff --git a/lib/utils/common-config.test.ts b/lib/utils/common-config.test.ts index 84b4c15c95..57839fd38e 100644 --- a/lib/utils/common-config.test.ts +++ b/lib/utils/common-config.test.ts @@ -1,6 +1,5 @@ import { describe, expect, it } from 'vitest'; import configUtils, { transElemText, replaceParams, getProp } from '@/utils/common-config'; -import nock from 'nock'; describe('index', () => { it('transElemText', () => { @@ -40,23 +39,6 @@ describe('index', () => { }); it('buildData', async () => { - nock('http://rsshub.test') - .get('/buildData') - .reply(() => [ - 200, - `
-
    -
  • - 1 -
    RSSHub1
    -
  • -
  • - 2 -
    RSSHub2
    -
  • -
-
`, - ]); const data = await configUtils({ link: 'http://rsshub.test/buildData', url: 'http://rsshub.test/buildData', From 3016a2f44fe2bd01857e18b2892415eb82f57cff Mon Sep 17 00:00:00 2001 From: DIYgod Date: Wed, 27 Mar 2024 14:53:43 +0800 Subject: [PATCH 54/99] test: fix wechat-mp test --- lib/setup.test.ts | 15 +++++++++++++++ lib/utils/wechat-mp.test.ts | 17 ----------------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/lib/setup.test.ts b/lib/setup.test.ts index df52b0f674..a3120aca62 100644 --- a/lib/setup.test.ts +++ b/lib/setup.test.ts @@ -32,6 +32,21 @@ const server = setupServer(
`) + ), + http.get(`https://mp.weixin.qq.com/rsshub_test/wechatMp_fetchArticle`, () => + HttpResponse.text( + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '
mpName
\n' + + '' + ) ) ); server.listen(); diff --git a/lib/utils/wechat-mp.test.ts b/lib/utils/wechat-mp.test.ts index b4811e84cd..e700a6e425 100644 --- a/lib/utils/wechat-mp.test.ts +++ b/lib/utils/wechat-mp.test.ts @@ -1,6 +1,5 @@ import { describe, expect, it } from 'vitest'; import { load } from 'cheerio'; -import nock from 'nock'; import { fixArticleContent, fetchArticle, finishArticleItem, normalizeUrl } from '@/utils/wechat-mp'; // date from the cache will be an ISO8601 string, so we need to use this function @@ -91,22 +90,6 @@ describe('wechat-mp', () => { it('fetchArticle_&_finishArticleItem', async () => { const ct = 1_636_626_300; - const exampleMpArticlePage = - '\n' + - '\n' + - '\n' + - '\n' + - '\n' + - '\n' + - '
mpName
\n' + - ''; - - nock('https://mp.weixin.qq.com') - .get('/rsshub_test/wechatMp_fetchArticle') - .reply(() => [200, exampleMpArticlePage]); const httpsUrl = 'https://mp.weixin.qq.com/rsshub_test/wechatMp_fetchArticle'; const httpUrl = httpsUrl.replace(/^https:\/\//, 'http://'); From bcd5f6ff8bb488f37302070702e8728288e209aa Mon Sep 17 00:00:00 2001 From: DIYgod Date: Wed, 27 Mar 2024 15:37:51 +0800 Subject: [PATCH 55/99] test: rand-user-agent test --- lib/setup.test.ts | 5 +++++ lib/utils/rand-user-agent.test.ts | 23 ++++------------------- 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/lib/setup.test.ts b/lib/setup.test.ts index a3120aca62..8e19dfc2c4 100644 --- a/lib/setup.test.ts +++ b/lib/setup.test.ts @@ -47,6 +47,11 @@ const server = setupServer( `var ct = "${1_636_626_300}";\n` + '' ) + ), + http.get(`http://rsshub.test/ua`, ({ request }) => + HttpResponse.json({ + ua: request.headers.get('user-agent'), + }) ) ); server.listen(); diff --git a/lib/utils/rand-user-agent.test.ts b/lib/utils/rand-user-agent.test.ts index 4ccea6ad99..91169f159c 100644 --- a/lib/utils/rand-user-agent.test.ts +++ b/lib/utils/rand-user-agent.test.ts @@ -1,7 +1,6 @@ import { describe, expect, it } from 'vitest'; import got from '@/utils/got'; import { config } from '@/config'; -import nock from 'nock'; import randUserAgent from '@/utils/rand-user-agent'; const mobileUa = randUserAgent({ browser: 'mobile safari', os: 'ios', device: 'mobile' }); @@ -23,30 +22,16 @@ describe('rand-user-agent', () => { }); it('should has default random ua', async () => { - nock('https://rsshub.test') - .get('/test') - .reply(function () { - expect(this.req.headers['user-agent']).toBe(config.ua); - expect(this.req.headers['user-agent']).not.toBe(mobileUa); - expect(this.req.headers['user-agent']).not.toBe('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'); - return [200, '']; - }); - await got('https://rsshub.test/test'); + const { data } = await got('http://rsshub.test/ua'); + expect(data.ua).toBe(config.ua); }); it('should match ua configurated', async () => { - nock('https://rsshub.test') - .get('/test') - .reply(function () { - return [200, { ua: this.req.headers['user-agent'] }]; - }); - - const resonse = await got('https://rsshub.test/test', { + const { data } = await got('http://rsshub.test/ua', { headers: { 'user-agent': mobileUa, }, }); - // @ts-expect-error custom field - expect(resonse.data.ua).toBe(mobileUa); + expect(data.ua).toBe(mobileUa); }); }); From a87ec364508f1b524241a8774c12d3244f26e8c2 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Wed, 27 Mar 2024 16:15:39 +0800 Subject: [PATCH 56/99] test: got test --- lib/setup.test.ts | 18 ++++++++++++- lib/utils/got.test.ts | 63 +++++++++++++++++++------------------------ 2 files changed, 45 insertions(+), 36 deletions(-) diff --git a/lib/setup.test.ts b/lib/setup.test.ts index 8e19dfc2c4..2946cdd13b 100644 --- a/lib/setup.test.ts +++ b/lib/setup.test.ts @@ -52,9 +52,25 @@ const server = setupServer( HttpResponse.json({ ua: request.headers.get('user-agent'), }) - ) + ), + http.post(`http://rsshub.test/form-post`, async ({ request }) => { + const formData = await request.formData(); + return HttpResponse.json({ + test: formData.get('test'), + }); + }), + http.post(`http://rsshub.test/json-post`, async ({ request }) => { + const jsonData = (await request.json()) as { + test: string; + }; + return HttpResponse.json({ + test: jsonData?.test, + }); + }) ); server.listen(); afterAll(() => server.close()); afterEach(() => server.resetHandlers()); + +export default server; diff --git a/lib/utils/got.test.ts b/lib/utils/got.test.ts index 45a1be6218..5b65725fc0 100644 --- a/lib/utils/got.test.ts +++ b/lib/utils/got.test.ts @@ -1,38 +1,26 @@ -import { describe, expect, it, afterEach, vi } from 'vitest'; -import nock from 'nock'; - -afterEach(() => { - vi.resetModules(); -}); +import { describe, expect, it, vi } from 'vitest'; +import { http, HttpResponse } from 'msw'; +import got from '@/utils/got'; +import { config } from '@/config'; describe('got', () => { it('headers', async () => { - const { default: got } = await import('@/utils/got'); - const { config } = await import('@/config'); - nock('http://rsshub.test') - .get('/test') - .reply(function () { - expect(this.req.headers['user-agent']).toBe(config.ua); - return [200, '']; - }); - - await got.get('http://rsshub.test/test'); + const { data } = await got('http://rsshub.test/ua'); + expect(data.ua).toBe(config.ua); }); it('retry', async () => { - const { default: got } = await import('@/utils/got'); - const { config } = await import('@/config'); const requestRun = vi.fn(); - nock('http://rsshub.test') - .get('/testRerty') - .times(config.requestRetry + 1) - .reply(() => { + const { default: server } = await import('@/setup.test'); + server.use( + http.get(`http://rsshub.test/retry-test`, () => { requestRun(); - return [503, '0']; - }); + return HttpResponse.error(); + }) + ); try { - await got.get('http://rsshub.test/testRerty'); + await got.get('http://rsshub.test/retry-test'); } catch (error: any) { expect(error.name).toBe('FetchError'); } @@ -41,18 +29,23 @@ describe('got', () => { expect(requestRun).toHaveBeenCalledTimes(config.requestRetry + 1); }); - it('axios', async () => { - const { default: got } = await import('@/utils/got'); - nock('http://rsshub.test') - .post('/post') - .reply(() => [200, '{"code": 0}']); - - const response1 = await got.post('http://rsshub.test/post', { + it('form-post', async () => { + const response = await got.post('http://rsshub.test/form-post', { form: { - test: 1, + test: 'rsshub', }, }); - expect(response1.body).toBe('{"code": 0}'); - expect(response1.data.code).toBe(0); + expect(response.body).toBe('{"test":"rsshub"}'); + expect(response.data.test).toBe('rsshub'); + }); + + it('json-post', async () => { + const response = await got.post('http://rsshub.test/json-post', { + json: { + test: 'rsshub', + }, + }); + expect(response.body).toBe('{"test":"rsshub"}'); + expect(response.data.test).toBe('rsshub'); }); }); From 2a366ef56dd1919143a3ed0d844b5045501ea737 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Wed, 27 Mar 2024 16:18:37 +0800 Subject: [PATCH 57/99] test: rss-parser test --- lib/setup.test.ts | 3 ++- lib/utils/rss-parser.test.ts | 16 ++++------------ 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/lib/setup.test.ts b/lib/setup.test.ts index 2946cdd13b..4e39c68dfa 100644 --- a/lib/setup.test.ts +++ b/lib/setup.test.ts @@ -66,7 +66,8 @@ const server = setupServer( return HttpResponse.json({ test: jsonData?.test, }); - }) + }), + http.get(`http://rsshub.test/rss`, () => HttpResponse.text('')) ); server.listen(); diff --git a/lib/utils/rss-parser.test.ts b/lib/utils/rss-parser.test.ts index 20b6664b56..0b09b61ea5 100644 --- a/lib/utils/rss-parser.test.ts +++ b/lib/utils/rss-parser.test.ts @@ -1,17 +1,9 @@ import { describe, expect, it } from 'vitest'; import parser from '@/utils/rss-parser'; -import { config } from '@/config'; -import nock from 'nock'; -describe('got', () => { - it('headers', async () => { - nock('http://rsshub.test') - .get('/test') - .reply(function () { - expect(this.req.headers['user-agent']).toBe(config.ua); - return [200, '']; - }); - - await parser.parseURL('http://rsshub.test/test'); +describe('rss-parser', () => { + it('rss', async () => { + const result = await parser.parseURL('http://rsshub.test/rss'); + expect(result).toBeTruthy(); }); }); From de40d32bb1812f8d6babaeb4a6375f24314f4ed6 Mon Sep 17 00:00:00 2001 From: Andvari <31068367+dzx-dzx@users.noreply.github.com> Date: Wed, 27 Mar 2024 22:30:27 +0800 Subject: [PATCH 58/99] fix(route/pts): Refine link selector. (#14988) * Update index.ts * Update index.ts --- lib/routes/pts/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/routes/pts/index.ts b/lib/routes/pts/index.ts index b64162ea67..c98290cbe2 100644 --- a/lib/routes/pts/index.ts +++ b/lib/routes/pts/index.ts @@ -29,7 +29,7 @@ async function handler(ctx) { const $ = load(response.data); - let items = $('h2 a') + let items = $('h1 a,h2 a') .slice(0, ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit')) : 30) .toArray() .map((item) => { From fa91b3b1338b6f3a27f353c118167c152c87a208 Mon Sep 17 00:00:00 2001 From: Mg Pig Date: Wed, 27 Mar 2024 22:55:14 +0800 Subject: [PATCH 59/99] feat(route): 18comic add category to description (#14986) --- lib/routes/18comic/templates/description.art | 5 +++++ lib/routes/18comic/utils.ts | 1 + 2 files changed, 6 insertions(+) diff --git a/lib/routes/18comic/templates/description.art b/lib/routes/18comic/templates/description.art index ffe0935976..1d69859b42 100644 --- a/lib/routes/18comic/templates/description.art +++ b/lib/routes/18comic/templates/description.art @@ -1,6 +1,11 @@ {{ if cover }} {{ /if }} +

+{{each category}} +{{ $value }} +{{/each}} +

{{ introduction }}

{{ each images image }} diff --git a/lib/routes/18comic/utils.ts b/lib/routes/18comic/utils.ts index e90e55077c..4f11fdd2ba 100644 --- a/lib/routes/18comic/utils.ts +++ b/lib/routes/18comic/utils.ts @@ -67,6 +67,7 @@ const ProcessItems = async (ctx, currentUrl, rootUrl) => { .toArray() .map((image) => content(image).attr('data-original')), cover: content('.thumb-overlay img').first().attr('src'), + category: item.category, }); return item; From c94ccb2c03f8040fe59e878f073cc182c87f3542 Mon Sep 17 00:00:00 2001 From: Enoch Ma Date: Wed, 27 Mar 2024 16:25:06 +0100 Subject: [PATCH 60/99] fix(route): AEON's banner (#14984) * use publishedAt * fix banner --- lib/routes/aeon/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/routes/aeon/utils.ts b/lib/routes/aeon/utils.ts index 5afcb4f57f..346ebe4df0 100644 --- a/lib/routes/aeon/utils.ts +++ b/lib/routes/aeon/utils.ts @@ -36,7 +36,7 @@ const getData = async (ctx, list) => { const article = data.props.pageProps.article; const capture = load(article.body); - const banner = article.thumbnail?.urls?.header; + const banner = article.image?.url; capture('p.pullquote').remove(); const authorsBio = article.authors.map((author) => '

' + author.name + author.authorBio.replaceAll(/^

/g, ' ')).join(''); From 0339933c29dcabef34403092786198c72faac5c3 Mon Sep 17 00:00:00 2001 From: nb5p <2098464+nb5p@users.noreply.github.com> Date: Thu, 28 Mar 2024 00:12:09 +0800 Subject: [PATCH 61/99] fix(route/docschina): markdown table in doc (#14989) Co-authored-by: nb5p --- lib/routes/docschina/weekly.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/routes/docschina/weekly.ts b/lib/routes/docschina/weekly.ts index 84369ae44b..a348658071 100644 --- a/lib/routes/docschina/weekly.ts +++ b/lib/routes/docschina/weekly.ts @@ -18,8 +18,8 @@ export const route: Route = { maintainers: ['daijinru', 'hestudy'], handler, description: `| javascript | node | react | - | ---------- | ---- | ----- | - | js | node | react |`, + | ---------- | ---- | ----- | + | js | node | react |`, radar: [ { source: ['docschina.org/news/weekly/js/*', 'docschina.org/news/weekly/js', 'docschina.org/'], From e5b0754fd695ff7ad278064e234c0d3bf297e428 Mon Sep 17 00:00:00 2001 From: stydxm <1773834430@qq.com> Date: Thu, 28 Mar 2024 00:49:05 +0800 Subject: [PATCH 62/99] fix(route): complete GitHub file params (#14987) * fix(route): complete GitHub file params * Apply suggestions from code review Co-authored-by: Tony -------- --- lib/routes/github/file.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/routes/github/file.ts b/lib/routes/github/file.ts index f44113890e..63684353ce 100644 --- a/lib/routes/github/file.ts +++ b/lib/routes/github/file.ts @@ -5,14 +5,21 @@ import queryString from 'query-string'; export const route: Route = { path: '/file/:user/:repo/:branch/:filepath{.+}', + example: '/github/file/DIYgod/RSSHub/master/README.md', + parameters: { + user: "GitHub user or org name", + repo: "repository name", + branch: "branch name", + filepath: "path of target file", + }, radar: [ { source: ['github.com/:user/:repo/blob/:branch/*filepath'], target: '/file/:user/:repo/:branch/:filepath', }, ], - name: 'Unknown', - maintainers: [], + name: 'File Commits', + maintainers: ['zengxs'], handler, }; From a13a9bda06400ef81d3b54bd33a8f031c6b9a7ae Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 27 Mar 2024 16:50:32 +0000 Subject: [PATCH 63/99] style: auto format --- lib/routes/github/file.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/routes/github/file.ts b/lib/routes/github/file.ts index 63684353ce..b1c192a0e9 100644 --- a/lib/routes/github/file.ts +++ b/lib/routes/github/file.ts @@ -7,10 +7,10 @@ export const route: Route = { path: '/file/:user/:repo/:branch/:filepath{.+}', example: '/github/file/DIYgod/RSSHub/master/README.md', parameters: { - user: "GitHub user or org name", - repo: "repository name", - branch: "branch name", - filepath: "path of target file", + user: 'GitHub user or org name', + repo: 'repository name', + branch: 'branch name', + filepath: 'path of target file', }, radar: [ { From 0e7c773a9a2d56016b5475914502f53791abba83 Mon Sep 17 00:00:00 2001 From: Ethan Shen <42264778+nczitzk@users.noreply.github.com> Date: Thu, 28 Mar 2024 02:23:01 +0800 Subject: [PATCH 64/99] =?UTF-8?q?feat(route):=20add=20=E5=90=9B=E5=90=88?= =?UTF-8?q?=E5=BE=8B=E5=B8=88=E4=BA=8B=E5=8A=A1=E6=89=80=E5=90=9B=E5=90=88?= =?UTF-8?q?=E6=B3=95=E8=AF=84=20(#14982)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(route): add 君合律师事务所君合法评 * update lib/routes/junhe/legal-updates.ts Co-authored-by: Tony --------- --- lib/routes/junhe/legal-updates.ts | 98 +++++++++++++++++++++++++++++++ lib/routes/junhe/namespace.ts | 8 +++ 2 files changed, 106 insertions(+) create mode 100644 lib/routes/junhe/legal-updates.ts create mode 100644 lib/routes/junhe/namespace.ts diff --git a/lib/routes/junhe/legal-updates.ts b/lib/routes/junhe/legal-updates.ts new file mode 100644 index 0000000000..70f5e4a918 --- /dev/null +++ b/lib/routes/junhe/legal-updates.ts @@ -0,0 +1,98 @@ +import { Route } from '@/types'; + +import cache from '@/utils/cache'; +import got from '@/utils/got'; +import { load } from 'cheerio'; +import { parseDate } from '@/utils/parse-date'; + +export const handler = async (ctx) => { + const limit = ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit'), 10) : 10; + + const rootUrl = 'https://junhe.com'; + const currentUrl = new URL('legal-updates', rootUrl).href; + + const { data: response } = await got(currentUrl); + + const $ = load(response); + + const language = $('html').prop('lang'); + + let items = $('a.content-wrap') + .slice(0, limit) + .toArray() + .map((item) => { + item = $(item); + + return { + title: item.find('h1.news.detail').text(), + pubDate: parseDate(item.find('p.date').text(), 'YYYY.MM.DD'), + link: new URL(item.prop('href'), rootUrl).href, + }; + }); + + items = await Promise.all( + items.map((item) => + cache.tryGet(item.link, async () => { + const { data: detailResponse } = await got(item.link); + + const $$ = load(detailResponse); + + const title = $$('h1.d-title').text(); + const description = $$('div.d-content').html(); + const infos = $$('p.d-pub-date').text().split(/\s/); + + item.title = title; + item.description = description; + item.pubDate = parseDate(infos[0], 'YYYY.MM.DD'); + item.author = infos.slice(1).join('/'); + item.content = { + html: description, + text: $$('div.d-content').text(), + }; + item.language = language; + + return item; + }) + ) + ); + + const image = new URL($('a.site-logo img').prop('src'), rootUrl).href; + + return { + title: $('title').text(), + description: $('meta[name="description"]').prop('content'), + link: currentUrl, + item: items, + allowEmpty: true, + image, + author: '君合律师事务所', + language, + }; +}; + +export const route: Route = { + path: '/legal-updates', + name: '君合法评', + url: 'junhe.com', + maintainers: ['nczitzk'], + handler, + example: '/junhe/legal-updates', + description: '', + categories: ['new-media'], + + features: { + requireConfig: false, + requirePuppeteer: false, + antiCrawler: false, + supportRadar: true, + supportBT: false, + supportPodcast: false, + supportScihub: false, + }, + radar: [ + { + source: ['/legal-updates'], + target: '/legal-updates', + }, + ], +}; diff --git a/lib/routes/junhe/namespace.ts b/lib/routes/junhe/namespace.ts new file mode 100644 index 0000000000..d4f5598819 --- /dev/null +++ b/lib/routes/junhe/namespace.ts @@ -0,0 +1,8 @@ +import type { Namespace } from '@/types'; + +export const namespace: Namespace = { + name: '君合律师事务所', + url: 'junhe.com', + categories: ['new-media'], + description: '', +}; From 23104cd1f69c2f16297cf1cdb1315c44888b6976 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Thu, 28 Mar 2024 02:42:24 +0800 Subject: [PATCH 65/99] feat: use undici --- lib/utils/ofetch.ts | 7 ++----- package.json | 1 + pnpm-lock.yaml | 8 ++++++++ 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/utils/ofetch.ts b/lib/utils/ofetch.ts index d7a765e119..31e6574c8e 100644 --- a/lib/utils/ofetch.ts +++ b/lib/utils/ofetch.ts @@ -1,14 +1,11 @@ -import { ofetch } from 'ofetch'; +import { createFetch } from 'ofetch'; import { config } from '@/config'; import logger from '@/utils/logger'; -const rofetch = ofetch.create({ +const rofetch = createFetch().create({ retry: config.requestRetry, retryDelay: 1000, timeout: config.requestTimeout, - headers: { - 'user-agent': config.ua, - }, onRequestError({ request, error }) { logger.error(`Request ${request} fail: ${error}`); }, diff --git a/package.json b/package.json index 24a513b9f9..dce2339eed 100644 --- a/package.json +++ b/package.json @@ -117,6 +117,7 @@ "tough-cookie": "4.1.3", "tsx": "4.7.1", "twitter-api-v2": "1.16.1", + "undici": "6.10.2", "uuid": "9.0.1", "winston": "3.12.0", "xxhash-wasm": "1.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a950c73b73..cf4280dcfc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -206,6 +206,9 @@ dependencies: twitter-api-v2: specifier: 1.16.1 version: 1.16.1 + undici: + specifier: 6.10.2 + version: 6.10.2 uuid: specifier: 9.0.1 version: 9.0.1 @@ -9101,6 +9104,11 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + /undici@6.10.2: + resolution: {integrity: sha512-HcVuBy7ACaDejIMdwCzAvO22OsiE6ir6ziTIr9kAE0vB+PheVe29ZvRN8p7FXCO2uZHTjEoUs5bPiFpuc/hwwQ==} + engines: {node: '>=18.0'} + dev: false + /unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} From 759c03cd23547573eb68088bad422d600c17caee Mon Sep 17 00:00:00 2001 From: DIYgod Date: Thu, 28 Mar 2024 02:45:08 +0800 Subject: [PATCH 66/99] feat: intercept undici and use fetch dispatcher --- lib/app.tsx | 2 +- lib/utils/proxy/index.ts | 7 +++ lib/utils/request-interceptor.ts | 80 ++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 lib/utils/request-interceptor.ts diff --git a/lib/app.tsx b/lib/app.tsx index c3b27ab41f..f2a549eef0 100644 --- a/lib/app.tsx +++ b/lib/app.tsx @@ -1,4 +1,4 @@ -import '@/utils/request-wrapper'; +import '@/utils/request-interceptor'; import { Hono } from 'hono'; diff --git a/lib/utils/proxy/index.ts b/lib/utils/proxy/index.ts index b49730693b..016501b2ac 100644 --- a/lib/utils/proxy/index.ts +++ b/lib/utils/proxy/index.ts @@ -2,6 +2,7 @@ import { config } from '@/config'; import { PacProxyAgent } from 'pac-proxy-agent'; import { HttpsProxyAgent } from 'https-proxy-agent'; import { SocksProxyAgent } from 'socks-proxy-agent'; +import { ProxyAgent } from 'undici'; const proxyIsPAC = config.pacUri || config.pacScript; @@ -24,11 +25,16 @@ if (proxyIsPAC) { } let agent: PacProxyAgent | HttpsProxyAgent | SocksProxyAgent | null = null; +let dispatcher: ProxyAgent | null = null; if (proxyIsPAC) { agent = new PacProxyAgent(`pac+${proxyUri}`); } else if (proxyUri) { if (proxyUri.startsWith('http')) { agent = new HttpsProxyAgent(proxyUri); + dispatcher = new ProxyAgent({ + uri: proxyUri, + token: proxyObj?.auth ? `Basic ${proxyObj.auth}` : undefined, + }); } else if (proxyUri.startsWith('socks')) { agent = new SocksProxyAgent(proxyUri); } @@ -36,6 +42,7 @@ if (proxyIsPAC) { export default { agent, + dispatcher, proxyUri, proxyObj, proxyUrlHandler, diff --git a/lib/utils/request-interceptor.ts b/lib/utils/request-interceptor.ts new file mode 100644 index 0000000000..c85ba01cd7 --- /dev/null +++ b/lib/utils/request-interceptor.ts @@ -0,0 +1,80 @@ +import { setupServer } from 'msw/node'; +import { http, passthrough } from 'msw'; +import logger from '@/utils/logger'; +import { config } from '@/config'; +import { fetch, Headers, FormData, ProxyAgent, Request, RequestInfo, RequestInit, Response } from 'undici'; +import proxy from '@/utils/proxy'; +import type nodehttp from 'node:http'; + +class ExtendedRequest extends Request { + public dispatcher: ProxyAgent | undefined; + public agent: nodehttp.ClientRequestArgs['agent']; + + constructor(input: RequestInfo, init?: RequestInit & nodehttp.ClientRequestArgs) { + super(input, init); + this.dispatcher = init?.dispatcher; // fetch + this.agent = init?.agent; // http + } +} + +Object.defineProperties(globalThis, { + fetch: { value: fetch, writable: true }, + Headers: { value: Headers }, + FormData: { value: FormData }, + Request: { value: ExtendedRequest }, + Response: { value: Response }, +}); + +const handler = (request: ExtendedRequest) => { + request.headers.set('debug', '1'); + // ua + if (!request.headers.get('user-agent')) { + request.headers.set('user-agent', config.ua); + } + + // accept + if (!request.headers.get('accept')) { + request.headers.set('accept', '*/*'); + } + + // referer + if (!request.headers.get('referer')) { + try { + const urlHandler = new URL(request.url); + request.headers.set('referer', urlHandler.origin); + } catch { + // ignore + } + } + + // proxy + if (!request.dispatcher && !request.agent && proxy.dispatcher) { + const proxyRegex = new RegExp(proxy.proxyObj.url_regex); + let urlHandler; + try { + urlHandler = new URL(request.url); + } catch { + // ignore + } + + if (proxyRegex.test(request.url) && request.url.startsWith('http') && !(urlHandler && urlHandler.host === proxy.proxyUrlHandler?.host)) { + // fetch + request.dispatcher = proxy.dispatcher; + + // http + request.agent = proxy.agent || undefined; + if (proxy.proxyObj.auth) { + request.headers.set('Proxy-Authorization', `Basic ${proxy.proxyObj.auth}`); + } + } + } +}; + +const server = setupServer( + http.all('*', ({ request }) => { + logger.debug(`Outgoing request: ${request.method} ${request.url}`); + handler(request); + return passthrough(); + }) +); +server.listen(); From cc459531a75d00f4b54b51c3a09048b6ae3d053e Mon Sep 17 00:00:00 2001 From: CaoMeiYouRen <40430746+CaoMeiYouRen@users.noreply.github.com> Date: Thu, 28 Mar 2024 02:48:48 +0800 Subject: [PATCH 67/99] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20form-data=20?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E7=9A=84=E7=BC=BA=E5=A4=B1=EF=BC=9B=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=20cross-env=20=E4=BB=A5=E5=85=BC=E5=AE=B9=20Windows?= =?UTF-8?q?=20=E5=92=8C=20Linux=20=E7=9A=84=E7=8E=AF=E5=A2=83=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E8=AE=BE=E7=BD=AE=20(#14981)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: 修复 form-data 依赖的缺失;增加 cross-env 以兼容 Windows 和 Linux 的环境变量设置 * fix: fix package.json/pnpm-lock.yaml; add .npmrc * fix: update the pnpm-lock.yaml file and use the locked version * fix: update pnpm-lock.yaml --- .npmrc | 1 + package.json | 18 +- pnpm-lock.yaml | 805 +++++++++++++++++++++++++++++++------------------ 3 files changed, 520 insertions(+), 304 deletions(-) create mode 100644 .npmrc diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000000..cafe685a11 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +package-lock=true diff --git a/package.json b/package.json index 1fd6485821..ebb7de0863 100644 --- a/package.json +++ b/package.json @@ -23,19 +23,19 @@ "scripts": { "build": "tsx scripts/workflow/build-routes.ts", "build:docs": "tsx scripts/workflow/build-docs.ts", - "dev": "NODE_ENV=dev tsx watch --no-cache lib/index.ts", - "dev:cache": "NODE_ENV=production tsx watch lib/index.ts", + "dev": "cross-env NODE_ENV=dev tsx watch --no-cache lib/index.ts", + "dev:cache": "cross-env NODE_ENV=production tsx watch lib/index.ts", "format": "eslint --cache --fix \"**/*.{ts,js,yml}\" && prettier \"**/*.{ts,js,json}\" --write", "format:check": "eslint --cache \"**/*.{ts,js,yml}\" && prettier \"**/*.{ts,js,json}\" --check", "format:staged": "lint-staged", - "vitest": "NODE_ENV=test vitest", - "vitest:fullroutes": "NODE_ENV=test FULL_ROUTES_TEST=true vitest --reporter=json --reporter=default --outputFile=\"./assets/build/test-full-routes.json\" routes", - "vitest:coverage": "NODE_ENV=test vitest --coverage.enabled --reporter=junit", - "vitest:watch": "NODE_ENV=test vitest --watch", + "vitest": "cross-env NODE_ENV=test vitest", + "vitest:fullroutes": "cross-env NODE_ENV=test FULL_ROUTES_TEST=true vitest --reporter=json --reporter=default --outputFile=\"./assets/build/test-full-routes.json\" routes", + "vitest:coverage": "cross-env NODE_ENV=test vitest --coverage.enabled --reporter=junit", + "vitest:watch": "cross-env NODE_ENV=test vitest --watch", "lint": "eslint --cache .", "prepare": "husky || true", - "profiling": "NODE_ENV=production tsx --prof lib/index.ts", - "start": "NODE_ENV=production tsx lib/index.ts", + "profiling": "cross-env NODE_ENV=production tsx --prof lib/index.ts", + "start": "cross-env NODE_ENV=production tsx lib/index.ts", "test": "npm run format:check && npm run vitest:coverage" }, "lint-staged": { @@ -63,6 +63,7 @@ "cheerio": "1.0.0-rc.12", "chrono-node": "2.7.5", "city-timezones": "1.2.1", + "cross-env": "7.0.3", "crypto-js": "4.2.0", "currency-symbol-map": "5.1.0", "dayjs": "1.11.8", @@ -71,6 +72,7 @@ "entities": "4.5.0", "etag": "1.8.1", "fanfou-sdk": "5.0.0", + "form-data": "4.0.0", "git-rev-sync": "3.0.2", "googleapis": "134.0.0", "got": "14.2.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index db69f0c9f4..3ddd1734df 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,6 +44,9 @@ dependencies: city-timezones: specifier: 1.2.1 version: 1.2.1 + cross-env: + specifier: 7.0.3 + version: 7.0.3 crypto-js: specifier: 4.2.0 version: 4.2.0 @@ -68,6 +71,9 @@ dependencies: fanfou-sdk: specifier: 5.0.0 version: 5.0.0 + form-data: + specifier: 4.0.0 + version: 4.0.0 git-rev-sync: specifier: 3.0.2 version: 3.0.2 @@ -372,14 +378,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.22 - dev: true - /@ampproject/remapping@2.3.0: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -545,8 +543,8 @@ packages: '@babel/types': 7.24.0 dev: true - /@babel/helper-module-imports@7.24.1: - resolution: {integrity: sha512-HfEWzysMyOa7xI5uQHc/OcZf67/jc+xe/RZlznWQHhbb8Pg1SkRdbK4yEi61aY8wxQA7PkSfoojtLQP/Kpe3og==} + /@babel/helper-module-imports@7.24.3: + resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.24.0 @@ -560,7 +558,7 @@ packages: dependencies: '@babel/core': 7.24.3 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.24.1 + '@babel/helper-module-imports': 7.24.3 '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 @@ -623,8 +621,8 @@ packages: '@babel/types': 7.24.0 dev: true - /@babel/helper-string-parser@7.23.4: - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + /@babel/helper-string-parser@7.24.1: + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} engines: {node: '>=6.9.0'} dev: true @@ -666,14 +664,6 @@ packages: js-tokens: 4.0.0 picocolors: 1.0.0 - /@babel/parser@7.23.9: - resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.24.0 - dev: true - /@babel/parser@7.24.1: resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} engines: {node: '>=6.0.0'} @@ -943,7 +933,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.3 - '@babel/helper-module-imports': 7.24.1 + '@babel/helper-module-imports': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.3) dev: true @@ -1577,16 +1567,16 @@ packages: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} dev: true - /@babel/runtime-corejs2@7.23.9: - resolution: {integrity: sha512-lwwDy5QfMkO2rmSz9AvLj6j2kWt5a4ulMi1t21vWQEO0kNCFslHoszat8reU/uigIQSUDF31zraZG/qMkcqAlw==} + /@babel/runtime-corejs2@7.24.1: + resolution: {integrity: sha512-De0q0utpUPiXnc7+B7Ku86mJ0eDItC/v3uFa/lQkq63XnHyZiytDHeCIvechlnVwwpU2ChjGF7c3I+mBrTudwg==} engines: {node: '>=6.9.0'} dependencies: core-js: 2.6.12 regenerator-runtime: 0.14.1 dev: false - /@babel/runtime@7.24.0: - resolution: {integrity: sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==} + /@babel/runtime@7.24.1: + resolution: {integrity: sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.1 @@ -1619,20 +1609,11 @@ packages: - supports-color dev: true - /@babel/types@7.23.9: - resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.23.4 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - dev: true - /@babel/types@7.24.0: resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.23.4 + '@babel/helper-string-parser': 7.24.1 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 dev: true @@ -1664,6 +1645,16 @@ packages: cpu: [ppc64] os: [aix] requiresBuild: true + dev: false + optional: true + + /@esbuild/aix-ppc64@0.20.2: + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true optional: true /@esbuild/android-arm64@0.19.12: @@ -1672,6 +1663,16 @@ packages: cpu: [arm64] os: [android] requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm64@0.20.2: + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true optional: true /@esbuild/android-arm@0.19.12: @@ -1680,6 +1681,16 @@ packages: cpu: [arm] os: [android] requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm@0.20.2: + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true optional: true /@esbuild/android-x64@0.19.12: @@ -1688,6 +1699,16 @@ packages: cpu: [x64] os: [android] requiresBuild: true + dev: false + optional: true + + /@esbuild/android-x64@0.20.2: + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true optional: true /@esbuild/darwin-arm64@0.19.12: @@ -1696,6 +1717,16 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-arm64@0.20.2: + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true optional: true /@esbuild/darwin-x64@0.19.12: @@ -1704,6 +1735,16 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-x64@0.20.2: + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true optional: true /@esbuild/freebsd-arm64@0.19.12: @@ -1712,6 +1753,16 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-arm64@0.20.2: + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true optional: true /@esbuild/freebsd-x64@0.19.12: @@ -1720,6 +1771,16 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-x64@0.20.2: + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true optional: true /@esbuild/linux-arm64@0.19.12: @@ -1728,6 +1789,16 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm64@0.20.2: + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true optional: true /@esbuild/linux-arm@0.19.12: @@ -1736,6 +1807,16 @@ packages: cpu: [arm] os: [linux] requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm@0.20.2: + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true optional: true /@esbuild/linux-ia32@0.19.12: @@ -1744,6 +1825,16 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ia32@0.20.2: + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true optional: true /@esbuild/linux-loong64@0.19.12: @@ -1752,6 +1843,16 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-loong64@0.20.2: + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true optional: true /@esbuild/linux-mips64el@0.19.12: @@ -1760,6 +1861,16 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-mips64el@0.20.2: + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true optional: true /@esbuild/linux-ppc64@0.19.12: @@ -1768,6 +1879,16 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ppc64@0.20.2: + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true optional: true /@esbuild/linux-riscv64@0.19.12: @@ -1776,6 +1897,16 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-riscv64@0.20.2: + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true optional: true /@esbuild/linux-s390x@0.19.12: @@ -1784,6 +1915,16 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-s390x@0.20.2: + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true optional: true /@esbuild/linux-x64@0.19.12: @@ -1792,6 +1933,16 @@ packages: cpu: [x64] os: [linux] requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-x64@0.20.2: + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true optional: true /@esbuild/netbsd-x64@0.19.12: @@ -1800,6 +1951,16 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true + dev: false + optional: true + + /@esbuild/netbsd-x64@0.20.2: + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true optional: true /@esbuild/openbsd-x64@0.19.12: @@ -1808,6 +1969,16 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true + dev: false + optional: true + + /@esbuild/openbsd-x64@0.20.2: + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true optional: true /@esbuild/sunos-x64@0.19.12: @@ -1816,6 +1987,16 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true + dev: false + optional: true + + /@esbuild/sunos-x64@0.20.2: + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true optional: true /@esbuild/win32-arm64@0.19.12: @@ -1824,6 +2005,16 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-arm64@0.20.2: + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true optional: true /@esbuild/win32-ia32@0.19.12: @@ -1832,6 +2023,16 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-ia32@0.20.2: + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true optional: true /@esbuild/win32-x64@0.19.12: @@ -1840,6 +2041,16 @@ packages: cpu: [x64] os: [win32] requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-x64@0.20.2: + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true optional: true /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): @@ -1971,15 +2182,6 @@ packages: '@sinclair/typebox': 0.27.8 dev: true - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.22 - dev: true - /@jridgewell/gen-mapping@0.3.5: resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} @@ -1994,11 +2196,6 @@ packages: engines: {node: '>=6.0.0'} dev: true - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - dev: true - /@jridgewell/set-array@1.2.1: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} @@ -2008,13 +2205,6 @@ packages: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: true - /@jridgewell/trace-mapping@0.3.22: - resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /@jridgewell/trace-mapping@0.3.25: resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} dependencies: @@ -2022,15 +2212,15 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true - /@lifeomic/attempt@3.0.3: - resolution: {integrity: sha512-GlM2AbzrErd/TmLL3E8hAHmb5Q7VhDJp35vIbyPVA5Rz55LZuRr8pwL3qrwwkVNo05gMX1J44gURKb4MHQZo7w==} + /@lifeomic/attempt@3.1.0: + resolution: {integrity: sha512-QZqem4QuAnAyzfz+Gj5/+SLxqwCAw2qmt7732ZXodr6VDWGeYLG6w1i/vYLa55JQM9wRuBKLmXmiZ2P0LtE5rw==} dev: false /@mapbox/node-pre-gyp@1.0.11: resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} hasBin: true dependencies: - detect-libc: 2.0.2 + detect-libc: 2.0.3 https-proxy-agent: 5.0.1 make-dir: 3.1.0 node-fetch: 2.7.0 @@ -2038,7 +2228,7 @@ packages: npmlog: 5.0.1 rimraf: 3.0.2 semver: 7.6.0 - tar: 6.2.0 + tar: 6.2.1 transitivePeerDependencies: - encoding - supports-color @@ -2057,7 +2247,7 @@ packages: dev: true /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + resolution: {integrity: sha1-dhnC6yGyVIP20WdUi0z9WnSIw9U=, tarball: https://registry.npmmirror.com/@nodelib/fs.scandir/download/@nodelib/fs.scandir-2.1.5.tgz} engines: {node: '>= 8'} dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2151,7 +2341,7 @@ packages: engines: {node: '>=10'} hasBin: true dependencies: - '@babel/runtime-corejs2': 7.23.9 + '@babel/runtime-corejs2': 7.24.1 '@postlight/ci-failed-test-reporter': 1.0.26 cheerio: 0.22.0 difflib: github.com/postlight/difflib.js/32e8e38c7fcd935241b9baab71bb432fd9b166ed @@ -2161,7 +2351,7 @@ packages: moment-parseformat: 3.0.0 postman-request: 2.88.1-postman.33 string-direction: 0.1.2 - turndown: 7.1.2 + turndown: 7.1.3 valid-url: 1.0.9 wuzzy: 0.1.8 yargs-parser: 15.0.3 @@ -2223,104 +2413,109 @@ packages: picomatch: 2.3.1 dev: true - /@rollup/rollup-android-arm-eabi@4.12.0: - resolution: {integrity: sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==} + /@rollup/rollup-android-arm-eabi@4.13.0: + resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==} cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-android-arm64@4.12.0: - resolution: {integrity: sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==} + /@rollup/rollup-android-arm64@4.13.0: + resolution: {integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==} cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-arm64@4.12.0: - resolution: {integrity: sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==} + /@rollup/rollup-darwin-arm64@4.13.0: + resolution: {integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-x64@4.12.0: - resolution: {integrity: sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==} + /@rollup/rollup-darwin-x64@4.13.0: + resolution: {integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.12.0: - resolution: {integrity: sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==} + /@rollup/rollup-linux-arm-gnueabihf@4.13.0: + resolution: {integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.12.0: - resolution: {integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==} + /@rollup/rollup-linux-arm64-gnu@4.13.0: + resolution: {integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==} cpu: [arm64] os: [linux] + libc: [glibc] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.12.0: - resolution: {integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==} + /@rollup/rollup-linux-arm64-musl@4.13.0: + resolution: {integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==} cpu: [arm64] os: [linux] + libc: [musl] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.12.0: - resolution: {integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==} + /@rollup/rollup-linux-riscv64-gnu@4.13.0: + resolution: {integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==} cpu: [riscv64] os: [linux] + libc: [glibc] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.12.0: - resolution: {integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==} + /@rollup/rollup-linux-x64-gnu@4.13.0: + resolution: {integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==} cpu: [x64] os: [linux] + libc: [glibc] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.12.0: - resolution: {integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==} + /@rollup/rollup-linux-x64-musl@4.13.0: + resolution: {integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==} cpu: [x64] os: [linux] + libc: [musl] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.12.0: - resolution: {integrity: sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==} + /@rollup/rollup-win32-arm64-msvc@4.13.0: + resolution: {integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.12.0: - resolution: {integrity: sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==} + /@rollup/rollup-win32-ia32-msvc@4.13.0: + resolution: {integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==} cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.12.0: - resolution: {integrity: sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==} + /@rollup/rollup-win32-x64-msvc@4.13.0: + resolution: {integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==} cpu: [x64] os: [win32] requiresBuild: true @@ -2665,8 +2860,8 @@ packages: resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} dev: true - /@types/superagent@8.1.3: - resolution: {integrity: sha512-R/CfN6w2XsixLb1Ii8INfn+BT9sGPvw74OavfkW4SwY+jeUcAwLZv2+bXLJkndnimxjEBm0RPHgcjW9pLCa8cw==} + /@types/superagent@8.1.6: + resolution: {integrity: sha512-yzBOv+6meEHSzV2NThYYOA6RtqvPr3Hbob9ZLp3i07SH27CrYVfm8CrF7ydTmidtelsFiKx2I4gZAiAOamGgvQ==} dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 @@ -2677,7 +2872,7 @@ packages: resolution: {integrity: sha512-137ypx2lk/wTQbW6An6safu9hXmajAifU/s7szAHLN/FeIm5w7yR0Wkl9fdJMRSHwOn4HLAI0DaB2TOORuhPDg==} dependencies: '@types/methods': 1.1.4 - '@types/superagent': 8.1.3 + '@types/superagent': 8.1.6 dev: true /@types/tiny-async-pool@2.0.3: @@ -2726,7 +2921,7 @@ packages: ignore: 5.3.1 natural-compare: 1.4.0 semver: 7.6.0 - ts-api-utils: 1.2.1(typescript@5.4.3) + ts-api-utils: 1.3.0(typescript@5.4.3) typescript: 5.4.3 transitivePeerDependencies: - supports-color @@ -2783,7 +2978,7 @@ packages: '@typescript-eslint/utils': 7.4.0(eslint@8.57.0)(typescript@5.4.3) debug: 4.3.4 eslint: 8.57.0 - ts-api-utils: 1.2.1(typescript@5.4.3) + ts-api-utils: 1.3.0(typescript@5.4.3) typescript: 5.4.3 transitivePeerDependencies: - supports-color @@ -2815,7 +3010,7 @@ packages: is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.6.0 - ts-api-utils: 1.2.1(typescript@5.4.3) + ts-api-utils: 1.3.0(typescript@5.4.3) typescript: 5.4.3 transitivePeerDependencies: - supports-color @@ -2837,7 +3032,7 @@ packages: is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.6.0 - ts-api-utils: 1.2.1(typescript@5.4.3) + ts-api-utils: 1.3.0(typescript@5.4.3) typescript: 5.4.3 transitivePeerDependencies: - supports-color @@ -2909,7 +3104,7 @@ packages: '@mapbox/node-pre-gyp': 1.0.11 '@rollup/pluginutils': 4.2.1 acorn: 8.11.3 - acorn-import-attributes: 1.9.2(acorn@8.11.3) + acorn-import-attributes: 1.9.4(acorn@8.11.3) async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 @@ -2928,13 +3123,13 @@ packages: peerDependencies: vitest: 1.4.0 dependencies: - '@ampproject/remapping': 2.2.1 + '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 debug: 4.3.4 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.4 - istanbul-reports: 3.1.6 + istanbul-reports: 3.1.7 magic-string: 0.30.8 magicast: 0.3.3 picocolors: 1.0.0 @@ -3002,8 +3197,8 @@ packages: event-target-shim: 5.0.1 dev: false - /acorn-import-attributes@1.9.2(acorn@8.11.3): - resolution: {integrity: sha512-O+nfJwNolEA771IYJaiLWK1UAwjNsQmZbTRqqwBYxCgVQTmpFEMvBw6LOIQV0Me339L5UMVYFyRohGnGlQDdIQ==} + /acorn-import-attributes@1.9.4(acorn@8.11.3): + resolution: {integrity: sha512-dNIX/5UEnZvVL94dV2scl4VIooK36D8AteP4xiz7cPKhDbhLhSuWkzG580g+Q7TXJklp+Z21SiaK7/HpLO84Qg==} peerDependencies: acorn: ^8 dependencies: @@ -3071,11 +3266,9 @@ packages: type-fest: 0.21.3 dev: true - /ansi-escapes@6.2.0: - resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} + /ansi-escapes@6.2.1: + resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} engines: {node: '>=14.16'} - dependencies: - type-fest: 3.13.1 dev: true /ansi-regex@2.1.1: @@ -3274,8 +3467,8 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - /bare-events@2.2.0: - resolution: {integrity: sha512-Yyyqff4PIFfSuthCZqLlPISTWHmnQxoPuAvkmgzsJEmG3CesdIv6Xweayl0JkCZJSB2yYIdJyEz97tpxNhgjbg==} + /bare-events@2.2.2: + resolution: {integrity: sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==} requiresBuild: true dev: false optional: true @@ -3284,15 +3477,15 @@ packages: resolution: {integrity: sha512-X9IqgvyB0/VA5OZJyb5ZstoN62AzD7YxVGog13kkfYWYqJYcK0kcqLZ6TrmH5qr4/8//ejVcX4x/a0UvaogXmA==} requiresBuild: true dependencies: - bare-events: 2.2.0 - bare-os: 2.2.0 + bare-events: 2.2.2 + bare-os: 2.2.1 bare-path: 2.1.0 - streamx: 2.15.8 + streamx: 2.16.1 dev: false optional: true - /bare-os@2.2.0: - resolution: {integrity: sha512-hD0rOPfYWOMpVirTACt4/nK8mC55La12K5fY1ij8HAdfQakD62M+H4o4tpfKzVGLgRDTuk3vjA4GqGXXCeFbag==} + /bare-os@2.2.1: + resolution: {integrity: sha512-OwPyHgBBMkhC29Hl3O4/YfxW9n7mdTr2+SsO29XBWKKJsbgj3mnorDB80r5TiCQgQstgE5ga1qNYrpes6NvX2w==} requiresBuild: true dev: false optional: true @@ -3301,15 +3494,15 @@ packages: resolution: {integrity: sha512-DIIg7ts8bdRKwJRJrUMy/PICEaQZaPGZ26lsSx9MJSwIhSrcdHn7/C8W+XmnG/rKi6BaRcz+JO00CjZteybDtw==} requiresBuild: true dependencies: - bare-os: 2.2.0 + bare-os: 2.2.1 dev: false optional: true /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - /basic-ftp@5.0.4: - resolution: {integrity: sha512-8PzkB0arJFV4jJWSGOYR+OEic6aeKMu/osRhBULN6RY0ykby6LKhbmuQ5ublvaas5BOwboah5D87nrHyuh8PPA==} + /basic-ftp@5.0.5: + resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} engines: {node: '>=10.0.0'} dev: false @@ -3388,8 +3581,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001587 - electron-to-chromium: 1.4.669 + caniuse-lite: 1.0.30001600 + electron-to-chromium: 1.4.717 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) dev: true @@ -3399,7 +3592,7 @@ packages: dev: false /buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + resolution: {integrity: sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=, tarball: https://registry.npmmirror.com/buffer-equal-constant-time/download/buffer-equal-constant-time-1.0.1.tgz} dev: false /buffer@5.7.1: @@ -3453,7 +3646,7 @@ packages: http-cache-semantics: 4.1.1 keyv: 4.5.4 mimic-response: 4.0.0 - normalize-url: 8.0.0 + normalize-url: 8.0.1 responselike: 3.0.0 dev: false @@ -3465,7 +3658,7 @@ packages: es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 - set-function-length: 1.2.1 + set-function-length: 1.2.2 /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -3498,8 +3691,8 @@ packages: engines: {node: '>=10'} dev: false - /caniuse-lite@1.0.30001587: - resolution: {integrity: sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA==} + /caniuse-lite@1.0.30001600: + resolution: {integrity: sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==} dev: true /caseless@0.12.0: @@ -3822,7 +4015,7 @@ packages: dev: true /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=, tarball: https://registry.npmmirror.com/concat-map/download/concat-map-0.0.1.tgz} /config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} @@ -3843,12 +4036,6 @@ packages: resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} dev: true - /core-js-compat@3.36.0: - resolution: {integrity: sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==} - dependencies: - browserslist: 4.23.0 - dev: true - /core-js-compat@3.36.1: resolution: {integrity: sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==} dependencies: @@ -3881,6 +4068,14 @@ packages: typescript: 5.4.3 dev: false + /cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + dependencies: + cross-spawn: 7.0.3 + dev: false + /cross-spawn@5.1.0: resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} dependencies: @@ -3896,7 +4091,6 @@ packages: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - dev: true /crypto-js@4.2.0: resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} @@ -3940,11 +4134,12 @@ packages: resolution: {integrity: sha512-LO/lzYRw134LMDVnLyAf1dHE5tyO6axEFkR3TXjQIOmMkAM9YL6QsiUwuXzZAmFnuDJcs4hayOgyIYtViXFrLw==} dev: false - /d@1.0.1: - resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + /d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} dependencies: es5-ext: 0.10.64 - type: 1.2.0 + type: 2.7.2 dev: false /dashdash@1.14.1: @@ -4092,8 +4287,8 @@ packages: engines: {node: '>=6'} dev: true - /detect-libc@2.0.2: - resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + /detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} dev: true @@ -4257,8 +4452,8 @@ packages: semver: 7.6.0 dev: true - /electron-to-chromium@1.4.669: - resolution: {integrity: sha512-E2SmpffFPrZhBSgf8ibqanRS2mpuk3FIRDzLDwt7WFpfgJMKDHJs0hmacyP0PS1cWsq0dVkwIIzlscNaterkPg==} + /electron-to-chromium@1.4.717: + resolution: {integrity: sha512-6Fmg8QkkumNOwuZ/5mIbMU9WI3H2fmn5ajcVya64I5Yr5CcNmO7vcLt0Y7c96DCiMO5/9G+4sI2r6eEvdg1F7A==} dev: true /ellipsize@0.1.0: @@ -4329,7 +4524,7 @@ packages: requiresBuild: true dependencies: es6-iterator: 2.0.3 - es6-symbol: 3.1.3 + es6-symbol: 3.1.4 esniff: 2.0.1 next-tick: 1.1.0 dev: false @@ -4337,15 +4532,16 @@ packages: /es6-iterator@2.0.3: resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} dependencies: - d: 1.0.1 + d: 1.0.2 es5-ext: 0.10.64 - es6-symbol: 3.1.3 + es6-symbol: 3.1.4 dev: false - /es6-symbol@3.1.3: - resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} + /es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} dependencies: - d: 1.0.1 + d: 1.0.2 ext: 1.7.0 dev: false @@ -4378,6 +4574,38 @@ packages: '@esbuild/win32-arm64': 0.19.12 '@esbuild/win32-ia32': 0.19.12 '@esbuild/win32-x64': 0.19.12 + dev: false + + /esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + dev: true /escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} @@ -4416,15 +4644,6 @@ packages: source-map: 0.6.1 dev: false - /eslint-compat-utils@0.1.2(eslint@8.57.0): - resolution: {integrity: sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==} - engines: {node: '>=12'} - peerDependencies: - eslint: '>=6.0.0' - dependencies: - eslint: 8.57.0 - dev: true - /eslint-compat-utils@0.5.0(eslint@8.57.0): resolution: {integrity: sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==} engines: {node: '>=12'} @@ -4482,8 +4701,8 @@ packages: optionator: 0.9.3 dev: true - /eslint-plugin-es-x@7.5.0(eslint@8.57.0): - resolution: {integrity: sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==} + /eslint-plugin-es-x@7.6.0(eslint@8.57.0): + resolution: {integrity: sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '>=8' @@ -4491,7 +4710,7 @@ packages: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/regexpp': 4.10.0 eslint: 8.57.0 - eslint-compat-utils: 0.1.2(eslint@8.57.0) + eslint-compat-utils: 0.5.0(eslint@8.57.0) dev: true /eslint-plugin-n@16.6.2(eslint@8.57.0): @@ -4503,8 +4722,8 @@ packages: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) builtins: 5.0.1 eslint: 8.57.0 - eslint-plugin-es-x: 7.5.0(eslint@8.57.0) - get-tsconfig: 4.7.2 + eslint-plugin-es-x: 7.6.0(eslint@8.57.0) + get-tsconfig: 4.7.3 globals: 13.24.0 ignore: 5.3.1 is-builtin-module: 3.2.1 @@ -4547,7 +4766,7 @@ packages: '@eslint/eslintrc': 2.1.4 ci-info: 4.0.0 clean-regexp: 1.0.0 - core-js-compat: 3.36.0 + core-js-compat: 3.36.1 eslint: 8.57.0 esquery: 1.5.0 indent-string: 4.0.0 @@ -4651,7 +4870,7 @@ packages: resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} engines: {node: '>=0.10'} dependencies: - d: 1.0.1 + d: 1.0.2 es5-ext: 0.10.64 event-emitter: 0.3.5 type: 2.7.2 @@ -4717,7 +4936,7 @@ packages: /event-emitter@0.3.5: resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} dependencies: - d: 1.0.1 + d: 1.0.2 es5-ext: 0.10.64 dev: false @@ -4757,7 +4976,7 @@ packages: human-signals: 5.0.0 is-stream: 3.0.0 merge-stream: 2.0.0 - npm-run-path: 5.2.0 + npm-run-path: 5.3.0 onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 @@ -4842,8 +5061,8 @@ packages: /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - /fast-redact@3.3.0: - resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} + /fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} engines: {node: '>=6'} dev: false @@ -4922,13 +5141,13 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flatted: 3.2.9 + flatted: 3.3.1 keyv: 4.5.4 rimraf: 3.0.2 dev: true - /flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + /flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} dev: true /fn.name@1.1.0: @@ -5005,7 +5224,7 @@ packages: dezalgo: 1.0.4 hexoid: 1.0.0 once: 1.4.0 - qs: 6.11.2 + qs: 6.12.0 dev: true /fs-extra@10.1.0: @@ -5060,8 +5279,8 @@ packages: wide-align: 1.1.5 dev: true - /gaxios@6.2.0: - resolution: {integrity: sha512-H6+bHeoEAU5D6XNc6mPKeN5dLZqEDs9Gpk6I+SZBEzK5So58JVrHPmevNi35fRl1J9Y5TaeLW0kYx3pCJ1U2mQ==} + /gaxios@6.3.0: + resolution: {integrity: sha512-p+ggrQw3fBwH2F5N/PAI4k/G/y1art5OxKpb2J2chwNNHM4hHuAOtivjPuirMF4KNKwTTUal/lPfL2+7h2mEcg==} engines: {node: '>=14'} dependencies: extend: 3.0.2 @@ -5077,7 +5296,7 @@ packages: resolution: {integrity: sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==} engines: {node: '>=14'} dependencies: - gaxios: 6.2.0 + gaxios: 6.3.0 json-bigint: 1.0.0 transitivePeerDependencies: - encoding @@ -5109,9 +5328,9 @@ packages: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 - has-proto: 1.0.1 + has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.1 + hasown: 2.0.2 /get-stream@3.0.0: resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} @@ -5134,8 +5353,8 @@ packages: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - /get-tsconfig@4.7.2: - resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} + /get-tsconfig@4.7.3: + resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} dependencies: resolve-pkg-maps: 1.0.0 @@ -5143,7 +5362,7 @@ packages: resolution: {integrity: sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==} engines: {node: '>= 14'} dependencies: - basic-ftp: 5.0.4 + basic-ftp: 5.0.5 data-uri-to-buffer: 6.0.2 debug: 4.3.4 fs-extra: 11.2.0 @@ -5187,7 +5406,7 @@ packages: foreground-child: 3.1.1 jackspeak: 2.3.6 minimatch: 9.0.3 - minipass: 5.0.0 + minipass: 7.0.4 path-scurry: 1.10.1 dev: true @@ -5229,13 +5448,13 @@ packages: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} dev: true - /google-auth-library@9.6.3: - resolution: {integrity: sha512-4CacM29MLC2eT9Cey5GDVK4Q8t+MMp8+OEdOaqD9MG6b0dOyLORaaeJMPQ7EESVgm/+z5EKYyFLxgzBJlJgyHQ==} + /google-auth-library@9.7.0: + resolution: {integrity: sha512-I/AvzBiUXDzLOy4iIZ2W+Zq33W4lcukQv1nl7C8WUA6SQwyQwUwu3waNmWNAvzds//FG8SZ+DnKnW/2k6mQS8A==} engines: {node: '>=14'} dependencies: base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 - gaxios: 6.2.0 + gaxios: 6.3.0 gcp-metadata: 6.1.0 gtoken: 7.1.0 jws: 4.0.0 @@ -5244,14 +5463,14 @@ packages: - supports-color dev: false - /googleapis-common@7.0.1: - resolution: {integrity: sha512-mgt5zsd7zj5t5QXvDanjWguMdHAcJmmDrF9RkInCecNsyV7S7YtGqm5v2IWONNID88osb7zmx5FtrAP12JfD0w==} + /googleapis-common@7.1.0: + resolution: {integrity: sha512-p3KHiWDBBWJEXk6SYauBEvxw5+UmRy7k2scxGtsNv9eHsTbpopJ3/7If4OrNnzJ9XMLg3IlyQXpVp8YPQsStiw==} engines: {node: '>=14.0.0'} dependencies: extend: 3.0.2 - gaxios: 6.2.0 - google-auth-library: 9.6.3 - qs: 6.11.2 + gaxios: 6.3.0 + google-auth-library: 9.7.0 + qs: 6.12.0 url-template: 2.0.8 uuid: 9.0.1 transitivePeerDependencies: @@ -5263,8 +5482,8 @@ packages: resolution: {integrity: sha512-o8LhD1754W6MHWtpwAPeP1WUHgNxuMxCnLMDFlMKAA5kCMTNqX9/eaTXnkkAIv6YRfoKMQ6D1vyR6/biXuhE9g==} engines: {node: '>=14.0.0'} dependencies: - google-auth-library: 9.6.3 - googleapis-common: 7.0.1 + google-auth-library: 9.7.0 + googleapis-common: 7.1.0 transitivePeerDependencies: - encoding - supports-color @@ -5324,7 +5543,7 @@ packages: resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} engines: {node: '>=14.0.0'} dependencies: - gaxios: 6.2.0 + gaxios: 6.3.0 jws: 4.0.0 transitivePeerDependencies: - encoding @@ -5371,8 +5590,8 @@ packages: dependencies: es-define-property: 1.0.0 - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} engines: {node: '>= 0.4'} /has-symbols@1.0.3: @@ -5383,8 +5602,8 @@ packages: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} dev: true - /hasown@2.0.1: - resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 @@ -5483,8 +5702,8 @@ packages: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} dev: false - /http-proxy-agent@7.0.1: - resolution: {integrity: sha512-My1KCEPs6A0hb4qCVzYp8iEvA8j8YqcvXLZZH8C9OFuTYpYjHE7N2dtG3mRl1HMD4+VGXpF3XcDVcxGBT7yDZQ==} + /http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} dependencies: agent-base: 7.1.0 @@ -5655,7 +5874,7 @@ packages: re2: optional: true dependencies: - '@lifeomic/attempt': 3.0.3 + '@lifeomic/attempt': 3.1.0 '@types/chance': 1.1.6 '@types/request-promise': 4.1.51 bluebird: 3.7.2 @@ -5741,7 +5960,7 @@ packages: /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: - hasown: 2.0.1 + hasown: 2.0.2 /is-extendable@0.1.1: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} @@ -5877,8 +6096,8 @@ packages: - supports-color dev: true - /istanbul-reports@3.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + /istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} dependencies: html-escaper: 2.0.2 @@ -5955,7 +6174,7 @@ packages: decimal.js: 10.4.3 form-data: 4.0.0 html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.1 + http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.4 is-potential-custom-element-name: 1.0.1 nwsapi: 2.2.7 @@ -6299,7 +6518,7 @@ packages: resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} engines: {node: '>=18'} dependencies: - ansi-escapes: 6.2.0 + ansi-escapes: 6.2.1 cli-cursor: 4.0.0 slice-ansi: 7.1.0 strip-ansi: 7.1.0 @@ -6380,9 +6599,9 @@ packages: /magicast@0.3.3: resolution: {integrity: sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==} dependencies: - '@babel/parser': 7.23.9 - '@babel/types': 7.23.9 - source-map-js: 1.0.2 + '@babel/parser': 7.24.1 + '@babel/types': 7.24.0 + source-map-js: 1.2.0 dev: true /mailparser@3.6.9: @@ -6769,6 +6988,11 @@ packages: engines: {node: '>=8'} dev: true + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true + /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} @@ -6801,7 +7025,7 @@ packages: acorn: 8.11.3 pathe: 1.1.2 pkg-types: 1.0.3 - ufo: 1.4.0 + ufo: 1.5.3 dev: true /mockdate@3.0.5: @@ -6931,8 +7155,8 @@ packages: validate-npm-package-license: 3.0.4 dev: true - /normalize-url@8.0.0: - resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==} + /normalize-url@8.0.1: + resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} engines: {node: '>=14.16'} dev: false @@ -6953,8 +7177,8 @@ packages: path-key: 2.0.1 dev: false - /npm-run-path@5.2.0: - resolution: {integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==} + /npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: path-key: 4.0.0 @@ -7033,7 +7257,7 @@ packages: /openapi3-ts@4.2.2: resolution: {integrity: sha512-+9g4actZKeb3czfi9gVQ4Br2Ju3KwhCAQJBNaKgye5KggqcBLIhFHH+nIkcm0BUX00TrAJl6dH4JWgM4G4JWrw==} dependencies: - yaml: 2.3.4 + yaml: 2.4.1 dev: false /optionator@0.8.3: @@ -7151,7 +7375,7 @@ packages: agent-base: 7.1.0 debug: 4.3.4 get-uri: 6.0.3 - http-proxy-agent: 7.0.1 + http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.4 pac-resolver: 7.0.1 socks-proxy-agent: 8.0.2 @@ -7236,7 +7460,6 @@ packages: /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - dev: true /path-key@4.0.0: resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} @@ -7251,7 +7474,7 @@ packages: engines: {node: '>=16 || 14 >=14.17'} dependencies: lru-cache: 10.2.0 - minipass: 5.0.0 + minipass: 7.0.4 dev: true /path-type@4.0.0: @@ -7314,7 +7537,7 @@ packages: hasBin: true dependencies: atomic-sleep: 1.0.0 - fast-redact: 3.3.0 + fast-redact: 3.5.0 on-exit-leak-free: 2.1.2 pino-abstract-transport: 1.1.0 pino-std-serializers: 6.2.2 @@ -7339,13 +7562,13 @@ packages: engines: {node: '>=4'} dev: true - /postcss@8.4.35: - resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} + /postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 picocolors: 1.0.0 - source-map-js: 1.0.2 + source-map-js: 1.2.0 /postman-request@2.88.1-postman.33: resolution: {integrity: sha512-uL9sCML4gPH6Z4hreDWbeinKU0p0Ke261nU7OvII95NU22HN6Dk7T/SaVPaj6T4TsQqGKIFw6/woLZnH7ugFNA==} @@ -7436,7 +7659,7 @@ packages: dependencies: agent-base: 7.1.0 debug: 4.3.4 - http-proxy-agent: 7.0.1 + http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.4 lru-cache: 7.18.3 pac-proxy-agent: 7.0.1 @@ -7617,11 +7840,11 @@ packages: - utf-8-validate dev: false - /qs@6.11.2: - resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + /qs@6.12.0: + resolution: {integrity: sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==} engines: {node: '>=0.6'} dependencies: - side-channel: 1.0.5 + side-channel: 1.0.6 /qs@6.5.3: resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} @@ -7763,7 +7986,7 @@ packages: /regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.1 dev: true /regexp-tree@0.1.27: @@ -7819,7 +8042,7 @@ packages: dev: false /request-promise-core@1.1.4(request@2.88.2): - resolution: {integrity: sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==} + resolution: {integrity: sha1-Pu3UIjII1BmGe3jOgVFn0QWToi8=, tarball: https://registry.npmmirror.com/request-promise-core/download/request-promise-core-1.1.4.tgz} engines: {node: '>=0.10.0'} peerDependencies: request: ^2.34 @@ -7943,26 +8166,26 @@ packages: dependencies: glob: 7.2.3 - /rollup@4.12.0: - resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==} + /rollup@4.13.0: + resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.12.0 - '@rollup/rollup-android-arm64': 4.12.0 - '@rollup/rollup-darwin-arm64': 4.12.0 - '@rollup/rollup-darwin-x64': 4.12.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.12.0 - '@rollup/rollup-linux-arm64-gnu': 4.12.0 - '@rollup/rollup-linux-arm64-musl': 4.12.0 - '@rollup/rollup-linux-riscv64-gnu': 4.12.0 - '@rollup/rollup-linux-x64-gnu': 4.12.0 - '@rollup/rollup-linux-x64-musl': 4.12.0 - '@rollup/rollup-win32-arm64-msvc': 4.12.0 - '@rollup/rollup-win32-ia32-msvc': 4.12.0 - '@rollup/rollup-win32-x64-msvc': 4.12.0 + '@rollup/rollup-android-arm-eabi': 4.13.0 + '@rollup/rollup-android-arm64': 4.13.0 + '@rollup/rollup-darwin-arm64': 4.13.0 + '@rollup/rollup-darwin-x64': 4.13.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.13.0 + '@rollup/rollup-linux-arm64-gnu': 4.13.0 + '@rollup/rollup-linux-arm64-musl': 4.13.0 + '@rollup/rollup-linux-riscv64-gnu': 4.13.0 + '@rollup/rollup-linux-x64-gnu': 4.13.0 + '@rollup/rollup-linux-x64-musl': 4.13.0 + '@rollup/rollup-win32-arm64-msvc': 4.13.0 + '@rollup/rollup-win32-ia32-msvc': 4.13.0 + '@rollup/rollup-win32-x64-msvc': 4.13.0 fsevents: 2.3.3 dev: true @@ -8019,7 +8242,7 @@ packages: htmlparser2: 8.0.2 is-plain-object: 5.0.0 parse-srcset: 1.0.2 - postcss: 8.4.35 + postcss: 8.4.38 dev: false /sax@1.3.0: @@ -8059,8 +8282,8 @@ packages: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true - /set-function-length@1.2.1: - resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.4 @@ -8092,7 +8315,6 @@ packages: engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 - dev: true /shebang-regex@1.0.0: resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} @@ -8102,7 +8324,6 @@ packages: /shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - dev: true /shelljs@0.8.5: resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} @@ -8114,8 +8335,8 @@ packages: rechoir: 0.6.2 dev: false - /side-channel@1.0.5: - resolution: {integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==} + /side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 @@ -8189,20 +8410,11 @@ packages: dependencies: agent-base: 7.1.0 debug: 4.3.4 - socks: 2.7.3 + socks: 2.8.1 transitivePeerDependencies: - supports-color dev: false - /socks@2.7.3: - resolution: {integrity: sha512-vfuYK48HXCTFD03G/1/zkIls3Ebr2YNa4qU9gHDZdblHLiqhJrJGkY3+0Nx0JpN9qBhJbVObc1CNciT1bIZJxw==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - deprecated: please use 2.7.4 or 2.8.1 to fix package-lock issue - dependencies: - ip-address: 9.0.5 - smart-buffer: 4.2.0 - dev: false - /socks@2.8.1: resolution: {integrity: sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} @@ -8217,8 +8429,8 @@ packages: atomic-sleep: 1.0.0 dev: false - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} /source-map@0.5.7: @@ -8243,14 +8455,14 @@ packages: spdx-license-ids: 3.0.17 dev: true - /spdx-exceptions@2.4.0: - resolution: {integrity: sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==} + /spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} dev: true /spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: - spdx-exceptions: 2.4.0 + spdx-exceptions: 2.5.0 spdx-license-ids: 3.0.17 dev: true @@ -8324,13 +8536,13 @@ packages: bluebird: 2.11.0 dev: false - /streamx@2.15.8: - resolution: {integrity: sha512-6pwMeMY/SuISiRsuS8TeIrAzyFbG5gGPHFQsYjUr/pbBadaL1PCWmzKw+CHZSwainfvcF6Si6cVLq4XTEwswFQ==} + /streamx@2.16.1: + resolution: {integrity: sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==} dependencies: fast-fifo: 1.3.2 queue-tick: 1.0.1 optionalDependencies: - bare-events: 2.2.0 + bare-events: 2.2.2 dev: false /strict-uri-encode@2.0.0: @@ -8445,7 +8657,7 @@ packages: formidable: 2.1.2 methods: 1.1.2 mime: 2.6.0 - qs: 6.11.2 + qs: 6.12.0 semver: 7.6.0 transitivePeerDependencies: - supports-color @@ -8516,11 +8728,11 @@ packages: dependencies: b4a: 1.6.6 fast-fifo: 1.3.2 - streamx: 2.15.8 + streamx: 2.16.1 dev: false - /tar@6.2.0: - resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} + /tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} dependencies: chownr: 2.0.0 @@ -8594,8 +8806,8 @@ packages: resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} dev: true - /tinypool@0.8.2: - resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==} + /tinypool@0.8.3: + resolution: {integrity: sha512-Ud7uepAklqRH1bvwy22ynrliC7Dljz7Tm8M/0RBUW+YRa4YHhZ6e4PpgE+fu1zr/WqB1kbeuVrdfeuyIBpy4tw==} engines: {node: '>=14.0.0'} dev: true @@ -8624,6 +8836,11 @@ packages: hasBin: true dev: false + /tlds@1.251.0: + resolution: {integrity: sha512-yztVk5O1LGKCjPd+7soBQyiKvSBXI5qugc/X0C7pLa0rV5ufBS6xcyX0pdf4NznO8xcZ5fqX248q+jTHd4AQJA==} + hasBin: true + dev: false + /tldts-core@6.1.14: resolution: {integrity: sha512-McyMQkkIUFYhfs3FPTxTn+5mewxERhfwy2x7TWHkBPb1poKaTBJhXehtuMg0FrhXp53J5eXRfvSD/oH/3mk/2A==} dev: false @@ -8710,8 +8927,8 @@ packages: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} dev: true - /ts-api-utils@1.2.1(typescript@5.4.3): - resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} + /ts-api-utils@1.3.0(typescript@5.4.3): + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' @@ -8760,7 +8977,7 @@ packages: hasBin: true dependencies: esbuild: 0.19.12 - get-tsconfig: 4.7.2 + get-tsconfig: 4.7.3 optionalDependencies: fsevents: 2.3.3 dev: false @@ -8771,8 +8988,8 @@ packages: safe-buffer: 5.2.1 dev: false - /turndown@7.1.2: - resolution: {integrity: sha512-ntI9R7fcUKjqBP6QU8rBK2Ehyt8LAzt3UBT9JR9tgo6GtuKvyUzpayWmeMKJw1DPdXzktvtIT8m2mVXz+bL/Qg==} + /turndown@7.1.3: + resolution: {integrity: sha512-Z3/iJ6IWh8VBiACWQJaA5ulPQE5E1QwvBHj00uGzdQxdRnd8fh1DPqNOJqzQDu6DkOstORrtXzf/9adB+vMtEA==} dependencies: domino: 2.1.6 dev: false @@ -8829,15 +9046,6 @@ packages: engines: {node: '>=10'} dev: false - /type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} - dev: true - - /type@1.2.0: - resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} - dev: false - /type@2.7.2: resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} dev: false @@ -8857,8 +9065,8 @@ packages: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} dev: false - /ufo@1.4.0: - resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} + /ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} dev: true /uglify-js@3.4.10: @@ -8965,7 +9173,7 @@ packages: optional: true dependencies: ip-regex: 4.3.0 - tlds: 1.250.0 + tlds: 1.251.0 dev: false /url-template@2.0.8: @@ -9016,7 +9224,7 @@ packages: resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} engines: {node: '>=10.12.0'} dependencies: - '@jridgewell/trace-mapping': 0.3.22 + '@jridgewell/trace-mapping': 0.3.25 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 dev: true @@ -9065,7 +9273,7 @@ packages: debug: 4.3.4 pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.1.5(@types/node@20.11.30) + vite: 5.2.6(@types/node@20.11.30) transitivePeerDependencies: - '@types/node' - less @@ -9093,8 +9301,8 @@ packages: - typescript dev: true - /vite@5.1.5(@types/node@20.11.30): - resolution: {integrity: sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==} + /vite@5.2.6(@types/node@20.11.30): + resolution: {integrity: sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -9122,9 +9330,9 @@ packages: optional: true dependencies: '@types/node': 20.11.30 - esbuild: 0.19.12 - postcss: 8.4.35 - rollup: 4.12.0 + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.13.0 optionalDependencies: fsevents: 2.3.3 dev: true @@ -9172,8 +9380,8 @@ packages: std-env: 3.7.0 strip-literal: 2.0.0 tinybench: 2.6.0 - tinypool: 0.8.2 - vite: 5.1.5(@types/node@20.11.30) + tinypool: 0.8.3 + vite: 5.2.6(@types/node@20.11.30) vite-node: 1.4.0(@types/node@20.11.30) why-is-node-running: 2.2.2 transitivePeerDependencies: @@ -9255,7 +9463,6 @@ packages: hasBin: true dependencies: isexe: 2.0.0 - dev: true /why-is-node-running@2.2.2: resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} @@ -9418,12 +9625,18 @@ packages: dependencies: eslint-visitor-keys: 3.4.3 lodash: 4.17.21 - yaml: 2.3.4 + yaml: 2.4.1 dev: true /yaml@2.3.4: resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} engines: {node: '>= 14'} + dev: true + + /yaml@2.4.1: + resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} + engines: {node: '>= 14'} + hasBin: true /yargs-parser@15.0.3: resolution: {integrity: sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==} From 11eb414a392accf97b0b55d15fd1d233ff3b357b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 28 Mar 2024 00:46:53 +0000 Subject: [PATCH 68/99] chore(deps): bump directory-import from 3.2.1 to 3.3.1 (#14992) * chore(deps): bump directory-import from 3.2.1 to 3.3.1 Bumps [directory-import](https://github.com/ANIname/directory-import) from 3.2.1 to 3.3.1. - [Commits](https://github.com/ANIname/directory-import/commits) --- updated-dependencies: - dependency-name: directory-import dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * chore: fix pnpm install --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 794 ++++++++++++++++++------------------------------- 2 files changed, 296 insertions(+), 500 deletions(-) diff --git a/package.json b/package.json index ebb7de0863..a4c17aa983 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "crypto-js": "4.2.0", "currency-symbol-map": "5.1.0", "dayjs": "1.11.8", - "directory-import": "3.2.1", + "directory-import": "3.3.1", "dotenv": "16.4.5", "entities": "4.5.0", "etag": "1.8.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3ddd1734df..0d22bb328c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -57,8 +57,8 @@ dependencies: specifier: 1.11.8 version: 1.11.8 directory-import: - specifier: 3.2.1 - version: 3.2.1 + specifier: 3.3.1 + version: 3.3.1 dotenv: specifier: 16.4.5 version: 16.4.5 @@ -378,6 +378,14 @@ packages: engines: {node: '>=0.10.0'} dev: true + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.22 + dev: true + /@ampproject/remapping@2.3.0: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -543,8 +551,8 @@ packages: '@babel/types': 7.24.0 dev: true - /@babel/helper-module-imports@7.24.3: - resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + /@babel/helper-module-imports@7.24.1: + resolution: {integrity: sha512-HfEWzysMyOa7xI5uQHc/OcZf67/jc+xe/RZlznWQHhbb8Pg1SkRdbK4yEi61aY8wxQA7PkSfoojtLQP/Kpe3og==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.24.0 @@ -558,7 +566,7 @@ packages: dependencies: '@babel/core': 7.24.3 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.24.3 + '@babel/helper-module-imports': 7.24.1 '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 @@ -621,8 +629,8 @@ packages: '@babel/types': 7.24.0 dev: true - /@babel/helper-string-parser@7.24.1: - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + /@babel/helper-string-parser@7.23.4: + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} engines: {node: '>=6.9.0'} dev: true @@ -664,6 +672,14 @@ packages: js-tokens: 4.0.0 picocolors: 1.0.0 + /@babel/parser@7.23.9: + resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.24.0 + dev: true + /@babel/parser@7.24.1: resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} engines: {node: '>=6.0.0'} @@ -933,7 +949,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.3 - '@babel/helper-module-imports': 7.24.3 + '@babel/helper-module-imports': 7.24.1 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.3) dev: true @@ -1567,16 +1583,16 @@ packages: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} dev: true - /@babel/runtime-corejs2@7.24.1: - resolution: {integrity: sha512-De0q0utpUPiXnc7+B7Ku86mJ0eDItC/v3uFa/lQkq63XnHyZiytDHeCIvechlnVwwpU2ChjGF7c3I+mBrTudwg==} + /@babel/runtime-corejs2@7.23.9: + resolution: {integrity: sha512-lwwDy5QfMkO2rmSz9AvLj6j2kWt5a4ulMi1t21vWQEO0kNCFslHoszat8reU/uigIQSUDF31zraZG/qMkcqAlw==} engines: {node: '>=6.9.0'} dependencies: core-js: 2.6.12 regenerator-runtime: 0.14.1 dev: false - /@babel/runtime@7.24.1: - resolution: {integrity: sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==} + /@babel/runtime@7.24.0: + resolution: {integrity: sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.1 @@ -1609,11 +1625,20 @@ packages: - supports-color dev: true + /@babel/types@7.23.9: + resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true + /@babel/types@7.24.0: resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.24.1 + '@babel/helper-string-parser': 7.23.4 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 dev: true @@ -1645,16 +1670,6 @@ packages: cpu: [ppc64] os: [aix] requiresBuild: true - dev: false - optional: true - - /@esbuild/aix-ppc64@0.20.2: - resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - requiresBuild: true - dev: true optional: true /@esbuild/android-arm64@0.19.12: @@ -1663,16 +1678,6 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: false - optional: true - - /@esbuild/android-arm64@0.20.2: - resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true optional: true /@esbuild/android-arm@0.19.12: @@ -1681,16 +1686,6 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: false - optional: true - - /@esbuild/android-arm@0.20.2: - resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true optional: true /@esbuild/android-x64@0.19.12: @@ -1699,16 +1694,6 @@ packages: cpu: [x64] os: [android] requiresBuild: true - dev: false - optional: true - - /@esbuild/android-x64@0.20.2: - resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true optional: true /@esbuild/darwin-arm64@0.19.12: @@ -1717,16 +1702,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: false - optional: true - - /@esbuild/darwin-arm64@0.20.2: - resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true optional: true /@esbuild/darwin-x64@0.19.12: @@ -1735,16 +1710,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: false - optional: true - - /@esbuild/darwin-x64@0.20.2: - resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true optional: true /@esbuild/freebsd-arm64@0.19.12: @@ -1753,16 +1718,6 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true - dev: false - optional: true - - /@esbuild/freebsd-arm64@0.20.2: - resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true optional: true /@esbuild/freebsd-x64@0.19.12: @@ -1771,16 +1726,6 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - dev: false - optional: true - - /@esbuild/freebsd-x64@0.20.2: - resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true optional: true /@esbuild/linux-arm64@0.19.12: @@ -1789,16 +1734,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-arm64@0.20.2: - resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true optional: true /@esbuild/linux-arm@0.19.12: @@ -1807,16 +1742,6 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-arm@0.20.2: - resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true optional: true /@esbuild/linux-ia32@0.19.12: @@ -1825,16 +1750,6 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-ia32@0.20.2: - resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true optional: true /@esbuild/linux-loong64@0.19.12: @@ -1843,16 +1758,6 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-loong64@0.20.2: - resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true optional: true /@esbuild/linux-mips64el@0.19.12: @@ -1861,16 +1766,6 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-mips64el@0.20.2: - resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true optional: true /@esbuild/linux-ppc64@0.19.12: @@ -1879,16 +1774,6 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-ppc64@0.20.2: - resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true optional: true /@esbuild/linux-riscv64@0.19.12: @@ -1897,16 +1782,6 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-riscv64@0.20.2: - resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true optional: true /@esbuild/linux-s390x@0.19.12: @@ -1915,16 +1790,6 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-s390x@0.20.2: - resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true optional: true /@esbuild/linux-x64@0.19.12: @@ -1933,16 +1798,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-x64@0.20.2: - resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true optional: true /@esbuild/netbsd-x64@0.19.12: @@ -1951,16 +1806,6 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true - dev: false - optional: true - - /@esbuild/netbsd-x64@0.20.2: - resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true optional: true /@esbuild/openbsd-x64@0.19.12: @@ -1969,16 +1814,6 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true - dev: false - optional: true - - /@esbuild/openbsd-x64@0.20.2: - resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true optional: true /@esbuild/sunos-x64@0.19.12: @@ -1987,16 +1822,6 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true - dev: false - optional: true - - /@esbuild/sunos-x64@0.20.2: - resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true optional: true /@esbuild/win32-arm64@0.19.12: @@ -2005,16 +1830,6 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: false - optional: true - - /@esbuild/win32-arm64@0.20.2: - resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true optional: true /@esbuild/win32-ia32@0.19.12: @@ -2023,16 +1838,6 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: false - optional: true - - /@esbuild/win32-ia32@0.20.2: - resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true optional: true /@esbuild/win32-x64@0.19.12: @@ -2041,16 +1846,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: false - optional: true - - /@esbuild/win32-x64@0.20.2: - resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true optional: true /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): @@ -2182,6 +1977,15 @@ packages: '@sinclair/typebox': 0.27.8 dev: true + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.22 + dev: true + /@jridgewell/gen-mapping@0.3.5: resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} @@ -2196,6 +2000,11 @@ packages: engines: {node: '>=6.0.0'} dev: true + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + /@jridgewell/set-array@1.2.1: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} @@ -2205,6 +2014,13 @@ packages: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: true + /@jridgewell/trace-mapping@0.3.22: + resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /@jridgewell/trace-mapping@0.3.25: resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} dependencies: @@ -2212,15 +2028,15 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true - /@lifeomic/attempt@3.1.0: - resolution: {integrity: sha512-QZqem4QuAnAyzfz+Gj5/+SLxqwCAw2qmt7732ZXodr6VDWGeYLG6w1i/vYLa55JQM9wRuBKLmXmiZ2P0LtE5rw==} + /@lifeomic/attempt@3.0.3: + resolution: {integrity: sha512-GlM2AbzrErd/TmLL3E8hAHmb5Q7VhDJp35vIbyPVA5Rz55LZuRr8pwL3qrwwkVNo05gMX1J44gURKb4MHQZo7w==} dev: false /@mapbox/node-pre-gyp@1.0.11: resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} hasBin: true dependencies: - detect-libc: 2.0.3 + detect-libc: 2.0.2 https-proxy-agent: 5.0.1 make-dir: 3.1.0 node-fetch: 2.7.0 @@ -2228,7 +2044,7 @@ packages: npmlog: 5.0.1 rimraf: 3.0.2 semver: 7.6.0 - tar: 6.2.1 + tar: 6.2.0 transitivePeerDependencies: - encoding - supports-color @@ -2247,7 +2063,7 @@ packages: dev: true /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha1-dhnC6yGyVIP20WdUi0z9WnSIw9U=, tarball: https://registry.npmmirror.com/@nodelib/fs.scandir/download/@nodelib/fs.scandir-2.1.5.tgz} + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2341,7 +2157,7 @@ packages: engines: {node: '>=10'} hasBin: true dependencies: - '@babel/runtime-corejs2': 7.24.1 + '@babel/runtime-corejs2': 7.23.9 '@postlight/ci-failed-test-reporter': 1.0.26 cheerio: 0.22.0 difflib: github.com/postlight/difflib.js/32e8e38c7fcd935241b9baab71bb432fd9b166ed @@ -2351,7 +2167,7 @@ packages: moment-parseformat: 3.0.0 postman-request: 2.88.1-postman.33 string-direction: 0.1.2 - turndown: 7.1.3 + turndown: 7.1.2 valid-url: 1.0.9 wuzzy: 0.1.8 yargs-parser: 15.0.3 @@ -2413,109 +2229,104 @@ packages: picomatch: 2.3.1 dev: true - /@rollup/rollup-android-arm-eabi@4.13.0: - resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==} + /@rollup/rollup-android-arm-eabi@4.12.0: + resolution: {integrity: sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==} cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-android-arm64@4.13.0: - resolution: {integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==} + /@rollup/rollup-android-arm64@4.12.0: + resolution: {integrity: sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==} cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-arm64@4.13.0: - resolution: {integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==} + /@rollup/rollup-darwin-arm64@4.12.0: + resolution: {integrity: sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-x64@4.13.0: - resolution: {integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==} + /@rollup/rollup-darwin-x64@4.12.0: + resolution: {integrity: sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.13.0: - resolution: {integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==} + /@rollup/rollup-linux-arm-gnueabihf@4.12.0: + resolution: {integrity: sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.13.0: - resolution: {integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==} + /@rollup/rollup-linux-arm64-gnu@4.12.0: + resolution: {integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==} cpu: [arm64] os: [linux] - libc: [glibc] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.13.0: - resolution: {integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==} + /@rollup/rollup-linux-arm64-musl@4.12.0: + resolution: {integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==} cpu: [arm64] os: [linux] - libc: [musl] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.13.0: - resolution: {integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==} + /@rollup/rollup-linux-riscv64-gnu@4.12.0: + resolution: {integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==} cpu: [riscv64] os: [linux] - libc: [glibc] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.13.0: - resolution: {integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==} + /@rollup/rollup-linux-x64-gnu@4.12.0: + resolution: {integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==} cpu: [x64] os: [linux] - libc: [glibc] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.13.0: - resolution: {integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==} + /@rollup/rollup-linux-x64-musl@4.12.0: + resolution: {integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==} cpu: [x64] os: [linux] - libc: [musl] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.13.0: - resolution: {integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==} + /@rollup/rollup-win32-arm64-msvc@4.12.0: + resolution: {integrity: sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.13.0: - resolution: {integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==} + /@rollup/rollup-win32-ia32-msvc@4.12.0: + resolution: {integrity: sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==} cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.13.0: - resolution: {integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==} + /@rollup/rollup-win32-x64-msvc@4.12.0: + resolution: {integrity: sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==} cpu: [x64] os: [win32] requiresBuild: true @@ -2860,8 +2671,8 @@ packages: resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} dev: true - /@types/superagent@8.1.6: - resolution: {integrity: sha512-yzBOv+6meEHSzV2NThYYOA6RtqvPr3Hbob9ZLp3i07SH27CrYVfm8CrF7ydTmidtelsFiKx2I4gZAiAOamGgvQ==} + /@types/superagent@8.1.3: + resolution: {integrity: sha512-R/CfN6w2XsixLb1Ii8INfn+BT9sGPvw74OavfkW4SwY+jeUcAwLZv2+bXLJkndnimxjEBm0RPHgcjW9pLCa8cw==} dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 @@ -2872,7 +2683,7 @@ packages: resolution: {integrity: sha512-137ypx2lk/wTQbW6An6safu9hXmajAifU/s7szAHLN/FeIm5w7yR0Wkl9fdJMRSHwOn4HLAI0DaB2TOORuhPDg==} dependencies: '@types/methods': 1.1.4 - '@types/superagent': 8.1.6 + '@types/superagent': 8.1.3 dev: true /@types/tiny-async-pool@2.0.3: @@ -2921,7 +2732,7 @@ packages: ignore: 5.3.1 natural-compare: 1.4.0 semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.3) + ts-api-utils: 1.2.1(typescript@5.4.3) typescript: 5.4.3 transitivePeerDependencies: - supports-color @@ -2978,7 +2789,7 @@ packages: '@typescript-eslint/utils': 7.4.0(eslint@8.57.0)(typescript@5.4.3) debug: 4.3.4 eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.4.3) + ts-api-utils: 1.2.1(typescript@5.4.3) typescript: 5.4.3 transitivePeerDependencies: - supports-color @@ -3010,7 +2821,7 @@ packages: is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.3) + ts-api-utils: 1.2.1(typescript@5.4.3) typescript: 5.4.3 transitivePeerDependencies: - supports-color @@ -3032,7 +2843,7 @@ packages: is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.3) + ts-api-utils: 1.2.1(typescript@5.4.3) typescript: 5.4.3 transitivePeerDependencies: - supports-color @@ -3104,7 +2915,7 @@ packages: '@mapbox/node-pre-gyp': 1.0.11 '@rollup/pluginutils': 4.2.1 acorn: 8.11.3 - acorn-import-attributes: 1.9.4(acorn@8.11.3) + acorn-import-attributes: 1.9.2(acorn@8.11.3) async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 @@ -3123,13 +2934,13 @@ packages: peerDependencies: vitest: 1.4.0 dependencies: - '@ampproject/remapping': 2.3.0 + '@ampproject/remapping': 2.2.1 '@bcoe/v8-coverage': 0.2.3 debug: 4.3.4 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.4 - istanbul-reports: 3.1.7 + istanbul-reports: 3.1.6 magic-string: 0.30.8 magicast: 0.3.3 picocolors: 1.0.0 @@ -3197,8 +3008,8 @@ packages: event-target-shim: 5.0.1 dev: false - /acorn-import-attributes@1.9.4(acorn@8.11.3): - resolution: {integrity: sha512-dNIX/5UEnZvVL94dV2scl4VIooK36D8AteP4xiz7cPKhDbhLhSuWkzG580g+Q7TXJklp+Z21SiaK7/HpLO84Qg==} + /acorn-import-attributes@1.9.2(acorn@8.11.3): + resolution: {integrity: sha512-O+nfJwNolEA771IYJaiLWK1UAwjNsQmZbTRqqwBYxCgVQTmpFEMvBw6LOIQV0Me339L5UMVYFyRohGnGlQDdIQ==} peerDependencies: acorn: ^8 dependencies: @@ -3266,9 +3077,11 @@ packages: type-fest: 0.21.3 dev: true - /ansi-escapes@6.2.1: - resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} + /ansi-escapes@6.2.0: + resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} engines: {node: '>=14.16'} + dependencies: + type-fest: 3.13.1 dev: true /ansi-regex@2.1.1: @@ -3467,8 +3280,8 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - /bare-events@2.2.2: - resolution: {integrity: sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==} + /bare-events@2.2.0: + resolution: {integrity: sha512-Yyyqff4PIFfSuthCZqLlPISTWHmnQxoPuAvkmgzsJEmG3CesdIv6Xweayl0JkCZJSB2yYIdJyEz97tpxNhgjbg==} requiresBuild: true dev: false optional: true @@ -3477,15 +3290,15 @@ packages: resolution: {integrity: sha512-X9IqgvyB0/VA5OZJyb5ZstoN62AzD7YxVGog13kkfYWYqJYcK0kcqLZ6TrmH5qr4/8//ejVcX4x/a0UvaogXmA==} requiresBuild: true dependencies: - bare-events: 2.2.2 - bare-os: 2.2.1 + bare-events: 2.2.0 + bare-os: 2.2.0 bare-path: 2.1.0 - streamx: 2.16.1 + streamx: 2.15.8 dev: false optional: true - /bare-os@2.2.1: - resolution: {integrity: sha512-OwPyHgBBMkhC29Hl3O4/YfxW9n7mdTr2+SsO29XBWKKJsbgj3mnorDB80r5TiCQgQstgE5ga1qNYrpes6NvX2w==} + /bare-os@2.2.0: + resolution: {integrity: sha512-hD0rOPfYWOMpVirTACt4/nK8mC55La12K5fY1ij8HAdfQakD62M+H4o4tpfKzVGLgRDTuk3vjA4GqGXXCeFbag==} requiresBuild: true dev: false optional: true @@ -3494,15 +3307,15 @@ packages: resolution: {integrity: sha512-DIIg7ts8bdRKwJRJrUMy/PICEaQZaPGZ26lsSx9MJSwIhSrcdHn7/C8W+XmnG/rKi6BaRcz+JO00CjZteybDtw==} requiresBuild: true dependencies: - bare-os: 2.2.1 + bare-os: 2.2.0 dev: false optional: true /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - /basic-ftp@5.0.5: - resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} + /basic-ftp@5.0.4: + resolution: {integrity: sha512-8PzkB0arJFV4jJWSGOYR+OEic6aeKMu/osRhBULN6RY0ykby6LKhbmuQ5ublvaas5BOwboah5D87nrHyuh8PPA==} engines: {node: '>=10.0.0'} dev: false @@ -3581,8 +3394,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001600 - electron-to-chromium: 1.4.717 + caniuse-lite: 1.0.30001587 + electron-to-chromium: 1.4.669 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) dev: true @@ -3592,7 +3405,7 @@ packages: dev: false /buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=, tarball: https://registry.npmmirror.com/buffer-equal-constant-time/download/buffer-equal-constant-time-1.0.1.tgz} + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} dev: false /buffer@5.7.1: @@ -3646,7 +3459,7 @@ packages: http-cache-semantics: 4.1.1 keyv: 4.5.4 mimic-response: 4.0.0 - normalize-url: 8.0.1 + normalize-url: 8.0.0 responselike: 3.0.0 dev: false @@ -3658,7 +3471,7 @@ packages: es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 - set-function-length: 1.2.2 + set-function-length: 1.2.1 /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -3691,8 +3504,8 @@ packages: engines: {node: '>=10'} dev: false - /caniuse-lite@1.0.30001600: - resolution: {integrity: sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==} + /caniuse-lite@1.0.30001587: + resolution: {integrity: sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA==} dev: true /caseless@0.12.0: @@ -4015,7 +3828,7 @@ packages: dev: true /concat-map@0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=, tarball: https://registry.npmmirror.com/concat-map/download/concat-map-0.0.1.tgz} + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} /config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} @@ -4036,6 +3849,12 @@ packages: resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} dev: true + /core-js-compat@3.36.0: + resolution: {integrity: sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==} + dependencies: + browserslist: 4.23.0 + dev: true + /core-js-compat@3.36.1: resolution: {integrity: sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==} dependencies: @@ -4134,12 +3953,11 @@ packages: resolution: {integrity: sha512-LO/lzYRw134LMDVnLyAf1dHE5tyO6axEFkR3TXjQIOmMkAM9YL6QsiUwuXzZAmFnuDJcs4hayOgyIYtViXFrLw==} dev: false - /d@1.0.2: - resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} - engines: {node: '>=0.12'} + /d@1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} dependencies: es5-ext: 0.10.64 - type: 2.7.2 + type: 1.2.0 dev: false /dashdash@1.14.1: @@ -4287,8 +4105,8 @@ packages: engines: {node: '>=6'} dev: true - /detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} engines: {node: '>=8'} dev: true @@ -4321,8 +4139,8 @@ packages: path-type: 4.0.0 dev: true - /directory-import@3.2.1: - resolution: {integrity: sha512-hIMc9WJHs4HRZbBiNAvKGxkhjaJ2wOaFcFA0K+yj16GyBJDg28e6QgQ3hFuFB0ZRETNYZu3u85rmxIxoxWEwbA==} + /directory-import@3.3.1: + resolution: {integrity: sha512-d9paCbverdqmuwR+B40phSqiHhgPKiP8dpsMz5WT9U6ug2VVQ3tqXNCedpa6iGHg6mgv9lHaoq5DJUu2IXMjsQ==} engines: {node: '>=18.17.0'} dev: false @@ -4452,8 +4270,8 @@ packages: semver: 7.6.0 dev: true - /electron-to-chromium@1.4.717: - resolution: {integrity: sha512-6Fmg8QkkumNOwuZ/5mIbMU9WI3H2fmn5ajcVya64I5Yr5CcNmO7vcLt0Y7c96DCiMO5/9G+4sI2r6eEvdg1F7A==} + /electron-to-chromium@1.4.669: + resolution: {integrity: sha512-E2SmpffFPrZhBSgf8ibqanRS2mpuk3FIRDzLDwt7WFpfgJMKDHJs0hmacyP0PS1cWsq0dVkwIIzlscNaterkPg==} dev: true /ellipsize@0.1.0: @@ -4524,7 +4342,7 @@ packages: requiresBuild: true dependencies: es6-iterator: 2.0.3 - es6-symbol: 3.1.4 + es6-symbol: 3.1.3 esniff: 2.0.1 next-tick: 1.1.0 dev: false @@ -4532,16 +4350,15 @@ packages: /es6-iterator@2.0.3: resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} dependencies: - d: 1.0.2 + d: 1.0.1 es5-ext: 0.10.64 - es6-symbol: 3.1.4 + es6-symbol: 3.1.3 dev: false - /es6-symbol@3.1.4: - resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} - engines: {node: '>=0.12'} + /es6-symbol@3.1.3: + resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} dependencies: - d: 1.0.2 + d: 1.0.1 ext: 1.7.0 dev: false @@ -4574,38 +4391,6 @@ packages: '@esbuild/win32-arm64': 0.19.12 '@esbuild/win32-ia32': 0.19.12 '@esbuild/win32-x64': 0.19.12 - dev: false - - /esbuild@0.20.2: - resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/aix-ppc64': 0.20.2 - '@esbuild/android-arm': 0.20.2 - '@esbuild/android-arm64': 0.20.2 - '@esbuild/android-x64': 0.20.2 - '@esbuild/darwin-arm64': 0.20.2 - '@esbuild/darwin-x64': 0.20.2 - '@esbuild/freebsd-arm64': 0.20.2 - '@esbuild/freebsd-x64': 0.20.2 - '@esbuild/linux-arm': 0.20.2 - '@esbuild/linux-arm64': 0.20.2 - '@esbuild/linux-ia32': 0.20.2 - '@esbuild/linux-loong64': 0.20.2 - '@esbuild/linux-mips64el': 0.20.2 - '@esbuild/linux-ppc64': 0.20.2 - '@esbuild/linux-riscv64': 0.20.2 - '@esbuild/linux-s390x': 0.20.2 - '@esbuild/linux-x64': 0.20.2 - '@esbuild/netbsd-x64': 0.20.2 - '@esbuild/openbsd-x64': 0.20.2 - '@esbuild/sunos-x64': 0.20.2 - '@esbuild/win32-arm64': 0.20.2 - '@esbuild/win32-ia32': 0.20.2 - '@esbuild/win32-x64': 0.20.2 - dev: true /escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} @@ -4644,6 +4429,15 @@ packages: source-map: 0.6.1 dev: false + /eslint-compat-utils@0.1.2(eslint@8.57.0): + resolution: {integrity: sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + eslint: 8.57.0 + dev: true + /eslint-compat-utils@0.5.0(eslint@8.57.0): resolution: {integrity: sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==} engines: {node: '>=12'} @@ -4701,8 +4495,8 @@ packages: optionator: 0.9.3 dev: true - /eslint-plugin-es-x@7.6.0(eslint@8.57.0): - resolution: {integrity: sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==} + /eslint-plugin-es-x@7.5.0(eslint@8.57.0): + resolution: {integrity: sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '>=8' @@ -4710,7 +4504,7 @@ packages: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/regexpp': 4.10.0 eslint: 8.57.0 - eslint-compat-utils: 0.5.0(eslint@8.57.0) + eslint-compat-utils: 0.1.2(eslint@8.57.0) dev: true /eslint-plugin-n@16.6.2(eslint@8.57.0): @@ -4722,8 +4516,8 @@ packages: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) builtins: 5.0.1 eslint: 8.57.0 - eslint-plugin-es-x: 7.6.0(eslint@8.57.0) - get-tsconfig: 4.7.3 + eslint-plugin-es-x: 7.5.0(eslint@8.57.0) + get-tsconfig: 4.7.2 globals: 13.24.0 ignore: 5.3.1 is-builtin-module: 3.2.1 @@ -4766,7 +4560,7 @@ packages: '@eslint/eslintrc': 2.1.4 ci-info: 4.0.0 clean-regexp: 1.0.0 - core-js-compat: 3.36.1 + core-js-compat: 3.36.0 eslint: 8.57.0 esquery: 1.5.0 indent-string: 4.0.0 @@ -4870,7 +4664,7 @@ packages: resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} engines: {node: '>=0.10'} dependencies: - d: 1.0.2 + d: 1.0.1 es5-ext: 0.10.64 event-emitter: 0.3.5 type: 2.7.2 @@ -4936,7 +4730,7 @@ packages: /event-emitter@0.3.5: resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} dependencies: - d: 1.0.2 + d: 1.0.1 es5-ext: 0.10.64 dev: false @@ -4976,7 +4770,7 @@ packages: human-signals: 5.0.0 is-stream: 3.0.0 merge-stream: 2.0.0 - npm-run-path: 5.3.0 + npm-run-path: 5.2.0 onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 @@ -5061,8 +4855,8 @@ packages: /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - /fast-redact@3.5.0: - resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + /fast-redact@3.3.0: + resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} engines: {node: '>=6'} dev: false @@ -5141,13 +4935,13 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flatted: 3.3.1 + flatted: 3.2.9 keyv: 4.5.4 rimraf: 3.0.2 dev: true - /flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} dev: true /fn.name@1.1.0: @@ -5224,7 +5018,7 @@ packages: dezalgo: 1.0.4 hexoid: 1.0.0 once: 1.4.0 - qs: 6.12.0 + qs: 6.11.2 dev: true /fs-extra@10.1.0: @@ -5279,8 +5073,8 @@ packages: wide-align: 1.1.5 dev: true - /gaxios@6.3.0: - resolution: {integrity: sha512-p+ggrQw3fBwH2F5N/PAI4k/G/y1art5OxKpb2J2chwNNHM4hHuAOtivjPuirMF4KNKwTTUal/lPfL2+7h2mEcg==} + /gaxios@6.2.0: + resolution: {integrity: sha512-H6+bHeoEAU5D6XNc6mPKeN5dLZqEDs9Gpk6I+SZBEzK5So58JVrHPmevNi35fRl1J9Y5TaeLW0kYx3pCJ1U2mQ==} engines: {node: '>=14'} dependencies: extend: 3.0.2 @@ -5296,7 +5090,7 @@ packages: resolution: {integrity: sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==} engines: {node: '>=14'} dependencies: - gaxios: 6.3.0 + gaxios: 6.2.0 json-bigint: 1.0.0 transitivePeerDependencies: - encoding @@ -5328,9 +5122,9 @@ packages: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 - has-proto: 1.0.3 + has-proto: 1.0.1 has-symbols: 1.0.3 - hasown: 2.0.2 + hasown: 2.0.1 /get-stream@3.0.0: resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} @@ -5353,8 +5147,8 @@ packages: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - /get-tsconfig@4.7.3: - resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + /get-tsconfig@4.7.2: + resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} dependencies: resolve-pkg-maps: 1.0.0 @@ -5362,7 +5156,7 @@ packages: resolution: {integrity: sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==} engines: {node: '>= 14'} dependencies: - basic-ftp: 5.0.5 + basic-ftp: 5.0.4 data-uri-to-buffer: 6.0.2 debug: 4.3.4 fs-extra: 11.2.0 @@ -5406,7 +5200,7 @@ packages: foreground-child: 3.1.1 jackspeak: 2.3.6 minimatch: 9.0.3 - minipass: 7.0.4 + minipass: 5.0.0 path-scurry: 1.10.1 dev: true @@ -5448,13 +5242,13 @@ packages: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} dev: true - /google-auth-library@9.7.0: - resolution: {integrity: sha512-I/AvzBiUXDzLOy4iIZ2W+Zq33W4lcukQv1nl7C8WUA6SQwyQwUwu3waNmWNAvzds//FG8SZ+DnKnW/2k6mQS8A==} + /google-auth-library@9.6.3: + resolution: {integrity: sha512-4CacM29MLC2eT9Cey5GDVK4Q8t+MMp8+OEdOaqD9MG6b0dOyLORaaeJMPQ7EESVgm/+z5EKYyFLxgzBJlJgyHQ==} engines: {node: '>=14'} dependencies: base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 - gaxios: 6.3.0 + gaxios: 6.2.0 gcp-metadata: 6.1.0 gtoken: 7.1.0 jws: 4.0.0 @@ -5463,14 +5257,14 @@ packages: - supports-color dev: false - /googleapis-common@7.1.0: - resolution: {integrity: sha512-p3KHiWDBBWJEXk6SYauBEvxw5+UmRy7k2scxGtsNv9eHsTbpopJ3/7If4OrNnzJ9XMLg3IlyQXpVp8YPQsStiw==} + /googleapis-common@7.0.1: + resolution: {integrity: sha512-mgt5zsd7zj5t5QXvDanjWguMdHAcJmmDrF9RkInCecNsyV7S7YtGqm5v2IWONNID88osb7zmx5FtrAP12JfD0w==} engines: {node: '>=14.0.0'} dependencies: extend: 3.0.2 - gaxios: 6.3.0 - google-auth-library: 9.7.0 - qs: 6.12.0 + gaxios: 6.2.0 + google-auth-library: 9.6.3 + qs: 6.11.2 url-template: 2.0.8 uuid: 9.0.1 transitivePeerDependencies: @@ -5482,8 +5276,8 @@ packages: resolution: {integrity: sha512-o8LhD1754W6MHWtpwAPeP1WUHgNxuMxCnLMDFlMKAA5kCMTNqX9/eaTXnkkAIv6YRfoKMQ6D1vyR6/biXuhE9g==} engines: {node: '>=14.0.0'} dependencies: - google-auth-library: 9.7.0 - googleapis-common: 7.1.0 + google-auth-library: 9.6.3 + googleapis-common: 7.0.1 transitivePeerDependencies: - encoding - supports-color @@ -5543,7 +5337,7 @@ packages: resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} engines: {node: '>=14.0.0'} dependencies: - gaxios: 6.3.0 + gaxios: 6.2.0 jws: 4.0.0 transitivePeerDependencies: - encoding @@ -5590,8 +5384,8 @@ packages: dependencies: es-define-property: 1.0.0 - /has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} engines: {node: '>= 0.4'} /has-symbols@1.0.3: @@ -5602,8 +5396,8 @@ packages: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} dev: true - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + /hasown@2.0.1: + resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 @@ -5702,8 +5496,8 @@ packages: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} dev: false - /http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + /http-proxy-agent@7.0.1: + resolution: {integrity: sha512-My1KCEPs6A0hb4qCVzYp8iEvA8j8YqcvXLZZH8C9OFuTYpYjHE7N2dtG3mRl1HMD4+VGXpF3XcDVcxGBT7yDZQ==} engines: {node: '>= 14'} dependencies: agent-base: 7.1.0 @@ -5874,7 +5668,7 @@ packages: re2: optional: true dependencies: - '@lifeomic/attempt': 3.1.0 + '@lifeomic/attempt': 3.0.3 '@types/chance': 1.1.6 '@types/request-promise': 4.1.51 bluebird: 3.7.2 @@ -5960,7 +5754,7 @@ packages: /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: - hasown: 2.0.2 + hasown: 2.0.1 /is-extendable@0.1.1: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} @@ -6096,8 +5890,8 @@ packages: - supports-color dev: true - /istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + /istanbul-reports@3.1.6: + resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} engines: {node: '>=8'} dependencies: html-escaper: 2.0.2 @@ -6174,7 +5968,7 @@ packages: decimal.js: 10.4.3 form-data: 4.0.0 html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.2 + http-proxy-agent: 7.0.1 https-proxy-agent: 7.0.4 is-potential-custom-element-name: 1.0.1 nwsapi: 2.2.7 @@ -6518,7 +6312,7 @@ packages: resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} engines: {node: '>=18'} dependencies: - ansi-escapes: 6.2.1 + ansi-escapes: 6.2.0 cli-cursor: 4.0.0 slice-ansi: 7.1.0 strip-ansi: 7.1.0 @@ -6599,9 +6393,9 @@ packages: /magicast@0.3.3: resolution: {integrity: sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==} dependencies: - '@babel/parser': 7.24.1 - '@babel/types': 7.24.0 - source-map-js: 1.2.0 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + source-map-js: 1.0.2 dev: true /mailparser@3.6.9: @@ -6988,11 +6782,6 @@ packages: engines: {node: '>=8'} dev: true - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - dev: true - /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} @@ -7025,7 +6814,7 @@ packages: acorn: 8.11.3 pathe: 1.1.2 pkg-types: 1.0.3 - ufo: 1.5.3 + ufo: 1.4.0 dev: true /mockdate@3.0.5: @@ -7155,8 +6944,8 @@ packages: validate-npm-package-license: 3.0.4 dev: true - /normalize-url@8.0.1: - resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} + /normalize-url@8.0.0: + resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==} engines: {node: '>=14.16'} dev: false @@ -7177,8 +6966,8 @@ packages: path-key: 2.0.1 dev: false - /npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + /npm-run-path@5.2.0: + resolution: {integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: path-key: 4.0.0 @@ -7257,7 +7046,7 @@ packages: /openapi3-ts@4.2.2: resolution: {integrity: sha512-+9g4actZKeb3czfi9gVQ4Br2Ju3KwhCAQJBNaKgye5KggqcBLIhFHH+nIkcm0BUX00TrAJl6dH4JWgM4G4JWrw==} dependencies: - yaml: 2.4.1 + yaml: 2.3.4 dev: false /optionator@0.8.3: @@ -7375,7 +7164,7 @@ packages: agent-base: 7.1.0 debug: 4.3.4 get-uri: 6.0.3 - http-proxy-agent: 7.0.2 + http-proxy-agent: 7.0.1 https-proxy-agent: 7.0.4 pac-resolver: 7.0.1 socks-proxy-agent: 8.0.2 @@ -7474,7 +7263,7 @@ packages: engines: {node: '>=16 || 14 >=14.17'} dependencies: lru-cache: 10.2.0 - minipass: 7.0.4 + minipass: 5.0.0 dev: true /path-type@4.0.0: @@ -7537,7 +7326,7 @@ packages: hasBin: true dependencies: atomic-sleep: 1.0.0 - fast-redact: 3.5.0 + fast-redact: 3.3.0 on-exit-leak-free: 2.1.2 pino-abstract-transport: 1.1.0 pino-std-serializers: 6.2.2 @@ -7562,13 +7351,13 @@ packages: engines: {node: '>=4'} dev: true - /postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + /postcss@8.4.35: + resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 picocolors: 1.0.0 - source-map-js: 1.2.0 + source-map-js: 1.0.2 /postman-request@2.88.1-postman.33: resolution: {integrity: sha512-uL9sCML4gPH6Z4hreDWbeinKU0p0Ke261nU7OvII95NU22HN6Dk7T/SaVPaj6T4TsQqGKIFw6/woLZnH7ugFNA==} @@ -7659,7 +7448,7 @@ packages: dependencies: agent-base: 7.1.0 debug: 4.3.4 - http-proxy-agent: 7.0.2 + http-proxy-agent: 7.0.1 https-proxy-agent: 7.0.4 lru-cache: 7.18.3 pac-proxy-agent: 7.0.1 @@ -7840,11 +7629,11 @@ packages: - utf-8-validate dev: false - /qs@6.12.0: - resolution: {integrity: sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==} + /qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} engines: {node: '>=0.6'} dependencies: - side-channel: 1.0.6 + side-channel: 1.0.5 /qs@6.5.3: resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} @@ -7986,7 +7775,7 @@ packages: /regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.0 dev: true /regexp-tree@0.1.27: @@ -8042,7 +7831,7 @@ packages: dev: false /request-promise-core@1.1.4(request@2.88.2): - resolution: {integrity: sha1-Pu3UIjII1BmGe3jOgVFn0QWToi8=, tarball: https://registry.npmmirror.com/request-promise-core/download/request-promise-core-1.1.4.tgz} + resolution: {integrity: sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==} engines: {node: '>=0.10.0'} peerDependencies: request: ^2.34 @@ -8166,26 +7955,26 @@ packages: dependencies: glob: 7.2.3 - /rollup@4.13.0: - resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==} + /rollup@4.12.0: + resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.13.0 - '@rollup/rollup-android-arm64': 4.13.0 - '@rollup/rollup-darwin-arm64': 4.13.0 - '@rollup/rollup-darwin-x64': 4.13.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.13.0 - '@rollup/rollup-linux-arm64-gnu': 4.13.0 - '@rollup/rollup-linux-arm64-musl': 4.13.0 - '@rollup/rollup-linux-riscv64-gnu': 4.13.0 - '@rollup/rollup-linux-x64-gnu': 4.13.0 - '@rollup/rollup-linux-x64-musl': 4.13.0 - '@rollup/rollup-win32-arm64-msvc': 4.13.0 - '@rollup/rollup-win32-ia32-msvc': 4.13.0 - '@rollup/rollup-win32-x64-msvc': 4.13.0 + '@rollup/rollup-android-arm-eabi': 4.12.0 + '@rollup/rollup-android-arm64': 4.12.0 + '@rollup/rollup-darwin-arm64': 4.12.0 + '@rollup/rollup-darwin-x64': 4.12.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.12.0 + '@rollup/rollup-linux-arm64-gnu': 4.12.0 + '@rollup/rollup-linux-arm64-musl': 4.12.0 + '@rollup/rollup-linux-riscv64-gnu': 4.12.0 + '@rollup/rollup-linux-x64-gnu': 4.12.0 + '@rollup/rollup-linux-x64-musl': 4.12.0 + '@rollup/rollup-win32-arm64-msvc': 4.12.0 + '@rollup/rollup-win32-ia32-msvc': 4.12.0 + '@rollup/rollup-win32-x64-msvc': 4.12.0 fsevents: 2.3.3 dev: true @@ -8242,7 +8031,7 @@ packages: htmlparser2: 8.0.2 is-plain-object: 5.0.0 parse-srcset: 1.0.2 - postcss: 8.4.38 + postcss: 8.4.35 dev: false /sax@1.3.0: @@ -8282,8 +8071,8 @@ packages: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true - /set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + /set-function-length@1.2.1: + resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.4 @@ -8335,8 +8124,8 @@ packages: rechoir: 0.6.2 dev: false - /side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + /side-channel@1.0.5: + resolution: {integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 @@ -8410,11 +8199,20 @@ packages: dependencies: agent-base: 7.1.0 debug: 4.3.4 - socks: 2.8.1 + socks: 2.7.3 transitivePeerDependencies: - supports-color dev: false + /socks@2.7.3: + resolution: {integrity: sha512-vfuYK48HXCTFD03G/1/zkIls3Ebr2YNa4qU9gHDZdblHLiqhJrJGkY3+0Nx0JpN9qBhJbVObc1CNciT1bIZJxw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + deprecated: please use 2.7.4 or 2.8.1 to fix package-lock issue + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + dev: false + /socks@2.8.1: resolution: {integrity: sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} @@ -8429,8 +8227,8 @@ packages: atomic-sleep: 1.0.0 dev: false - /source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} /source-map@0.5.7: @@ -8455,14 +8253,14 @@ packages: spdx-license-ids: 3.0.17 dev: true - /spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + /spdx-exceptions@2.4.0: + resolution: {integrity: sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==} dev: true /spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: - spdx-exceptions: 2.5.0 + spdx-exceptions: 2.4.0 spdx-license-ids: 3.0.17 dev: true @@ -8536,13 +8334,13 @@ packages: bluebird: 2.11.0 dev: false - /streamx@2.16.1: - resolution: {integrity: sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==} + /streamx@2.15.8: + resolution: {integrity: sha512-6pwMeMY/SuISiRsuS8TeIrAzyFbG5gGPHFQsYjUr/pbBadaL1PCWmzKw+CHZSwainfvcF6Si6cVLq4XTEwswFQ==} dependencies: fast-fifo: 1.3.2 queue-tick: 1.0.1 optionalDependencies: - bare-events: 2.2.2 + bare-events: 2.2.0 dev: false /strict-uri-encode@2.0.0: @@ -8657,7 +8455,7 @@ packages: formidable: 2.1.2 methods: 1.1.2 mime: 2.6.0 - qs: 6.12.0 + qs: 6.11.2 semver: 7.6.0 transitivePeerDependencies: - supports-color @@ -8728,11 +8526,11 @@ packages: dependencies: b4a: 1.6.6 fast-fifo: 1.3.2 - streamx: 2.16.1 + streamx: 2.15.8 dev: false - /tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + /tar@6.2.0: + resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} engines: {node: '>=10'} dependencies: chownr: 2.0.0 @@ -8806,8 +8604,8 @@ packages: resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} dev: true - /tinypool@0.8.3: - resolution: {integrity: sha512-Ud7uepAklqRH1bvwy22ynrliC7Dljz7Tm8M/0RBUW+YRa4YHhZ6e4PpgE+fu1zr/WqB1kbeuVrdfeuyIBpy4tw==} + /tinypool@0.8.2: + resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==} engines: {node: '>=14.0.0'} dev: true @@ -8836,11 +8634,6 @@ packages: hasBin: true dev: false - /tlds@1.251.0: - resolution: {integrity: sha512-yztVk5O1LGKCjPd+7soBQyiKvSBXI5qugc/X0C7pLa0rV5ufBS6xcyX0pdf4NznO8xcZ5fqX248q+jTHd4AQJA==} - hasBin: true - dev: false - /tldts-core@6.1.14: resolution: {integrity: sha512-McyMQkkIUFYhfs3FPTxTn+5mewxERhfwy2x7TWHkBPb1poKaTBJhXehtuMg0FrhXp53J5eXRfvSD/oH/3mk/2A==} dev: false @@ -8927,8 +8720,8 @@ packages: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} dev: true - /ts-api-utils@1.3.0(typescript@5.4.3): - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + /ts-api-utils@1.2.1(typescript@5.4.3): + resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' @@ -8977,7 +8770,7 @@ packages: hasBin: true dependencies: esbuild: 0.19.12 - get-tsconfig: 4.7.3 + get-tsconfig: 4.7.2 optionalDependencies: fsevents: 2.3.3 dev: false @@ -8988,8 +8781,8 @@ packages: safe-buffer: 5.2.1 dev: false - /turndown@7.1.3: - resolution: {integrity: sha512-Z3/iJ6IWh8VBiACWQJaA5ulPQE5E1QwvBHj00uGzdQxdRnd8fh1DPqNOJqzQDu6DkOstORrtXzf/9adB+vMtEA==} + /turndown@7.1.2: + resolution: {integrity: sha512-ntI9R7fcUKjqBP6QU8rBK2Ehyt8LAzt3UBT9JR9tgo6GtuKvyUzpayWmeMKJw1DPdXzktvtIT8m2mVXz+bL/Qg==} dependencies: domino: 2.1.6 dev: false @@ -9046,6 +8839,15 @@ packages: engines: {node: '>=10'} dev: false + /type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + dev: true + + /type@1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + dev: false + /type@2.7.2: resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} dev: false @@ -9065,8 +8867,8 @@ packages: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} dev: false - /ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + /ufo@1.4.0: + resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} dev: true /uglify-js@3.4.10: @@ -9173,7 +8975,7 @@ packages: optional: true dependencies: ip-regex: 4.3.0 - tlds: 1.251.0 + tlds: 1.250.0 dev: false /url-template@2.0.8: @@ -9224,7 +9026,7 @@ packages: resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} engines: {node: '>=10.12.0'} dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.22 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 dev: true @@ -9273,7 +9075,7 @@ packages: debug: 4.3.4 pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.2.6(@types/node@20.11.30) + vite: 5.1.5(@types/node@20.11.30) transitivePeerDependencies: - '@types/node' - less @@ -9301,8 +9103,8 @@ packages: - typescript dev: true - /vite@5.2.6(@types/node@20.11.30): - resolution: {integrity: sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==} + /vite@5.1.5(@types/node@20.11.30): + resolution: {integrity: sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -9330,9 +9132,9 @@ packages: optional: true dependencies: '@types/node': 20.11.30 - esbuild: 0.20.2 - postcss: 8.4.38 - rollup: 4.13.0 + esbuild: 0.19.12 + postcss: 8.4.35 + rollup: 4.12.0 optionalDependencies: fsevents: 2.3.3 dev: true @@ -9380,8 +9182,8 @@ packages: std-env: 3.7.0 strip-literal: 2.0.0 tinybench: 2.6.0 - tinypool: 0.8.3 - vite: 5.2.6(@types/node@20.11.30) + tinypool: 0.8.2 + vite: 5.1.5(@types/node@20.11.30) vite-node: 1.4.0(@types/node@20.11.30) why-is-node-running: 2.2.2 transitivePeerDependencies: @@ -9625,18 +9427,12 @@ packages: dependencies: eslint-visitor-keys: 3.4.3 lodash: 4.17.21 - yaml: 2.4.1 + yaml: 2.3.4 dev: true /yaml@2.3.4: resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} engines: {node: '>= 14'} - dev: true - - /yaml@2.4.1: - resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} - engines: {node: '>= 14'} - hasBin: true /yargs-parser@15.0.3: resolution: {integrity: sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==} From 9080e169e585e366ad868e8c7cadd06be853a18c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 28 Mar 2024 00:59:43 +0000 Subject: [PATCH 69/99] chore(deps): bump tldts from 6.1.14 to 6.1.15 (#14991) * chore(deps): bump tldts from 6.1.14 to 6.1.15 Bumps [tldts](https://github.com/remusao/tldts) from 6.1.14 to 6.1.15. - [Release notes](https://github.com/remusao/tldts/releases) - [Changelog](https://github.com/remusao/tldts/blob/master/CHANGELOG.md) - [Commits](https://github.com/remusao/tldts/compare/v6.1.14...v6.1.15) --- updated-dependencies: - dependency-name: tldts dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * chore: fix pnpm install --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index a4c17aa983..969610d080 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,7 @@ "telegram": "2.20.2", "tiny-async-pool": "2.1.0", "title": "3.5.3", - "tldts": "6.1.14", + "tldts": "6.1.15", "tough-cookie": "4.1.3", "tsx": "4.7.1", "twitter-api-v2": "1.16.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0d22bb328c..9d80c751bf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -195,8 +195,8 @@ dependencies: specifier: 3.5.3 version: 3.5.3 tldts: - specifier: 6.1.14 - version: 6.1.14 + specifier: 6.1.15 + version: 6.1.15 tough-cookie: specifier: 4.1.3 version: 4.1.3 @@ -8634,15 +8634,15 @@ packages: hasBin: true dev: false - /tldts-core@6.1.14: - resolution: {integrity: sha512-McyMQkkIUFYhfs3FPTxTn+5mewxERhfwy2x7TWHkBPb1poKaTBJhXehtuMg0FrhXp53J5eXRfvSD/oH/3mk/2A==} + /tldts-core@6.1.15: + resolution: {integrity: sha512-E/gy+y6I53cZcqbHllhS5Aak6DmMZSO9tX6DYw3NXZk+f1yoFKGLiojQ8ww39G5QAupKKZL+vehNVqzSS0SQgQ==} dev: false - /tldts@6.1.14: - resolution: {integrity: sha512-zGbimRt9fHP68Gbj5fGWmR90xiuRDK/iYukHevT9mcG6Job+HfR119D9DSr6voFWjpStJwOtVfWGpbhNYVwt3A==} + /tldts@6.1.15: + resolution: {integrity: sha512-0/2FOdXnP5ON6PTQfE7B4X1ymqa1Bs6oG/yHKtVMxLSlUPlb/1AdWGzz2Co3P/uM0eUPWOt61L7cayyyNUSh7A==} hasBin: true dependencies: - tldts-core: 6.1.14 + tldts-core: 6.1.15 dev: false /tmp@0.0.33: From 0526c2c852aa91d217c04f946e745e41a2ec4db1 Mon Sep 17 00:00:00 2001 From: abc1763613206 Date: Thu, 28 Mar 2024 09:32:01 +0800 Subject: [PATCH 70/99] =?UTF-8?q?feat(route):=20Add=20=E5=B0=8F=E7=B1=B3?= =?UTF-8?q?=E7=A4=BE=E5=8C=BA=E7=94=A8=E6=88=B7=E5=8F=91=E5=B8=96=20(#1492?= =?UTF-8?q?0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(route): Add 小米社区用户发帖 * fix: use logical operator * fix: apply radar suggestion Co-authored-by: Tony * wip: migrate route to `miui` * fix: migrate miui firmware update to `firmware` --------- --- lib/routes/miui/community/user.ts | 69 +++++++++++++++++++++++++ lib/routes/miui/{ => firmware}/index.ts | 4 +- 2 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 lib/routes/miui/community/user.ts rename lib/routes/miui/{ => firmware}/index.ts (95%) diff --git a/lib/routes/miui/community/user.ts b/lib/routes/miui/community/user.ts new file mode 100644 index 0000000000..49f47bb755 --- /dev/null +++ b/lib/routes/miui/community/user.ts @@ -0,0 +1,69 @@ +import { Route, Data } from '@/types'; +import got from '@/utils/got'; + +export const route: Route = { + path: '/community/user/:uid', + categories: ['bbs'], + example: '/miui/community/user/1200057564', + parameters: { + uid: '小米用户 UID,可于网页版用户主页链接中 `uid` 项获取', + }, + features: { + requireConfig: false, + requirePuppeteer: false, + antiCrawler: false, + supportBT: false, + supportPodcast: false, + supportScihub: false, + }, + radar: [ + { + source: ['web.vip.miui.com/page/info/mio/mio/homePage'], + target: (_, url) => `/miui/community/user/${new URL(url).searchParams.get('uid')}`, + }, + ], + name: '小米社区用户发帖', + maintainers: ['abc1763613206'], + handler, +}; + +const userRoot = 'https://web.vip.miui.com/page/info/mio/mio/homePage'; +const apiRoot = 'https://api.vip.miui.com/api/community/user/announce/list'; +const pageRoot = 'https://web.vip.miui.com/page/info/mio/mio/detail'; + +async function handler(ctx): Promise { + const uid = ctx.req.param('uid'); + const apiLink = `${apiRoot}?uid=${uid}&limit=10`; + const userLink = `${userRoot}?uid=${uid}`; + const { data } = await got({ + method: 'get', + url: apiLink, + headers: { + Referer: userLink, + }, + }); + if (data.code === 200) { + let authorName = ''; + const records = data.entity.records; + const items = records.map((item) => { + authorName = item.author.name; + return { + title: item.title || `${authorName} 的动态`, + description: item.textContent, + pubDate: new Date(item.createTime).toUTCString(), + author: item.author.name, + link: `${pageRoot}?postId=${item.id}`, + image: item.pic || item.cover || '', + }; + }); + return { + title: `小米社区 - ${authorName} 的发帖`, + link: userLink, + description: `${authorName} 的发帖`, + item: items, + language: 'zh-cn', + }; + } else { + throw new Error(data.message); + } +} diff --git a/lib/routes/miui/index.ts b/lib/routes/miui/firmware/index.ts similarity index 95% rename from lib/routes/miui/index.ts rename to lib/routes/miui/firmware/index.ts index ceb1ed8a76..ffdeb734f6 100644 --- a/lib/routes/miui/index.ts +++ b/lib/routes/miui/firmware/index.ts @@ -3,9 +3,9 @@ import got from '@/utils/got'; import queryString from 'query-string'; export const route: Route = { - path: '/:device/:type?/:region?', + path: '/firmware/:device/:type?/:region?', categories: ['program-update'], - example: '/miui/aries', + example: '/miui/firmware/aries', parameters: { device: 'the device `codename` eg. `aries` for Mi 2S', type: 'type', region: 'Region, default to `cn`' }, name: 'New firmware', maintainers: ['Indexyz'], From 176e77301309f7097c255fc96a820c52c5d4845d Mon Sep 17 00:00:00 2001 From: DIYgod Date: Thu, 28 Mar 2024 19:39:29 +0800 Subject: [PATCH 71/99] fix: setting dispatcher in options --- lib/utils/request-interceptor.ts | 39 ++++++++++---------------------- package.json | 2 +- pnpm-lock.yaml | 8 +++---- 3 files changed, 17 insertions(+), 32 deletions(-) diff --git a/lib/utils/request-interceptor.ts b/lib/utils/request-interceptor.ts index c85ba01cd7..5125e7b486 100644 --- a/lib/utils/request-interceptor.ts +++ b/lib/utils/request-interceptor.ts @@ -1,32 +1,19 @@ import { setupServer } from 'msw/node'; -import { http, passthrough } from 'msw'; +import { http } from 'msw'; import logger from '@/utils/logger'; import { config } from '@/config'; -import { fetch, Headers, FormData, ProxyAgent, Request, RequestInfo, RequestInit, Response } from 'undici'; +import { fetch, Headers, FormData, Request, Response } from 'undici'; import proxy from '@/utils/proxy'; -import type nodehttp from 'node:http'; - -class ExtendedRequest extends Request { - public dispatcher: ProxyAgent | undefined; - public agent: nodehttp.ClientRequestArgs['agent']; - - constructor(input: RequestInfo, init?: RequestInit & nodehttp.ClientRequestArgs) { - super(input, init); - this.dispatcher = init?.dispatcher; // fetch - this.agent = init?.agent; // http - } -} Object.defineProperties(globalThis, { fetch: { value: fetch, writable: true }, Headers: { value: Headers }, FormData: { value: FormData }, - Request: { value: ExtendedRequest }, + Request: { value: Request }, Response: { value: Response }, }); -const handler = (request: ExtendedRequest) => { - request.headers.set('debug', '1'); +const handler = (request: globalThis.Request, options: NonNullable[1]>) => { // ua if (!request.headers.get('user-agent')) { request.headers.set('user-agent', config.ua); @@ -48,7 +35,7 @@ const handler = (request: ExtendedRequest) => { } // proxy - if (!request.dispatcher && !request.agent && proxy.dispatcher) { + if (!options.dispatcher && proxy.dispatcher) { const proxyRegex = new RegExp(proxy.proxyObj.url_regex); let urlHandler; try { @@ -59,22 +46,20 @@ const handler = (request: ExtendedRequest) => { if (proxyRegex.test(request.url) && request.url.startsWith('http') && !(urlHandler && urlHandler.host === proxy.proxyUrlHandler?.host)) { // fetch - request.dispatcher = proxy.dispatcher; - - // http - request.agent = proxy.agent || undefined; - if (proxy.proxyObj.auth) { - request.headers.set('Proxy-Authorization', `Basic ${proxy.proxyObj.auth}`); - } + options.dispatcher = proxy.dispatcher; } } }; const server = setupServer( + // @ts-expect-error http.all('*', ({ request }) => { logger.debug(`Outgoing request: ${request.method} ${request.url}`); - handler(request); - return passthrough(); + const requestClone = request.clone(); + const options = {}; + handler(requestClone, options); + // @ts-expect-error + return fetch(requestClone, options); }) ); server.listen(); diff --git a/package.json b/package.json index 77124348d0..a78cdc7947 100644 --- a/package.json +++ b/package.json @@ -167,7 +167,7 @@ "js-beautify": "1.15.1", "lint-staged": "15.2.2", "mockdate": "3.0.5", - "msw": "2.2.12", + "msw": "2.2.13", "nock": "14.0.0-beta.5", "prettier": "3.2.5", "remark-parse": "11.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9756e122f5..2d1a2462e5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -353,8 +353,8 @@ devDependencies: specifier: 3.0.5 version: 3.0.5 msw: - specifier: 2.2.12 - version: 2.2.12(typescript@5.4.3) + specifier: 2.2.13 + version: 2.2.13(typescript@5.4.3) nock: specifier: 14.0.0-beta.5 version: 14.0.0-beta.5 @@ -7187,8 +7187,8 @@ packages: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: false - /msw@2.2.12(typescript@5.4.3): - resolution: {integrity: sha512-thmjEipUvr+XGawcNOh4T8+T2TN3qKWPfF0Ewx6ub1HIATXBsjOhnjV6Wx2BmmFThKEtYYC+RygrvkpG4DzoZw==} + /msw@2.2.13(typescript@5.4.3): + resolution: {integrity: sha512-ljFf1xZsU0b4zv1l7xzEmC6OZA6yD06hcx0H+dc8V0VypaP3HGYJa1rMLjQbBWl32ptGhcfwcPCWDB1wjmsftw==} engines: {node: '>=18'} hasBin: true requiresBuild: true From 97fdc24e84177699c561552b973f656cbccd0361 Mon Sep 17 00:00:00 2001 From: KidLoveToPlay <63667585+Yamico@users.noreply.github.com> Date: Thu, 28 Mar 2024 22:43:43 +0800 Subject: [PATCH 72/99] docs(route): /ntdm/video, update right example id (#14999) --- lib/routes/ntdm/video.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/routes/ntdm/video.ts b/lib/routes/ntdm/video.ts index 2c0bcdd11f..7a320ceb72 100644 --- a/lib/routes/ntdm/video.ts +++ b/lib/routes/ntdm/video.ts @@ -6,7 +6,7 @@ import cheerio from 'cheerio'; export const route: Route = { path: '/video/:id', categories: ['anime'], - example: '/ntdm/video/20200035', + example: '/ntdm/video/4309', parameters: { id: '番剧 id,对应详情 URL 中找到' }, features: { requireConfig: false, @@ -22,7 +22,7 @@ export const route: Route = { }, ], name: '番剧详情', - maintainers: ['alexhere'], + maintainers: ['Yamico'], handler, }; From b9ff6613375c151644f491e9824cc03e1597f104 Mon Sep 17 00:00:00 2001 From: JimenezLi <75196426+JimenezLi@users.noreply.github.com> Date: Fri, 29 Mar 2024 02:58:56 +0800 Subject: [PATCH 73/99] fix(core): fix wrong path on windows deploy (#15000) --- lib/registry.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/registry.ts b/lib/registry.ts index 74101502df..7d20172e22 100644 --- a/lib/registry.ts +++ b/lib/registry.ts @@ -45,7 +45,7 @@ if (Object.keys(modules).length) { | { namespace: Namespace; }; - const namespace = module.split('/')[1]; + const namespace = module.split(/[/\\]/)[1]; if ('namespace' in content) { namespaces[namespace] = Object.assign( { @@ -65,13 +65,13 @@ if (Object.keys(modules).length) { for (const path of content.route.path) { namespaces[namespace].routes[path] = { ...content.route, - location: module.split('/').slice(2).join('/'), + location: module.split(/[/\\]/).slice(2).join('/'), }; } } else { namespaces[namespace].routes[content.route.path] = { ...content.route, - location: module.split('/').slice(2).join('/'), + location: module.split(/[/\\]/).slice(2).join('/'), }; } } From c03ec9c32de559cd7c60ae609fa89dfa98b14e2c Mon Sep 17 00:00:00 2001 From: Enoch Ma Date: Thu, 28 Mar 2024 20:14:21 +0100 Subject: [PATCH 74/99] feat(route): migrate to v2 api (twreporter) (#14983) * support category and fix time(twreporter) * html -> text Co-authored-by: Tony * simplification Co-authored-by: Tony * update list of entries Co-authored-by: Tony * use api (v2) * support youtube * linting * solve lint * ignore the inconsistency * manually solve the abnormal cases * camelCase * use format function * add filter --------- --- lib/routes/twreporter/category.ts | 50 +++++--- lib/routes/twreporter/fetch-article.ts | 135 +++++++++++++------- lib/routes/twreporter/newest.ts | 21 ++- lib/routes/twreporter/templates/image.art | 3 + lib/routes/twreporter/templates/youtube.art | 1 + 5 files changed, 128 insertions(+), 82 deletions(-) create mode 100644 lib/routes/twreporter/templates/image.art create mode 100644 lib/routes/twreporter/templates/youtube.art diff --git a/lib/routes/twreporter/category.ts b/lib/routes/twreporter/category.ts index c09e8b92dc..5bf0534576 100644 --- a/lib/routes/twreporter/category.ts +++ b/lib/routes/twreporter/category.ts @@ -1,6 +1,5 @@ import { Route } from '@/types'; import cache from '@/utils/cache'; -import { load } from 'cheerio'; import got from '@/utils/got'; import fetch from './fetch-article'; @@ -30,34 +29,43 @@ export const route: Route = { }; async function handler(ctx) { - const baseURL = 'https://www.twreporter.org'; - const url = baseURL + `/categories/${ctx.req.param('category')}`; - const res = await got(url); - const $ = load(res.data); + const category = ctx.req.param('category'); + const url = `https://go-api.twreporter.org/v2/index_page`; + const res = await got(url).json(); + const list = res.data[category]; - const regexp = /^window\.__REDUX_STATE__=(.*);$/gm; - const raw = $('script[charset="UTF-8"]').text().replaceAll(regexp, '$1'); - const posts = JSON.parse(raw).entities.posts; + let name = list[0].category_set[0].category.name; + let categoryID = category; + switch (categoryID) { + case 'photos_section': + categoryID = 'photography'; - const list = posts.allIds.map((id) => ({ - link: baseURL + '/a/' + posts.byId[id].slug, - title: posts.byId[id].title, - })); - const category = posts.byId[posts.allIds[0]].category_set[0].category.name; + break; + case 'politics_and_society': + categoryID = categoryID.replaceAll('_', '-'); + name = '政治社會'; + + break; + default: + break; + } + const home = `https://www.twreporter.org/categories/${categoryID}`; const out = await Promise.all( - list.map((item) => - cache.tryGet(item.link, async () => { - const single = await fetch(item.link); - single.title = item.title; + list.map((item) => { + const title = item.title; + // categoryNames = item.category_set[0].category.name; + return cache.tryGet(item.slug, async () => { + const single = await fetch(item.slug); + single.title = title; return single; - }) - ) + }); + }) ); return { - title: `報導者 | ${category}`, - link: url, + title: `報導者 | ${name}`, + link: home, item: out, }; } diff --git a/lib/routes/twreporter/fetch-article.ts b/lib/routes/twreporter/fetch-article.ts index a9bca8d4c0..cf9cfee8c4 100644 --- a/lib/routes/twreporter/fetch-article.ts +++ b/lib/routes/twreporter/fetch-article.ts @@ -1,67 +1,104 @@ -import { load } from 'cheerio'; +import { getCurrentPath } from '@/utils/helpers'; +const __dirname = getCurrentPath(import.meta.url); + import got from '@/utils/got'; import { parseDate } from '@/utils/parse-date'; +import { art } from '@/utils/render'; +import * as path from 'node:path'; -export default async function fetch(address) { - const res = await got(address); - const capture = load(res.data); - capture('.gIMvvS').remove(); +export default async function fetch(slug: string) { + const url = `https://go-api.twreporter.org/v2/posts/${slug}?full=true`; + const res = await got(url); + const post = res.data.data; - let time = capture('.gzaDTq').text(); - // For `photography` - if (!time) { - time = capture('.fEZfRw').text(); + const time = post.published_date; + // For `writers` + let authors = ''; + if (post.writers) { + authors = post.writers.map((writer) => (writer.job_title ? writer.job_title + ' / ' + writer.name : '文字 / ' + writer.name)).join(','); } - let metaInfoBox = capture('.ffAPnj') - .filter((index) => index === 0) - .get(); - - // For photography - if (metaInfoBox.length === 0) { - metaInfoBox = capture('.deNvJY') - .filter((index) => index === 0) - .get(); + // For `photography`, if it exists + let photographers = ''; + if (post.photographers) { + photographers = post.photographers + .map((photographer) => { + let title = '攝影 / '; + if (photographer.job_title) { + title = photographer.job_title + ' / '; + } + return title + photographer.name; + }) + .join(','); + authors += ';' + photographers; } - const acquire = load(metaInfoBox); - // # Author(s) of the article - // - // There exists two formats for this section. - // 1. 文字 /...` with `摄影 / ..` in separate line, or - // 2. just a simple line starts with `文/ ...` - // For the first condition, we use a array - // to record the list of author(s), and use - // `;` to connect two lines. - const authors = []; + const bannerImage = post.og_image.resized_targets.desktop.url; + const caption = post.leading_image_description; + const bannerDescription = post.og_image.description; + const ogDescription = post.og_description; + const banner = art(path.join(__dirname, 'templates/image.art'), { image: bannerImage, description: bannerDescription, caption }); - if (acquire('.loxoWO').text() === '') { - for (const item of acquire('.flciyI').get()) { - const $ = load(item); - const job = $('.hGsNtm').text(); - // An article may have multiple authors - const name = []; - for (const item of $('.cidPTd > a').get()) { - const $ = load(item); - name.push($('.fJSaZP').text()); + function format(type, content) { + let block = ''; + if (content !== '' && type !== 'embeddedcode') { + switch (type) { + case 'image': + case 'slideshow': + block = content.map((image) => art(path.join(__dirname, 'templates/image.art'), { image: image.desktop.url, description: image.description, caption: image.description })).join('
'); + + break; + + case 'blockquote': + block = `

${content}
`; + + break; + + case 'header-one': + block = `

${content}

`; + + break; + + case 'header-two': + block = `

${content}

`; + + break; + + case 'infobox': { + const box = content[0]; + block = `

${box.title}

${box.body}`; + + break; + } + case 'youtube': { + const video = content[0].youtubeId; + const id = video.split('?')[0]; + block = art(path.join(__dirname, 'templates/youtube.art'), { video: id }); + + break; + } + default: + block = `${content}
`; } - - const author = job + '/' + name.join(','); - authors.push(author); } - } else { - authors.push(acquire('.loxoWO').text()); + return block; } - const author = authors.join(';'); - // contents = cover photo + italic intro + text - const contents = '' + capture('.hxFBKc').html() + '
' + capture('.jONJYq').html(); + const text = post.content.api_data + .map((item) => { + const content = item.content; + const type = item.type; + return format(type, content); + }) + .filter(Boolean) + .join('
'); + const contents = [banner, ogDescription, text].filter(Boolean).join('

'); return { - author, + author: authors, description: contents, - link: address, - guid: address, - pubDate: parseDate(time, 'YYYY/M/D'), + link: `https://www.twreporter.org/a/${slug}`, + guid: `https://www.twreporter.org/a/${slug}`, + pubDate: parseDate(time, 'YYYY-MM-DDTHH:mm:ssZ'), }; } diff --git a/lib/routes/twreporter/newest.ts b/lib/routes/twreporter/newest.ts index f8b56e69d6..a71354ba8d 100644 --- a/lib/routes/twreporter/newest.ts +++ b/lib/routes/twreporter/newest.ts @@ -1,6 +1,5 @@ import { Route } from '@/types'; import cache from '@/utils/cache'; -import { load } from 'cheerio'; import got from '@/utils/got'; import fetch from './fetch-article'; @@ -30,26 +29,24 @@ export const route: Route = { }; async function handler() { - const url = 'https://www.twreporter.org'; - const res = await got(url); - const $ = load(res.data); - const list = $('.gKMjSz').get(); - + const base = `https://www.twreporter.org`; + const url = `https://go-api.twreporter.org/v2/index_page`; + const res = await got(url).json(); + const list = res.data.latest_section; const out = await Promise.all( list.map((item) => { - const $ = load(item); - const address = url + $('a').attr('href'); - const title = $('.latest-section__Title-hzxpx3-6').text(); - return cache.tryGet(address, async () => { - const single = await fetch(address); + const title = item.title; + return cache.tryGet(item.slug, async () => { + const single = await fetch(item.slug); single.title = title; return single; }); }) ); + return { title: `報導者 | 最新`, - link: url, + link: base, item: out, }; } diff --git a/lib/routes/twreporter/templates/image.art b/lib/routes/twreporter/templates/image.art new file mode 100644 index 0000000000..74fd8bd732 --- /dev/null +++ b/lib/routes/twreporter/templates/image.art @@ -0,0 +1,3 @@ + +{{ description }} +
{{ caption }}
\ No newline at end of file diff --git a/lib/routes/twreporter/templates/youtube.art b/lib/routes/twreporter/templates/youtube.art new file mode 100644 index 0000000000..4388be0312 --- /dev/null +++ b/lib/routes/twreporter/templates/youtube.art @@ -0,0 +1 @@ + \ No newline at end of file From 528b9c357a8fbf638ddf6f80816dcf3b5cb08ef5 Mon Sep 17 00:00:00 2001 From: LMark <40017222+ladeng07@users.noreply.github.com> Date: Fri, 29 Mar 2024 03:31:37 +0800 Subject: [PATCH 75/99] =?UTF-8?q?fix(route):=20=E4=B8=AD=E5=8D=8E=E4=BA=BA?= =?UTF-8?q?=E6=B0=91=E5=85=B1=E5=92=8C=E5=9B=BD=E4=BA=A4=E9=80=9A=E8=BF=90?= =?UTF-8?q?=E8=BE=93=E9=83=A8=20(#15002)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/routes/gov/mot/index.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/routes/gov/mot/index.ts b/lib/routes/gov/mot/index.ts index 0eef6b4aa4..b273395c57 100644 --- a/lib/routes/gov/mot/index.ts +++ b/lib/routes/gov/mot/index.ts @@ -7,8 +7,8 @@ import { parseDate } from '@/utils/parse-date'; export const route: Route = { path: '/mot/:category{.+}?', - name: 'Unknown', - maintainers: [], + name: '中华人民共和国交通运输部', + maintainers: ['ladeng07'], handler, }; @@ -48,7 +48,7 @@ async function handler(ctx) { item.title = content('meta[name="ArticleTitle"]').prop('content') || content('h1#ti').text(); item.description = content('div.TRS_UEDITOR').html(); - item.author = [...new Set([content('meta[name="Author"]').prop('content'), content('meta[name="ContentSource"]').prop('content')])].filter(Boolean); + item.author = [...new Set([content('meta[name="Author"]').prop('content'), content('meta[name="ContentSource"]').prop('content')])].find(Boolean); item.category = [ ...new Set([content('meta[name="ColumnName"]').prop('content'), content('meta[name="ColumnType"]').prop('content'), ...(content('meta[name="Keywords"]').prop('content')?.split(/,|;/) ?? [])]), ].filter(Boolean); From 458cf23405886f398e0be9115212378085f69a37 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 Mar 2024 01:59:24 +0000 Subject: [PATCH 76/99] chore(deps): bump @sentry/node from 7.108.0 to 7.109.0 (#15004) * chore(deps): bump @sentry/node from 7.108.0 to 7.109.0 Bumps [@sentry/node](https://github.com/getsentry/sentry-javascript) from 7.108.0 to 7.109.0. - [Release notes](https://github.com/getsentry/sentry-javascript/releases) - [Changelog](https://github.com/getsentry/sentry-javascript/blob/7.109.0/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-javascript/compare/7.108.0...7.109.0) --- updated-dependencies: - dependency-name: "@sentry/node" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * chore: fix pnpm install --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 44 ++++++++++++++++++++++---------------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index 969610d080..baf9b01fdd 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "@hono/zod-openapi": "0.9.9", "@notionhq/client": "2.2.14", "@postlight/parser": "2.2.3", - "@sentry/node": "7.108.0", + "@sentry/node": "7.109.0", "@tonyrl/rand-user-agent": "2.0.56", "aes-js": "3.1.2", "art-template": "4.13.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9d80c751bf..c3ce510cfa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ dependencies: specifier: 2.2.3 version: 2.2.3 '@sentry/node': - specifier: 7.108.0 - version: 7.108.0 + specifier: 7.109.0 + version: 7.109.0 '@tonyrl/rand-user-agent': specifier: 2.0.56 version: 2.0.56 @@ -2340,43 +2340,43 @@ packages: selderee: 0.11.0 dev: false - /@sentry-internal/tracing@7.108.0: - resolution: {integrity: sha512-zuK5XsTsb+U+hgn3SPetYDAogrXsM16U/LLoMW7+TlC6UjlHGYQvmX3o+M2vntejoU1QZS8m1bCAZSMWEypAEw==} + /@sentry-internal/tracing@7.109.0: + resolution: {integrity: sha512-PzK/joC5tCuh2R/PRh+7dp+uuZl7pTsBIjPhVZHMTtb9+ls65WkdZJ1/uKXPouyz8NOo9Xok7aEvEo9seongyw==} engines: {node: '>=8'} dependencies: - '@sentry/core': 7.108.0 - '@sentry/types': 7.108.0 - '@sentry/utils': 7.108.0 + '@sentry/core': 7.109.0 + '@sentry/types': 7.109.0 + '@sentry/utils': 7.109.0 dev: false - /@sentry/core@7.108.0: - resolution: {integrity: sha512-I/VNZCFgLASxHZaD0EtxZRM34WG9w2gozqgrKGNMzAymwmQ3K9g/1qmBy4e6iS3YRptb7J5UhQkZQHrcwBbjWQ==} + /@sentry/core@7.109.0: + resolution: {integrity: sha512-xwD4U0IlvvlE/x/g/W1I8b4Cfb16SsCMmiEuBf6XxvAa3OfWBxKoqLifb3GyrbxMC4LbIIZCN/SvLlnGJPgszA==} engines: {node: '>=8'} dependencies: - '@sentry/types': 7.108.0 - '@sentry/utils': 7.108.0 + '@sentry/types': 7.109.0 + '@sentry/utils': 7.109.0 dev: false - /@sentry/node@7.108.0: - resolution: {integrity: sha512-pMxc9txnDDkU4Z8k2Uw/DPSLPehNtWV3mjJ3+my0AMORGYrXLkJI93tddlE5z/7k+GEJdj1HsOLgxUN0OU+HGA==} + /@sentry/node@7.109.0: + resolution: {integrity: sha512-tqMNAES4X/iBl1eZRCmc29p//0id01FBLEiesNo5nk6ECl6/SaGMFAEwu1gsn90h/Bjgr04slwFOS4cR45V2PQ==} engines: {node: '>=8'} dependencies: - '@sentry-internal/tracing': 7.108.0 - '@sentry/core': 7.108.0 - '@sentry/types': 7.108.0 - '@sentry/utils': 7.108.0 + '@sentry-internal/tracing': 7.109.0 + '@sentry/core': 7.109.0 + '@sentry/types': 7.109.0 + '@sentry/utils': 7.109.0 dev: false - /@sentry/types@7.108.0: - resolution: {integrity: sha512-bKtHITmBN3kqtqE5eVvL8mY8znM05vEodENwRpcm6TSrrBjC2RnwNWVwGstYDdHpNfFuKwC8mLY9bgMJcENo8g==} + /@sentry/types@7.109.0: + resolution: {integrity: sha512-egCBnDv3YpVFoNzRLdP0soVrxVLCQ+rovREKJ1sw3rA2/MFH9WJ+DZZexsX89yeAFzy1IFsCp7/dEqudusml6g==} engines: {node: '>=8'} dev: false - /@sentry/utils@7.108.0: - resolution: {integrity: sha512-a45yEFD5qtgZaIFRAcFkG8C8lnDzn6t4LfLXuV4OafGAy/3ZAN3XN8wDnrruHkiUezSSANGsLg3bXaLW/JLvJw==} + /@sentry/utils@7.109.0: + resolution: {integrity: sha512-3RjxMOLMBwZ5VSiH84+o/3NY2An4Zldjz0EbfEQNRY9yffRiCPJSQiCJID8EoylCFOh/PAhPimBhqbtWJxX6iw==} engines: {node: '>=8'} dependencies: - '@sentry/types': 7.108.0 + '@sentry/types': 7.109.0 dev: false /@sinclair/typebox@0.27.8: From 5a7108c7abce06f557e99a9e3a6b75d295a2e52e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 Mar 2024 10:00:24 +0800 Subject: [PATCH 77/99] chore(deps): bump hono from 4.1.4 to 4.1.5 (#15003) * chore(deps): bump hono from 4.1.4 to 4.1.5 Bumps [hono](https://github.com/honojs/hono) from 4.1.4 to 4.1.5. - [Release notes](https://github.com/honojs/hono/releases) - [Commits](https://github.com/honojs/hono/compare/v4.1.4...v4.1.5) --- updated-dependencies: - dependency-name: hono dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * chore: fix pnpm install --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index baf9b01fdd..fb04abfdea 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "git-rev-sync": "3.0.2", "googleapis": "134.0.0", "got": "14.2.1", - "hono": "4.1.4", + "hono": "4.1.5", "html-to-text": "9.0.5", "https-proxy-agent": "7.0.4", "iconv-lite": "0.6.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c3ce510cfa..cc663c37eb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,10 +10,10 @@ dependencies: version: 1.9.0 '@hono/swagger-ui': specifier: 0.2.1 - version: 0.2.1(hono@4.1.4) + version: 0.2.1(hono@4.1.5) '@hono/zod-openapi': specifier: 0.9.9 - version: 0.9.9(hono@4.1.4)(zod@3.22.4) + version: 0.9.9(hono@4.1.5)(zod@3.22.4) '@notionhq/client': specifier: 2.2.14 version: 2.2.14 @@ -84,8 +84,8 @@ dependencies: specifier: 14.2.1 version: 14.2.1 hono: - specifier: 4.1.4 - version: 4.1.4 + specifier: 4.1.5 + version: 4.1.5 html-to-text: specifier: 9.0.5 version: 9.0.5 @@ -1890,15 +1890,15 @@ packages: engines: {node: '>=18.14.1'} dev: false - /@hono/swagger-ui@0.2.1(hono@4.1.4): + /@hono/swagger-ui@0.2.1(hono@4.1.5): resolution: {integrity: sha512-wBxVMRe3/v8xH4o6icmwztiIq0DG0s7+jHVMHVUAoFFCWEQNL2iskMmQtrhSDtsFmBZUeUFQUaaJ6Ir6DOmHLA==} peerDependencies: hono: '*' dependencies: - hono: 4.1.4 + hono: 4.1.5 dev: false - /@hono/zod-openapi@0.9.9(hono@4.1.4)(zod@3.22.4): + /@hono/zod-openapi@0.9.9(hono@4.1.5)(zod@3.22.4): resolution: {integrity: sha512-Icak3c8WKNS1gFDWmYs2zJ7ra3js9lDeAXNPf5h3fa0SnJQcjcCrLaG6EZPPAbW92HRwCDeQt8yA/ZVp17HPFg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -1906,18 +1906,18 @@ packages: zod: 3.* dependencies: '@asteasolutions/zod-to-openapi': 5.5.0(zod@3.22.4) - '@hono/zod-validator': 0.1.11(hono@4.1.4)(zod@3.22.4) - hono: 4.1.4 + '@hono/zod-validator': 0.1.11(hono@4.1.5)(zod@3.22.4) + hono: 4.1.5 zod: 3.22.4 dev: false - /@hono/zod-validator@0.1.11(hono@4.1.4)(zod@3.22.4): + /@hono/zod-validator@0.1.11(hono@4.1.5)(zod@3.22.4): resolution: {integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==} peerDependencies: hono: '>=3.9.0' zod: ^3.19.1 dependencies: - hono: 4.1.4 + hono: 4.1.5 zod: 3.22.4 dev: false @@ -5420,8 +5420,8 @@ packages: resolution: {integrity: sha512-4FP6J0oI8jqb6gLLl9tSwVdosWJ/AKSGJ+HwYf6Ixe4MUcEkst4uWzpVQrNOCin0fzTRQbXV8ePheU8WiiDYBw==} dev: false - /hono@4.1.4: - resolution: {integrity: sha512-JcdAKRBHjWO5OEkEW6Lv5NUr4QLl4InshCIUnHwGY7hymCxmV1Ji/eAAr1hclQixWc3I7ZljMHXwIedNWRAcqA==} + /hono@4.1.5: + resolution: {integrity: sha512-3ChJiIoeCxvkt6vnkxJagplrt1YZg3NyNob7ssVeK2PUqEINp4q1F94HzFnvY9QE8asVmbW5kkTDlyWylfg2vg==} engines: {node: '>=16.0.0'} dev: false From 3b5b43a3dceae78a94224b8fd860e477f78392e9 Mon Sep 17 00:00:00 2001 From: CaoMeiYouRen <40430746+CaoMeiYouRen@users.noreply.github.com> Date: Fri, 29 Mar 2024 12:23:18 +0800 Subject: [PATCH 78/99] =?UTF-8?q?fix(route):=20=E4=BF=AE=E5=A4=8D=20?= =?UTF-8?q?=E7=9F=A5=E4=B9=8E=E6=97=A5=E6=8A=A5=E8=B7=AF=E7=94=B1=20(#1500?= =?UTF-8?q?8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/routes/zhihu/daily.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/routes/zhihu/daily.ts b/lib/routes/zhihu/daily.ts index fd57b162d3..5125087ea8 100644 --- a/lib/routes/zhihu/daily.ts +++ b/lib/routes/zhihu/daily.ts @@ -60,9 +60,9 @@ async function handler() { headers: { ...utils.header, Referer: `${api}/latest`, - Host: HOST, + Host: address, }, - host: address, + // host: address, }); // 根据api的说明,过滤掉极个别站外链接 const storyList = listRes.data.stories.filter((el) => el.type === 0); @@ -85,9 +85,9 @@ async function handler() { url, headers: { Referer: url, - Host: HOST, + Host: address, }, - host: address, + // host: address, }); return utils.ProcessImage(storyDetail.data.body.replaceAll(/
([\S\s]*?)<\/div>/g, '$1').replaceAll(/<\/?h2.*?>/g, '')); }); From c086c62acd48116b3d0e301b419348d8c50f01fa Mon Sep 17 00:00:00 2001 From: wudifeixue Date: Sat, 30 Mar 2024 02:12:12 -0600 Subject: [PATCH 79/99] fix(core): fix documentation link path and error message links (#15023) * fix: all broken sponsor links * fix: all broken deployment links * fix: other broken links --- .github/FUNDING.yml | 2 +- .github/ISSUE_TEMPLATE/bug_report_en.yml | 2 +- .github/ISSUE_TEMPLATE/feature_request_en.yml | 2 +- .github/ISSUE_TEMPLATE/rss_request_en.yml | 2 +- CONTRIBUTING.md | 2 +- README.md | 8 ++++---- api/vercel.ts | 2 +- lib/index.ts | 2 +- lib/middleware/parameter.ts | 2 +- lib/routes-deprecated/disqus/posts.js | 2 +- lib/routes-deprecated/fanfou/favorites.js | 2 +- lib/routes-deprecated/fanfou/home-timeline.js | 2 +- lib/routes-deprecated/fanfou/public-timeline.js | 2 +- lib/routes-deprecated/fanfou/user-timeline.js | 2 +- lib/routes-deprecated/lastfm/loved.js | 2 +- lib/routes-deprecated/lastfm/recent.js | 2 +- lib/routes-deprecated/lastfm/top.js | 2 +- lib/routes/163/music/playlist.ts | 2 +- lib/routes/bilibili/followers.ts | 2 +- lib/routes/bilibili/followings.ts | 2 +- lib/routes/discord/channel.ts | 2 +- lib/routes/discourse/utils.ts | 2 +- lib/routes/ehentai/favorites.ts | 2 +- lib/routes/github/follower.ts | 2 +- lib/routes/github/notifications.ts | 2 +- lib/routes/github/star.ts | 2 +- lib/routes/github/trending.ts | 2 +- lib/routes/google/fonts.ts | 2 +- lib/routes/hit/namespace.ts | 2 +- lib/routes/instagram/private-api/index.ts | 2 +- lib/routes/instagram/private-api/utils.ts | 2 +- lib/routes/instagram/web-api/index.ts | 2 +- lib/routes/iwara/subscriptions.ts | 4 ++-- lib/routes/mail/imap.ts | 2 +- lib/routes/manhuagui/subscribe.ts | 2 +- lib/routes/mastodon/namespace.ts | 2 +- lib/routes/mastodon/utils.ts | 2 +- lib/routes/mihoyo/bbs/cache.ts | 2 +- lib/routes/mihoyo/bbs/timeline.ts | 2 +- lib/routes/newrank/douyin.ts | 2 +- lib/routes/newrank/wechat.ts | 2 +- lib/routes/nhentai/other.ts | 2 +- lib/routes/nhentai/search.ts | 2 +- lib/routes/nhentai/util.ts | 2 +- lib/routes/notion/database.ts | 2 +- lib/routes/notion/namespace.ts | 2 +- lib/routes/pianyuan/utils.ts | 2 +- lib/routes/pixiv/bookmarks.ts | 2 +- lib/routes/pixiv/illustfollow.ts | 2 +- lib/routes/pixiv/ranking.ts | 2 +- lib/routes/pixiv/search.ts | 2 +- lib/routes/pixiv/user.ts | 2 +- lib/routes/sdu/data.ts | 4 ++-- lib/routes/sehuatang/user.ts | 2 +- lib/routes/spotify/utils.ts | 4 ++-- lib/routes/stbu/jsjxy.ts | 2 +- lib/routes/telegram/stickerpack.ts | 2 +- lib/routes/twitter/likes.ts | 2 +- lib/routes/twitter/trends.ts | 2 +- lib/routes/ucas/rader.ts | 8 ++++---- lib/routes/weibo/friends.ts | 2 +- lib/routes/weibo/group.ts | 2 +- lib/routes/youtube/channel.ts | 2 +- lib/routes/youtube/custom.ts | 2 +- lib/routes/youtube/live.ts | 2 +- lib/routes/youtube/playlist.ts | 2 +- lib/routes/youtube/subscriptions.ts | 2 +- lib/routes/youtube/user.ts | 2 +- lib/routes/zodgame/forum.ts | 2 +- lib/views/error.tsx | 2 +- lib/views/index.tsx | 4 ++-- 71 files changed, 81 insertions(+), 81 deletions(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 3e06b6773a..1a29f35400 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -2,4 +2,4 @@ github: DIYgod patreon: DIYgod open_collective: RSSHub -custom: ['https://afdian.net/a/diygod', 'https://docs.rsshub.app/support'] +custom: ['https://afdian.net/a/diygod', 'https://docs.rsshub.app/sponsor'] diff --git a/.github/ISSUE_TEMPLATE/bug_report_en.yml b/.github/ISSUE_TEMPLATE/bug_report_en.yml index ac686b2dcc..de560dad59 100644 --- a/.github/ISSUE_TEMPLATE/bug_report_en.yml +++ b/.github/ISSUE_TEMPLATE/bug_report_en.yml @@ -6,7 +6,7 @@ body: - type: markdown attributes: value: | - Please ensure you have read [documentation](https://docs.rsshub.app/en), and provide all the information required by this template, otherwise the issue will be closed immediately. + Please ensure you have read [documentation](https://docs.rsshub.app/), and provide all the information required by this template, otherwise the issue will be closed immediately. Due to the anti-crawling policy implemented by certain websites, some RSS routes provided by the demo will return status code 403. This is not an issue caused by RSSHub and please do not report it. - type: textarea diff --git a/.github/ISSUE_TEMPLATE/feature_request_en.yml b/.github/ISSUE_TEMPLATE/feature_request_en.yml index ed5db239e0..7aee701cc8 100644 --- a/.github/ISSUE_TEMPLATE/feature_request_en.yml +++ b/.github/ISSUE_TEMPLATE/feature_request_en.yml @@ -7,7 +7,7 @@ body: - type: markdown attributes: value: | - Please ensure the feature requested is not listed in [documentation](https://docs.rsshub.app/en) or [issue](https://github.com/DIYgod/RSSHub/issues), and is not a [new RSS proposal](https://github.com/DIYgod/RSSHub/issues/new?assignees=&labels=RSS+proposal&template=rss_request_en.yml), and provide all the information required by this template. + Please ensure the feature requested is not listed in [documentation](https://docs.rsshub.app/) or [issue](https://github.com/DIYgod/RSSHub/issues), and is not a [new RSS proposal](https://github.com/DIYgod/RSSHub/issues/new?assignees=&labels=RSS+proposal&template=rss_request_en.yml), and provide all the information required by this template. Otherwise the issue will be closed immediately. - type: textarea diff --git a/.github/ISSUE_TEMPLATE/rss_request_en.yml b/.github/ISSUE_TEMPLATE/rss_request_en.yml index 322b48e143..0f1efc64b5 100644 --- a/.github/ISSUE_TEMPLATE/rss_request_en.yml +++ b/.github/ISSUE_TEMPLATE/rss_request_en.yml @@ -7,7 +7,7 @@ body: - type: markdown attributes: value: | - Please ensure the RSS proposal is not listed in [documentation](https://docs.rsshub.app/en) or [issue](https://github.com/DIYgod/RSSHub/issues), website doesn't provide this kind of RSS feed, and provide all the information required by this template. + Please ensure the RSS proposal is not listed in [documentation](https://docs.rsshub.app/) or [issue](https://github.com/DIYgod/RSSHub/issues), website doesn't provide this kind of RSS feed, and provide all the information required by this template. Otherwise the issue will be closed immediately. We are flooded with feature requests and short-handed, please try to make it yourself, the [guide](https://docs.rsshub.app/joinus) is a good place to start. Submit a pull request when done! diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 12d5111208..273aa2c8b3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1 +1 @@ -## Please refer to [Join Us](https://docs.rsshub.app/joinus/quick-start) +## Please refer to [Join Us](https://docs.rsshub.app/joinus/) diff --git a/README.md b/README.md index 936fb48871..8eb2654555 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ RSSHub can be used with browser extension [RSSHub Radar](https://github.com/DIYg        

-[![](https://opencollective.com/static/images/become_sponsor.svg)](https://docs.rsshub.app/support/) +[![](https://opencollective.com/static/images/become_sponsor.svg)](https://docs.rsshub.app/sponsor/) ### Contributors @@ -54,15 +54,15 @@ Logo designer [sheldonrrr](https://dribbble.com/sheldonrrr) We welcome all pull requests. Suggestions and feedback are also welcomed [here](https://github.com/DIYgod/RSSHub/issues). -Refer to [Join Us](https://docs.rsshub.app/joinus/quick-start) +Refer to [Join Us](https://docs.rsshub.app/joinus/) ## Deployment -Refer to [Deployment](https://docs.rsshub.app/install/) +Refer to [Deployment](https://docs.rsshub.app/deploy/) ## Support RSSHub -Refer to [Support RSSHub](https://docs.rsshub.app/support/) +Refer to [Support RSSHub](https://docs.rsshub.app/sponsor/) RSSHub is open source and completely free under the MIT license. However, just like any other open source project, as the project grows, the hosting, development and maintenance requires funding support. diff --git a/api/vercel.ts b/api/vercel.ts index 1f9ac0208e..12a2a910b7 100644 --- a/api/vercel.ts +++ b/api/vercel.ts @@ -12,6 +12,6 @@ const app = require('../lib/app'); const logger = require('../lib/utils/logger'); logger.info(`🎉 RSSHub is running! Cheers!`); -logger.info('💖 Can you help keep this open source project alive? Please sponsor 👉 https://docs.rsshub.app/support'); +logger.info('💖 Can you help keep this open source project alive? Please sponsor 👉 https://docs.rsshub.app/sponsor'); module.exports = handle(app); diff --git a/lib/index.ts b/lib/index.ts index edef861a13..24e7a247c3 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -8,7 +8,7 @@ const port = config.connect.port; const hostIPList = getLocalhostAddress(); logger.info(`🎉 RSSHub is running on port ${port}! Cheers!`); -logger.info('💖 Can you help keep this open source project alive? Please sponsor 👉 https://docs.rsshub.app/support'); +logger.info('💖 Can you help keep this open source project alive? Please sponsor 👉 https://docs.rsshub.app/sponsor'); logger.info(`🔗 Local: 👉 http://localhost:${port}`); for (const ip of hostIPList) { logger.info(`🔗 Network: 👉 http://${ip}:${port}`); diff --git a/lib/middleware/parameter.ts b/lib/middleware/parameter.ts index 1933889128..8306f39cc4 100644 --- a/lib/middleware/parameter.ts +++ b/lib/middleware/parameter.ts @@ -380,7 +380,7 @@ const middleware: MiddlewareHandler = async (ctx, next) => { } } } else { - throw new Error(`Invalid parameter brief. Please check the doc https://docs.rsshub.app/parameter#shu-chu-jian-xun`); + throw new Error(`Invalid parameter brief. Please check the doc https://docs.rsshub.app/guide/parameters#shu-chu-jian-xun`); } } // some parameters are processed in `anti-hotlink.js` diff --git a/lib/routes-deprecated/disqus/posts.js b/lib/routes-deprecated/disqus/posts.js index ab1779e1ea..28e72e887c 100644 --- a/lib/routes-deprecated/disqus/posts.js +++ b/lib/routes-deprecated/disqus/posts.js @@ -3,7 +3,7 @@ const config = require('@/config').value; module.exports = async (ctx) => { if (!config.disqus || !config.disqus.api_key) { - throw new Error('Disqus RSS is disabled due to the lack of relevant config'); + throw new Error('Disqus RSS is disabled due to the lack of relevant config'); } const forum = ctx.params.forum; diff --git a/lib/routes-deprecated/fanfou/favorites.js b/lib/routes-deprecated/fanfou/favorites.js index abeb4bb35e..7131ef4987 100644 --- a/lib/routes-deprecated/fanfou/favorites.js +++ b/lib/routes-deprecated/fanfou/favorites.js @@ -3,7 +3,7 @@ const utils = require('./utils'); module.exports = async (ctx) => { if (!config.fanfou || !config.fanfou.consumer_key || !config.fanfou.consumer_secret || !config.fanfou.username || !config.fanfou.password) { - throw new Error('Fanfou RSS is disabled due to the lack of relevant config'); + throw new Error('Fanfou RSS is disabled due to the lack of relevant config'); } const uid = ctx.params.uid; diff --git a/lib/routes-deprecated/fanfou/home-timeline.js b/lib/routes-deprecated/fanfou/home-timeline.js index 94af0c2d8d..4c97e848a6 100644 --- a/lib/routes-deprecated/fanfou/home-timeline.js +++ b/lib/routes-deprecated/fanfou/home-timeline.js @@ -3,7 +3,7 @@ const utils = require('./utils'); module.exports = async (ctx) => { if (!config.fanfou || !config.fanfou.consumer_key || !config.fanfou.consumer_secret || !config.fanfou.username || !config.fanfou.password) { - throw new Error('Fanfou RSS is disabled due to the lack of relevant config'); + throw new Error('Fanfou RSS is disabled due to the lack of relevant config'); } const fanfou = await utils.getFanfou(); diff --git a/lib/routes-deprecated/fanfou/public-timeline.js b/lib/routes-deprecated/fanfou/public-timeline.js index 81d18f28e2..90e41bf03f 100644 --- a/lib/routes-deprecated/fanfou/public-timeline.js +++ b/lib/routes-deprecated/fanfou/public-timeline.js @@ -3,7 +3,7 @@ const utils = require('./utils'); module.exports = async (ctx) => { if (!config.fanfou || !config.fanfou.consumer_key || !config.fanfou.consumer_secret || !config.fanfou.username || !config.fanfou.password) { - throw new Error('Fanfou RSS is disabled due to the lack of relevant config'); + throw new Error('Fanfou RSS is disabled due to the lack of relevant config'); } const keyword = ctx.params.keyword; diff --git a/lib/routes-deprecated/fanfou/user-timeline.js b/lib/routes-deprecated/fanfou/user-timeline.js index 4f6d9d8611..3644f7c34b 100644 --- a/lib/routes-deprecated/fanfou/user-timeline.js +++ b/lib/routes-deprecated/fanfou/user-timeline.js @@ -3,7 +3,7 @@ const utils = require('./utils'); module.exports = async (ctx) => { if (!config.fanfou || !config.fanfou.consumer_key || !config.fanfou.consumer_secret || !config.fanfou.username || !config.fanfou.password) { - throw new Error('Fanfou RSS is disabled due to the lack of relevant config'); + throw new Error('Fanfou RSS is disabled due to the lack of relevant config'); } const uid = ctx.params.uid; diff --git a/lib/routes-deprecated/lastfm/loved.js b/lib/routes-deprecated/lastfm/loved.js index 51ca36f9cb..276e2802ba 100644 --- a/lib/routes-deprecated/lastfm/loved.js +++ b/lib/routes-deprecated/lastfm/loved.js @@ -3,7 +3,7 @@ const config = require('@/config').value; module.exports = async (ctx) => { if (!config.lastfm || !config.lastfm.api_key) { - throw new Error('Last.fm RSS is disabled due to the lack of relevant config'); + throw new Error('Last.fm RSS is disabled due to the lack of relevant config'); } const user = ctx.params.user; diff --git a/lib/routes-deprecated/lastfm/recent.js b/lib/routes-deprecated/lastfm/recent.js index 02b17668ce..4915fe7d87 100644 --- a/lib/routes-deprecated/lastfm/recent.js +++ b/lib/routes-deprecated/lastfm/recent.js @@ -3,7 +3,7 @@ const config = require('@/config').value; module.exports = async (ctx) => { if (!config.lastfm || !config.lastfm.api_key) { - throw new Error('Last.fm RSS is disabled due to the lack of relevant config'); + throw new Error('Last.fm RSS is disabled due to the lack of relevant config'); } const user = ctx.params.user; diff --git a/lib/routes-deprecated/lastfm/top.js b/lib/routes-deprecated/lastfm/top.js index 3ee3b7ee25..b58f357399 100644 --- a/lib/routes-deprecated/lastfm/top.js +++ b/lib/routes-deprecated/lastfm/top.js @@ -3,7 +3,7 @@ const config = require('@/config').value; module.exports = async (ctx) => { if (!config.lastfm || !config.lastfm.api_key) { - throw new Error('Last.fm RSS is disabled due to the lack of relevant config'); + throw new Error('Last.fm RSS is disabled due to the lack of relevant config'); } const country = ctx.params.country; diff --git a/lib/routes/163/music/playlist.ts b/lib/routes/163/music/playlist.ts index 5a7861217d..61da28a627 100644 --- a/lib/routes/163/music/playlist.ts +++ b/lib/routes/163/music/playlist.ts @@ -27,7 +27,7 @@ export const route: Route = { async function handler(ctx) { if (!config.ncm || !config.ncm.cookies) { - throw new Error('163 Music RSS is disabled due to the lack of relevant config'); + throw new Error('163 Music RSS is disabled due to the lack of relevant config'); } const id = ctx.req.param('id'); diff --git a/lib/routes/bilibili/followers.ts b/lib/routes/bilibili/followers.ts index 36cbd342c0..962d860d03 100644 --- a/lib/routes/bilibili/followers.ts +++ b/lib/routes/bilibili/followers.ts @@ -45,7 +45,7 @@ async function handler(ctx) { const cookie = config.bilibili.cookies[loginUid]; if (cookie === undefined) { - throw new Error('缺少对应 loginUid 的 Bilibili 用户登录后的 Cookie 值 bilibili 用户关注动态系列路由'); + throw new Error('缺少对应 loginUid 的 Bilibili 用户登录后的 Cookie 值 bilibili 用户关注动态系列路由'); } const name = await cache.getUsernameFromUID(uid); diff --git a/lib/routes/bilibili/followings.ts b/lib/routes/bilibili/followings.ts index 4f1443896c..82cce50d20 100644 --- a/lib/routes/bilibili/followings.ts +++ b/lib/routes/bilibili/followings.ts @@ -43,7 +43,7 @@ async function handler(ctx) { const loginUid = ctx.req.param('loginUid'); const cookie = config.bilibili.cookies[loginUid]; if (cookie === undefined) { - throw new Error('缺少对应 loginUid 的 Bilibili 用户登录后的 Cookie 值 bilibili 用户关注动态系列路由'); + throw new Error('缺少对应 loginUid 的 Bilibili 用户登录后的 Cookie 值 bilibili 用户关注动态系列路由'); } const uid = ctx.req.param('uid'); diff --git a/lib/routes/discord/channel.ts b/lib/routes/discord/channel.ts index d3986c40f6..ed2ef1c216 100644 --- a/lib/routes/discord/channel.ts +++ b/lib/routes/discord/channel.ts @@ -39,7 +39,7 @@ export const route: Route = { async function handler(ctx) { if (!config.discord || !config.discord.authorization) { - throw new Error('Discord RSS is disabled due to the lack of relevant config'); + throw new Error('Discord RSS is disabled due to the lack of relevant config'); } const { authorization } = config.discord; const channelId = ctx.req.param('channelId'); diff --git a/lib/routes/discourse/utils.ts b/lib/routes/discourse/utils.ts index 1927fd11a3..897738ed72 100644 --- a/lib/routes/discourse/utils.ts +++ b/lib/routes/discourse/utils.ts @@ -2,7 +2,7 @@ import { config } from '@/config'; function getConfig(ctx) { if (!config.discourse.config[ctx.req.param('configId')]) { - throw new Error('Discourse RSS is disabled due to the lack of relevant config'); + throw new Error('Discourse RSS is disabled due to the lack of relevant config'); } return config.discourse.config[ctx.req.param('configId')]; } diff --git a/lib/routes/ehentai/favorites.ts b/lib/routes/ehentai/favorites.ts index a5a1d8ad55..2c0dac5a75 100644 --- a/lib/routes/ehentai/favorites.ts +++ b/lib/routes/ehentai/favorites.ts @@ -22,7 +22,7 @@ export const route: Route = { async function handler(ctx) { if (!EhAPI.has_cookie) { - throw new Error('Ehentai favorites RSS is disabled due to the lack of relevant config'); + throw new Error('Ehentai favorites RSS is disabled due to the lack of relevant config'); } const favcat = ctx.req.param('favcat') ? Number.parseInt(ctx.req.param('favcat')) : 0; const page = ctx.req.param('page'); diff --git a/lib/routes/github/follower.ts b/lib/routes/github/follower.ts index 554de31f35..6a6dabb9a8 100644 --- a/lib/routes/github/follower.ts +++ b/lib/routes/github/follower.ts @@ -27,7 +27,7 @@ export const route: Route = { async function handler(ctx) { if (!config.github || !config.github.access_token) { - throw new Error('GitHub follower RSS is disabled due to the lack of relevant config'); + throw new Error('GitHub follower RSS is disabled due to the lack of relevant config'); } const user = ctx.req.param('user'); diff --git a/lib/routes/github/notifications.ts b/lib/routes/github/notifications.ts index c12ec85a7c..e0594bd46f 100644 --- a/lib/routes/github/notifications.ts +++ b/lib/routes/github/notifications.ts @@ -36,7 +36,7 @@ export const route: Route = { async function handler(ctx) { if (!config.github || !config.github.access_token) { - throw new Error('GitHub trending RSS is disabled due to the lack of relevant config'); + throw new Error('GitHub trending RSS is disabled due to the lack of relevant config'); } const headers = { Accept: 'application/vnd.github.v3+json', diff --git a/lib/routes/github/star.ts b/lib/routes/github/star.ts index 309f513906..06e2b1b2ba 100644 --- a/lib/routes/github/star.ts +++ b/lib/routes/github/star.ts @@ -27,7 +27,7 @@ export const route: Route = { async function handler(ctx) { if (!config.github || !config.github.access_token) { - throw new Error('GitHub star RSS is disabled due to the lack of relevant config'); + throw new Error('GitHub star RSS is disabled due to the lack of relevant config'); } const user = ctx.req.param('user'); const repo = ctx.req.param('repo'); diff --git a/lib/routes/github/trending.ts b/lib/routes/github/trending.ts index a8872bfe35..fe2ec6cde1 100644 --- a/lib/routes/github/trending.ts +++ b/lib/routes/github/trending.ts @@ -44,7 +44,7 @@ export const route: Route = { async function handler(ctx) { if (!config.github || !config.github.access_token) { - throw new Error('GitHub trending RSS is disabled due to the lack of relevant config'); + throw new Error('GitHub trending RSS is disabled due to the lack of relevant config'); } const since = ctx.req.param('since'); const language = ctx.req.param('language') === 'any' ? '' : ctx.req.param('language'); diff --git a/lib/routes/google/fonts.ts b/lib/routes/google/fonts.ts index c21ac8b495..2ee8551da8 100644 --- a/lib/routes/google/fonts.ts +++ b/lib/routes/google/fonts.ts @@ -42,7 +42,7 @@ export const route: Route = { | date | trending | popularity | alpha | style | :::warning - This route requires API key, therefore it's only available when self-hosting, refer to the [Deploy Guide](https://docs.rsshub.app/install/#configuration-route-specific-configurations) for route-specific configurations. + This route requires API key, therefore it's only available when self-hosting, refer to the [Deploy Guide](https://docs.rsshub.app/deploy/config#route-specific-configurations) for route-specific configurations. :::`, }; diff --git a/lib/routes/hit/namespace.ts b/lib/routes/hit/namespace.ts index 0d2385c40b..e4eae82546 100644 --- a/lib/routes/hit/namespace.ts +++ b/lib/routes/hit/namespace.ts @@ -4,6 +4,6 @@ export const namespace: Namespace = { name: '哈尔滨工业大学', url: 'jwc.hit.edu.cn', description: `:::warning -哈工大网站疑似禁止了\`rsshub.app\`的访问,使用路由需要自行 [部署](https://docs.rsshub.app/install)。 +哈工大网站疑似禁止了\`rsshub.app\`的访问,使用路由需要自行 [部署](https://docs.rsshub.app/deploy/)。 :::`, }; diff --git a/lib/routes/instagram/private-api/index.ts b/lib/routes/instagram/private-api/index.ts index ce6af2cb60..92f1aaedad 100644 --- a/lib/routes/instagram/private-api/index.ts +++ b/lib/routes/instagram/private-api/index.ts @@ -78,7 +78,7 @@ export const route: Route = { maintainers: ['oppilate', 'DIYgod'], handler, description: `:::warning -Due to [Instagram Private API](https://github.com/dilame/instagram-private-api) restrictions, you have to setup your credentials on the server. 2FA is not supported. See [deployment guide](https://docs.rsshub.app/install/) for more. +Due to [Instagram Private API](https://github.com/dilame/instagram-private-api) restrictions, you have to setup your credentials on the server. 2FA is not supported. See [deployment guide](https://docs.rsshub.app/deploy/) for more. :::`, }; diff --git a/lib/routes/instagram/private-api/utils.ts b/lib/routes/instagram/private-api/utils.ts index 2ac6fd9480..f6cdeac658 100644 --- a/lib/routes/instagram/private-api/utils.ts +++ b/lib/routes/instagram/private-api/utils.ts @@ -6,7 +6,7 @@ const ig = new IgApiClient(); async function login(ig, cache) { if (!config.instagram || !config.instagram.username || !config.instagram.password) { - throw new Error('Instagram RSS is disabled due to the lack of relevant config'); + throw new Error('Instagram RSS is disabled due to the lack of relevant config'); } const LOGIN_CACHE_KEY = 'instagram:login'; const { username, password } = config.instagram; diff --git a/lib/routes/instagram/web-api/index.ts b/lib/routes/instagram/web-api/index.ts index 33f916331b..f53da7ff0c 100644 --- a/lib/routes/instagram/web-api/index.ts +++ b/lib/routes/instagram/web-api/index.ts @@ -33,7 +33,7 @@ You may need to setup cookie for a less restrictive rate limit and private profi async function handler(ctx) { // if (!config.instagram || !config.instagram.cookie) { - // throw Error('Instagram RSS is disabled due to the lack of relevant config'); + // throw Error('Instagram RSS is disabled due to the lack of relevant config'); // } const availableCategories = ['user', 'tags']; const { category, key } = ctx.req.param(); diff --git a/lib/routes/iwara/subscriptions.ts b/lib/routes/iwara/subscriptions.ts index 4bf05913e7..a845e7dd46 100644 --- a/lib/routes/iwara/subscriptions.ts +++ b/lib/routes/iwara/subscriptions.ts @@ -45,13 +45,13 @@ export const route: Route = { handler, url: 'ecchi.iwara.tv/', description: `:::warning - This route requires username and password, therefore it's only available when self-hosting, refer to the [Deploy Guide](/install/#route-specific-configurations) for route-specific configurations. + This route requires username and password, therefore it's only available when self-hosting, refer to the [Deploy Guide](https://docs.rsshub.app/deploy/config#route-specific-configurations) for route-specific configurations. :::`, }; async function handler() { if (!config.iwara || !config.iwara.username || !config.iwara.password) { - throw new Error('Iwara subscription RSS is disabled due to the lack of relevant config'); + throw new Error('Iwara subscription RSS is disabled due to the lack of relevant config'); } const rootUrl = `https://www.iwara.tv`; diff --git a/lib/routes/mail/imap.ts b/lib/routes/mail/imap.ts index 93ae006466..fa9be620c1 100644 --- a/lib/routes/mail/imap.ts +++ b/lib/routes/mail/imap.ts @@ -23,7 +23,7 @@ async function handler(ctx) { }; if (!mailConfig.username || !mailConfig.password || !mailConfig.host || !mailConfig.port) { - throw new Error('Email Inbox RSS is disabled due to the lack of relevant config'); + throw new Error('Email Inbox RSS is disabled due to the lack of relevant config'); } const client = new ImapFlow({ diff --git a/lib/routes/manhuagui/subscribe.ts b/lib/routes/manhuagui/subscribe.ts index ebc9ae50e8..7e94c64770 100644 --- a/lib/routes/manhuagui/subscribe.ts +++ b/lib/routes/manhuagui/subscribe.ts @@ -45,7 +45,7 @@ export const route: Route = { async function handler() { if (!config.manhuagui || !config.manhuagui.cookie) { - throw new Error('manhuagui RSS is disabled due to the lack of relevant config'); + throw new Error('manhuagui RSS is disabled due to the lack of relevant config'); } const cookie = config.manhuagui.cookie; const response = await got({ diff --git a/lib/routes/mastodon/namespace.ts b/lib/routes/mastodon/namespace.ts index f0f3f3dc48..0d8b2473cc 100644 --- a/lib/routes/mastodon/namespace.ts +++ b/lib/routes/mastodon/namespace.ts @@ -9,6 +9,6 @@ Official user RSS: - RSS: \`https://**:instance**/users/**:username**.rss\` ([Example](https://pawoo.net/users/pawoo_support.rss)) - Atom: ~~\`https://**:instance**/users/**:username**.atom\`~~ (Only for pawoo.net, [example](https://pawoo.net/users/pawoo_support.atom)) -These feed do not include boosts (a.k.a. reblogs). RSSHub provides a feed for user timeline based on the Mastodon API, but to use that, you may need to create application on a Mastodon instance, and configure your RSSHub instance. Check the [Deploy Guide](/install/#route-specific-configurations) for route-specific configurations. +These feed do not include boosts (a.k.a. reblogs). RSSHub provides a feed for user timeline based on the Mastodon API, but to use that, you may need to create application on a Mastodon instance, and configure your RSSHub instance. Check the [Deploy Guide](https://docs.rsshub.app/deploy/config#route-specific-configurations) for route-specific configurations. :::`, }; diff --git a/lib/routes/mastodon/utils.ts b/lib/routes/mastodon/utils.ts index d4492f007a..f25cda95e5 100644 --- a/lib/routes/mastodon/utils.ts +++ b/lib/routes/mastodon/utils.ts @@ -93,7 +93,7 @@ async function getAccountIdByAcct(acct) { const site = mastodonConfig.apiHost || acctHost; const acctDomain = mastodonConfig.acctDomain || acctHost; if (!(site && acctDomain)) { - throw new Error('Mastodon RSS is disabled due to the lack of relevant config'); + throw new Error('Mastodon RSS is disabled due to the lack of relevant config'); } if (!config.feature.allow_user_supply_unsafe_domain && !allowSiteList.includes(site)) { throw new Error(`RSS for this domain is disabled unless 'ALLOW_USER_SUPPLY_UNSAFE_DOMAIN' is set to 'true' or 'MASTODON_API_HOST' is set.`); diff --git a/lib/routes/mihoyo/bbs/cache.ts b/lib/routes/mihoyo/bbs/cache.ts index 05adf54814..9e56eafa74 100644 --- a/lib/routes/mihoyo/bbs/cache.ts +++ b/lib/routes/mihoyo/bbs/cache.ts @@ -4,7 +4,7 @@ import { config } from '@/config'; const getUserFullInfo = (ctx, uid) => { if (!uid && !config.mihoyo.cookie) { - throw new Error('GetUserFullInfo is not available due to the absense of [Miyoushe Cookie]. Check relevant config tutorial'); + throw new Error('GetUserFullInfo is not available due to the absense of [Miyoushe Cookie]. Check relevant config tutorial'); } uid ||= ''; const key = 'mihoyo:user-full-info-uid-' + uid; diff --git a/lib/routes/mihoyo/bbs/timeline.ts b/lib/routes/mihoyo/bbs/timeline.ts index 4a3ce513e0..04795c4807 100644 --- a/lib/routes/mihoyo/bbs/timeline.ts +++ b/lib/routes/mihoyo/bbs/timeline.ts @@ -37,7 +37,7 @@ export const route: Route = { async function handler(ctx) { if (!config.mihoyo.cookie) { - throw new Error('Miyoushe Timeline is not available due to the absense of [Miyoushe Cookie]. Check relevant config tutorial'); + throw new Error('Miyoushe Timeline is not available due to the absense of [Miyoushe Cookie]. Check relevant config tutorial'); } const page_size = ctx.req.query('limit') || '20'; diff --git a/lib/routes/newrank/douyin.ts b/lib/routes/newrank/douyin.ts index dabdae87d9..4a77715a6a 100644 --- a/lib/routes/newrank/douyin.ts +++ b/lib/routes/newrank/douyin.ts @@ -31,7 +31,7 @@ export const route: Route = { async function handler(ctx) { if (!config.newrank || !config.newrank.cookie) { - throw new Error('newrank RSS is disabled due to the lack of relevant config'); + throw new Error('newrank RSS is disabled due to the lack of relevant config'); } const uid = ctx.req.param('dyid'); const nonce = utils.random_nonce(9); diff --git a/lib/routes/newrank/wechat.ts b/lib/routes/newrank/wechat.ts index d84a5c1451..592d83a06c 100644 --- a/lib/routes/newrank/wechat.ts +++ b/lib/routes/newrank/wechat.ts @@ -30,7 +30,7 @@ export const route: Route = { async function handler(ctx) { if (!config.newrank || !config.newrank.cookie) { - throw new Error('newrank RSS is disabled due to the lack of relevant config'); + throw new Error('newrank RSS is disabled due to the lack of relevant config'); } const uid = ctx.req.param('wxid'); const nonce = utils.random_nonce(9); diff --git a/lib/routes/nhentai/other.ts b/lib/routes/nhentai/other.ts index 027c1661df..191a140c3c 100644 --- a/lib/routes/nhentai/other.ts +++ b/lib/routes/nhentai/other.ts @@ -11,7 +11,7 @@ export const route: Route = { parameters: { key: 'Filter term, can be: `parody`, `character`, `tag`, `artist`, `group`, `language` or `category`', keyword: 'Filter value', - mode: 'mode, `simple` to only show cover, `detail` to show all pages, `torrent` to include Magnet URI, need login, refer to [Route-specific Configurations](/install/#configuration-route-specific-configurations), default to `simple`', + mode: 'mode, `simple` to only show cover, `detail` to show all pages, `torrent` to include Magnet URI, need login, refer to [Route-specific Configurations](https://docs.rsshub.app/deploy/config#route-specific-configurations), default to `simple`', }, features: { requireConfig: false, diff --git a/lib/routes/nhentai/search.ts b/lib/routes/nhentai/search.ts index df945511fd..cb26cf29e6 100644 --- a/lib/routes/nhentai/search.ts +++ b/lib/routes/nhentai/search.ts @@ -8,7 +8,7 @@ export const route: Route = { example: '/nhentai/search/language%3Ajapanese+-scat+-yaoi+-guro+-"mosaic+censorship"', parameters: { keyword: 'Keywords for search. You can copy the content after `q=` after searching on the original website, or you can enter it directly. See the [official website](https://nhentai.net/info/) for details', - mode: 'mode, `simple` to only show cover, `detail` to show all pages, `torrent` to include Magnet URI, need login, refer to [Route-specific Configurations](/install/#configuration-route-specific-configurations), default to `simple`', + mode: 'mode, `simple` to only show cover, `detail` to show all pages, `torrent` to include Magnet URI, need login, refer to [Route-specific Configurations](https://docs.rsshub.app/deploy/config#route-specific-configurations), default to `simple`', }, features: { requireConfig: false, diff --git a/lib/routes/nhentai/util.ts b/lib/routes/nhentai/util.ts index 9874a684c2..b1329a29f1 100644 --- a/lib/routes/nhentai/util.ts +++ b/lib/routes/nhentai/util.ts @@ -88,7 +88,7 @@ const getDetails = (cache, simples, limit) => Promise.all(simples.slice(0, limit const getTorrents = async (cache, simples, limit) => { if (!config.nhentai || !config.nhentai.username || !config.nhentai.password) { - throw new Error('nhentai RSS with torrents is disabled due to the lack of relevant config'); + throw new Error('nhentai RSS with torrents is disabled due to the lack of relevant config'); } const cookie = await getCookie(config.nhentai.username, config.nhentai.password, cache); if (!cookie) { diff --git a/lib/routes/notion/database.ts b/lib/routes/notion/database.ts index eda7853547..833f4b1855 100644 --- a/lib/routes/notion/database.ts +++ b/lib/routes/notion/database.ts @@ -55,7 +55,7 @@ export const route: Route = { async function handler(ctx) { if (!config.notion.key) { - throw new Error('Notion RSS is disabled due to the lack of NOTION_TOKEN(relevant config)'); + throw new Error('Notion RSS is disabled due to the lack of NOTION_TOKEN(relevant config)'); } const databaseId = ctx.req.param('databaseId'); diff --git a/lib/routes/notion/namespace.ts b/lib/routes/notion/namespace.ts index c07c16baf5..2910f91ad7 100644 --- a/lib/routes/notion/namespace.ts +++ b/lib/routes/notion/namespace.ts @@ -4,7 +4,7 @@ export const namespace: Namespace = { name: 'Notion', url: 'notion.so', description: `:::warning -Need to set up Notion integration, please refer to [Route-specific Configurations](https://docs.rsshub.app/install/#Deployment) for details. +Need to set up Notion integration, please refer to [Route-specific Configurations](https://docs.rsshub.app/deploy/config#route-specific-configurations) for details. ::: :::tip Recommendation diff --git a/lib/routes/pianyuan/utils.ts b/lib/routes/pianyuan/utils.ts index 920e953d6a..7948eac5c3 100644 --- a/lib/routes/pianyuan/utils.ts +++ b/lib/routes/pianyuan/utils.ts @@ -47,7 +47,7 @@ async function getCookie(cache) { let py_loginauth = await cache.get(loginauth_key); if (!py_loginauth) { if (!config.pianyuan || !config.pianyuan.cookie) { - throw new Error('pianyuan is disabled due to the lack of relevant config'); + throw new Error('pianyuan is disabled due to the lack of relevant config'); } py_loginauth = config.pianyuan.cookie; } diff --git a/lib/routes/pixiv/bookmarks.ts b/lib/routes/pixiv/bookmarks.ts index 862cc2ead9..ea5fab4bae 100644 --- a/lib/routes/pixiv/bookmarks.ts +++ b/lib/routes/pixiv/bookmarks.ts @@ -32,7 +32,7 @@ export const route: Route = { async function handler(ctx) { if (!config.pixiv || !config.pixiv.refreshToken) { - throw new Error('pixiv RSS is disabled due to the lack of relevant config'); + throw new Error('pixiv RSS is disabled due to the lack of relevant config'); } const id = ctx.req.param('id'); diff --git a/lib/routes/pixiv/illustfollow.ts b/lib/routes/pixiv/illustfollow.ts index 33072455f9..569499898e 100644 --- a/lib/routes/pixiv/illustfollow.ts +++ b/lib/routes/pixiv/illustfollow.ts @@ -40,7 +40,7 @@ export const route: Route = { async function handler() { if (!config.pixiv || !config.pixiv.refreshToken) { - throw new Error('pixiv RSS is disabled due to the lack of relevant config'); + throw new Error('pixiv RSS is disabled due to the lack of relevant config'); } const token = await getToken(cache.tryGet); diff --git a/lib/routes/pixiv/ranking.ts b/lib/routes/pixiv/ranking.ts index 5f6205ce55..3f35769417 100644 --- a/lib/routes/pixiv/ranking.ts +++ b/lib/routes/pixiv/ranking.ts @@ -84,7 +84,7 @@ export const route: Route = { async function handler(ctx) { if (!config.pixiv || !config.pixiv.refreshToken) { - throw new Error('pixiv RSS is disabled due to the lack of relevant config'); + throw new Error('pixiv RSS is disabled due to the lack of relevant config'); } const mode = alias[ctx.req.param('mode')] ?? ctx.req.param('mode'); diff --git a/lib/routes/pixiv/search.ts b/lib/routes/pixiv/search.ts index e84b6b9900..30c2a04561 100644 --- a/lib/routes/pixiv/search.ts +++ b/lib/routes/pixiv/search.ts @@ -30,7 +30,7 @@ export const route: Route = { async function handler(ctx) { if (!config.pixiv || !config.pixiv.refreshToken) { - throw new Error('pixiv RSS is disabled due to the lack of relevant config'); + throw new Error('pixiv RSS is disabled due to the lack of relevant config'); } const keyword = ctx.req.param('keyword'); diff --git a/lib/routes/pixiv/user.ts b/lib/routes/pixiv/user.ts index bb1a185dea..47a1bc3ccd 100644 --- a/lib/routes/pixiv/user.ts +++ b/lib/routes/pixiv/user.ts @@ -31,7 +31,7 @@ export const route: Route = { async function handler(ctx) { if (!config.pixiv || !config.pixiv.refreshToken) { - throw new Error('pixiv RSS is disabled due to the lack of relevant config'); + throw new Error('pixiv RSS is disabled due to the lack of relevant config'); } const id = ctx.req.param('id'); diff --git a/lib/routes/sdu/data.ts b/lib/routes/sdu/data.ts index 079cd009c6..8b5f0c6c0d 100644 --- a/lib/routes/sdu/data.ts +++ b/lib/routes/sdu/data.ts @@ -5,7 +5,7 @@ export default { route: '/news', source: ['/*path', '/'], titlePrefix: '(威海)新闻网|', - docs: 'https://docs.rsshub.app/university#shan-dong-da-xue-wei-hai', + docs: 'https://docs.rsshub.app/routes/university#shan-dong-da-xue-wei-hai', getTarget(url) { return this.route + '/' + url.replace(/\.htm$/, ''); }, @@ -62,7 +62,7 @@ export default { route: '/jwc', source: ['/*path', '/'], titlePrefix: '(威海)教务处|', - docs: 'https://docs.rsshub.app/university#shan-dong-da-xue-wei-hai', + docs: 'https://docs.rsshub.app/routes/university#shan-dong-da-xue-wei-hai', getTarget(url) { return this.route + '/' + url.replace(/\.htm$/, ''); }, diff --git a/lib/routes/sehuatang/user.ts b/lib/routes/sehuatang/user.ts index 1d4d076fee..01fbbb4cac 100644 --- a/lib/routes/sehuatang/user.ts +++ b/lib/routes/sehuatang/user.ts @@ -33,7 +33,7 @@ export const route: Route = { async function handler(ctx) { if (!config.sehuatang.cookie) { - throw new Error('Sehuatang RSS is disabled due to the lack of relevant config'); + throw new Error('Sehuatang RSS is disabled due to the lack of relevant config'); } // 从Url参数中获取uid const uid = ctx.req.param('uid'); diff --git a/lib/routes/spotify/utils.ts b/lib/routes/spotify/utils.ts index 919304677b..6103efa730 100644 --- a/lib/routes/spotify/utils.ts +++ b/lib/routes/spotify/utils.ts @@ -4,7 +4,7 @@ import got from '@/utils/got'; // Token used to retrieve public information. async function getPublicToken() { if (!config.spotify || !config.spotify.clientId || !config.spotify.clientSecret) { - throw new Error('Spotify public RSS is disabled due to the lack of relevant config'); + throw new Error('Spotify public RSS is disabled due to the lack of relevant config'); } const { clientId, clientSecret } = config.spotify; @@ -26,7 +26,7 @@ async function getPublicToken() { // Note that we don't use PKCE since the client secret shall be safe on the server. async function getPrivateToken() { if (!config.spotify || !config.spotify.clientId || !config.spotify.clientSecret || !config.spotify.refreshToken) { - throw new Error('Spotify private RSS is disabled due to the lack of relevant config'); + throw new Error('Spotify private RSS is disabled due to the lack of relevant config'); } const { clientId, clientSecret, refreshToken } = config.spotify; diff --git a/lib/routes/stbu/jsjxy.ts b/lib/routes/stbu/jsjxy.ts index 259f037bfb..81f739a9ff 100644 --- a/lib/routes/stbu/jsjxy.ts +++ b/lib/routes/stbu/jsjxy.ts @@ -30,7 +30,7 @@ export const route: Route = { handler, url: 'jsjxy.stbu.edu.cn/news', description: `:::warning -计算机学院通知公告疑似禁止了非大陆 IP 访问,使用路由需要自行 [部署](https://docs.rsshub.app/install)。 +计算机学院通知公告疑似禁止了非大陆 IP 访问,使用路由需要自行 [部署](https://docs.rsshub.app/deploy/)。 :::`, }; diff --git a/lib/routes/telegram/stickerpack.ts b/lib/routes/telegram/stickerpack.ts index 4525169b5c..6633850910 100644 --- a/lib/routes/telegram/stickerpack.ts +++ b/lib/routes/telegram/stickerpack.ts @@ -22,7 +22,7 @@ export const route: Route = { async function handler(ctx) { if (!config.telegram || !config.telegram.token) { - throw new Error('Telegram Sticker Pack RSS is disabled due to the lack of relevant config'); + throw new Error('Telegram Sticker Pack RSS is disabled due to the lack of relevant config'); } const name = ctx.req.param('name'); diff --git a/lib/routes/twitter/likes.ts b/lib/routes/twitter/likes.ts index 509d0b489d..1c62479b96 100644 --- a/lib/routes/twitter/likes.ts +++ b/lib/routes/twitter/likes.ts @@ -22,7 +22,7 @@ export const route: Route = { async function handler(ctx) { if (!config.twitter || !config.twitter.consumer_key || !config.twitter.consumer_secret) { - throw new Error('Twitter RSS is disabled due to the lack of relevant config'); + throw new Error('Twitter RSS is disabled due to the lack of relevant config'); } const id = ctx.req.param('id'); const client = await utils.getAppClient(); diff --git a/lib/routes/twitter/trends.ts b/lib/routes/twitter/trends.ts index 0757fe23c1..19ea43b55a 100644 --- a/lib/routes/twitter/trends.ts +++ b/lib/routes/twitter/trends.ts @@ -22,7 +22,7 @@ export const route: Route = { async function handler(ctx) { if (!config.twitter || !config.twitter.consumer_key || !config.twitter.consumer_secret) { - throw new Error('Twitter RSS is disabled due to the lack of relevant config'); + throw new Error('Twitter RSS is disabled due to the lack of relevant config'); } const woeid = ctx.req.param('woeid') ?? 1; // Global information is available by using 1 as the WOEID const client = await utils.getAppClient(); diff --git a/lib/routes/ucas/rader.ts b/lib/routes/ucas/rader.ts index 77a59e427b..ccea519da9 100644 --- a/lib/routes/ucas/rader.ts +++ b/lib/routes/ucas/rader.ts @@ -4,7 +4,7 @@ export default { zhaopin: [ { title: '招聘信息-博士后', - docs: 'https://docs.rsshub.app/university#zhong-guo-ke-xue-yuan-da-xue-zhao-pin-xin-xi', + docs: 'https://docs.rsshub.app/routes/university#zhong-guo-ke-xue-yuan-da-xue-zhao-pin-xin-xi', source: '/*', target: (params, url) => { if (new URL(url).searchParams.get('c') === '6') { @@ -14,7 +14,7 @@ export default { }, { title: '招聘信息-课题项目聘用', - docs: 'https://docs.rsshub.app/university#zhong-guo-ke-xue-yuan-da-xue-zhao-pin-xin-xi', + docs: 'https://docs.rsshub.app/routes/university#zhong-guo-ke-xue-yuan-da-xue-zhao-pin-xin-xi', source: '/*', target: (params, url) => { if (new URL(url).searchParams.get('c') === '5') { @@ -24,7 +24,7 @@ export default { }, { title: '招聘信息-管理支撑人才', - docs: 'https://docs.rsshub.app/university#zhong-guo-ke-xue-yuan-da-xue-zhao-pin-xin-xi', + docs: 'https://docs.rsshub.app/routes/university#zhong-guo-ke-xue-yuan-da-xue-zhao-pin-xin-xi', source: '/*', target: (params, url) => { if (new URL(url).searchParams.get('c') === '4') { @@ -34,7 +34,7 @@ export default { }, { title: '招聘信息-科学科研人才', - docs: 'https://docs.rsshub.app/university#zhong-guo-ke-xue-yuan-da-xue-zhao-pin-xin-xi', + docs: 'https://docs.rsshub.app/routes/university#zhong-guo-ke-xue-yuan-da-xue-zhao-pin-xin-xi', source: '/*', target: (params, url) => { if (new URL(url).searchParams.get('c') === '3') { diff --git a/lib/routes/weibo/friends.ts b/lib/routes/weibo/friends.ts index c6d04e7307..4aeb9d1980 100644 --- a/lib/routes/weibo/friends.ts +++ b/lib/routes/weibo/friends.ts @@ -45,7 +45,7 @@ export const route: Route = { async function handler(ctx) { if (!config.weibo.cookies) { - throw new Error('Weibo Friends Timeline is not available due to the absense of [Weibo Cookies]. Check relevant config tutorial'); + throw new Error('Weibo Friends Timeline is not available due to the absense of [Weibo Cookies]. Check relevant config tutorial'); } let displayVideo = '1'; diff --git a/lib/routes/weibo/group.ts b/lib/routes/weibo/group.ts index 884fe116c5..c3850822c5 100644 --- a/lib/routes/weibo/group.ts +++ b/lib/routes/weibo/group.ts @@ -38,7 +38,7 @@ export const route: Route = { async function handler(ctx) { if (!config.weibo.cookies) { - throw new Error('Weibo Group Timeline is not available due to the absense of [Weibo Cookies]. Check relevant config tutorial'); + throw new Error('Weibo Group Timeline is not available due to the absense of [Weibo Cookies]. Check relevant config tutorial'); } const gid = ctx.req.param('gid'); diff --git a/lib/routes/youtube/channel.ts b/lib/routes/youtube/channel.ts index dbfb5d1bbd..d5c557ffcf 100644 --- a/lib/routes/youtube/channel.ts +++ b/lib/routes/youtube/channel.ts @@ -38,7 +38,7 @@ YouTube provides official RSS feeds for channels, for instance [https://www.yout async function handler(ctx) { if (!config.youtube || !config.youtube.key) { - throw new Error('YouTube RSS is disabled due to the lack of relevant config'); + throw new Error('YouTube RSS is disabled due to the lack of relevant config'); } const id = ctx.req.param('id'); const embed = !ctx.req.param('embed'); diff --git a/lib/routes/youtube/custom.ts b/lib/routes/youtube/custom.ts index 9ccda071cf..944548ba8e 100644 --- a/lib/routes/youtube/custom.ts +++ b/lib/routes/youtube/custom.ts @@ -21,7 +21,7 @@ export const route: Route = { async function handler(ctx) { if (!config.youtube || !config.youtube.key) { - throw new Error('YouTube RSS is disabled due to the lack of relevant config'); + throw new Error('YouTube RSS is disabled due to the lack of relevant config'); } const username = ctx.req.param('username'); const embed = !ctx.req.param('embed'); diff --git a/lib/routes/youtube/live.ts b/lib/routes/youtube/live.ts index e9d1e3ef43..680c66582e 100644 --- a/lib/routes/youtube/live.ts +++ b/lib/routes/youtube/live.ts @@ -26,7 +26,7 @@ export const route: Route = { async function handler(ctx) { if (!config.youtube || !config.youtube.key) { - throw new Error('YouTube RSS is disabled due to the lack of relevant config'); + throw new Error('YouTube RSS is disabled due to the lack of relevant config'); } const username = ctx.req.param('username'); const embed = !ctx.req.param('embed'); diff --git a/lib/routes/youtube/playlist.ts b/lib/routes/youtube/playlist.ts index e46f886c81..70602d066f 100644 --- a/lib/routes/youtube/playlist.ts +++ b/lib/routes/youtube/playlist.ts @@ -24,7 +24,7 @@ export const route: Route = { async function handler(ctx) { if (!config.youtube || !config.youtube.key) { - throw new Error('YouTube RSS is disabled due to the lack of relevant config'); + throw new Error('YouTube RSS is disabled due to the lack of relevant config'); } const id = ctx.req.param('id'); const embed = !ctx.req.param('embed'); diff --git a/lib/routes/youtube/subscriptions.ts b/lib/routes/youtube/subscriptions.ts index a47f5c0b14..abda50eaf5 100644 --- a/lib/routes/youtube/subscriptions.ts +++ b/lib/routes/youtube/subscriptions.ts @@ -49,7 +49,7 @@ export const route: Route = { async function handler(ctx) { if (!config.youtube || !config.youtube.key || !config.youtube.clientId || !config.youtube.clientSecret || !config.youtube.refreshToken) { - throw new Error('YouTube RSS is disabled due to the lack of relevant config'); + throw new Error('YouTube RSS is disabled due to the lack of relevant config'); } const embed = !ctx.req.param('embed'); diff --git a/lib/routes/youtube/user.ts b/lib/routes/youtube/user.ts index 7136643f32..bc910c3441 100644 --- a/lib/routes/youtube/user.ts +++ b/lib/routes/youtube/user.ts @@ -32,7 +32,7 @@ export const route: Route = { async function handler(ctx) { if (!config.youtube || !config.youtube.key) { - throw new Error('YouTube RSS is disabled due to the lack of relevant config'); + throw new Error('YouTube RSS is disabled due to the lack of relevant config'); } const username = ctx.req.param('username'); const embed = !ctx.req.param('embed'); diff --git a/lib/routes/zodgame/forum.ts b/lib/routes/zodgame/forum.ts index 04c5a1b305..b219adc3d0 100644 --- a/lib/routes/zodgame/forum.ts +++ b/lib/routes/zodgame/forum.ts @@ -40,7 +40,7 @@ async function handler(ctx) { const cookie = config.zodgame.cookie; if (cookie === undefined) { - throw new Error('Zodgame RSS is disabled due to the lack of relevant config'); + throw new Error('Zodgame RSS is disabled due to the lack of relevant config'); } const response = await got({ diff --git a/lib/views/error.tsx b/lib/views/error.tsx index 9aedf58649..bdab930c16 100644 --- a/lib/views/error.tsx +++ b/lib/views/error.tsx @@ -88,7 +88,7 @@ const Index: FC<{

Please consider{' '} - + sponsoring {' '} to help keep this open source project alive. diff --git a/lib/views/index.tsx b/lib/views/index.tsx index c47564cc79..03850b6a8c 100644 --- a/lib/views/index.tsx +++ b/lib/views/index.tsx @@ -171,7 +171,7 @@ const Index: FC<{ debugQuery: string | undefined }> = ({ debugQuery }) => { - +

@@ -204,7 +204,7 @@ const Index: FC<{ debugQuery: string | undefined }> = ({ debugQuery }) => {

Please consider{' '} - + sponsoring {' '} to help keep this open source project alive. From f287945d6987a7d89141d0ba16546bd1a72dc4e8 Mon Sep 17 00:00:00 2001 From: xtex Date: Sat, 30 Mar 2024 16:27:24 +0800 Subject: [PATCH 80/99] feat(route): /minecraft/version, add version type filter and wiki link generator (#14941) --- lib/routes/minecraft/version.ts | 112 +++++++++++++++++++++++++++----- 1 file changed, 95 insertions(+), 17 deletions(-) diff --git a/lib/routes/minecraft/version.ts b/lib/routes/minecraft/version.ts index c04d8430f2..f53a6c38c3 100644 --- a/lib/routes/minecraft/version.ts +++ b/lib/routes/minecraft/version.ts @@ -1,11 +1,15 @@ import { Route } from '@/types'; import got from '@/utils/got'; +import { Context } from 'hono'; export const route: Route = { - path: '/version', + path: '/version/:versionType?/:linkType?', categories: ['game'], example: '/minecraft/version', - parameters: {}, + parameters: { + versionType: `Game version type, \`all\` by default`, + linkType: `Link added to feed, \`official\` by default`, + }, features: { requireConfig: false, requirePuppeteer: false, @@ -20,39 +24,113 @@ export const route: Route = { }, ], name: 'Java Game Update', - maintainers: ['TheresaQWQ'], + maintainers: ['TheresaQWQ', 'xtexChooser'], handler, url: 'minecraft.net/', + description: ` +| Version | versionType | +| -------------------------- | ----------- | +| 正式版 | release | +| 快照 | snapshot | +| Alpha 及更早的版本 | old_alpha | +| Beta 版 | old_beta | +| Target | linkType | +| -------------------------- | -------- | +| minecraft.net | official | +| 英文 Minecraft Wiki 版本页 | enwiki | +| 中文 Minecraft Wiki 版本页 | zhwiki | +`, + zh: { + name: 'Java版游戏更新', + }, }; -async function handler() { - const url = 'https://launchermeta.mojang.com/mc/game/version_manifest.json'; +interface VersionInManifest { + id: string; + type: string; + releaseTime: string; +} - const response = await got({ +const typeName = { + release: '正式版', + snapshot: '快照', + old_alpha: 'Alpha及更早的版本', + old_beta: 'Beta版', +}; + +const linkFormatter: any = { + official: () => `https://www.minecraft.net`, + enwiki: (item: VersionInManifest) => { + let id = item.id; + if (item.type === 'old_beta' && id.startsWith('b')) { + id = `Beta ${id.substring(1)}`; + } + if (item.type === 'old_alpha') { + if (id.startsWith('a')) { + id = `Alpha ${id.substring(1)}`; + } else if (id.startsWith('c')) { + id = `Classic ${id.substring(1)}`; + } else if (id.startsWith('inf-')) { + id = `Infdev`; + } else if (id.startsWith('rd-')) { + id = `pre-Classic ${id}`; + } + } + return `https://minecraft.wiki/w/Java Edition ${id}`; + }, + zhwiki: (item: VersionInManifest) => { + let id = item.id; + if (item.type === 'release') { + id = `Java版${id}`; + } + if (item.type === 'old_beta' && id.startsWith('b')) { + id = `Java版Beta ${id.substring(1)}`; + } + if (item.type === 'old_alpha') { + if (id.startsWith('a')) { + id = `Java版Alpha ${id.substring(1)}`; + } else if (id.startsWith('c')) { + id = `Java版Classic ${id.substring(1)}`; + } else if (id.startsWith('inf-')) { + id = `Java版Infdev`; + } else if (id.startsWith('rd-')) { + id = `Java版pre-Classic ${id}`; + } + } + return `https://zh.minecraft.wiki/w/${id}`; + }, +}; + +async function handler(ctx?: Context) { + const url = ctx?.req.query('mcmanifest') ?? 'https://piston-meta.mojang.com/mc/game/version_manifest_v2.json'; + + const response: any = await got({ method: 'get', url, + responseType: 'json', }); - const typeMap = { - release: '正式版', - snapshot: '快照', - old_alpha: '过时的预览版', - old_beta: '过时的测试版', - }; + let data: VersionInManifest[] = response.data.versions; - const data = response.data.versions; + const versionType = ctx?.req.param('versionType') ?? 'all'; + const linkType = ctx?.req.param('linkType') ?? 'official'; + const linker = linkFormatter[linkType] ?? linkFormatter.official; - const title = `Minecraft Java版游戏更新`; + if (versionType !== 'all') { + data = data.filter((item) => item.type === versionType); + } + + const title = `Minecraft Java版${versionType === 'all' ? '' : typeName[versionType] ?? versionType}游戏更新`; return { title, link: `https://www.minecraft.net/`, description: title, item: data.map((item) => ({ - title: `${item.id} ${typeMap[item.type] || ''}更新`, - description: `${item.id} ${typeMap[item.type] || ''}更新`, + title: `${item.id} ${typeName[item.type] || ''}更新`, + description: `${item.id} ${typeName[item.type] || ''}更新`, pubDate: new Date(item.releaseTime).toUTCString(), - link: `https://www.minecraft.net`, + link: linker(item), guid: item.id + item.type, })), }; From a5334b7317587b4d32a66258fe21234ba3ff79d1 Mon Sep 17 00:00:00 2001 From: LMark <40017222+ladeng07@users.noreply.github.com> Date: Sat, 30 Mar 2024 17:06:44 +0800 Subject: [PATCH 81/99] =?UTF-8?q?fix(route):=20=E5=B7=B4=E5=93=88=E5=A7=86?= =?UTF-8?q?=E7=89=B9=E9=9B=BB=E7=8E=A9=E8=B3=87=E8=A8=8A=E7=AB=99-GNN=20?= =?UTF-8?q?=E6=96=B0=E8=81=9E=20(#15009)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix 巴哈姆特電玩資訊站-GNN 新聞 * update limit to response data * fix timezone error * Revert "fix timezone error" This reverts commit c99af4fa5b0dc24076f1580a7736a42e684242d5. --- lib/routes/gamer/gnn-index.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/routes/gamer/gnn-index.ts b/lib/routes/gamer/gnn-index.ts index 20d9572264..d767ae4fb3 100644 --- a/lib/routes/gamer/gnn-index.ts +++ b/lib/routes/gamer/gnn-index.ts @@ -13,13 +13,13 @@ export const route: Route = { features: { requireConfig: false, requirePuppeteer: false, - antiCrawler: false, + antiCrawler: true, supportBT: false, supportPodcast: false, supportScihub: false, }, name: 'GNN 新聞', - maintainers: ['Arracc'], + maintainers: ['Arracc', 'ladeng07'], handler, description: `| 首頁 | PC | TV 掌機 | 手機遊戲 | 動漫畫 | 主題報導 | 活動展覽 | 電競 | | ---- | -- | ------- | -------- | ------ | -------- | -------- | ---- | @@ -68,11 +68,13 @@ async function handler(ctx) { url, }); const data = response.data; + const limit = ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit')) : 50; const $ = load(data); const list = $('div.BH-lbox.GN-lbox2') .children() .not('p,a,img,span') + .slice(0, limit) .map((index, item) => { item = $(item); let aLabelNode; @@ -99,11 +101,11 @@ async function handler(ctx) { item.description = await cache.tryGet(item.link, async () => { const response = await got.get(item.link); let component = ''; - const urlReg = /window.location.replace\('.*'/g; + const urlReg = /window\.lazySizesConfig/g; let pubInfo; let dateStr; - if (response.body.search(urlReg) < 0) { + if (response.body.search(urlReg) >= 0) { const $ = load(response.data); if ($('span.GN-lbox3C').length > 0) { // official publish 1 @@ -119,8 +121,7 @@ async function handler(ctx) { component = $('div.GN-lbox3B').html(); } else { // url redirect - const newUrl = response.body.match(urlReg)[0].split('(')[1].replaceAll("'", ''); - const _response = await got.get(newUrl); + const _response = await got.get(item.link); const _$ = load(_response.data); if (_$('div.MSG-list8C').length > 0) { From 67c9eebafed8a651666102a97a75720b2544c746 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 30 Mar 2024 17:07:07 +0800 Subject: [PATCH 82/99] chore(deps): bump tldts from 6.1.15 to 6.1.16 (#15017) * chore(deps): bump tldts from 6.1.15 to 6.1.16 Bumps [tldts](https://github.com/remusao/tldts) from 6.1.15 to 6.1.16. - [Release notes](https://github.com/remusao/tldts/releases) - [Changelog](https://github.com/remusao/tldts/blob/master/CHANGELOG.md) - [Commits](https://github.com/remusao/tldts/compare/v6.1.15...v6.1.16) --- updated-dependencies: - dependency-name: tldts dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * chore: fix pnpm install --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index fb04abfdea..0d9e02be4c 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,7 @@ "telegram": "2.20.2", "tiny-async-pool": "2.1.0", "title": "3.5.3", - "tldts": "6.1.15", + "tldts": "6.1.16", "tough-cookie": "4.1.3", "tsx": "4.7.1", "twitter-api-v2": "1.16.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cc663c37eb..34df9d9e05 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -195,8 +195,8 @@ dependencies: specifier: 3.5.3 version: 3.5.3 tldts: - specifier: 6.1.15 - version: 6.1.15 + specifier: 6.1.16 + version: 6.1.16 tough-cookie: specifier: 4.1.3 version: 4.1.3 @@ -8634,15 +8634,15 @@ packages: hasBin: true dev: false - /tldts-core@6.1.15: - resolution: {integrity: sha512-E/gy+y6I53cZcqbHllhS5Aak6DmMZSO9tX6DYw3NXZk+f1yoFKGLiojQ8ww39G5QAupKKZL+vehNVqzSS0SQgQ==} + /tldts-core@6.1.16: + resolution: {integrity: sha512-rxnuCux+zn3hMF57nBzr1m1qGZH7Od2ErbDZjVm04fk76cEynTg3zqvHjx5BsBl8lvRTjpzIhsEGMHDH/Hr2Vw==} dev: false - /tldts@6.1.15: - resolution: {integrity: sha512-0/2FOdXnP5ON6PTQfE7B4X1ymqa1Bs6oG/yHKtVMxLSlUPlb/1AdWGzz2Co3P/uM0eUPWOt61L7cayyyNUSh7A==} + /tldts@6.1.16: + resolution: {integrity: sha512-X6VrQzW4RymhI1kBRvrWzYlRLXTftZpi7/s/9ZlDILA04yM2lNX7mBvkzDib9L4uSymHt8mBbeaielZMdsAkfQ==} hasBin: true dependencies: - tldts-core: 6.1.15 + tldts-core: 6.1.16 dev: false /tmp@0.0.33: From 684edfbb575b4399cf5a31e2402a3270ce7ff145 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 30 Mar 2024 17:13:11 +0800 Subject: [PATCH 83/99] chore(deps): bump @hono/zod-openapi from 0.9.9 to 0.9.10 (#15018) * chore(deps): bump @hono/zod-openapi from 0.9.9 to 0.9.10 Bumps [@hono/zod-openapi](https://github.com/honojs/middleware) from 0.9.9 to 0.9.10. - [Release notes](https://github.com/honojs/middleware/releases) - [Commits](https://github.com/honojs/middleware/compare/@hono/zod-openapi@0.9.9...@hono/zod-openapi@0.9.10) --- updated-dependencies: - dependency-name: "@hono/zod-openapi" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * chore: fix pnpm install --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 0d9e02be4c..b87a404f61 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "dependencies": { "@hono/node-server": "1.9.0", "@hono/swagger-ui": "0.2.1", - "@hono/zod-openapi": "0.9.9", + "@hono/zod-openapi": "0.9.10", "@notionhq/client": "2.2.14", "@postlight/parser": "2.2.3", "@sentry/node": "7.109.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 34df9d9e05..8d67e52b86 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,8 +12,8 @@ dependencies: specifier: 0.2.1 version: 0.2.1(hono@4.1.5) '@hono/zod-openapi': - specifier: 0.9.9 - version: 0.9.9(hono@4.1.5)(zod@3.22.4) + specifier: 0.9.10 + version: 0.9.10(hono@4.1.5)(zod@3.22.4) '@notionhq/client': specifier: 2.2.14 version: 2.2.14 @@ -1898,21 +1898,21 @@ packages: hono: 4.1.5 dev: false - /@hono/zod-openapi@0.9.9(hono@4.1.5)(zod@3.22.4): - resolution: {integrity: sha512-Icak3c8WKNS1gFDWmYs2zJ7ra3js9lDeAXNPf5h3fa0SnJQcjcCrLaG6EZPPAbW92HRwCDeQt8yA/ZVp17HPFg==} + /@hono/zod-openapi@0.9.10(hono@4.1.5)(zod@3.22.4): + resolution: {integrity: sha512-v/b/z0qPxDo952gjRyhJ0n9ifbPoIluR2KmXDL20np0hj99+XvakoIHK5/T/3+hUmXlTj1Kn3TiGsSV6hwZesg==} engines: {node: '>=16.0.0'} peerDependencies: hono: '>=3.11.3' zod: 3.* dependencies: '@asteasolutions/zod-to-openapi': 5.5.0(zod@3.22.4) - '@hono/zod-validator': 0.1.11(hono@4.1.5)(zod@3.22.4) + '@hono/zod-validator': 0.2.1(hono@4.1.5)(zod@3.22.4) hono: 4.1.5 zod: 3.22.4 dev: false - /@hono/zod-validator@0.1.11(hono@4.1.5)(zod@3.22.4): - resolution: {integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==} + /@hono/zod-validator@0.2.1(hono@4.1.5)(zod@3.22.4): + resolution: {integrity: sha512-HFoxln7Q6JsE64qz2WBS28SD33UB2alp3aRKmcWnNLDzEL1BLsWfbdX6e1HIiUprHYTIXf5y7ax8eYidKUwyaA==} peerDependencies: hono: '>=3.9.0' zod: ^3.19.1 From a828b3dd1ccf50281a879b0512c8043e9e148930 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Sat, 30 Mar 2024 18:21:14 +0800 Subject: [PATCH 84/99] feat: request rewriter --- lib/app.tsx | 2 +- lib/utils/proxy/index.ts | 3 + .../fetch.ts} | 33 ++---- lib/utils/request-rewriter/get.ts | 66 +++++++++++ lib/utils/request-rewriter/index.ts | 19 ++++ lib/utils/request-wrapper.ts | 105 ------------------ tsconfig.json | 2 +- 7 files changed, 99 insertions(+), 131 deletions(-) rename lib/utils/{request-interceptor.ts => request-rewriter/fetch.ts} (55%) create mode 100644 lib/utils/request-rewriter/get.ts create mode 100644 lib/utils/request-rewriter/index.ts delete mode 100644 lib/utils/request-wrapper.ts diff --git a/lib/app.tsx b/lib/app.tsx index f2a549eef0..5615affc10 100644 --- a/lib/app.tsx +++ b/lib/app.tsx @@ -1,4 +1,4 @@ -import '@/utils/request-interceptor'; +import '@/utils/request-rewriter'; import { Hono } from 'hono'; diff --git a/lib/utils/proxy/index.ts b/lib/utils/proxy/index.ts index 016501b2ac..bc04898fce 100644 --- a/lib/utils/proxy/index.ts +++ b/lib/utils/proxy/index.ts @@ -34,6 +34,9 @@ if (proxyIsPAC) { dispatcher = new ProxyAgent({ uri: proxyUri, token: proxyObj?.auth ? `Basic ${proxyObj.auth}` : undefined, + requestTls: { + rejectUnauthorized: process.env.NODE_TLS_REJECT_UNAUTHORIZED !== '0', + }, }); } else if (proxyUri.startsWith('socks')) { agent = new SocksProxyAgent(proxyUri); diff --git a/lib/utils/request-interceptor.ts b/lib/utils/request-rewriter/fetch.ts similarity index 55% rename from lib/utils/request-interceptor.ts rename to lib/utils/request-rewriter/fetch.ts index 5125e7b486..39b628a233 100644 --- a/lib/utils/request-interceptor.ts +++ b/lib/utils/request-rewriter/fetch.ts @@ -1,19 +1,14 @@ -import { setupServer } from 'msw/node'; -import { http } from 'msw'; import logger from '@/utils/logger'; import { config } from '@/config'; -import { fetch, Headers, FormData, Request, Response } from 'undici'; +import { fetch, Request, RequestInfo, RequestInit } from 'undici'; import proxy from '@/utils/proxy'; -Object.defineProperties(globalThis, { - fetch: { value: fetch, writable: true }, - Headers: { value: Headers }, - FormData: { value: FormData }, - Request: { value: Request }, - Response: { value: Response }, -}); +const wrappedFetch: typeof fetch = (input: RequestInfo, init?: RequestInit) => { + const request = new Request(input, init); + const options: RequestInit = {}; + + logger.debug(`Outgoing request: ${request.method} ${request.url}`); -const handler = (request: globalThis.Request, options: NonNullable[1]>) => { // ua if (!request.headers.get('user-agent')) { request.headers.set('user-agent', config.ua); @@ -45,21 +40,11 @@ const handler = (request: globalThis.Request, options: NonNullable { - logger.debug(`Outgoing request: ${request.method} ${request.url}`); - const requestClone = request.clone(); - const options = {}; - handler(requestClone, options); - // @ts-expect-error - return fetch(requestClone, options); - }) -); -server.listen(); +export default wrappedFetch; diff --git a/lib/utils/request-rewriter/get.ts b/lib/utils/request-rewriter/get.ts new file mode 100644 index 0000000000..a69e5f1c0e --- /dev/null +++ b/lib/utils/request-rewriter/get.ts @@ -0,0 +1,66 @@ +import http from 'node:http'; +import https from 'node:https'; +import logger from '@/utils/logger'; +import { config } from '@/config'; +import proxy from '@/utils/proxy'; + +type Get = typeof http.get | typeof https.get | typeof http.request | typeof https.request; + +const getWrappedGet: (origin: T) => T = (origin) => + function (this: any, ...args: Parameters) { + let url: URL; + let options: http.RequestOptions = {}; + let callback: ((res: http.IncomingMessage) => void) | undefined; + if (typeof args[0] === 'string' || args[0] instanceof URL) { + url = new URL(args[0]); + if (typeof args[1] === 'object') { + options = args[1]; + callback = args[2]; + } else if (typeof args[1] === 'function') { + options = {}; + callback = args[1]; + } + } else { + options = args[0]; + url = new URL(options.href || `${options.protocol}//${options.hostname || options.host}${options.path}${options.search || (options.query ? `?${options.query}` : '')}`); + if (typeof args[1] === 'function') { + callback = args[1]; + } + } + + logger.debug(`Outgoing request: ${options.method || 'GET'} ${url}`); + + options.headers = options.headers || {}; + const headersLowerCaseKeys = new Set(Object.keys(options.headers).map((key) => key.toLowerCase())); + + // ua + if (!headersLowerCaseKeys.has('user-agent')) { + options.headers['user-agent'] = config.ua; + } + + // Accept + if (!headersLowerCaseKeys.has('accept')) { + options.headers.accept = '*/*'; + } + + // referer + if (!headersLowerCaseKeys.has('referer')) { + options.headers.referer = url.origin; + } + + // proxy + if (!options.agent && proxy.agent) { + const proxyRegex = new RegExp(proxy.proxyObj.url_regex); + + if (proxyRegex.test(url.toString()) && url.protocol.startsWith('http') && url.host !== proxy.proxyUrlHandler?.host) { + options.agent = proxy.agent; + if (proxy.proxyObj.auth) { + options.headers['Proxy-Authorization'] = `Basic ${proxy.proxyObj.auth}`; + } + } + } + + return Reflect.apply(origin, this, [url, options, callback]) as ReturnType; + }; + +export default getWrappedGet; diff --git a/lib/utils/request-rewriter/index.ts b/lib/utils/request-rewriter/index.ts new file mode 100644 index 0000000000..74e793167f --- /dev/null +++ b/lib/utils/request-rewriter/index.ts @@ -0,0 +1,19 @@ +import { Headers, FormData, Request, Response } from 'undici'; +import http from 'node:http'; +import https from 'node:https'; + +import fetch from '@/utils/request-rewriter/fetch'; +import getWrappedGet from '@/utils/request-rewriter/get'; + +Object.defineProperties(globalThis, { + fetch: { value: fetch }, + Headers: { value: Headers }, + FormData: { value: FormData }, + Request: { value: Request }, + Response: { value: Response }, +}); + +http.get = getWrappedGet(http.get); +http.request = getWrappedGet(http.request); +https.get = getWrappedGet(https.get); +https.request = getWrappedGet(https.request); diff --git a/lib/utils/request-wrapper.ts b/lib/utils/request-wrapper.ts deleted file mode 100644 index 352f7d2dba..0000000000 --- a/lib/utils/request-wrapper.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { config } from '@/config'; -import logger from '@/utils/logger'; -import http, { type RequestOptions } from 'node:http'; -import https from 'node:https'; -import proxy from '@/utils/proxy'; - -let proxyWrapper: ( - url: string, - options: RequestOptions & { - headers: Record; - } -) => boolean = () => false; - -if (proxy.agent) { - const proxyRegex = new RegExp(proxy.proxyObj.url_regex); - const protocolMatch = (protocolLike?: string | null) => protocolLike?.toLowerCase().startsWith('http'); - - proxyWrapper = (url, options) => { - let urlHandler; - try { - urlHandler = new URL(url); - } catch { - // ignore - } - if (proxyRegex.test(url) && (protocolMatch(options.protocol) || protocolMatch(url)) && (!urlHandler || urlHandler.host !== proxy.proxyUrlHandler?.host)) { - options.agent = proxy.agent || false; - if (proxy.proxyObj.auth) { - options.headers['Proxy-Authorization'] = `Basic ${proxy.proxyObj.auth}`; - } - return true; - } - return false; - }; -} - -const requestWrapper = (url: string, options: http.RequestOptions = {}) => { - options.headers = options.headers || {}; - - const optionsWithHeaders = options as http.RequestOptions & { - headers: Record; - }; - const headersLowerCaseKeys = new Set(Object.keys(optionsWithHeaders.headers).map((key) => key.toLowerCase())); - - let prxied = false; - if (config.proxyStrategy === 'all') { - prxied = proxyWrapper(url, optionsWithHeaders); - } else if (config.proxyStrategy === 'on_retry' && (optionsWithHeaders as any).retryCount) { - // TODO - prxied = proxyWrapper(url, optionsWithHeaders); - } - if (prxied) { - logger.debug(`Proxy for ${url}`); - } else { - logger.debug(`Requesting ${url}`); - } - - // ua - if (!headersLowerCaseKeys.has('user-agent')) { - options.headers['user-agent'] = config.ua; - } - - // Accept - if (!headersLowerCaseKeys.has('accept')) { - options.headers.Accept = '*/*'; - } - - let urlHandler; - try { - urlHandler = new URL(url); - } catch { - // ignore - } - - if ( - urlHandler && // referer - !headersLowerCaseKeys.has('referer') - ) { - options.headers.referer = urlHandler.origin; - } -}; - -const httpWrap = (func: typeof http.request) => { - const origin = func; - const warpped: typeof http.request = function (...args) { - let url: string; - let options: http.RequestOptions; - if (args[0] instanceof URL || typeof args[0] === 'string') { - url = args[0].toString(); - options = args[1] as http.RequestOptions; - } else { - options = args[0] as http.RequestOptions; - url = `${options.protocol}//${options.hostname || options.host}${options.path}`; - } - requestWrapper(url, options); - - // @ts-expect-error apply - return origin.apply(this, args); - }; - return warpped; -}; - -http.get = httpWrap(http.get); -https.get = httpWrap(https.get); -http.request = httpWrap(http.request); -https.request = httpWrap(https.request); diff --git a/tsconfig.json b/tsconfig.json index 20bc583435..5ce6ad9584 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "target": "ESNext", "module": "ESNext", - "moduleResolution": "node", + "moduleResolution": "bundler", "strict": true, "jsx": "react-jsx", "jsxImportSource": "hono/jsx", From b4d7da11acb9d3fd0acba9ae2b58e99a17727358 Mon Sep 17 00:00:00 2001 From: SettingDust Date: Sat, 30 Mar 2024 18:22:54 +0800 Subject: [PATCH 85/99] fix(modrinth): name could be null (#15024) * fix(modrinth): name could be null * fix(modrinth): author api seems changed --- lib/routes/modrinth/versions.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/routes/modrinth/versions.ts b/lib/routes/modrinth/versions.ts index e7ba723c16..5377218481 100644 --- a/lib/routes/modrinth/versions.ts +++ b/lib/routes/modrinth/versions.ts @@ -96,12 +96,16 @@ async function handler(ctx: Context) { ids: JSON.stringify(versions.map((it) => it.author_id)), }, }).json(); + const groupedAuthors = >{}; + for (const author of authors) { + groupedAuthors[author.id] = author; + } return { title: `${project.title} Modrinth versions`, description: project.description, link: `https://modrinth.com/project/${id}`, - item: versions.map((it, index) => ({ + item: versions.map((it) => ({ title: `${it.name} for ${it.loaders.join('/')} on ${[...new Set([it.game_versions[0], it.game_versions.at(-1)])].join('-')}`, link: `https://modrinth.com/project/${id}/version/${it.version_number}`, pubDate: parseDate(it.date_published), @@ -110,7 +114,7 @@ async function handler(ctx: Context) { changelog: md.render(it.changelog), }), guid: it.id, - author: authors[index].name, + author: groupedAuthors[it.author_id].username, })), }; } catch (error: any) { From bec0ba0705656f7c2416e4944b5f570eed9c9ca0 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Sat, 30 Mar 2024 18:29:38 +0800 Subject: [PATCH 86/99] test: request headers --- lib/setup.test.ts | 4 ++-- lib/utils/ofetch.ts | 3 +++ lib/utils/rand-user-agent.test.ts | 10 +++++----- package.json | 2 +- pnpm-lock.yaml | 31 ++++++++----------------------- 5 files changed, 19 insertions(+), 31 deletions(-) diff --git a/lib/setup.test.ts b/lib/setup.test.ts index 4e39c68dfa..90170e0c7e 100644 --- a/lib/setup.test.ts +++ b/lib/setup.test.ts @@ -48,9 +48,9 @@ const server = setupServer( '' ) ), - http.get(`http://rsshub.test/ua`, ({ request }) => + http.get(`http://rsshub.test/headers`, ({ request }) => HttpResponse.json({ - ua: request.headers.get('user-agent'), + ...Object.fromEntries(request.headers.entries()), }) ), http.post(`http://rsshub.test/form-post`, async ({ request }) => { diff --git a/lib/utils/ofetch.ts b/lib/utils/ofetch.ts index 31e6574c8e..06f77e3792 100644 --- a/lib/utils/ofetch.ts +++ b/lib/utils/ofetch.ts @@ -9,6 +9,9 @@ const rofetch = createFetch().create({ onRequestError({ request, error }) { logger.error(`Request ${request} fail: ${error}`); }, + headers: { + 'user-agent': config.ua, + }, }); export default rofetch; diff --git a/lib/utils/rand-user-agent.test.ts b/lib/utils/rand-user-agent.test.ts index 91169f159c..c459190dd6 100644 --- a/lib/utils/rand-user-agent.test.ts +++ b/lib/utils/rand-user-agent.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import got from '@/utils/got'; +import ofetch from '@/utils/ofetch'; import { config } from '@/config'; import randUserAgent from '@/utils/rand-user-agent'; @@ -22,16 +22,16 @@ describe('rand-user-agent', () => { }); it('should has default random ua', async () => { - const { data } = await got('http://rsshub.test/ua'); - expect(data.ua).toBe(config.ua); + const response = await ofetch('http://rsshub.test/headers'); + expect(response['user-agent']).toBe(config.ua); }); it('should match ua configurated', async () => { - const { data } = await got('http://rsshub.test/ua', { + const response = await ofetch('http://rsshub.test/headers', { headers: { 'user-agent': mobileUa, }, }); - expect(data.ua).toBe(mobileUa); + expect(response['user-agent']).toBe(mobileUa); }); }); diff --git a/package.json b/package.json index a78cdc7947..713dfbc7db 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,6 @@ "form-data": "4.0.0", "git-rev-sync": "3.0.2", "googleapis": "134.0.0", - "got": "14.2.1", "hono": "4.1.4", "html-to-text": "9.0.5", "https-proxy-agent": "7.0.4", @@ -163,6 +162,7 @@ "eslint-plugin-unicorn": "51.0.1", "eslint-plugin-yml": "1.13.2", "fs-extra": "11.2.0", + "got": "14.2.1", "husky": "9.0.11", "js-beautify": "1.15.1", "lint-staged": "15.2.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2d1a2462e5..c65df8125a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -83,9 +83,6 @@ dependencies: googleapis: specifier: 134.0.0 version: 134.0.0 - got: - specifier: 14.2.1 - version: 14.2.1 hono: specifier: 4.1.4 version: 4.1.4 @@ -340,6 +337,9 @@ devDependencies: fs-extra: specifier: 11.2.0 version: 11.2.0 + got: + specifier: 14.2.1 + version: 14.2.1 husky: specifier: 9.0.11 version: 9.0.11 @@ -2669,7 +2669,7 @@ packages: /@sindresorhus/is@6.2.0: resolution: {integrity: sha512-yM/IGPkVnYGblhDosFBwq0ZGdnVSBkNV4onUtipGMOjZd4kB6GAu3ys91aftSbyMHh6A2GPdt+KDI5NoWP63MQ==} engines: {node: '>=16'} - dev: false + dev: true /@stylistic/eslint-plugin-js@1.7.0(eslint@8.57.0): resolution: {integrity: sha512-PN6On/+or63FGnhhMKSQfYcWutRlzOiYlVdLM6yN7lquoBTqUJHYnl4TA4MHwiAt46X5gRxDr1+xPZ1lOLcL+Q==} @@ -2748,7 +2748,6 @@ packages: engines: {node: '>=14.16'} dependencies: defer-to-connect: 2.0.1 - dev: false /@tonyrl/rand-user-agent@2.0.56: resolution: {integrity: sha512-7C2zOyvJsU2BxYayw+w/KjtP/InxYHzRWOWUuPj3XP3SGfnUTpQjKvEuo5K0LB+0YqF62w65LjHGE7Aw1irtaA==} @@ -2829,7 +2828,6 @@ packages: /@types/http-cache-semantics@4.0.4: resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - dev: false /@types/imapflow@1.0.18: resolution: {integrity: sha512-BoWZUoMktji2YJmkRY8z0KsjvyDNpBzeC/rLVMFKcHkPxaKp+SHBFfx/kj7ltKh3l010Lc9RZqnJs8KUMNhf6Q==} @@ -3742,7 +3740,6 @@ packages: /cacheable-lookup@7.0.0: resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} engines: {node: '>=14.16'} - dev: false /cacheable-request@10.2.14: resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} @@ -3755,7 +3752,6 @@ packages: mimic-response: 4.0.0 normalize-url: 8.0.1 responselike: 3.0.0 - dev: false /call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} @@ -4340,7 +4336,6 @@ packages: engines: {node: '>=10'} dependencies: mimic-response: 3.1.0 - dev: false /deep-eql@4.1.3: resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} @@ -4366,7 +4361,6 @@ packages: /defer-to-connect@2.0.1: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} - dev: false /define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} @@ -5311,7 +5305,7 @@ packages: /form-data-encoder@4.0.2: resolution: {integrity: sha512-KQVhvhK8ZkWzxKxOr56CPulAhH3dobtuQ4+hNQ+HekH/Wp5gSOafqRAeTphQUJAIk0GBvHZgJ2ZGRWd5kphMuw==} engines: {node: '>= 18'} - dev: false + dev: true /form-data@2.3.3: resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} @@ -5466,11 +5460,11 @@ packages: /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - dev: false /get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} + dev: true /get-tsconfig@4.7.3: resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} @@ -5645,7 +5639,7 @@ packages: lowercase-keys: 3.0.0 p-cancelable: 4.0.1 responselike: 3.0.0 - dev: false + dev: true /graceful-fs@4.1.15: resolution: {integrity: sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==} @@ -5828,7 +5822,6 @@ packages: /http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - dev: false /http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} @@ -5863,7 +5856,6 @@ packages: dependencies: quick-lru: 5.1.1 resolve-alpn: 1.2.1 - dev: false /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} @@ -6682,7 +6674,6 @@ packages: /lowercase-keys@3.0.0: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: false /lru-cache@10.2.0: resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} @@ -7077,12 +7068,10 @@ packages: /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - dev: false /mimic-response@4.0.0: resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: false /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} @@ -7327,7 +7316,6 @@ packages: /normalize-url@8.0.1: resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} engines: {node: '>=14.16'} - dev: false /notion-to-md@3.1.1: resolution: {integrity: sha512-Zaa2P1B9Rx99bevFYTGuUMYbbfdHn2G1AZMsytYGDWIJjr6Ie1qp/8CorpwVUh1qrquES/V2PkEREqCuTu1zKA==} @@ -7501,7 +7489,7 @@ packages: /p-cancelable@4.0.1: resolution: {integrity: sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==} engines: {node: '>=14.16'} - dev: false + dev: true /p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} @@ -8074,7 +8062,6 @@ packages: /quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} - dev: false /re2js@0.4.1: resolution: {integrity: sha512-Kxb+OKXrEPowP4bXAF07NDXtgYX07S8HeVGgadx5/D/R41LzWg1kgTD2szIv2iHJM3vrAPnDKaBzfUE/7QWX9w==} @@ -8286,7 +8273,6 @@ packages: /resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - dev: false /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} @@ -8313,7 +8299,6 @@ packages: engines: {node: '>=14.16'} dependencies: lowercase-keys: 3.0.0 - dev: false /restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} From 59631b2e9b6f11a3f5687b9e7ee91fd65032a5d2 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Sat, 30 Mar 2024 18:30:41 +0800 Subject: [PATCH 87/99] test: request-rewriter headers --- lib/utils/request-rewriter.test.ts | 123 ++++++++++ lib/utils/request-wrapper.test.ts | 365 ----------------------------- 2 files changed, 123 insertions(+), 365 deletions(-) create mode 100644 lib/utils/request-rewriter.test.ts delete mode 100644 lib/utils/request-wrapper.test.ts diff --git a/lib/utils/request-rewriter.test.ts b/lib/utils/request-rewriter.test.ts new file mode 100644 index 0000000000..5ac366c49f --- /dev/null +++ b/lib/utils/request-rewriter.test.ts @@ -0,0 +1,123 @@ +import { describe, expect, it, afterEach, vi } from 'vitest'; +import '@/utils/request-rewriter'; +import { config } from '@/config'; + +import ofetch from '@/utils/ofetch'; +import got from 'got'; + +afterEach(() => { + delete process.env.PROXY_URI; + delete process.env.PROXY_AUTH; + delete process.env.PROXY_URL_REGEX; + + vi.resetModules(); +}); + +describe('request-rewriter', () => { + it('ofetch', async () => { + const response = await ofetch('http://rsshub.test/headers'); + expect(response['user-agent']).toBe(config.ua); + expect(response.accept).toBe('*/*'); + expect(response.referer).toBe('http://rsshub.test'); + }); + + it('fetch', async () => { + const response = await (await fetch('http://rsshub.test/headers')).json(); + expect(response['user-agent']).toBe(config.ua); + expect(response.accept).toBe('*/*'); + expect(response.referer).toBe('http://rsshub.test'); + }); + + it('http', async () => { + const { config } = await import('@/config'); + await import('@/utils/request-rewriter'); + + const response = await got + .get('http://rsshub.test/headers', { + headers: { + 'user-agent': undefined, + accept: undefined, + }, + }) + .json(); + expect(response['user-agent']).toBe(config.ua); + expect(response.accept).toBe('*/*'); + expect(response.referer).toBe('http://rsshub.test'); + }); + + // it('proxy-uri http', async () => { + // process.env.PROXY_URI = 'http://user:pass@rsshub.proxy:2333'; + + // await import('@/utils/request-wrapper'); + // check = (request) => { + // expect(request.agent.constructor.name).toBe('HttpsProxyAgent'); + // expect(request.agent.proxy.protocol).toBe('http:'); + // expect(request.agent.proxy.username).toBe('user'); + // expect(request.agent.proxy.password).toBe('pass'); + // expect(request.agent.proxy.host).toBe('rsshub.proxy:2333'); + // expect(request.agent.proxy.hostname).toBe('rsshub.proxy'); + // expect(request.agent.proxy.port).toBe('2333'); + // }; + + // nock(/rsshub\.test/) + // .get('/proxy') + // .times(2) + // .reply(200, simpleResponse); + + // await got.get('http://rsshub.test/proxy'); + // await parser.parseURL('http://rsshub.test/proxy'); + // }); + + // it('auth', async () => { + // process.env.PROXY_AUTH = 'testtest'; + // process.env.PROXY_PROTOCOL = 'http'; // only http(s) proxies extract auth from Headers + // process.env.PROXY_HOST = 'rsshub.proxy'; + // process.env.PROXY_PORT = '2333'; + + // await import('@/utils/request-wrapper'); + + // nock(/rsshub\.test/) + // .get('/auth') + // .times(2) + // .reply(function () { + // expect(this.req.headers['proxy-authorization']).toBe('Basic testtest'); + // return [200, simpleResponse]; + // }); + + // await got.get('http://rsshub.test/auth'); + // await parser.parseURL('http://rsshub.test/auth'); + // }); + + // it('url_regex', async () => { + // process.env.PROXY_URL_REGEX = 'url_regex'; + // process.env.PROXY_PROTOCOL = 'socks'; + // process.env.PROXY_HOST = 'rsshub.proxy'; + // process.env.PROXY_PORT = '2333'; + + // await import('@/utils/request-wrapper'); + // check = (request) => { + // if (request.path === '/url_regex') { + // expect(request.agent.constructor.name).toBe('SocksProxyAgent'); + // expect(request.agent.proxy.host).toBe('rsshub.proxy'); + // expect(request.agent.proxy.port).toBe(2333); + // } else if (request.path === '/proxy') { + // expect(request.agent).toBe(undefined); + // } + // }; + + // nock(/rsshub\.test/) + // .get('/url_regex') + // .times(2) + // .reply(() => [200, simpleResponse]); + // nock(/rsshub\.test/) + // .get('/proxy') + // .times(2) + // .reply(() => [200, simpleResponse]); + + // await got.get('http://rsshub.test/url_regex'); + // await parser.parseURL('http://rsshub.test/url_regex'); + + // await got.get('http://rsshub.test/proxy'); + // await parser.parseURL('http://rsshub.test/proxy'); + // }); +}); diff --git a/lib/utils/request-wrapper.test.ts b/lib/utils/request-wrapper.test.ts deleted file mode 100644 index 1b126d5068..0000000000 --- a/lib/utils/request-wrapper.test.ts +++ /dev/null @@ -1,365 +0,0 @@ -import { describe, expect, it, beforeEach, afterEach, vi } from 'vitest'; - -import got from '@/utils/got'; -import parser from '@/utils/rss-parser'; -import nock from 'nock'; -import http from 'node:http'; - -let check: ( - request: Request & { - agent: any; - path: string; - } -) => void = () => {}; -const simpleResponse = ''; - -beforeEach(() => { - delete process.env.PAC_URI; - delete process.env.PAC_SCRIPT; -}); - -afterEach(() => { - delete process.env.PROXY_URI; - delete process.env.PROXY_PROTOCOL; - delete process.env.PROXY_HOST; - delete process.env.PROXY_PORT; - delete process.env.PROXY_AUTH; - delete process.env.PROXY_URL_REGEX; - - nock.restore(); - nock.activate(); - check = () => {}; - - const httpWrap = (func) => { - const origin = func; - return function (url, request) { - if (typeof url === 'object') { - if (url instanceof URL) { - check(request); - } else { - check(url); - } - } else { - check(request); - } - // @ts-expect-error any - // eslint-disable-next-line prefer-rest-params - return Reflect.apply(origin, this, arguments); - }; - }; - http.get = httpWrap(http.get); - http.request = httpWrap(http.request); - - vi.resetModules(); -}); - -describe('got', () => { - it('headers', async () => { - await import('@/utils/request-wrapper'); - - nock(/rsshub\.test/) - .get(/.*/) - .times(3) - .reply(function () { - expect(this.req.headers.referer).toBe('http://api.rsshub.test'); - expect(this.req.headers.host).toBe('api.rsshub.test'); - return [200, simpleResponse]; - }); - - await got.get('http://api.rsshub.test/test'); - await got.get('http://api.rsshub.test'); - - await parser.parseURL('http://api.rsshub.test/test'); - }); - - it('proxy-uri socks', async () => { - process.env.PROXY_URI = 'socks5://user:pass@rsshub.proxy:2333'; - - await import('@/utils/request-wrapper'); - check = (request) => { - expect(request.agent.constructor.name).toBe('SocksProxyAgent'); - expect(request.agent.proxy.host).toBe('rsshub.proxy'); - expect(request.agent.proxy.port).toBe(2333); - expect(request.agent.proxy.type).toBe(5); - }; - - nock(/rsshub\.test/) - .get('/proxy') - .times(2) - .reply(200, simpleResponse); - - await got.get('http://rsshub.test/proxy'); - await parser.parseURL('http://rsshub.test/proxy'); - }); - - it('proxy-uri http', async () => { - process.env.PROXY_URI = 'http://user:pass@rsshub.proxy:2333'; - - await import('@/utils/request-wrapper'); - check = (request) => { - expect(request.agent.constructor.name).toBe('HttpsProxyAgent'); - expect(request.agent.proxy.protocol).toBe('http:'); - expect(request.agent.proxy.username).toBe('user'); - expect(request.agent.proxy.password).toBe('pass'); - expect(request.agent.proxy.host).toBe('rsshub.proxy:2333'); - expect(request.agent.proxy.hostname).toBe('rsshub.proxy'); - expect(request.agent.proxy.port).toBe('2333'); - }; - - nock(/rsshub\.test/) - .get('/proxy') - .times(2) - .reply(200, simpleResponse); - - await got.get('http://rsshub.test/proxy'); - await parser.parseURL('http://rsshub.test/proxy'); - }); - - it('proxy-uri https', async () => { - process.env.PROXY_URI = 'https://rsshub.proxy:2333'; - - await import('@/utils/request-wrapper'); - check = (request) => { - expect(request.agent.constructor.name).toBe('HttpsProxyAgent'); - expect(request.agent.proxy.protocol).toBe('https:'); - expect(request.agent.proxy.host).toBe('rsshub.proxy:2333'); - expect(request.agent.proxy.hostname).toBe('rsshub.proxy'); - expect(request.agent.proxy.port).toBe('2333'); - }; - - nock(/rsshub\.test/) - .get('/proxy') - .times(2) - .reply(200, simpleResponse); - - await got.get('http://rsshub.test/proxy'); - await parser.parseURL('http://rsshub.test/proxy'); - }); - - it('proxy socks', async () => { - process.env.PROXY_PROTOCOL = 'socks'; - process.env.PROXY_HOST = 'rsshub.proxy'; - process.env.PROXY_PORT = '2333'; - - await import('@/utils/request-wrapper'); - check = (request) => { - expect(request.agent.constructor.name).toBe('SocksProxyAgent'); - expect(request.agent.proxy.host).toBe('rsshub.proxy'); - expect(request.agent.proxy.port).toBe(2333); - expect(request.agent.proxy.type).toBe(5); - }; - - nock(/rsshub\.test/) - .get('/proxy') - .times(2) - .reply(200, simpleResponse); - - await got.get('http://rsshub.test/proxy'); - await parser.parseURL('http://rsshub.test/proxy'); - }); - - it('proxy http', async () => { - process.env.PROXY_PROTOCOL = 'http'; - process.env.PROXY_HOST = 'rsshub.proxy'; - process.env.PROXY_PORT = '2333'; - - await import('@/utils/request-wrapper'); - check = (request) => { - expect(request.agent.constructor.name).toBe('HttpsProxyAgent'); - expect(request.agent.proxy.protocol).toBe('http:'); - expect(request.agent.proxy.host).toBe('rsshub.proxy:2333'); - expect(request.agent.proxy.hostname).toBe('rsshub.proxy'); - expect(request.agent.proxy.port).toBe('2333'); - }; - - nock(/rsshub\.test/) - .get('/proxy') - .times(2) - .reply(200, simpleResponse); - - await got.get('http://rsshub.test/proxy'); - await parser.parseURL('http://rsshub.test/proxy'); - }); - - it('proxy https', async () => { - process.env.PROXY_PROTOCOL = 'https'; - process.env.PROXY_HOST = 'rsshub.proxy'; - process.env.PROXY_PORT = '2333'; - - await import('@/utils/request-wrapper'); - check = (request) => { - expect(request.agent.constructor.name).toBe('HttpsProxyAgent'); - expect(request.agent.proxy.protocol).toBe('https:'); - expect(request.agent.proxy.host).toBe('rsshub.proxy:2333'); - expect(request.agent.proxy.hostname).toBe('rsshub.proxy'); - expect(request.agent.proxy.port).toBe('2333'); - }; - - nock(/rsshub\.test/) - .get('/proxy') - .times(2) - .reply(200, simpleResponse); - - await got.get('http://rsshub.test/proxy'); - await parser.parseURL('http://rsshub.test/proxy'); - }); - - it('pac-uri http', async () => { - process.env.PAC_URI = 'http://rsshub.proxy:2333'; - - await import('@/utils/request-wrapper'); - - check = (request) => { - expect(request.agent.constructor.name).toBe('PacProxyAgent'); - expect(request.agent.uri.protocol).toBe('http:'); - expect(request.agent.uri.host).toBe('rsshub.proxy:2333'); - expect(request.agent.uri.hostname).toBe('rsshub.proxy'); - expect(request.agent.uri.port).toBe('2333'); - }; - - nock(/rsshub\.test/) - .get('/proxy') - .times(2) - .reply(200, simpleResponse); - - await got.get('http://rsshub.test/proxy'); - await parser.parseURL('http://rsshub.test/proxy'); - }); - - it('pac-uri https', async () => { - process.env.PAC_URI = 'https://rsshub.proxy:2333'; - - await import('@/utils/request-wrapper'); - - check = (request) => { - expect(request.agent.constructor.name).toBe('PacProxyAgent'); - expect(request.agent.uri.protocol).toBe('https:'); - expect(request.agent.uri.host).toBe('rsshub.proxy:2333'); - expect(request.agent.uri.hostname).toBe('rsshub.proxy'); - expect(request.agent.uri.port).toBe('2333'); - }; - - nock(/rsshub\.test/) - .get('/proxy') - .times(2) - .reply(200, simpleResponse); - - await got.get('http://rsshub.test/proxy'); - await parser.parseURL('http://rsshub.test/proxy'); - }); - - it('pac-uri ftp', async () => { - process.env.PAC_URI = 'ftp://rsshub.proxy:2333'; - - await import('@/utils/request-wrapper'); - - check = (request) => { - expect(request.agent.constructor.name).toBe('PacProxyAgent'); - expect(request.agent.uri.protocol).toBe('ftp:'); - expect(request.agent.uri.host).toBe('rsshub.proxy:2333'); - expect(request.agent.uri.hostname).toBe('rsshub.proxy'); - expect(request.agent.uri.port).toBe('2333'); - }; - - nock(/rsshub\.test/) - .get('/proxy') - .times(2) - .reply(200, simpleResponse); - - await got.get('http://rsshub.test/proxy'); - await parser.parseURL('http://rsshub.test/proxy'); - }); - - it('pac-uri file', async () => { - process.env.PAC_URI = 'file:///D:/rsshub/proxy'; - - await import('@/utils/request-wrapper'); - - check = (request) => { - expect(request.agent.constructor.name).toBe('PacProxyAgent'); - expect(request.agent.uri.protocol).toBe('file:'); - expect(request.agent.uri.pathname).toBe('/D:/rsshub/proxy'); - }; - - nock(/rsshub\.test/) - .get('/proxy') - .times(2) - .reply(200, simpleResponse); - - await got.get('http://rsshub.test/proxy'); - await parser.parseURL('http://rsshub.test/proxy'); - }); - - it('pac-script data', async () => { - process.env.PAC_SCRIPT = "function FindProxyForURL(url,host){return 'DIRECT';}"; - - await import('@/utils/request-wrapper'); - - check = (request) => { - expect(request.agent.constructor.name).toBe('PacProxyAgent'); - expect(request.agent.uri.protocol).toBe('data:'); - expect(request.agent.uri.pathname).toBe("text/javascript;charset=utf-8,function%20FindProxyForURL(url%2Chost)%7Breturn%20'DIRECT'%3B%7D"); - }; - - nock(/rsshub\.test/) - .get('/proxy') - .times(2) - .reply(200, simpleResponse); - - await got.get('http://rsshub.test/proxy'); - await parser.parseURL('http://rsshub.test/proxy'); - }); - - it('auth', async () => { - process.env.PROXY_AUTH = 'testtest'; - process.env.PROXY_PROTOCOL = 'http'; // only http(s) proxies extract auth from Headers - process.env.PROXY_HOST = 'rsshub.proxy'; - process.env.PROXY_PORT = '2333'; - - await import('@/utils/request-wrapper'); - - nock(/rsshub\.test/) - .get('/auth') - .times(2) - .reply(function () { - expect(this.req.headers['proxy-authorization']).toBe('Basic testtest'); - return [200, simpleResponse]; - }); - - await got.get('http://rsshub.test/auth'); - await parser.parseURL('http://rsshub.test/auth'); - }); - - it('url_regex', async () => { - process.env.PROXY_URL_REGEX = 'url_regex'; - process.env.PROXY_PROTOCOL = 'socks'; - process.env.PROXY_HOST = 'rsshub.proxy'; - process.env.PROXY_PORT = '2333'; - - await import('@/utils/request-wrapper'); - check = (request) => { - if (request.path === '/url_regex') { - expect(request.agent.constructor.name).toBe('SocksProxyAgent'); - expect(request.agent.proxy.host).toBe('rsshub.proxy'); - expect(request.agent.proxy.port).toBe(2333); - } else if (request.path === '/proxy') { - expect(request.agent).toBe(undefined); - } - }; - - nock(/rsshub\.test/) - .get('/url_regex') - .times(2) - .reply(() => [200, simpleResponse]); - nock(/rsshub\.test/) - .get('/proxy') - .times(2) - .reply(() => [200, simpleResponse]); - - await got.get('http://rsshub.test/url_regex'); - await parser.parseURL('http://rsshub.test/url_regex'); - - await got.get('http://rsshub.test/proxy'); - await parser.parseURL('http://rsshub.test/proxy'); - }); -}); From 0d0684a6767ca612015b8869824e96704e7f68fe Mon Sep 17 00:00:00 2001 From: Ethan Shen <42264778+nczitzk@users.noreply.github.com> Date: Sun, 31 Mar 2024 00:50:47 +0800 Subject: [PATCH 88/99] =?UTF-8?q?fix(route):=20BT=E4=B9=8B=E5=AE=B61LOU?= =?UTF-8?q?=E7=AB=99=20(#15014)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(route): BT之家1LOU站 * fix categories --- lib/routes/1lou/index.ts | 175 +++++++++++++++++++++++------------ lib/routes/1lou/namespace.ts | 2 + 2 files changed, 119 insertions(+), 58 deletions(-) diff --git a/lib/routes/1lou/index.ts b/lib/routes/1lou/index.ts index 9769567760..0d3f16267b 100644 --- a/lib/routes/1lou/index.ts +++ b/lib/routes/1lou/index.ts @@ -1,88 +1,147 @@ import { Route } from '@/types'; + import cache from '@/utils/cache'; import got from '@/utils/got'; import { load } from 'cheerio'; import timezone from '@/utils/timezone'; import { parseDate } from '@/utils/parse-date'; -export const route: Route = { - path: '/:path?', - categories: ['multimedia'], - example: '/1lou/search-繁花.htm', - parameters: { path: '路径信息在URL里找到,主页为 index' }, - features: { - requireConfig: false, - requirePuppeteer: false, - antiCrawler: false, - supportBT: false, - supportPodcast: false, - supportScihub: false, - }, - radar: [ - { - source: ['1lou.me/:path'], - target: '/:path', - }, - ], - name: '搜索', - maintainers: ['falling'], - handler, - description: `:::tip - 将 1lou.me/ 后的内容作为参数传入到 path 即可 +const rootUrl = 'https://www.1lou.me'; - [www.1lou.me/search - 繁花.htm](http://www.1lou.me/search-繁花.htm) --> /1lou/search - 繁花.htm +export const handler = async (ctx) => { + const { params } = ctx.req.param(); + const limit = ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit'), 10) : 50; - [www.1lou.me/forum-1.htm](http://www.1lou.me/forum-1.htm) --> /1lou/forum-1.htm + const queryString = Object.entries(ctx.req.query()) + .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`) + .join('&'); - [www.1lou.me/](http://www.1lou.me/) --> /1lou/ - :::`, -}; + const currentUrl = new URL(`${params && params.endsWith('.htm') ? params : `${params}.htm`}${queryString ? `?${queryString}` : ''}`, rootUrl).href; -async function handler(ctx) { - const path = ctx.req.param('path') ?? ''; - const rootUrl = `https://www.1lou.me`; - const currentUrl = `${rootUrl}/${path}`; - const response = await got({ - method: 'get', - url: currentUrl, - }); - const $ = load(response.data); + const { data: response } = await got(currentUrl); - let items = $('li.media.thread.tap:not(.hidden-sm)') + const $ = load(response); + + const language = $('html').prop('lang'); + + let items = $('li.media.thread.tap:not(li.hidden-sm)') + .slice(0, limit) .toArray() .map((item) => { - const title = $(item).find('.subject.break-all').children('a').first(); - const author = $(item).find('.username.text-grey.mr-1').text(); - const pubDate = $(item).find('.date.text-grey').text(); + item = $(item); + + const subjectEl = item.find('div.subject').children('a').first(); + return { - title: title.text(), - link: `${rootUrl}/${title.attr('href')}`, - author, - pubDate: timezone(parseDate(pubDate), +8), + title: subjectEl.text(), + pubDate: timezone(parseDate(item.find('span.date').text()), +8), + link: new URL(subjectEl.prop('href'), rootUrl).href, + category: [ + item.find('a.text-secondary').text().replaceAll('[]', ''), + ...item + .find('a.badge') + .toArray() + .map((c) => $(c).text()), + ].filter(Boolean), + author: item.find('a.username').text(), + language, }; }); + items = await Promise.all( items.map((item) => cache.tryGet(item.link, async () => { - const detailResponse = await got({ - method: 'get', - url: item.link, - }); - const content = load(detailResponse.data); - item.description = content('.message.break-all').html(); - const torrents = content('.attachlist').find('a'); - if (torrents.length > 0) { - item.enclosure_type = 'application/x-bittorrent'; - item.enclosure_url = `${rootUrl}/${torrents.first().attr('href')}`; + const { data: detailResponse } = await got(item.link); + + const $$ = load(detailResponse); + + const title = $$('h4.break-all').contents().last().text(); + + if (title) { + const description = $$('div.message.break-all').html(); + const image = new URL($$('img').first().prop('src'), rootUrl).href; + + item.title = title; + item.description = description; + item.pubDate = timezone(parseDate($$('span.date').text()), +8); + item.category = $$('a.badge') + .toArray() + .map((c) => $$(c).text()); + item.content = { + html: description, + text: $$('div.message.break-all').text(), + }; + item.image = image; + item.banner = image; + item.language = language; + + const torrents = $$('ul.attachlist li a'); + + if (torrents.length > 0) { + const torrent = torrents.first(); + + item.enclosure_url = new URL(torrent.prop('href'), rootUrl).href; + item.enclosure_type = 'application/x-bittorrent'; + item.enclosure_title = torrent.text(); + } } return item; }) ) ); + + const author = 'BT 之家 1LOU 站'; + const image = new URL($('img.logo-2').prop('src'), rootUrl).href; + return { - title: '1Lou', + title: `${$('title').text().split(/-/)[0]} - ${author}`, + description: $('meta[name="description"]').prop('content'), link: currentUrl, item: items, + allowEmpty: true, + image, + author, + language, }; -} +}; + +export const route: Route = { + path: '/:params{.+}?', + name: '通用', + url: '1lou.me', + maintainers: ['falling', 'nczitzk'], + handler, + example: '/1lou/forum-2-1', + parameters: { params: '路径参数,可以在对应页面的 URL 中找到' }, + description: `:::tip + \`1lou.me/\` 后的内容填入 params 参数,以下是几个例子: + + 若订阅 [大陆电视剧](https://www.1lou.me/forum-2-1.htm?tagids=0_97_0_0),网址为 \`https://www.1lou.me/forum-2-1.htm?tagids=0_97_0_0\`。截取 \`https://www.1lou.me/\` 到末尾 \`.htm\` 的部分 \`forum-2-1\` 作为参数,并补充 \`tagids\`,此时路由为 [\`/1lou/forum-2-1?tagids=0_97_0_0\`](https://rsshub.app/1lou/forum-2-1?tagids=0_97_0_0)。 + + 若订阅 [最新发帖电视剧](https://www.1lou.me/forum-2-1.htm?orderby=tid&digest=0),网址为 \`https://www.1lou.me/forum-2-1.htm?orderby=tid&digest=0\`。截取 \`https://www.1lou.me/\` 到末尾 \`.htm\` 的部分 \`forum-2-1\` 作为参数,并补充 \`orderby\`,此时路由为 [\`/1lou/forum-2-1?orderby=tid\`](https://rsshub.app/1lou/forum-2-1?orderby=tid)。 + + 若订阅 [搜素繁花主题贴](https://www.1lou.me/search-_E7_B9_81_E8_8A_B1-1.htm),网址为 \`https://www.1lou.me/search-_E7_B9_81_E8_8A_B1-1.htm\`。截取 \`https://www.1lou.me/\` 到末尾 \`.htm\` 的部分 \`search-_E7_B9_81_E8_8A_B1-1\` 作为参数,此时路由为 [\`/1lou/search-_E7_B9_81_E8_8A_B1-1\`](https://rsshub.app/1lou/search-_E7_B9_81_E8_8A_B1-1)。 + :::`, + categories: ['multimedia'], + + features: { + requireConfig: false, + requirePuppeteer: false, + antiCrawler: false, + supportRadar: true, + supportBT: false, + supportPodcast: false, + supportScihub: false, + }, + radar: [ + { + source: ['1lou.me/:params'], + target: (_, url) => { + url = new URL(url); + + return `/1lou${url.href.replace(rootUrl, '')}`; + }, + }, + ], +}; diff --git a/lib/routes/1lou/namespace.ts b/lib/routes/1lou/namespace.ts index 388f617e4f..03f3b6c0ad 100644 --- a/lib/routes/1lou/namespace.ts +++ b/lib/routes/1lou/namespace.ts @@ -3,4 +3,6 @@ import type { Namespace } from '@/types'; export const namespace: Namespace = { name: 'BT 之家 1LOU 站', url: '1lou.me', + categories: ['multimedia'], + description: '', }; From aae5eb774199e4c786bdf58a215fcb34455f0a86 Mon Sep 17 00:00:00 2001 From: SettingDust Date: Sun, 31 Mar 2024 01:24:47 +0800 Subject: [PATCH 89/99] fix(modrinth): avoid duplicating author id (#15027) --- lib/routes/modrinth/versions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/routes/modrinth/versions.ts b/lib/routes/modrinth/versions.ts index 5377218481..57e5673b51 100644 --- a/lib/routes/modrinth/versions.ts +++ b/lib/routes/modrinth/versions.ts @@ -93,7 +93,7 @@ async function handler(ctx: Context) { }).json(); const authors = await customGot(`https://api.modrinth.com/v2/users`, { searchParams: { - ids: JSON.stringify(versions.map((it) => it.author_id)), + ids: JSON.stringify([...new Set(versions.map((it) => it.author_id))]), }, }).json(); const groupedAuthors = >{}; From d83c951d8cffa4af13461dc51814d71b6dceafb7 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Sun, 31 Mar 2024 02:28:26 +0800 Subject: [PATCH 90/99] fix: proxy auth --- lib/utils/proxy/index.ts | 8 ++++++-- lib/utils/request-rewriter/get.ts | 3 --- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/utils/proxy/index.ts b/lib/utils/proxy/index.ts index bc04898fce..aa0c5c9a7a 100644 --- a/lib/utils/proxy/index.ts +++ b/lib/utils/proxy/index.ts @@ -30,10 +30,14 @@ if (proxyIsPAC) { agent = new PacProxyAgent(`pac+${proxyUri}`); } else if (proxyUri) { if (proxyUri.startsWith('http')) { - agent = new HttpsProxyAgent(proxyUri); + agent = new HttpsProxyAgent(proxyUri, { + headers: { + 'proxy-authorization': config.proxy?.auth ? `Basic ${config.proxy?.auth}` : undefined, + }, + }); dispatcher = new ProxyAgent({ uri: proxyUri, - token: proxyObj?.auth ? `Basic ${proxyObj.auth}` : undefined, + token: config.proxy?.auth ? `Basic ${config.proxy?.auth}` : undefined, requestTls: { rejectUnauthorized: process.env.NODE_TLS_REJECT_UNAUTHORIZED !== '0', }, diff --git a/lib/utils/request-rewriter/get.ts b/lib/utils/request-rewriter/get.ts index a69e5f1c0e..181dd2adb5 100644 --- a/lib/utils/request-rewriter/get.ts +++ b/lib/utils/request-rewriter/get.ts @@ -54,9 +54,6 @@ const getWrappedGet: (origin: T) => T = (origin) => if (proxyRegex.test(url.toString()) && url.protocol.startsWith('http') && url.host !== proxy.proxyUrlHandler?.host) { options.agent = proxy.agent; - if (proxy.proxyObj.auth) { - options.headers['Proxy-Authorization'] = `Basic ${proxy.proxyObj.auth}`; - } } } From 8c50e2f96f7bfdf954e6e29c3bc59c420bb2d6b3 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Sun, 31 Mar 2024 02:28:58 +0800 Subject: [PATCH 91/99] test: request-rewriter --- lib/utils/request-rewriter.test.ts | 226 +++++++++++++++------------- lib/utils/request-rewriter/fetch.ts | 6 +- 2 files changed, 123 insertions(+), 109 deletions(-) diff --git a/lib/utils/request-rewriter.test.ts b/lib/utils/request-rewriter.test.ts index 5ac366c49f..44b1a37f4c 100644 --- a/lib/utils/request-rewriter.test.ts +++ b/lib/utils/request-rewriter.test.ts @@ -1,123 +1,137 @@ -import { describe, expect, it, afterEach, vi } from 'vitest'; -import '@/utils/request-rewriter'; -import { config } from '@/config'; - -import ofetch from '@/utils/ofetch'; +import { describe, expect, it, vi } from 'vitest'; +import undici from 'undici'; import got from 'got'; +import http from 'node:http'; -afterEach(() => { - delete process.env.PROXY_URI; - delete process.env.PROXY_AUTH; - delete process.env.PROXY_URL_REGEX; +process.env.PROXY_URI = 'http://rsshub.proxy:2333/'; +process.env.PROXY_AUTH = 'rsshubtest'; +process.env.PROXY_URL_REGEX = 'headers'; - vi.resetModules(); -}); +await import('@/utils/request-rewriter'); +const { config } = await import('@/config'); +const { default: ofetch } = await import('@/utils/ofetch'); describe('request-rewriter', () => { - it('ofetch', async () => { - const response = await ofetch('http://rsshub.test/headers'); - expect(response['user-agent']).toBe(config.ua); - expect(response.accept).toBe('*/*'); - expect(response.referer).toBe('http://rsshub.test'); + it('fetch', async () => { + const fetchSpy = vi.spyOn(undici, 'fetch'); + + try { + await (await fetch('http://rsshub.test/headers')).json(); + } catch { + // ignore + } + + // headers + const headers: Headers = fetchSpy.mock.lastCall?.[0].headers; + expect(headers.get('user-agent')).toBe(config.ua); + expect(headers.get('accept')).toBe('*/*'); + expect(headers.get('referer')).toBe('http://rsshub.test'); + + // proxy + const options = fetchSpy.mock.lastCall?.[1]; + const agentKey = Object.getOwnPropertySymbols(options?.dispatcher).find((s) => s.description === 'proxy agent options'); + const agentUri = agentKey ? options?.dispatcher?.[agentKey].uri : null; + expect(agentUri).toBe(process.env.PROXY_URI); + + // proxy auth + const headersKey = Object.getOwnPropertySymbols(options?.dispatcher).find((s) => s.description === 'proxy headers'); + const agentHeaders = headersKey ? options?.dispatcher?.[headersKey] : null; + expect(agentHeaders['proxy-authorization']).toBe(`Basic ${process.env.PROXY_AUTH}`); + + // url regex not match + { + try { + await (await fetch('http://rsshub.test/rss')).json(); + } catch { + // ignore + } + const options = fetchSpy.mock.lastCall?.[1]; + expect(options?.dispatcher).toBeUndefined(); + } }); - it('fetch', async () => { - const response = await (await fetch('http://rsshub.test/headers')).json(); - expect(response['user-agent']).toBe(config.ua); - expect(response.accept).toBe('*/*'); - expect(response.referer).toBe('http://rsshub.test'); + it('ofetch', async () => { + const fetchSpy = vi.spyOn(undici, 'fetch'); + + try { + await ofetch('http://rsshub.test/headers', { + retry: 0, + }); + } catch { + // ignore + } + + // headers + const headers: Headers = fetchSpy.mock.lastCall?.[0].headers; + expect(headers.get('user-agent')).toBe(config.ua); + expect(headers.get('accept')).toBe('*/*'); + expect(headers.get('referer')).toBe('http://rsshub.test'); + + // proxy + const options = fetchSpy.mock.lastCall?.[1]; + const agentKey = Object.getOwnPropertySymbols(options?.dispatcher).find((s) => s.description === 'proxy agent options'); + const agentUri = agentKey ? options?.dispatcher?.[agentKey].uri : null; + expect(agentUri).toBe(process.env.PROXY_URI); + + // proxy auth + const headersKey = Object.getOwnPropertySymbols(options?.dispatcher).find((s) => s.description === 'proxy headers'); + const agentHeaders = headersKey ? options?.dispatcher?.[headersKey] : null; + expect(agentHeaders['proxy-authorization']).toBe(`Basic ${process.env.PROXY_AUTH}`); + + // url regex not match + { + try { + await ofetch('http://rsshub.test/rss', { + retry: 0, + }); + } catch { + // ignore + } + const options = fetchSpy.mock.lastCall?.[1]; + expect(options?.dispatcher).toBeUndefined(); + } }); it('http', async () => { - const { config } = await import('@/config'); - await import('@/utils/request-rewriter'); + const httpSpy = vi.spyOn(http, 'request'); - const response = await got - .get('http://rsshub.test/headers', { + try { + await got.get('http://rsshub.test/headers', { headers: { 'user-agent': undefined, accept: undefined, }, - }) - .json(); - expect(response['user-agent']).toBe(config.ua); - expect(response.accept).toBe('*/*'); - expect(response.referer).toBe('http://rsshub.test'); + }); + } catch { + // ignore + } + + // headers + const options = httpSpy.mock.lastCall?.[1]; + const headers = options?.headers; + expect(headers?.['user-agent']).toBe(config.ua); + expect(headers?.accept).toBe('*/*'); + expect(headers?.referer).toBe('http://rsshub.test'); + + // proxy + const agentUri = options?.agent?.proxy?.href; + expect(agentUri).toBe(process.env.PROXY_URI); + expect(options?.agent?.proxyHeaders['proxy-authorization']).toBe(`Basic ${process.env.PROXY_AUTH}`); + + // url regex not match + { + try { + await got.get('http://rsshub.test/rss', { + headers: { + 'user-agent': undefined, + accept: undefined, + }, + }); + } catch { + // ignore + } + const options = httpSpy.mock.lastCall?.[1]; + expect(options?.agent).toBeUndefined(); + } }); - - // it('proxy-uri http', async () => { - // process.env.PROXY_URI = 'http://user:pass@rsshub.proxy:2333'; - - // await import('@/utils/request-wrapper'); - // check = (request) => { - // expect(request.agent.constructor.name).toBe('HttpsProxyAgent'); - // expect(request.agent.proxy.protocol).toBe('http:'); - // expect(request.agent.proxy.username).toBe('user'); - // expect(request.agent.proxy.password).toBe('pass'); - // expect(request.agent.proxy.host).toBe('rsshub.proxy:2333'); - // expect(request.agent.proxy.hostname).toBe('rsshub.proxy'); - // expect(request.agent.proxy.port).toBe('2333'); - // }; - - // nock(/rsshub\.test/) - // .get('/proxy') - // .times(2) - // .reply(200, simpleResponse); - - // await got.get('http://rsshub.test/proxy'); - // await parser.parseURL('http://rsshub.test/proxy'); - // }); - - // it('auth', async () => { - // process.env.PROXY_AUTH = 'testtest'; - // process.env.PROXY_PROTOCOL = 'http'; // only http(s) proxies extract auth from Headers - // process.env.PROXY_HOST = 'rsshub.proxy'; - // process.env.PROXY_PORT = '2333'; - - // await import('@/utils/request-wrapper'); - - // nock(/rsshub\.test/) - // .get('/auth') - // .times(2) - // .reply(function () { - // expect(this.req.headers['proxy-authorization']).toBe('Basic testtest'); - // return [200, simpleResponse]; - // }); - - // await got.get('http://rsshub.test/auth'); - // await parser.parseURL('http://rsshub.test/auth'); - // }); - - // it('url_regex', async () => { - // process.env.PROXY_URL_REGEX = 'url_regex'; - // process.env.PROXY_PROTOCOL = 'socks'; - // process.env.PROXY_HOST = 'rsshub.proxy'; - // process.env.PROXY_PORT = '2333'; - - // await import('@/utils/request-wrapper'); - // check = (request) => { - // if (request.path === '/url_regex') { - // expect(request.agent.constructor.name).toBe('SocksProxyAgent'); - // expect(request.agent.proxy.host).toBe('rsshub.proxy'); - // expect(request.agent.proxy.port).toBe(2333); - // } else if (request.path === '/proxy') { - // expect(request.agent).toBe(undefined); - // } - // }; - - // nock(/rsshub\.test/) - // .get('/url_regex') - // .times(2) - // .reply(() => [200, simpleResponse]); - // nock(/rsshub\.test/) - // .get('/proxy') - // .times(2) - // .reply(() => [200, simpleResponse]); - - // await got.get('http://rsshub.test/url_regex'); - // await parser.parseURL('http://rsshub.test/url_regex'); - - // await got.get('http://rsshub.test/proxy'); - // await parser.parseURL('http://rsshub.test/proxy'); - // }); }); diff --git a/lib/utils/request-rewriter/fetch.ts b/lib/utils/request-rewriter/fetch.ts index 39b628a233..69861eb0b5 100644 --- a/lib/utils/request-rewriter/fetch.ts +++ b/lib/utils/request-rewriter/fetch.ts @@ -1,9 +1,9 @@ import logger from '@/utils/logger'; import { config } from '@/config'; -import { fetch, Request, RequestInfo, RequestInit } from 'undici'; +import undici, { Request, RequestInfo, RequestInit } from 'undici'; import proxy from '@/utils/proxy'; -const wrappedFetch: typeof fetch = (input: RequestInfo, init?: RequestInit) => { +const wrappedFetch: typeof undici.fetch = (input: RequestInfo, init?: RequestInit) => { const request = new Request(input, init); const options: RequestInit = {}; @@ -44,7 +44,7 @@ const wrappedFetch: typeof fetch = (input: RequestInfo, init?: RequestInit) => { } } - return fetch(request, options); + return undici.fetch(request, options); }; export default wrappedFetch; From f7048d4c249978444b42b3f0454401e0f9cc2d12 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Sun, 31 Mar 2024 02:45:40 +0800 Subject: [PATCH 92/99] fix: ignore url parsing error --- lib/utils/request-rewriter/get.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/utils/request-rewriter/get.ts b/lib/utils/request-rewriter/get.ts index 181dd2adb5..7a0b21e6f2 100644 --- a/lib/utils/request-rewriter/get.ts +++ b/lib/utils/request-rewriter/get.ts @@ -8,7 +8,7 @@ type Get = typeof http.get | typeof https.get | typeof http.request | typeof htt const getWrappedGet: (origin: T) => T = (origin) => function (this: any, ...args: Parameters) { - let url: URL; + let url: URL | null; let options: http.RequestOptions = {}; let callback: ((res: http.IncomingMessage) => void) | undefined; if (typeof args[0] === 'string' || args[0] instanceof URL) { @@ -22,11 +22,18 @@ const getWrappedGet: (origin: T) => T = (origin) => } } else { options = args[0]; - url = new URL(options.href || `${options.protocol}//${options.hostname || options.host}${options.path}${options.search || (options.query ? `?${options.query}` : '')}`); + try { + url = new URL(options.href || `${options.protocol || 'http:'}//${options.hostname || options.host}${options.path}${options.search || (options.query ? `?${options.query}` : '')}`); + } catch { + url = null; + } if (typeof args[1] === 'function') { callback = args[1]; } } + if (!url) { + return Reflect.apply(origin, this, args) as ReturnType; + } logger.debug(`Outgoing request: ${options.method || 'GET'} ${url}`); From f5ced001eb202054bcde8043359131c1b1742fb6 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Sun, 31 Mar 2024 03:17:53 +0800 Subject: [PATCH 93/99] test: errors --- lib/errors/index.test.ts | 2 +- lib/errors/index.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/errors/index.test.ts b/lib/errors/index.test.ts index a89a84af62..f76af62198 100644 --- a/lib/errors/index.test.ts +++ b/lib/errors/index.test.ts @@ -22,7 +22,7 @@ describe('httperror', () => { it(`httperror`, async () => { const response = await request.get('/test/httperror'); expect(response.status).toBe(503); - expect(response.text).toMatch('Response code 404 (Not Found): target website might be blocking our access, you can host your own RSSHub instance for a better usability.'); + expect(response.text).toMatch('404 Not Found: target website might be blocking our access, you can host your own RSSHub instance for a better usability.'); }, 20000); }); diff --git a/lib/errors/index.tsx b/lib/errors/index.tsx index f2ff4bde7e..913bd3b82c 100644 --- a/lib/errors/index.tsx +++ b/lib/errors/index.tsx @@ -39,7 +39,7 @@ export const errorHandler: ErrorHandler = (error, ctx) => { } let message = ''; - if (error.name && (error.name === 'HTTPError' || error.name === 'RequestError')) { + if (error.name && (error.name === 'HTTPError' || error.name === 'RequestError' || error.name === 'FetchError')) { ctx.status(503); message = `${error.message}: target website might be blocking our access, you can host your own RSSHub instance for a better usability.`; } else if (error instanceof RequestInProgressError) { From 34e844a70b64468076c9a8e420b43aa297d97216 Mon Sep 17 00:00:00 2001 From: N78Wy <98439218+N78Wy@users.noreply.github.com> Date: Sun, 31 Mar 2024 07:02:56 +0800 Subject: [PATCH 94/99] fix(router): MMDArchive fix __dirname (#15028) Co-authored-by: keweiye --- lib/routes/booru/mmda.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/routes/booru/mmda.ts b/lib/routes/booru/mmda.ts index 664cc1bb26..6123735411 100644 --- a/lib/routes/booru/mmda.ts +++ b/lib/routes/booru/mmda.ts @@ -1,4 +1,7 @@ import { Route } from '@/types'; +import { getCurrentPath } from '@/utils/helpers'; +const __dirname = getCurrentPath(import.meta.url); + import got from '@/utils/got'; import queryString from 'query-string'; import { load } from 'cheerio'; From 614f6dc12fe1a55aa6aeb86c6553ad778f755a95 Mon Sep 17 00:00:00 2001 From: Ethan Shen <42264778+nczitzk@users.noreply.github.com> Date: Sun, 31 Mar 2024 07:21:57 +0800 Subject: [PATCH 95/99] =?UTF-8?q?feat(route):=20add=20=E5=B9=BB=E4=B9=8B?= =?UTF-8?q?=E7=BE=81=E7=BB=8A=E5=8A=A8=E6=BC=AB=E7=BD=91=20(#15015)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(route): add 幻之羁绊动漫网 * fix categories --- lib/routes-deprecated/005tv/zx.js | 24 ---- lib/routes/005/index.ts | 156 +++++++++++++++++++++++ lib/routes/005/namespace.ts | 8 ++ lib/routes/005/templates/description.art | 27 ++++ 4 files changed, 191 insertions(+), 24 deletions(-) delete mode 100644 lib/routes-deprecated/005tv/zx.js create mode 100644 lib/routes/005/index.ts create mode 100644 lib/routes/005/namespace.ts create mode 100644 lib/routes/005/templates/description.art diff --git a/lib/routes-deprecated/005tv/zx.js b/lib/routes-deprecated/005tv/zx.js deleted file mode 100644 index 007546baa5..0000000000 --- a/lib/routes-deprecated/005tv/zx.js +++ /dev/null @@ -1,24 +0,0 @@ -const got = require('@/utils/got'); -const host = 'http://www.005.tv/zx'; -const cheerio = require('cheerio'); - -module.exports = async (ctx) => { - const response = await got(host); - const data = response.body; - const $ = cheerio.load(data); - const list = $('div.article-list li'); - ctx.state.data = { - title: $('head > title').text(), - link: host, - description: '二次元资讯', - item: list - .map((index, item) => ({ - title: $(item).find('h3 > a').text().trim(), - description: `
- ${$(item).find('div.p-row').text()}`, - link: $(item).find('h3 > a').attr('href'), - pubDate: new Date($(item).find('span.fr.time').text().trim().slice(0, 4), $(item).find('span.fr.time').text().trim().slice(5, 7), $(item).find('span.fr.time').text().trim().slice(8, 12)).toUTCString(), - })) - .get(), - }; -}; diff --git a/lib/routes/005/index.ts b/lib/routes/005/index.ts new file mode 100644 index 0000000000..9b8c1ec34a --- /dev/null +++ b/lib/routes/005/index.ts @@ -0,0 +1,156 @@ +import { Route } from '@/types'; +import { getCurrentPath } from '@/utils/helpers'; +const __dirname = getCurrentPath(import.meta.url); + +import cache from '@/utils/cache'; +import got from '@/utils/got'; +import { load } from 'cheerio'; +import timezone from '@/utils/timezone'; +import { parseDate } from '@/utils/parse-date'; +import { art } from '@/utils/render'; +import * as path from 'node:path'; + +export const handler = async (ctx) => { + const { category = 'zx' } = ctx.req.param(); + const limit = ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit'), 10) : 20; + + const rootUrl = 'https://005.tv'; + const currentUrl = new URL(category ? `${category}/` : '', rootUrl).href; + + const { data: response } = await got(currentUrl); + + const $ = load(response); + + const language = $('html').prop('lang'); + + let items = $('div.article-list ul li') + .slice(0, limit) + .toArray() + .map((item) => { + item = $(item); + + const title = item.find('h3').text(); + const image = item.find('img').prop('src'); + + const description = art(path.join(__dirname, 'templates/description.art'), { + intro: item.find('div.p-row').text(), + images: image + ? [ + { + src: image, + alt: title, + }, + ] + : undefined, + }); + + return { + title, + description, + pubDate: parseDate(item.find('span.time').text()), + link: new URL(item.find('h3 a').prop('href'), rootUrl).href, + content: { + html: description, + text: item.find('div.p-row').text(), + }, + image, + banner: image, + language, + }; + }); + + items = await Promise.all( + items.map((item) => + cache.tryGet(item.link, async () => { + const { data: detailResponse } = await got(item.link); + + const $$ = load(detailResponse); + + const title = $$('h1.articleTitle-name').text(); + const description = $$('div.articleContent').html(); + + item.title = title; + item.description = description; + item.pubDate = timezone(parseDate($$('.time').text()), +8); + item.category = $$('meta[name="keywords"]').prop('content').split(/,/); + item.content = { + html: description, + text: $$('div.articleContent').text(), + }; + item.language = language; + + return item; + }) + ) + ); + + const title = $('title').text(); + const image = new URL('templets/muban/style/images/logo.png', rootUrl).href; + + return { + title, + description: title.split(/_/)[0], + link: currentUrl, + item: items, + allowEmpty: true, + image, + author: title.split(/,/).pop(), + language, + }; +}; + +export const route: Route = { + path: '/:category?', + name: '资讯', + url: '005.tv', + maintainers: ['nczitzk'], + handler, + example: '/005/zx', + parameters: { category: '分类,可在对应分类页 URL 中找到,默认为二次元资讯' }, + description: ` + | 二次元资讯 | 慢慢说 | 道听途说 | 展会资讯 | + | ---------- | ------ | -------- | -------- | + | zx | zwh | dtts | zh | + `, + categories: ['anime'], + + features: { + requireConfig: false, + requirePuppeteer: false, + antiCrawler: false, + supportRadar: true, + supportBT: false, + supportPodcast: false, + supportScihub: false, + }, + radar: [ + { + source: ['005.tv/:category'], + target: (params) => { + const category = params.category; + + return `/005${category ? `/${category}` : ''}`; + }, + }, + { + title: '二次元资讯', + source: ['005.tv/zx/'], + target: '/005/zx', + }, + { + title: '慢慢说', + source: ['005.tv/zwh/'], + target: '/005/zwh', + }, + { + title: '道听途说', + source: ['005.tv/dtts/'], + target: '/005/dtts', + }, + { + title: '展会资讯', + source: ['005.tv/zh/'], + target: '/005/zh', + }, + ], +}; diff --git a/lib/routes/005/namespace.ts b/lib/routes/005/namespace.ts new file mode 100644 index 0000000000..fcf20a8fb0 --- /dev/null +++ b/lib/routes/005/namespace.ts @@ -0,0 +1,8 @@ +import type { Namespace } from '@/types'; + +export const namespace: Namespace = { + name: '幻之羁绊动漫网', + url: '005.tv', + categories: ['anime'], + description: '', +}; diff --git a/lib/routes/005/templates/description.art b/lib/routes/005/templates/description.art new file mode 100644 index 0000000000..d96cdbc563 --- /dev/null +++ b/lib/routes/005/templates/description.art @@ -0,0 +1,27 @@ +{{ if images }} + {{ each images image }} + {{ if !videos?.[0]?.src && image?.src }} +

+ {{ image.alt }} +
+ {{ /if }} + {{ /each }} +{{ /if }} + +{{ if intro }} +
{{ intro }}
+{{ /if }} + +{{ if description }} + {{@ description }} +{{ /if }} \ No newline at end of file From bf4e5dd78ffcef07ac6e2cf2588c26dfbf9c38ee Mon Sep 17 00:00:00 2001 From: DIYgod Date: Sun, 31 Mar 2024 23:13:22 +0800 Subject: [PATCH 96/99] test: fix caces --- lib/middleware/cache.test.ts | 10 +++++----- lib/middleware/parameter.test.ts | 30 +++++++----------------------- lib/middleware/parameter.ts | 2 +- lib/setup.test.ts | 2 +- lib/utils/got.test.ts | 4 ++-- vitest.config.ts | 1 + 6 files changed, 17 insertions(+), 32 deletions(-) diff --git a/lib/middleware/cache.test.ts b/lib/middleware/cache.test.ts index 7edce9fc5b..393d8153e7 100644 --- a/lib/middleware/cache.test.ts +++ b/lib/middleware/cache.test.ts @@ -3,7 +3,7 @@ import Parser from 'rss-parser'; import wait from '@/utils/wait'; process.env.CACHE_EXPIRE = '1'; -process.env.CACHE_CONTENT_EXPIRE = '3'; +process.env.CACHE_CONTENT_EXPIRE = '2'; const parser = new Parser(); @@ -38,7 +38,7 @@ describe('cache', () => { expect(response3.headers).not.toHaveProperty('rsshub-cache-status'); const parsed3 = await parser.parseString(await response3.text()); - await wait(3 * 1000 + 100); + await wait(2 * 1000 + 100); const response4 = await app.request('/test/cache'); const parsed4 = await parser.parseString(await response4.text()); @@ -51,7 +51,7 @@ describe('cache', () => { await wait(1 * 1000 + 100); const response5 = await app.request('/test/refreshCache'); const parsed5 = await parser.parseString(await response5.text()); - await wait(2 * 1000 + 100); + await wait(1 * 1000 + 100); const response6 = await app.request('/test/refreshCache'); const parsed6 = await parser.parseString(await response6.text()); @@ -86,7 +86,7 @@ describe('cache', () => { expect(response3.headers).not.toHaveProperty('rsshub-cache-status'); const parsed3 = await parser.parseString(await response3.text()); - await wait(3 * 1000 + 100); + await wait(2 * 1000 + 100); const response4 = await app.request('/test/cache'); const parsed4 = await parser.parseString(await response4.text()); @@ -99,7 +99,7 @@ describe('cache', () => { await wait(1 * 1000 + 100); const response5 = await app.request('/test/refreshCache'); const parsed5 = await parser.parseString(await response5.text()); - await wait(2 * 1000 + 100); + await wait(1 * 1000 + 100); const response6 = await app.request('/test/refreshCache'); const parsed6 = await parser.parseString(await response6.text()); diff --git a/lib/middleware/parameter.test.ts b/lib/middleware/parameter.test.ts index 2a31436d30..6fb8788bbf 100644 --- a/lib/middleware/parameter.test.ts +++ b/lib/middleware/parameter.test.ts @@ -1,8 +1,12 @@ import { describe, expect, it, vi } from 'vitest'; -import app from '@/app'; import Parser from 'rss-parser'; -import { config } from '@/config'; -import nock from 'nock'; + +process.env.OPENAI_API_KEY = 'sk-1234567890'; +process.env.OPENAI_API_ENDPOINT = 'https://api.openai.mock/v1'; + +vi.mock('@/utils/request-rewriter', () => ({ default: null })); +const { config } = await import('@/config'); +const { default: app } = await import('@/app'); const parser = new Parser(); @@ -424,26 +428,6 @@ describe('multi parameter', () => { describe('openai', () => { it(`chatgpt`, async () => { - vi.resetModules(); - - process.env.OPENAI_API_KEY = 'sk-1234567890'; - const app = (await import('@/app')).default; - const { config } = await import('@/config'); - nock(config.openai.endpoint) - .post('/chat/completions') - .reply(() => [ - 200, - { - choices: [ - { - message: { - content: 'Summary of the article.', - }, - }, - ], - }, - ]); - const responseWithGpt = await app.request('/test/gpt?chatgpt=true'); const responseNormal = await app.request('/test/gpt'); diff --git a/lib/middleware/parameter.ts b/lib/middleware/parameter.ts index 025f6b405c..5985d4bd88 100644 --- a/lib/middleware/parameter.ts +++ b/lib/middleware/parameter.ts @@ -50,7 +50,7 @@ const summarizeArticle = async (articleText: string) => { }, }); - return response.data.choices[0].message.content; + return response.choices[0].message.content; }; const getAuthorString = (item) => { diff --git a/lib/setup.test.ts b/lib/setup.test.ts index 90170e0c7e..192d9fe827 100644 --- a/lib/setup.test.ts +++ b/lib/setup.test.ts @@ -3,7 +3,7 @@ import { setupServer } from 'msw/node'; import { http, HttpResponse } from 'msw'; const server = setupServer( - http.post(`https://api.openai.com/v1/chat/completions`, () => + http.post(`https://api.openai.mock/v1/chat/completions`, () => HttpResponse.json({ choices: [ { diff --git a/lib/utils/got.test.ts b/lib/utils/got.test.ts index 5b65725fc0..b09ff977e4 100644 --- a/lib/utils/got.test.ts +++ b/lib/utils/got.test.ts @@ -5,8 +5,8 @@ import { config } from '@/config'; describe('got', () => { it('headers', async () => { - const { data } = await got('http://rsshub.test/ua'); - expect(data.ua).toBe(config.ua); + const { data } = await got('http://rsshub.test/headers'); + expect(data['user-agent']).toBe(config.ua); }); it('retry', async () => { diff --git a/vitest.config.ts b/vitest.config.ts index bc2deb5f5f..883c92d55b 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -11,5 +11,6 @@ export default defineConfig({ }, testTimeout: 10000, setupFiles: ['./lib/setup.test.ts'], + exclude: ['./lib/setup.test.ts'], }, }); From 4f44a8150d81a76768501f7ad88d1b94875948bb Mon Sep 17 00:00:00 2001 From: DIYgod Date: Sun, 31 Mar 2024 23:33:31 +0800 Subject: [PATCH 97/99] test: fix exclude --- vitest.config.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vitest.config.ts b/vitest.config.ts index 883c92d55b..fa395d2b2b 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -1,4 +1,4 @@ -import { defineConfig } from 'vitest/config'; +import { defineConfig, configDefaults } from 'vitest/config'; import tsconfigPaths from 'vite-tsconfig-paths'; export default defineConfig({ @@ -11,6 +11,6 @@ export default defineConfig({ }, testTimeout: 10000, setupFiles: ['./lib/setup.test.ts'], - exclude: ['./lib/setup.test.ts'], + exclude: [...configDefaults.exclude, './lib/setup.test.ts'], }, }); From 425a131083ac240606745d3f0f26fd5df0cf8822 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Mon, 1 Apr 2024 01:51:11 +0800 Subject: [PATCH 98/99] chore: remove nock --- package.json | 1 - pnpm-lock.yaml | 17 +---------------- 2 files changed, 1 insertion(+), 17 deletions(-) diff --git a/package.json b/package.json index 35ed9843e3..7cd349712d 100644 --- a/package.json +++ b/package.json @@ -168,7 +168,6 @@ "lint-staged": "15.2.2", "mockdate": "3.0.5", "msw": "2.2.13", - "nock": "14.0.0-beta.5", "prettier": "3.2.5", "remark-parse": "11.0.0", "supertest": "6.3.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b7d45e82e0..55a499b446 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -355,9 +355,6 @@ devDependencies: msw: specifier: 2.2.13 version: 2.2.13(typescript@5.4.3) - nock: - specifier: 14.0.0-beta.5 - version: 14.0.0-beta.5 prettier: specifier: 3.2.5 version: 3.2.5 @@ -6361,6 +6358,7 @@ packages: /json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: false /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} @@ -7240,14 +7238,6 @@ packages: lower-case: 1.1.4 dev: false - /nock@14.0.0-beta.5: - resolution: {integrity: sha512-u255tf4DYvyErTlPZA9uTfXghiZZy+NflUOFONPVKZ5tP0yaHwKig28zyFOLhu8y5YcCRC+V5vDk4HHileh2iw==} - engines: {node: '>= 18'} - dependencies: - json-stringify-safe: 5.0.1 - propagate: 2.0.1 - dev: true - /node-fetch-native@1.6.4: resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} dev: false @@ -7817,11 +7807,6 @@ packages: engines: {node: '>=0.4.0'} dev: false - /propagate@2.0.1: - resolution: {integrity: sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==} - engines: {node: '>= 8'} - dev: true - /proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} dev: true From 255f04b8fe96dbdd9990ec76cd13a74835272887 Mon Sep 17 00:00:00 2001 From: rkscv Date: Mon, 1 Apr 2024 10:55:13 +0800 Subject: [PATCH 99/99] fix(route): linovelib volume (#15039) --- lib/routes/linovelib/volume.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/routes/linovelib/volume.ts b/lib/routes/linovelib/volume.ts index 8aa877e3db..be962f55eb 100644 --- a/lib/routes/linovelib/volume.ts +++ b/lib/routes/linovelib/volume.ts @@ -21,7 +21,7 @@ export const route: Route = { async function handler(ctx: Context): Promise { const { id } = ctx.req.param(); const link = `https://www.linovelib.com/novel/${id}/catalog`; - const $ = load(await got(link).text()); + const $ = load((await got(link)).data); return { title: `${$('.book-meta h1').text()} - 哔哩轻小说`, link,