├── .gitignore ├── LICENSE ├── app.js ├── dockerfile ├── package-lock.json ├── package.json ├── readme.md ├── searchEngineTool.js └── searchEngines.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/* 2 | .vscode -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | const Koa = require('koa'); 2 | const bodyParser = require('koa-bodyparser'); 3 | 4 | const searchEngineTool = require("./searchEngineTool"); 5 | 6 | const app = new Koa(); 7 | app.use(bodyParser()); 8 | 9 | app.use(async ctx => { 10 | // the parsed body will store in ctx.request.body 11 | // if nothing was parsed, body will be an empty object {} 12 | 13 | let question = ctx.request.body.q; 14 | let engine = ctx.request.body.engine ? ctx.request.body.engine : 'baidu'; 15 | ctx.body = { q: question, results: await searchEngineTool(question, engine) }; 16 | }); 17 | 18 | app.listen(3000); -------------------------------------------------------------------------------- /dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:21-bullseye-slim 2 | 3 | # We don't need the standalone Chromium 4 | ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD true 5 | 6 | # Install Google Chrome Stable and fonts 7 | # Note: this installs the necessary libs to make the browser work with Puppeteer. 8 | RUN apt-get update && apt-get install gnupg wget -y && \ 9 | wget --quiet --output-document=- https://dl-ssl.google.com/linux/linux_signing_key.pub | gpg --dearmor > /etc/apt/trusted.gpg.d/google-archive.gpg && \ 10 | sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' && \ 11 | apt-get update && \ 12 | apt-get install google-chrome-stable -y --no-install-recommends && \ 13 | rm -rf /var/lib/apt/lists/* 14 | 15 | WORKDIR /app 16 | 17 | COPY package.json package.json 18 | COPY package-lock.json package-lock.json 19 | 20 | RUN npm install 21 | 22 | COPY . . 23 | 24 | EXPOSE 3000 25 | CMD [ "node", "app.js" ] -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "search-node-api", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "search-node-api", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "koa": "^2.14.2", 13 | "koa-body-parser": "^1.1.2", 14 | "koa-bodyparser": "^4.4.1", 15 | "koa-router": "^12.0.1", 16 | "puppeteer": "^20.7.3" 17 | } 18 | }, 19 | "node_modules/@babel/code-frame": { 20 | "version": "7.22.13", 21 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", 22 | "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", 23 | "dependencies": { 24 | "@babel/highlight": "^7.22.13", 25 | "chalk": "^2.4.2" 26 | }, 27 | "engines": { 28 | "node": ">=6.9.0" 29 | } 30 | }, 31 | "node_modules/@babel/helper-validator-identifier": { 32 | "version": "7.22.20", 33 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", 34 | "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", 35 | "engines": { 36 | "node": ">=6.9.0" 37 | } 38 | }, 39 | "node_modules/@babel/highlight": { 40 | "version": "7.22.20", 41 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", 42 | "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", 43 | "dependencies": { 44 | "@babel/helper-validator-identifier": "^7.22.20", 45 | "chalk": "^2.4.2", 46 | "js-tokens": "^4.0.0" 47 | }, 48 | "engines": { 49 | "node": ">=6.9.0" 50 | } 51 | }, 52 | "node_modules/@puppeteer/browsers": { 53 | "version": "1.4.6", 54 | "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.4.6.tgz", 55 | "integrity": "sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==", 56 | "dependencies": { 57 | "debug": "4.3.4", 58 | "extract-zip": "2.0.1", 59 | "progress": "2.0.3", 60 | "proxy-agent": "6.3.0", 61 | "tar-fs": "3.0.4", 62 | "unbzip2-stream": "1.4.3", 63 | "yargs": "17.7.1" 64 | }, 65 | "bin": { 66 | "browsers": "lib/cjs/main-cli.js" 67 | }, 68 | "engines": { 69 | "node": ">=16.3.0" 70 | }, 71 | "peerDependencies": { 72 | "typescript": ">= 4.7.4" 73 | }, 74 | "peerDependenciesMeta": { 75 | "typescript": { 76 | "optional": true 77 | } 78 | } 79 | }, 80 | "node_modules/@tootallnate/quickjs-emscripten": { 81 | "version": "0.23.0", 82 | "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", 83 | "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" 84 | }, 85 | "node_modules/@types/node": { 86 | "version": "20.9.1", 87 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.1.tgz", 88 | "integrity": "sha512-HhmzZh5LSJNS5O8jQKpJ/3ZcrrlG6L70hpGqMIAoM9YVD0YBRNWYsfwcXq8VnSjlNpCpgLzMXdiPo+dxcvSmiA==", 89 | "optional": true, 90 | "dependencies": { 91 | "undici-types": "~5.26.4" 92 | } 93 | }, 94 | "node_modules/@types/yauzl": { 95 | "version": "2.10.3", 96 | "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", 97 | "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", 98 | "optional": true, 99 | "dependencies": { 100 | "@types/node": "*" 101 | } 102 | }, 103 | "node_modules/accepts": { 104 | "version": "1.3.8", 105 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 106 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 107 | "dependencies": { 108 | "mime-types": "~2.1.34", 109 | "negotiator": "0.6.3" 110 | }, 111 | "engines": { 112 | "node": ">= 0.6" 113 | } 114 | }, 115 | "node_modules/agent-base": { 116 | "version": "7.1.0", 117 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", 118 | "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", 119 | "dependencies": { 120 | "debug": "^4.3.4" 121 | }, 122 | "engines": { 123 | "node": ">= 14" 124 | } 125 | }, 126 | "node_modules/ansi-regex": { 127 | "version": "5.0.1", 128 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 129 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 130 | "engines": { 131 | "node": ">=8" 132 | } 133 | }, 134 | "node_modules/ansi-styles": { 135 | "version": "3.2.1", 136 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 137 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 138 | "dependencies": { 139 | "color-convert": "^1.9.0" 140 | }, 141 | "engines": { 142 | "node": ">=4" 143 | } 144 | }, 145 | "node_modules/argparse": { 146 | "version": "2.0.1", 147 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 148 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" 149 | }, 150 | "node_modules/ast-types": { 151 | "version": "0.13.4", 152 | "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", 153 | "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", 154 | "dependencies": { 155 | "tslib": "^2.0.1" 156 | }, 157 | "engines": { 158 | "node": ">=4" 159 | } 160 | }, 161 | "node_modules/b4a": { 162 | "version": "1.6.4", 163 | "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", 164 | "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" 165 | }, 166 | "node_modules/base64-js": { 167 | "version": "1.5.1", 168 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 169 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 170 | "funding": [ 171 | { 172 | "type": "github", 173 | "url": "https://github.com/sponsors/feross" 174 | }, 175 | { 176 | "type": "patreon", 177 | "url": "https://www.patreon.com/feross" 178 | }, 179 | { 180 | "type": "consulting", 181 | "url": "https://feross.org/support" 182 | } 183 | ] 184 | }, 185 | "node_modules/basic-ftp": { 186 | "version": "5.0.3", 187 | "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.3.tgz", 188 | "integrity": "sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==", 189 | "engines": { 190 | "node": ">=10.0.0" 191 | } 192 | }, 193 | "node_modules/buffer": { 194 | "version": "5.7.1", 195 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 196 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 197 | "funding": [ 198 | { 199 | "type": "github", 200 | "url": "https://github.com/sponsors/feross" 201 | }, 202 | { 203 | "type": "patreon", 204 | "url": "https://www.patreon.com/feross" 205 | }, 206 | { 207 | "type": "consulting", 208 | "url": "https://feross.org/support" 209 | } 210 | ], 211 | "dependencies": { 212 | "base64-js": "^1.3.1", 213 | "ieee754": "^1.1.13" 214 | } 215 | }, 216 | "node_modules/buffer-crc32": { 217 | "version": "0.2.13", 218 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 219 | "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", 220 | "engines": { 221 | "node": "*" 222 | } 223 | }, 224 | "node_modules/bytes": { 225 | "version": "1.0.0", 226 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", 227 | "integrity": "sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ==" 228 | }, 229 | "node_modules/cache-content-type": { 230 | "version": "1.0.1", 231 | "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", 232 | "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", 233 | "dependencies": { 234 | "mime-types": "^2.1.18", 235 | "ylru": "^1.2.0" 236 | }, 237 | "engines": { 238 | "node": ">= 6.0.0" 239 | } 240 | }, 241 | "node_modules/call-bind": { 242 | "version": "1.0.5", 243 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", 244 | "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", 245 | "dependencies": { 246 | "function-bind": "^1.1.2", 247 | "get-intrinsic": "^1.2.1", 248 | "set-function-length": "^1.1.1" 249 | }, 250 | "funding": { 251 | "url": "https://github.com/sponsors/ljharb" 252 | } 253 | }, 254 | "node_modules/callsites": { 255 | "version": "3.1.0", 256 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 257 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 258 | "engines": { 259 | "node": ">=6" 260 | } 261 | }, 262 | "node_modules/chalk": { 263 | "version": "2.4.2", 264 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 265 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 266 | "dependencies": { 267 | "ansi-styles": "^3.2.1", 268 | "escape-string-regexp": "^1.0.5", 269 | "supports-color": "^5.3.0" 270 | }, 271 | "engines": { 272 | "node": ">=4" 273 | } 274 | }, 275 | "node_modules/chromium-bidi": { 276 | "version": "0.4.16", 277 | "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz", 278 | "integrity": "sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==", 279 | "dependencies": { 280 | "mitt": "3.0.0" 281 | }, 282 | "peerDependencies": { 283 | "devtools-protocol": "*" 284 | } 285 | }, 286 | "node_modules/cliui": { 287 | "version": "8.0.1", 288 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 289 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 290 | "dependencies": { 291 | "string-width": "^4.2.0", 292 | "strip-ansi": "^6.0.1", 293 | "wrap-ansi": "^7.0.0" 294 | }, 295 | "engines": { 296 | "node": ">=12" 297 | } 298 | }, 299 | "node_modules/co": { 300 | "version": "4.6.0", 301 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 302 | "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", 303 | "engines": { 304 | "iojs": ">= 1.0.0", 305 | "node": ">= 0.12.0" 306 | } 307 | }, 308 | "node_modules/co-body": { 309 | "version": "2.0.0", 310 | "resolved": "https://registry.npmjs.org/co-body/-/co-body-2.0.0.tgz", 311 | "integrity": "sha512-OFdxyTLZndkM9xl7WqGKfkNe2KKWmSywaJAz/xZQnj519T8o29W+QM1osyi2ilps4WiP/q3H+qiIuSXesrmcnw==", 312 | "dependencies": { 313 | "qs": "~2.4.1", 314 | "raw-body": "~1.3.4" 315 | } 316 | }, 317 | "node_modules/color-convert": { 318 | "version": "1.9.3", 319 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 320 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 321 | "dependencies": { 322 | "color-name": "1.1.3" 323 | } 324 | }, 325 | "node_modules/color-name": { 326 | "version": "1.1.3", 327 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 328 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" 329 | }, 330 | "node_modules/content-disposition": { 331 | "version": "0.5.4", 332 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 333 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 334 | "dependencies": { 335 | "safe-buffer": "5.2.1" 336 | }, 337 | "engines": { 338 | "node": ">= 0.6" 339 | } 340 | }, 341 | "node_modules/content-type": { 342 | "version": "1.0.5", 343 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 344 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 345 | "engines": { 346 | "node": ">= 0.6" 347 | } 348 | }, 349 | "node_modules/cookies": { 350 | "version": "0.8.0", 351 | "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", 352 | "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", 353 | "dependencies": { 354 | "depd": "~2.0.0", 355 | "keygrip": "~1.1.0" 356 | }, 357 | "engines": { 358 | "node": ">= 0.8" 359 | } 360 | }, 361 | "node_modules/copy-to": { 362 | "version": "2.0.1", 363 | "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", 364 | "integrity": "sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==" 365 | }, 366 | "node_modules/cosmiconfig": { 367 | "version": "8.2.0", 368 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", 369 | "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", 370 | "dependencies": { 371 | "import-fresh": "^3.2.1", 372 | "js-yaml": "^4.1.0", 373 | "parse-json": "^5.0.0", 374 | "path-type": "^4.0.0" 375 | }, 376 | "engines": { 377 | "node": ">=14" 378 | }, 379 | "funding": { 380 | "url": "https://github.com/sponsors/d-fischer" 381 | } 382 | }, 383 | "node_modules/cross-fetch": { 384 | "version": "4.0.0", 385 | "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", 386 | "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", 387 | "dependencies": { 388 | "node-fetch": "^2.6.12" 389 | } 390 | }, 391 | "node_modules/data-uri-to-buffer": { 392 | "version": "6.0.1", 393 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.1.tgz", 394 | "integrity": "sha512-MZd3VlchQkp8rdend6vrx7MmVDJzSNTBvghvKjirLkD+WTChA3KUf0jkE68Q4UyctNqI11zZO9/x2Yx+ub5Cvg==", 395 | "engines": { 396 | "node": ">= 14" 397 | } 398 | }, 399 | "node_modules/debug": { 400 | "version": "4.3.4", 401 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 402 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 403 | "dependencies": { 404 | "ms": "2.1.2" 405 | }, 406 | "engines": { 407 | "node": ">=6.0" 408 | }, 409 | "peerDependenciesMeta": { 410 | "supports-color": { 411 | "optional": true 412 | } 413 | } 414 | }, 415 | "node_modules/deep-equal": { 416 | "version": "1.0.1", 417 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 418 | "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==" 419 | }, 420 | "node_modules/define-data-property": { 421 | "version": "1.1.1", 422 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", 423 | "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", 424 | "dependencies": { 425 | "get-intrinsic": "^1.2.1", 426 | "gopd": "^1.0.1", 427 | "has-property-descriptors": "^1.0.0" 428 | }, 429 | "engines": { 430 | "node": ">= 0.4" 431 | } 432 | }, 433 | "node_modules/degenerator": { 434 | "version": "5.0.1", 435 | "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", 436 | "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", 437 | "dependencies": { 438 | "ast-types": "^0.13.4", 439 | "escodegen": "^2.1.0", 440 | "esprima": "^4.0.1" 441 | }, 442 | "engines": { 443 | "node": ">= 14" 444 | } 445 | }, 446 | "node_modules/delegates": { 447 | "version": "1.0.0", 448 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 449 | "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" 450 | }, 451 | "node_modules/depd": { 452 | "version": "2.0.0", 453 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 454 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 455 | "engines": { 456 | "node": ">= 0.8" 457 | } 458 | }, 459 | "node_modules/destroy": { 460 | "version": "1.2.0", 461 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 462 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 463 | "engines": { 464 | "node": ">= 0.8", 465 | "npm": "1.2.8000 || >= 1.4.16" 466 | } 467 | }, 468 | "node_modules/devtools-protocol": { 469 | "version": "0.0.1147663", 470 | "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz", 471 | "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==" 472 | }, 473 | "node_modules/ee-first": { 474 | "version": "1.1.1", 475 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 476 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 477 | }, 478 | "node_modules/emoji-regex": { 479 | "version": "8.0.0", 480 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 481 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 482 | }, 483 | "node_modules/encodeurl": { 484 | "version": "1.0.2", 485 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 486 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 487 | "engines": { 488 | "node": ">= 0.8" 489 | } 490 | }, 491 | "node_modules/end-of-stream": { 492 | "version": "1.4.4", 493 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 494 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 495 | "dependencies": { 496 | "once": "^1.4.0" 497 | } 498 | }, 499 | "node_modules/error-ex": { 500 | "version": "1.3.2", 501 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 502 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 503 | "dependencies": { 504 | "is-arrayish": "^0.2.1" 505 | } 506 | }, 507 | "node_modules/escalade": { 508 | "version": "3.1.1", 509 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 510 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 511 | "engines": { 512 | "node": ">=6" 513 | } 514 | }, 515 | "node_modules/escape-html": { 516 | "version": "1.0.3", 517 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 518 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 519 | }, 520 | "node_modules/escape-string-regexp": { 521 | "version": "1.0.5", 522 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 523 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 524 | "engines": { 525 | "node": ">=0.8.0" 526 | } 527 | }, 528 | "node_modules/escodegen": { 529 | "version": "2.1.0", 530 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", 531 | "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", 532 | "dependencies": { 533 | "esprima": "^4.0.1", 534 | "estraverse": "^5.2.0", 535 | "esutils": "^2.0.2" 536 | }, 537 | "bin": { 538 | "escodegen": "bin/escodegen.js", 539 | "esgenerate": "bin/esgenerate.js" 540 | }, 541 | "engines": { 542 | "node": ">=6.0" 543 | }, 544 | "optionalDependencies": { 545 | "source-map": "~0.6.1" 546 | } 547 | }, 548 | "node_modules/esprima": { 549 | "version": "4.0.1", 550 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 551 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 552 | "bin": { 553 | "esparse": "bin/esparse.js", 554 | "esvalidate": "bin/esvalidate.js" 555 | }, 556 | "engines": { 557 | "node": ">=4" 558 | } 559 | }, 560 | "node_modules/estraverse": { 561 | "version": "5.3.0", 562 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 563 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 564 | "engines": { 565 | "node": ">=4.0" 566 | } 567 | }, 568 | "node_modules/esutils": { 569 | "version": "2.0.3", 570 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 571 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 572 | "engines": { 573 | "node": ">=0.10.0" 574 | } 575 | }, 576 | "node_modules/extract-zip": { 577 | "version": "2.0.1", 578 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", 579 | "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", 580 | "dependencies": { 581 | "debug": "^4.1.1", 582 | "get-stream": "^5.1.0", 583 | "yauzl": "^2.10.0" 584 | }, 585 | "bin": { 586 | "extract-zip": "cli.js" 587 | }, 588 | "engines": { 589 | "node": ">= 10.17.0" 590 | }, 591 | "optionalDependencies": { 592 | "@types/yauzl": "^2.9.1" 593 | } 594 | }, 595 | "node_modules/fast-fifo": { 596 | "version": "1.3.2", 597 | "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", 598 | "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" 599 | }, 600 | "node_modules/fd-slicer": { 601 | "version": "1.1.0", 602 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 603 | "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", 604 | "dependencies": { 605 | "pend": "~1.2.0" 606 | } 607 | }, 608 | "node_modules/fresh": { 609 | "version": "0.5.2", 610 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 611 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 612 | "engines": { 613 | "node": ">= 0.6" 614 | } 615 | }, 616 | "node_modules/fs-extra": { 617 | "version": "8.1.0", 618 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", 619 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", 620 | "dependencies": { 621 | "graceful-fs": "^4.2.0", 622 | "jsonfile": "^4.0.0", 623 | "universalify": "^0.1.0" 624 | }, 625 | "engines": { 626 | "node": ">=6 <7 || >=8" 627 | } 628 | }, 629 | "node_modules/function-bind": { 630 | "version": "1.1.2", 631 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 632 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 633 | "funding": { 634 | "url": "https://github.com/sponsors/ljharb" 635 | } 636 | }, 637 | "node_modules/get-caller-file": { 638 | "version": "2.0.5", 639 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 640 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 641 | "engines": { 642 | "node": "6.* || 8.* || >= 10.*" 643 | } 644 | }, 645 | "node_modules/get-intrinsic": { 646 | "version": "1.2.2", 647 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", 648 | "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", 649 | "dependencies": { 650 | "function-bind": "^1.1.2", 651 | "has-proto": "^1.0.1", 652 | "has-symbols": "^1.0.3", 653 | "hasown": "^2.0.0" 654 | }, 655 | "funding": { 656 | "url": "https://github.com/sponsors/ljharb" 657 | } 658 | }, 659 | "node_modules/get-stream": { 660 | "version": "5.2.0", 661 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", 662 | "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", 663 | "dependencies": { 664 | "pump": "^3.0.0" 665 | }, 666 | "engines": { 667 | "node": ">=8" 668 | }, 669 | "funding": { 670 | "url": "https://github.com/sponsors/sindresorhus" 671 | } 672 | }, 673 | "node_modules/get-uri": { 674 | "version": "6.0.2", 675 | "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.2.tgz", 676 | "integrity": "sha512-5KLucCJobh8vBY1K07EFV4+cPZH3mrV9YeAruUseCQKHB58SGjjT2l9/eA9LD082IiuMjSlFJEcdJ27TXvbZNw==", 677 | "dependencies": { 678 | "basic-ftp": "^5.0.2", 679 | "data-uri-to-buffer": "^6.0.0", 680 | "debug": "^4.3.4", 681 | "fs-extra": "^8.1.0" 682 | }, 683 | "engines": { 684 | "node": ">= 14" 685 | } 686 | }, 687 | "node_modules/gopd": { 688 | "version": "1.0.1", 689 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 690 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 691 | "dependencies": { 692 | "get-intrinsic": "^1.1.3" 693 | }, 694 | "funding": { 695 | "url": "https://github.com/sponsors/ljharb" 696 | } 697 | }, 698 | "node_modules/graceful-fs": { 699 | "version": "4.2.11", 700 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 701 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" 702 | }, 703 | "node_modules/has-flag": { 704 | "version": "3.0.0", 705 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 706 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 707 | "engines": { 708 | "node": ">=4" 709 | } 710 | }, 711 | "node_modules/has-property-descriptors": { 712 | "version": "1.0.1", 713 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", 714 | "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", 715 | "dependencies": { 716 | "get-intrinsic": "^1.2.2" 717 | }, 718 | "funding": { 719 | "url": "https://github.com/sponsors/ljharb" 720 | } 721 | }, 722 | "node_modules/has-proto": { 723 | "version": "1.0.1", 724 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", 725 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", 726 | "engines": { 727 | "node": ">= 0.4" 728 | }, 729 | "funding": { 730 | "url": "https://github.com/sponsors/ljharb" 731 | } 732 | }, 733 | "node_modules/has-symbols": { 734 | "version": "1.0.3", 735 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 736 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 737 | "engines": { 738 | "node": ">= 0.4" 739 | }, 740 | "funding": { 741 | "url": "https://github.com/sponsors/ljharb" 742 | } 743 | }, 744 | "node_modules/has-tostringtag": { 745 | "version": "1.0.0", 746 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 747 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 748 | "dependencies": { 749 | "has-symbols": "^1.0.2" 750 | }, 751 | "engines": { 752 | "node": ">= 0.4" 753 | }, 754 | "funding": { 755 | "url": "https://github.com/sponsors/ljharb" 756 | } 757 | }, 758 | "node_modules/hasown": { 759 | "version": "2.0.0", 760 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", 761 | "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", 762 | "dependencies": { 763 | "function-bind": "^1.1.2" 764 | }, 765 | "engines": { 766 | "node": ">= 0.4" 767 | } 768 | }, 769 | "node_modules/http-assert": { 770 | "version": "1.5.0", 771 | "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", 772 | "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", 773 | "dependencies": { 774 | "deep-equal": "~1.0.1", 775 | "http-errors": "~1.8.0" 776 | }, 777 | "engines": { 778 | "node": ">= 0.8" 779 | } 780 | }, 781 | "node_modules/http-errors": { 782 | "version": "1.8.1", 783 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", 784 | "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", 785 | "dependencies": { 786 | "depd": "~1.1.2", 787 | "inherits": "2.0.4", 788 | "setprototypeof": "1.2.0", 789 | "statuses": ">= 1.5.0 < 2", 790 | "toidentifier": "1.0.1" 791 | }, 792 | "engines": { 793 | "node": ">= 0.6" 794 | } 795 | }, 796 | "node_modules/http-errors/node_modules/depd": { 797 | "version": "1.1.2", 798 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 799 | "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", 800 | "engines": { 801 | "node": ">= 0.6" 802 | } 803 | }, 804 | "node_modules/http-proxy-agent": { 805 | "version": "7.0.0", 806 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", 807 | "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", 808 | "dependencies": { 809 | "agent-base": "^7.1.0", 810 | "debug": "^4.3.4" 811 | }, 812 | "engines": { 813 | "node": ">= 14" 814 | } 815 | }, 816 | "node_modules/https-proxy-agent": { 817 | "version": "7.0.2", 818 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", 819 | "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", 820 | "dependencies": { 821 | "agent-base": "^7.0.2", 822 | "debug": "4" 823 | }, 824 | "engines": { 825 | "node": ">= 14" 826 | } 827 | }, 828 | "node_modules/iconv-lite": { 829 | "version": "0.4.8", 830 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.8.tgz", 831 | "integrity": "sha512-D90rbOiZuEJGtmIBK9wcRpW//ZKLD8bTPOAx5oEsu+O+HhSOstX/HCZFBvNkuyDuiNHunb81cfsqaYzZxcUMYA==", 832 | "engines": { 833 | "node": ">=0.8.0" 834 | } 835 | }, 836 | "node_modules/ieee754": { 837 | "version": "1.2.1", 838 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 839 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 840 | "funding": [ 841 | { 842 | "type": "github", 843 | "url": "https://github.com/sponsors/feross" 844 | }, 845 | { 846 | "type": "patreon", 847 | "url": "https://www.patreon.com/feross" 848 | }, 849 | { 850 | "type": "consulting", 851 | "url": "https://feross.org/support" 852 | } 853 | ] 854 | }, 855 | "node_modules/import-fresh": { 856 | "version": "3.3.0", 857 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 858 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 859 | "dependencies": { 860 | "parent-module": "^1.0.0", 861 | "resolve-from": "^4.0.0" 862 | }, 863 | "engines": { 864 | "node": ">=6" 865 | }, 866 | "funding": { 867 | "url": "https://github.com/sponsors/sindresorhus" 868 | } 869 | }, 870 | "node_modules/inflation": { 871 | "version": "2.1.0", 872 | "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.1.0.tgz", 873 | "integrity": "sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==", 874 | "engines": { 875 | "node": ">= 0.8.0" 876 | } 877 | }, 878 | "node_modules/inherits": { 879 | "version": "2.0.4", 880 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 881 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 882 | }, 883 | "node_modules/ip": { 884 | "version": "1.1.8", 885 | "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", 886 | "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" 887 | }, 888 | "node_modules/is-arrayish": { 889 | "version": "0.2.1", 890 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 891 | "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" 892 | }, 893 | "node_modules/is-fullwidth-code-point": { 894 | "version": "3.0.0", 895 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 896 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 897 | "engines": { 898 | "node": ">=8" 899 | } 900 | }, 901 | "node_modules/is-generator-function": { 902 | "version": "1.0.10", 903 | "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", 904 | "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", 905 | "dependencies": { 906 | "has-tostringtag": "^1.0.0" 907 | }, 908 | "engines": { 909 | "node": ">= 0.4" 910 | }, 911 | "funding": { 912 | "url": "https://github.com/sponsors/ljharb" 913 | } 914 | }, 915 | "node_modules/js-tokens": { 916 | "version": "4.0.0", 917 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 918 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 919 | }, 920 | "node_modules/js-yaml": { 921 | "version": "4.1.0", 922 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 923 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 924 | "dependencies": { 925 | "argparse": "^2.0.1" 926 | }, 927 | "bin": { 928 | "js-yaml": "bin/js-yaml.js" 929 | } 930 | }, 931 | "node_modules/json-parse-even-better-errors": { 932 | "version": "2.3.1", 933 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 934 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" 935 | }, 936 | "node_modules/jsonfile": { 937 | "version": "4.0.0", 938 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 939 | "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", 940 | "optionalDependencies": { 941 | "graceful-fs": "^4.1.6" 942 | } 943 | }, 944 | "node_modules/keygrip": { 945 | "version": "1.1.0", 946 | "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", 947 | "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", 948 | "dependencies": { 949 | "tsscmp": "1.0.6" 950 | }, 951 | "engines": { 952 | "node": ">= 0.6" 953 | } 954 | }, 955 | "node_modules/koa": { 956 | "version": "2.14.2", 957 | "resolved": "https://registry.npmjs.org/koa/-/koa-2.14.2.tgz", 958 | "integrity": "sha512-VFI2bpJaodz6P7x2uyLiX6RLYpZmOJqNmoCst/Yyd7hQlszyPwG/I9CQJ63nOtKSxpt5M7NH67V6nJL2BwCl7g==", 959 | "dependencies": { 960 | "accepts": "^1.3.5", 961 | "cache-content-type": "^1.0.0", 962 | "content-disposition": "~0.5.2", 963 | "content-type": "^1.0.4", 964 | "cookies": "~0.8.0", 965 | "debug": "^4.3.2", 966 | "delegates": "^1.0.0", 967 | "depd": "^2.0.0", 968 | "destroy": "^1.0.4", 969 | "encodeurl": "^1.0.2", 970 | "escape-html": "^1.0.3", 971 | "fresh": "~0.5.2", 972 | "http-assert": "^1.3.0", 973 | "http-errors": "^1.6.3", 974 | "is-generator-function": "^1.0.7", 975 | "koa-compose": "^4.1.0", 976 | "koa-convert": "^2.0.0", 977 | "on-finished": "^2.3.0", 978 | "only": "~0.0.2", 979 | "parseurl": "^1.3.2", 980 | "statuses": "^1.5.0", 981 | "type-is": "^1.6.16", 982 | "vary": "^1.1.2" 983 | }, 984 | "engines": { 985 | "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" 986 | } 987 | }, 988 | "node_modules/koa-body-parser": { 989 | "version": "1.1.2", 990 | "resolved": "https://registry.npmjs.org/koa-body-parser/-/koa-body-parser-1.1.2.tgz", 991 | "integrity": "sha512-RYslHxGU1DWKUgxHrd95VxQWcj6NxdRWNOFvAGI70Lr66qcACQur/7q8j8JHcPvIQ5eABM9Q11GHarg+Dhg08Q==", 992 | "dependencies": { 993 | "co-body": "^2.0.0" 994 | } 995 | }, 996 | "node_modules/koa-bodyparser": { 997 | "version": "4.4.1", 998 | "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.4.1.tgz", 999 | "integrity": "sha512-kBH3IYPMb+iAXnrxIhXnW+gXV8OTzCu8VPDqvcDHW9SQrbkHmqPQtiZwrltNmSq6/lpipHnT7k7PsjlVD7kK0w==", 1000 | "dependencies": { 1001 | "co-body": "^6.0.0", 1002 | "copy-to": "^2.0.1", 1003 | "type-is": "^1.6.18" 1004 | }, 1005 | "engines": { 1006 | "node": ">=8.0.0" 1007 | } 1008 | }, 1009 | "node_modules/koa-bodyparser/node_modules/bytes": { 1010 | "version": "3.1.2", 1011 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 1012 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 1013 | "engines": { 1014 | "node": ">= 0.8" 1015 | } 1016 | }, 1017 | "node_modules/koa-bodyparser/node_modules/co-body": { 1018 | "version": "6.1.0", 1019 | "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", 1020 | "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", 1021 | "dependencies": { 1022 | "inflation": "^2.0.0", 1023 | "qs": "^6.5.2", 1024 | "raw-body": "^2.3.3", 1025 | "type-is": "^1.6.16" 1026 | } 1027 | }, 1028 | "node_modules/koa-bodyparser/node_modules/http-errors": { 1029 | "version": "2.0.0", 1030 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 1031 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 1032 | "dependencies": { 1033 | "depd": "2.0.0", 1034 | "inherits": "2.0.4", 1035 | "setprototypeof": "1.2.0", 1036 | "statuses": "2.0.1", 1037 | "toidentifier": "1.0.1" 1038 | }, 1039 | "engines": { 1040 | "node": ">= 0.8" 1041 | } 1042 | }, 1043 | "node_modules/koa-bodyparser/node_modules/iconv-lite": { 1044 | "version": "0.4.24", 1045 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1046 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1047 | "dependencies": { 1048 | "safer-buffer": ">= 2.1.2 < 3" 1049 | }, 1050 | "engines": { 1051 | "node": ">=0.10.0" 1052 | } 1053 | }, 1054 | "node_modules/koa-bodyparser/node_modules/qs": { 1055 | "version": "6.11.2", 1056 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", 1057 | "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", 1058 | "dependencies": { 1059 | "side-channel": "^1.0.4" 1060 | }, 1061 | "engines": { 1062 | "node": ">=0.6" 1063 | }, 1064 | "funding": { 1065 | "url": "https://github.com/sponsors/ljharb" 1066 | } 1067 | }, 1068 | "node_modules/koa-bodyparser/node_modules/raw-body": { 1069 | "version": "2.5.2", 1070 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", 1071 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 1072 | "dependencies": { 1073 | "bytes": "3.1.2", 1074 | "http-errors": "2.0.0", 1075 | "iconv-lite": "0.4.24", 1076 | "unpipe": "1.0.0" 1077 | }, 1078 | "engines": { 1079 | "node": ">= 0.8" 1080 | } 1081 | }, 1082 | "node_modules/koa-bodyparser/node_modules/statuses": { 1083 | "version": "2.0.1", 1084 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1085 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 1086 | "engines": { 1087 | "node": ">= 0.8" 1088 | } 1089 | }, 1090 | "node_modules/koa-compose": { 1091 | "version": "4.1.0", 1092 | "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", 1093 | "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" 1094 | }, 1095 | "node_modules/koa-convert": { 1096 | "version": "2.0.0", 1097 | "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", 1098 | "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", 1099 | "dependencies": { 1100 | "co": "^4.6.0", 1101 | "koa-compose": "^4.1.0" 1102 | }, 1103 | "engines": { 1104 | "node": ">= 10" 1105 | } 1106 | }, 1107 | "node_modules/koa-router": { 1108 | "version": "12.0.1", 1109 | "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-12.0.1.tgz", 1110 | "integrity": "sha512-gaDdj3GtzoLoeosacd50kBBTnnh3B9AYxDThQUo4sfUyXdOhY6ku1qyZKW88tQCRgc3Sw6ChXYXWZwwgjOxE0w==", 1111 | "dependencies": { 1112 | "debug": "^4.3.4", 1113 | "http-errors": "^2.0.0", 1114 | "koa-compose": "^4.1.0", 1115 | "methods": "^1.1.2", 1116 | "path-to-regexp": "^6.2.1" 1117 | }, 1118 | "engines": { 1119 | "node": ">= 12" 1120 | } 1121 | }, 1122 | "node_modules/koa-router/node_modules/http-errors": { 1123 | "version": "2.0.0", 1124 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 1125 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 1126 | "dependencies": { 1127 | "depd": "2.0.0", 1128 | "inherits": "2.0.4", 1129 | "setprototypeof": "1.2.0", 1130 | "statuses": "2.0.1", 1131 | "toidentifier": "1.0.1" 1132 | }, 1133 | "engines": { 1134 | "node": ">= 0.8" 1135 | } 1136 | }, 1137 | "node_modules/koa-router/node_modules/statuses": { 1138 | "version": "2.0.1", 1139 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1140 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 1141 | "engines": { 1142 | "node": ">= 0.8" 1143 | } 1144 | }, 1145 | "node_modules/lines-and-columns": { 1146 | "version": "1.2.4", 1147 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 1148 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" 1149 | }, 1150 | "node_modules/lru-cache": { 1151 | "version": "7.18.3", 1152 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", 1153 | "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", 1154 | "engines": { 1155 | "node": ">=12" 1156 | } 1157 | }, 1158 | "node_modules/media-typer": { 1159 | "version": "0.3.0", 1160 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1161 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 1162 | "engines": { 1163 | "node": ">= 0.6" 1164 | } 1165 | }, 1166 | "node_modules/methods": { 1167 | "version": "1.1.2", 1168 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1169 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 1170 | "engines": { 1171 | "node": ">= 0.6" 1172 | } 1173 | }, 1174 | "node_modules/mime-db": { 1175 | "version": "1.52.0", 1176 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1177 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1178 | "engines": { 1179 | "node": ">= 0.6" 1180 | } 1181 | }, 1182 | "node_modules/mime-types": { 1183 | "version": "2.1.35", 1184 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1185 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1186 | "dependencies": { 1187 | "mime-db": "1.52.0" 1188 | }, 1189 | "engines": { 1190 | "node": ">= 0.6" 1191 | } 1192 | }, 1193 | "node_modules/mitt": { 1194 | "version": "3.0.0", 1195 | "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", 1196 | "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==" 1197 | }, 1198 | "node_modules/mkdirp-classic": { 1199 | "version": "0.5.3", 1200 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 1201 | "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" 1202 | }, 1203 | "node_modules/ms": { 1204 | "version": "2.1.2", 1205 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1206 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1207 | }, 1208 | "node_modules/negotiator": { 1209 | "version": "0.6.3", 1210 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1211 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 1212 | "engines": { 1213 | "node": ">= 0.6" 1214 | } 1215 | }, 1216 | "node_modules/netmask": { 1217 | "version": "2.0.2", 1218 | "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", 1219 | "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", 1220 | "engines": { 1221 | "node": ">= 0.4.0" 1222 | } 1223 | }, 1224 | "node_modules/node-fetch": { 1225 | "version": "2.7.0", 1226 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", 1227 | "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", 1228 | "dependencies": { 1229 | "whatwg-url": "^5.0.0" 1230 | }, 1231 | "engines": { 1232 | "node": "4.x || >=6.0.0" 1233 | }, 1234 | "peerDependencies": { 1235 | "encoding": "^0.1.0" 1236 | }, 1237 | "peerDependenciesMeta": { 1238 | "encoding": { 1239 | "optional": true 1240 | } 1241 | } 1242 | }, 1243 | "node_modules/object-inspect": { 1244 | "version": "1.13.1", 1245 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", 1246 | "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", 1247 | "funding": { 1248 | "url": "https://github.com/sponsors/ljharb" 1249 | } 1250 | }, 1251 | "node_modules/on-finished": { 1252 | "version": "2.4.1", 1253 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1254 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1255 | "dependencies": { 1256 | "ee-first": "1.1.1" 1257 | }, 1258 | "engines": { 1259 | "node": ">= 0.8" 1260 | } 1261 | }, 1262 | "node_modules/once": { 1263 | "version": "1.4.0", 1264 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1265 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1266 | "dependencies": { 1267 | "wrappy": "1" 1268 | } 1269 | }, 1270 | "node_modules/only": { 1271 | "version": "0.0.2", 1272 | "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", 1273 | "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==" 1274 | }, 1275 | "node_modules/pac-proxy-agent": { 1276 | "version": "7.0.1", 1277 | "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", 1278 | "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", 1279 | "dependencies": { 1280 | "@tootallnate/quickjs-emscripten": "^0.23.0", 1281 | "agent-base": "^7.0.2", 1282 | "debug": "^4.3.4", 1283 | "get-uri": "^6.0.1", 1284 | "http-proxy-agent": "^7.0.0", 1285 | "https-proxy-agent": "^7.0.2", 1286 | "pac-resolver": "^7.0.0", 1287 | "socks-proxy-agent": "^8.0.2" 1288 | }, 1289 | "engines": { 1290 | "node": ">= 14" 1291 | } 1292 | }, 1293 | "node_modules/pac-resolver": { 1294 | "version": "7.0.0", 1295 | "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.0.tgz", 1296 | "integrity": "sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==", 1297 | "dependencies": { 1298 | "degenerator": "^5.0.0", 1299 | "ip": "^1.1.8", 1300 | "netmask": "^2.0.2" 1301 | }, 1302 | "engines": { 1303 | "node": ">= 14" 1304 | } 1305 | }, 1306 | "node_modules/parent-module": { 1307 | "version": "1.0.1", 1308 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1309 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1310 | "dependencies": { 1311 | "callsites": "^3.0.0" 1312 | }, 1313 | "engines": { 1314 | "node": ">=6" 1315 | } 1316 | }, 1317 | "node_modules/parse-json": { 1318 | "version": "5.2.0", 1319 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", 1320 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", 1321 | "dependencies": { 1322 | "@babel/code-frame": "^7.0.0", 1323 | "error-ex": "^1.3.1", 1324 | "json-parse-even-better-errors": "^2.3.0", 1325 | "lines-and-columns": "^1.1.6" 1326 | }, 1327 | "engines": { 1328 | "node": ">=8" 1329 | }, 1330 | "funding": { 1331 | "url": "https://github.com/sponsors/sindresorhus" 1332 | } 1333 | }, 1334 | "node_modules/parseurl": { 1335 | "version": "1.3.3", 1336 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1337 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1338 | "engines": { 1339 | "node": ">= 0.8" 1340 | } 1341 | }, 1342 | "node_modules/path-to-regexp": { 1343 | "version": "6.2.1", 1344 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", 1345 | "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" 1346 | }, 1347 | "node_modules/path-type": { 1348 | "version": "4.0.0", 1349 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 1350 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 1351 | "engines": { 1352 | "node": ">=8" 1353 | } 1354 | }, 1355 | "node_modules/pend": { 1356 | "version": "1.2.0", 1357 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 1358 | "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" 1359 | }, 1360 | "node_modules/progress": { 1361 | "version": "2.0.3", 1362 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1363 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1364 | "engines": { 1365 | "node": ">=0.4.0" 1366 | } 1367 | }, 1368 | "node_modules/proxy-agent": { 1369 | "version": "6.3.0", 1370 | "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz", 1371 | "integrity": "sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==", 1372 | "dependencies": { 1373 | "agent-base": "^7.0.2", 1374 | "debug": "^4.3.4", 1375 | "http-proxy-agent": "^7.0.0", 1376 | "https-proxy-agent": "^7.0.0", 1377 | "lru-cache": "^7.14.1", 1378 | "pac-proxy-agent": "^7.0.0", 1379 | "proxy-from-env": "^1.1.0", 1380 | "socks-proxy-agent": "^8.0.1" 1381 | }, 1382 | "engines": { 1383 | "node": ">= 14" 1384 | } 1385 | }, 1386 | "node_modules/proxy-from-env": { 1387 | "version": "1.1.0", 1388 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 1389 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 1390 | }, 1391 | "node_modules/pump": { 1392 | "version": "3.0.0", 1393 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1394 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1395 | "dependencies": { 1396 | "end-of-stream": "^1.1.0", 1397 | "once": "^1.3.1" 1398 | } 1399 | }, 1400 | "node_modules/puppeteer": { 1401 | "version": "20.9.0", 1402 | "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-20.9.0.tgz", 1403 | "integrity": "sha512-kAglT4VZ9fWEGg3oLc4/de+JcONuEJhlh3J6f5R1TLkrY/EHHIHxWXDOzXvaxQCtedmyVXBwg8M+P8YCO/wZjw==", 1404 | "hasInstallScript": true, 1405 | "dependencies": { 1406 | "@puppeteer/browsers": "1.4.6", 1407 | "cosmiconfig": "8.2.0", 1408 | "puppeteer-core": "20.9.0" 1409 | }, 1410 | "engines": { 1411 | "node": ">=16.3.0" 1412 | } 1413 | }, 1414 | "node_modules/puppeteer-core": { 1415 | "version": "20.9.0", 1416 | "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz", 1417 | "integrity": "sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==", 1418 | "dependencies": { 1419 | "@puppeteer/browsers": "1.4.6", 1420 | "chromium-bidi": "0.4.16", 1421 | "cross-fetch": "4.0.0", 1422 | "debug": "4.3.4", 1423 | "devtools-protocol": "0.0.1147663", 1424 | "ws": "8.13.0" 1425 | }, 1426 | "engines": { 1427 | "node": ">=16.3.0" 1428 | }, 1429 | "peerDependencies": { 1430 | "typescript": ">= 4.7.4" 1431 | }, 1432 | "peerDependenciesMeta": { 1433 | "typescript": { 1434 | "optional": true 1435 | } 1436 | } 1437 | }, 1438 | "node_modules/qs": { 1439 | "version": "2.4.2", 1440 | "resolved": "https://registry.npmjs.org/qs/-/qs-2.4.2.tgz", 1441 | "integrity": "sha512-Ur2glV49dt6jknphzkWeLUNCy7pmwGxGaEJuuxVVBioSwQzT00cZPLEtRqr4cg/iO/6N+RbfB0lFD2EovyeEng==" 1442 | }, 1443 | "node_modules/queue-tick": { 1444 | "version": "1.0.1", 1445 | "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", 1446 | "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" 1447 | }, 1448 | "node_modules/raw-body": { 1449 | "version": "1.3.4", 1450 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.3.4.tgz", 1451 | "integrity": "sha512-ZC2kBq6BsR0uK441H5SvGH9H+hRpTKVRjvlI6BhLOJrih3oGbGRYdFyyKKESw4/hjzJEr4cZkQgbuU52s63MOQ==", 1452 | "dependencies": { 1453 | "bytes": "1.0.0", 1454 | "iconv-lite": "0.4.8" 1455 | }, 1456 | "engines": { 1457 | "node": ">= 0.8.0" 1458 | } 1459 | }, 1460 | "node_modules/require-directory": { 1461 | "version": "2.1.1", 1462 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1463 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 1464 | "engines": { 1465 | "node": ">=0.10.0" 1466 | } 1467 | }, 1468 | "node_modules/resolve-from": { 1469 | "version": "4.0.0", 1470 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1471 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1472 | "engines": { 1473 | "node": ">=4" 1474 | } 1475 | }, 1476 | "node_modules/safe-buffer": { 1477 | "version": "5.2.1", 1478 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1479 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1480 | "funding": [ 1481 | { 1482 | "type": "github", 1483 | "url": "https://github.com/sponsors/feross" 1484 | }, 1485 | { 1486 | "type": "patreon", 1487 | "url": "https://www.patreon.com/feross" 1488 | }, 1489 | { 1490 | "type": "consulting", 1491 | "url": "https://feross.org/support" 1492 | } 1493 | ] 1494 | }, 1495 | "node_modules/safer-buffer": { 1496 | "version": "2.1.2", 1497 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1498 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1499 | }, 1500 | "node_modules/set-function-length": { 1501 | "version": "1.1.1", 1502 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", 1503 | "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", 1504 | "dependencies": { 1505 | "define-data-property": "^1.1.1", 1506 | "get-intrinsic": "^1.2.1", 1507 | "gopd": "^1.0.1", 1508 | "has-property-descriptors": "^1.0.0" 1509 | }, 1510 | "engines": { 1511 | "node": ">= 0.4" 1512 | } 1513 | }, 1514 | "node_modules/setprototypeof": { 1515 | "version": "1.2.0", 1516 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1517 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1518 | }, 1519 | "node_modules/side-channel": { 1520 | "version": "1.0.4", 1521 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1522 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1523 | "dependencies": { 1524 | "call-bind": "^1.0.0", 1525 | "get-intrinsic": "^1.0.2", 1526 | "object-inspect": "^1.9.0" 1527 | }, 1528 | "funding": { 1529 | "url": "https://github.com/sponsors/ljharb" 1530 | } 1531 | }, 1532 | "node_modules/smart-buffer": { 1533 | "version": "4.2.0", 1534 | "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", 1535 | "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", 1536 | "engines": { 1537 | "node": ">= 6.0.0", 1538 | "npm": ">= 3.0.0" 1539 | } 1540 | }, 1541 | "node_modules/socks": { 1542 | "version": "2.7.1", 1543 | "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", 1544 | "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", 1545 | "dependencies": { 1546 | "ip": "^2.0.0", 1547 | "smart-buffer": "^4.2.0" 1548 | }, 1549 | "engines": { 1550 | "node": ">= 10.13.0", 1551 | "npm": ">= 3.0.0" 1552 | } 1553 | }, 1554 | "node_modules/socks-proxy-agent": { 1555 | "version": "8.0.2", 1556 | "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", 1557 | "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", 1558 | "dependencies": { 1559 | "agent-base": "^7.0.2", 1560 | "debug": "^4.3.4", 1561 | "socks": "^2.7.1" 1562 | }, 1563 | "engines": { 1564 | "node": ">= 14" 1565 | } 1566 | }, 1567 | "node_modules/socks/node_modules/ip": { 1568 | "version": "2.0.0", 1569 | "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", 1570 | "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" 1571 | }, 1572 | "node_modules/source-map": { 1573 | "version": "0.6.1", 1574 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1575 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1576 | "optional": true, 1577 | "engines": { 1578 | "node": ">=0.10.0" 1579 | } 1580 | }, 1581 | "node_modules/statuses": { 1582 | "version": "1.5.0", 1583 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1584 | "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", 1585 | "engines": { 1586 | "node": ">= 0.6" 1587 | } 1588 | }, 1589 | "node_modules/streamx": { 1590 | "version": "2.15.5", 1591 | "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.5.tgz", 1592 | "integrity": "sha512-9thPGMkKC2GctCzyCUjME3yR03x2xNo0GPKGkRw2UMYN+gqWa9uqpyNWhmsNCutU5zHmkUum0LsCRQTXUgUCAg==", 1593 | "dependencies": { 1594 | "fast-fifo": "^1.1.0", 1595 | "queue-tick": "^1.0.1" 1596 | } 1597 | }, 1598 | "node_modules/string-width": { 1599 | "version": "4.2.3", 1600 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1601 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1602 | "dependencies": { 1603 | "emoji-regex": "^8.0.0", 1604 | "is-fullwidth-code-point": "^3.0.0", 1605 | "strip-ansi": "^6.0.1" 1606 | }, 1607 | "engines": { 1608 | "node": ">=8" 1609 | } 1610 | }, 1611 | "node_modules/strip-ansi": { 1612 | "version": "6.0.1", 1613 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1614 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1615 | "dependencies": { 1616 | "ansi-regex": "^5.0.1" 1617 | }, 1618 | "engines": { 1619 | "node": ">=8" 1620 | } 1621 | }, 1622 | "node_modules/supports-color": { 1623 | "version": "5.5.0", 1624 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1625 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1626 | "dependencies": { 1627 | "has-flag": "^3.0.0" 1628 | }, 1629 | "engines": { 1630 | "node": ">=4" 1631 | } 1632 | }, 1633 | "node_modules/tar-fs": { 1634 | "version": "3.0.4", 1635 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", 1636 | "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", 1637 | "dependencies": { 1638 | "mkdirp-classic": "^0.5.2", 1639 | "pump": "^3.0.0", 1640 | "tar-stream": "^3.1.5" 1641 | } 1642 | }, 1643 | "node_modules/tar-stream": { 1644 | "version": "3.1.6", 1645 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", 1646 | "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", 1647 | "dependencies": { 1648 | "b4a": "^1.6.4", 1649 | "fast-fifo": "^1.2.0", 1650 | "streamx": "^2.15.0" 1651 | } 1652 | }, 1653 | "node_modules/through": { 1654 | "version": "2.3.8", 1655 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1656 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" 1657 | }, 1658 | "node_modules/toidentifier": { 1659 | "version": "1.0.1", 1660 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1661 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1662 | "engines": { 1663 | "node": ">=0.6" 1664 | } 1665 | }, 1666 | "node_modules/tr46": { 1667 | "version": "0.0.3", 1668 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 1669 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 1670 | }, 1671 | "node_modules/tslib": { 1672 | "version": "2.6.2", 1673 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", 1674 | "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" 1675 | }, 1676 | "node_modules/tsscmp": { 1677 | "version": "1.0.6", 1678 | "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", 1679 | "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", 1680 | "engines": { 1681 | "node": ">=0.6.x" 1682 | } 1683 | }, 1684 | "node_modules/type-is": { 1685 | "version": "1.6.18", 1686 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1687 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1688 | "dependencies": { 1689 | "media-typer": "0.3.0", 1690 | "mime-types": "~2.1.24" 1691 | }, 1692 | "engines": { 1693 | "node": ">= 0.6" 1694 | } 1695 | }, 1696 | "node_modules/unbzip2-stream": { 1697 | "version": "1.4.3", 1698 | "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", 1699 | "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", 1700 | "dependencies": { 1701 | "buffer": "^5.2.1", 1702 | "through": "^2.3.8" 1703 | } 1704 | }, 1705 | "node_modules/undici-types": { 1706 | "version": "5.26.5", 1707 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 1708 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", 1709 | "optional": true 1710 | }, 1711 | "node_modules/universalify": { 1712 | "version": "0.1.2", 1713 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 1714 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 1715 | "engines": { 1716 | "node": ">= 4.0.0" 1717 | } 1718 | }, 1719 | "node_modules/unpipe": { 1720 | "version": "1.0.0", 1721 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1722 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1723 | "engines": { 1724 | "node": ">= 0.8" 1725 | } 1726 | }, 1727 | "node_modules/vary": { 1728 | "version": "1.1.2", 1729 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1730 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 1731 | "engines": { 1732 | "node": ">= 0.8" 1733 | } 1734 | }, 1735 | "node_modules/webidl-conversions": { 1736 | "version": "3.0.1", 1737 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 1738 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 1739 | }, 1740 | "node_modules/whatwg-url": { 1741 | "version": "5.0.0", 1742 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 1743 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 1744 | "dependencies": { 1745 | "tr46": "~0.0.3", 1746 | "webidl-conversions": "^3.0.0" 1747 | } 1748 | }, 1749 | "node_modules/wrap-ansi": { 1750 | "version": "7.0.0", 1751 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1752 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1753 | "dependencies": { 1754 | "ansi-styles": "^4.0.0", 1755 | "string-width": "^4.1.0", 1756 | "strip-ansi": "^6.0.0" 1757 | }, 1758 | "engines": { 1759 | "node": ">=10" 1760 | }, 1761 | "funding": { 1762 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1763 | } 1764 | }, 1765 | "node_modules/wrap-ansi/node_modules/ansi-styles": { 1766 | "version": "4.3.0", 1767 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1768 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1769 | "dependencies": { 1770 | "color-convert": "^2.0.1" 1771 | }, 1772 | "engines": { 1773 | "node": ">=8" 1774 | }, 1775 | "funding": { 1776 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1777 | } 1778 | }, 1779 | "node_modules/wrap-ansi/node_modules/color-convert": { 1780 | "version": "2.0.1", 1781 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1782 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1783 | "dependencies": { 1784 | "color-name": "~1.1.4" 1785 | }, 1786 | "engines": { 1787 | "node": ">=7.0.0" 1788 | } 1789 | }, 1790 | "node_modules/wrap-ansi/node_modules/color-name": { 1791 | "version": "1.1.4", 1792 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1793 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 1794 | }, 1795 | "node_modules/wrappy": { 1796 | "version": "1.0.2", 1797 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1798 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 1799 | }, 1800 | "node_modules/ws": { 1801 | "version": "8.13.0", 1802 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", 1803 | "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", 1804 | "engines": { 1805 | "node": ">=10.0.0" 1806 | }, 1807 | "peerDependencies": { 1808 | "bufferutil": "^4.0.1", 1809 | "utf-8-validate": ">=5.0.2" 1810 | }, 1811 | "peerDependenciesMeta": { 1812 | "bufferutil": { 1813 | "optional": true 1814 | }, 1815 | "utf-8-validate": { 1816 | "optional": true 1817 | } 1818 | } 1819 | }, 1820 | "node_modules/y18n": { 1821 | "version": "5.0.8", 1822 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1823 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 1824 | "engines": { 1825 | "node": ">=10" 1826 | } 1827 | }, 1828 | "node_modules/yargs": { 1829 | "version": "17.7.1", 1830 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", 1831 | "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", 1832 | "dependencies": { 1833 | "cliui": "^8.0.1", 1834 | "escalade": "^3.1.1", 1835 | "get-caller-file": "^2.0.5", 1836 | "require-directory": "^2.1.1", 1837 | "string-width": "^4.2.3", 1838 | "y18n": "^5.0.5", 1839 | "yargs-parser": "^21.1.1" 1840 | }, 1841 | "engines": { 1842 | "node": ">=12" 1843 | } 1844 | }, 1845 | "node_modules/yargs-parser": { 1846 | "version": "21.1.1", 1847 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 1848 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 1849 | "engines": { 1850 | "node": ">=12" 1851 | } 1852 | }, 1853 | "node_modules/yauzl": { 1854 | "version": "2.10.0", 1855 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 1856 | "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", 1857 | "dependencies": { 1858 | "buffer-crc32": "~0.2.3", 1859 | "fd-slicer": "~1.1.0" 1860 | } 1861 | }, 1862 | "node_modules/ylru": { 1863 | "version": "1.3.2", 1864 | "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.3.2.tgz", 1865 | "integrity": "sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==", 1866 | "engines": { 1867 | "node": ">= 4.0.0" 1868 | } 1869 | } 1870 | } 1871 | } 1872 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "search-node-api", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "koa": "^2.14.2", 13 | "koa-body-parser": "^1.1.2", 14 | "koa-bodyparser": "^4.4.1", 15 | "koa-router": "^12.0.1", 16 | "puppeteer": "^20.7.3" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # 开源搜索引擎API 2 | 3 | 因为OpenAI的横空出世,大家都习惯于使用OpenAI来问问题,但是OpenAI有一个致命的问题,就是只知道他训练的知识,而不知道新的知识,比如你问他今天深圳的天气如何,问他一些热点新闻,他是没有任何概念的。 4 | 5 | ### 解决办法 6 | 7 | 通常我们为了让大模型“感知“到新的知识,我们需要将新的知识材料提供给他大模型学习,因此基于软件开发第一定律,没有什么是做不到的,如果做不到,就加一层,如果还是做不到,就在加一层,咋们这个层就是一个通过搜索获取当前最新信息的层,将摘要给到大模型学习,然后大模型基于这些个新学习的知识来回答你的问题。 8 | 9 | ### 方案对比 10 | 11 | 为什么不直接使用 Google search API,而要自己造轮子,其原因就是一是因为巨硬们提供的API都是要付费的,免费计划也需要绑visa卡等,特别麻烦,因此还不如自己动手实现一个免费的。 12 | 13 | ### 原理 14 | 15 | 原理很简单,使用 无头浏览器(puppeteer chrome) 去访问 baidu,bing 等搜索网站,分析网页内容,提取url,title,摘要。 16 | 17 | ## 已支持的搜索引擎 18 | 19 | baidu/bing/google/duckduckgo/yahoo 20 | 21 | ## 使用方式 22 | 23 | Docker: 24 | docker run -d -p your_port:3000 talentxiet/search-node-api-docker:v1.5 25 | 26 | http api: 27 | ```js 28 | curl --location 'http://localhost:3000' \ 29 | --header 'Content-Type: application/json' \ 30 | --data '{ 31 | "q":"亚运会dota2中", 32 | "engine":"bing" 33 | }' 34 | 35 | { 36 | "q": "nihao", 37 | "results": [ 38 | { 39 | "href": "https://baike.baidu.com/item/你好/32416", 40 | "title": "你好(汉语词语)_百度百科", 41 | "abstract": "你好是一个汉语词语,拼音是nǐ hǎo,是汉语中打招呼的敬语常用词语,作为一般对话的 开场白 。. 这也是个最基本的汉语词语。. 主要用于打招呼、请教别人问题时,或者单纯表示礼貌的时候等。. 中文名. 你好. 外文名. 英文:Hello. 法文:Bonjour. 俄文:Привет." 42 | }, 43 | { 44 | "href": "https://www.zhihu.com/question/516667003", 45 | "title": "你知道Nihao Mobile吗? - 知乎", 46 | "abstract": "Dec 30, 2022 · Nihao Mobile隶属于广东星鼎通信科技有限公司,是中华人民共和国工业和信息化部(简称工信部)合法授权经营的移动通讯运营商,仅为居住在中国的外籍人士及港澳台同胞提供移动通讯服务。" 47 | }, 48 | { 49 | "href": "https://dictionary.hantrainerpro.com/chinese-english/translation-nihao_hello.htm", 50 | "title": "English translation of 你好 ( ni hao / nĭ hăo ) - hello in Chinese", 51 | "abstract": "你好 ( ni hao / nĭ hăo ) (English translation: \"hello\") as Chinese character including stroke order, Pinyin phonetic script, pronunciation in Mandarin, example sentence and English meaning." 52 | }, 53 | { 54 | "href": "https://en.wiktionary.org/wiki/%E4%BD%A0%E5%A5%BD", 55 | "title": "你好 - Wiktionary, the free dictionary", 56 | "abstract": "Sep 1, 2023 · From modern Mandarin 你好 ( nǐ hǎo, “hello”). Pronunciation[edit] ( Tokyo)ニ イハオ[níꜜìhàò] ( Atamadaka – [1]) [1] IPA ( key) : [ɲ̟iːha̠o̞] Interjectionedit. 你好 ( ニイハオ) • ( nīhao ) ( informal, rare) hi, hello (in a Chinese context) 1967, リービ英雄, 我的中 …" 57 | }, 58 | { 59 | "href": "https://zhuanlan.zhihu.com/p/142587325", 60 | "title": "你好 - 知乎", 61 | "abstract": "May 21, 2020 · 丹麦语 的你好 Jó napot 匈牙利 的你好. Boa tarde 葡萄牙语的你好. Saluton. 世界语\"你好\"最常见的说法,来自拉丁语。. 日语--こんにちは 罗马音 :kon ni chi wa. 藏文:扎喜德勒 泰文 :萨瓦迪卡. 发布于 2020-05-21 01:32. 汉语. 你好 - 汉语词语 免费编辑 修改义项名 …" 62 | } 63 | ] 64 | } 65 | ``` 66 | 67 | # 开源共建 68 | 69 | 参考了searchEngineTool项目 70 | 让我们一起改进,把这个搜索API做得更加好用一些。 71 | -------------------------------------------------------------------------------- /searchEngineTool.js: -------------------------------------------------------------------------------- 1 | const { 2 | googleSearch, 3 | bingSearch, 4 | yahooSearch, 5 | duckduckgoSearch, 6 | baiduSearch 7 | } = require("./searchEngines"); 8 | 9 | async function searchEngineTool(query, engine) { 10 | let results = []; 11 | switch (engine) { 12 | case "baidu": 13 | results = await baiduSearch(query); 14 | break; 15 | case "google": 16 | results = await googleSearch(query); 17 | break; 18 | case "bing": 19 | results = await bingSearch(query); 20 | break; 21 | case "yahoo": 22 | results = await yahooSearch(query); 23 | break; 24 | case "duckduckgo": 25 | results = await duckduckgoSearch(query); 26 | break; 27 | default: 28 | throw new Error("Invalid search engine specified."); 29 | } 30 | return results; 31 | } 32 | 33 | module.exports = searchEngineTool; 34 | -------------------------------------------------------------------------------- /searchEngines.js: -------------------------------------------------------------------------------- 1 | const puppeteer = require("puppeteer"); 2 | 3 | async function googleSearch(query) { 4 | try { 5 | //https://serpapi.com/search-api 6 | const browser = await puppeteer.launch(); 7 | const page = await browser.newPage(); 8 | await page.goto( 9 | `https://www.google.com.hk/search?q=${encodeURIComponent( 10 | query 11 | )}&oq=${encodeURIComponent( 12 | query 13 | )}&uule=w+CAIQICIaQXVzdGluLFRleGFzLFVuaXRlZCBTdGF0ZXM&hl=en&gl=us&sourceid=chrome&ie=UTF-8%22#ip=1` 14 | ); 15 | const summaries = await page.evaluate(() => { 16 | const liElements = Array.from( 17 | document.querySelector("#search > div > div").childNodes 18 | ); 19 | const firstFiveLiElements = liElements.slice(0, 5); 20 | return firstFiveLiElements.map((li) => { 21 | const linkElement = li.querySelector("a"); 22 | const href = linkElement.getAttribute("href"); 23 | const title = linkElement.querySelector("a > h3").textContent; 24 | const abstract = Array.from( 25 | li.querySelectorAll("div > div > div > div > div > div > span") 26 | ) 27 | .map((e) => e.textContent) 28 | .join(""); 29 | return { href, title, abstract }; 30 | }); 31 | }); 32 | await browser.close(); 33 | console.log(summaries); 34 | return summaries; 35 | } catch (error) { 36 | console.error("An error occurred:", error); 37 | } 38 | } 39 | 40 | async function bingSearch(query) { 41 | try { 42 | //https://serpapi.com/bing-search-api 43 | const browser = await puppeteer.launch({ 44 | headless: true, 45 | args: ['--no-sandbox'] 46 | }); 47 | const page = await browser.newPage(); 48 | await page.goto( 49 | `https://cn.bing.com/search?mkt=zh-cn&FORM=BEHPTB&q=${encodeURIComponent( 50 | query 51 | )}` 52 | ); 53 | const summaries = await page.evaluate(() => { 54 | const liElements = Array.from( 55 | document.querySelectorAll("#b_results > .b_algo") 56 | ); 57 | console.log(liElements) 58 | const firstFiveLiElements = liElements.slice(0, 5); 59 | return firstFiveLiElements.map((li) => { 60 | const linkElement = li.querySelector("a"); 61 | const href = linkElement.getAttribute("href"); 62 | const title = li.querySelector("h2").textContent; 63 | const abstractEle = li.querySelector('div > p'); 64 | let abstract = abstractEle ? abstractEle.textContent : ""; 65 | if (abstract.length > 3) { 66 | abstract = abstract.substring(3, abstract.length); 67 | } 68 | return { href, title , abstract}; 69 | }); 70 | }); 71 | await browser.close(); 72 | console.log(summaries); 73 | return summaries; 74 | } catch (error) { 75 | console.error("An error occurred:", error); 76 | } 77 | } 78 | 79 | async function baiduSearch(query) { 80 | try { 81 | //https://serpapi.com/bing-search-api 82 | const browser = await puppeteer.launch({ 83 | headless: true, 84 | args: ['--no-sandbox'] 85 | }); 86 | const page = await browser.newPage(); 87 | console.log(`https://www.baidu.com/s?wd=${encodeURIComponent( 88 | query 89 | )}`); 90 | await page.goto( 91 | `https://www.baidu.com/s?wd=${encodeURIComponent( 92 | query 93 | )}` 94 | ); 95 | const summaries = await page.evaluate(() => { 96 | const contentDivEle = document.querySelector("#content_left"); 97 | const firstFiveDivElements = Array.from(contentDivEle.querySelectorAll("div[class='c-container']")).slice(0, 5); // trick 98 | // const firstFiveLiElements = liElements.slice(0, 5); 99 | return firstFiveDivElements.map((div) => { 100 | const linkElement = div.querySelector('h3').querySelector('a'); 101 | const href = linkElement.getAttribute("href"); 102 | const title = linkElement.textContent; 103 | const abstractEle = div.querySelector("span[class^='content-right']"); 104 | let abstract = abstractEle ? abstractEle.textContent : ""; 105 | if (abstract.length > 3) { 106 | abstract = abstract.substring(3, abstract.length); 107 | } 108 | return { href, title , abstract}; 109 | }); 110 | }); 111 | await browser.close(); 112 | console.log(summaries); 113 | return summaries; 114 | } catch (error) { 115 | console.error("An error occurred:", error); 116 | } 117 | } 118 | 119 | async function yahooSearch(query) { 120 | try { 121 | const browser = await puppeteer.launch(); 122 | const page = await browser.newPage(); 123 | await page.goto( 124 | `https://search.yahoo.com/search?p=${encodeURIComponent( 125 | query 126 | )}&ei=UTF-8&fr=fp-tts` 127 | ); 128 | const summaries = await page.evaluate(() => { 129 | const liElements = Array.from( 130 | document.querySelector(".searchCenterMiddle").childNodes 131 | ); 132 | const firstFiveLiElements = liElements.slice(0, 5); 133 | return firstFiveLiElements.map((li) => { 134 | const compTextElement = li.querySelector(".compText"); 135 | const linkElement = li.querySelector("a"); 136 | const href = linkElement.getAttribute("href"); 137 | const title = linkElement.getAttribute("aria-label"); 138 | 139 | const abstract = compTextElement ? compTextElement.textContent : ""; 140 | return { href, title, abstract }; 141 | }); 142 | }); 143 | await browser.close(); 144 | return summaries; 145 | } catch (error) { 146 | console.error("An error occurred:", error); 147 | } 148 | } 149 | 150 | async function duckduckgoSearch(query) { 151 | try { 152 | //https://serpapi.com/duckduckgo-search-api 153 | // 可以改区域,这些设置的是港区 154 | const browser = await puppeteer.launch(); 155 | const page = await browser.newPage(); 156 | await page.goto( 157 | `https://duckduckgo.com/?q=${encodeURIComponent(query)}&kl=hk-tzh&ia=web` 158 | ); 159 | const summaries = await page.evaluate(() => { 160 | const liElements = Array.from( 161 | document.querySelectorAll("#react-layout ol li") 162 | ); 163 | const firstFiveLiElements = liElements.slice(0, 5); 164 | return firstFiveLiElements.map((li) => { 165 | const abstractElement = li 166 | .querySelector("div:nth-child(3)") 167 | .querySelector("div"); 168 | const linkElement = li 169 | .querySelector("div:nth-child(2)") 170 | .querySelector("a"); 171 | const href = linkElement.getAttribute("href"); 172 | const title = linkElement.textContent; 173 | 174 | const abstract = abstractElement ? abstractElement.textContent : ""; 175 | return { href, title, abstract }; 176 | }); 177 | }); 178 | await browser.close(); 179 | console.log(summaries); 180 | return summaries; 181 | } catch (error) { 182 | console.error("An error occurred:", error); 183 | } 184 | } 185 | 186 | module.exports = { 187 | googleSearch, 188 | bingSearch, 189 | yahooSearch, 190 | duckduckgoSearch, 191 | baiduSearch 192 | }; 193 | --------------------------------------------------------------------------------