├── .env.example ├── .gitignore ├── README.md ├── package.json ├── pnpm-lock.yaml ├── prisma └── schema.prisma ├── src ├── grab │ ├── constants.ts │ ├── filter.ts │ ├── index.ts │ └── routes │ │ ├── ele-duck.ts │ │ ├── ruanyf.ts │ │ └── v2ex.ts ├── lib │ ├── db.ts │ ├── generative-ai-js │ │ ├── errors.ts │ │ ├── gen-ai.ts │ │ ├── index.ts │ │ ├── methods │ │ │ ├── chat-session.ts │ │ │ ├── count-tokens.ts │ │ │ ├── embed-content.ts │ │ │ └── generate-content.ts │ │ ├── models │ │ │ └── generative-model.ts │ │ ├── requests │ │ │ ├── request-helpers.ts │ │ │ ├── request.ts │ │ │ ├── response-helpers.ts │ │ │ └── stream-reader.ts │ │ └── types │ │ │ ├── content.ts │ │ │ ├── enums.ts │ │ │ ├── index.ts │ │ │ ├── requests.ts │ │ │ └── responses.ts │ ├── logger.ts │ ├── utils.ts │ └── with-ai │ │ └── analysis.ts └── main.ts └── tsconfig.json /.env.example: -------------------------------------------------------------------------------- 1 | NODE_ENV="development" 2 | 3 | # Prisma 4 | # https://www.prisma.io/docs/reference/database-reference/connection-urls#env 5 | DATABASE_URL="postgresql://x-hiring:password@x.x.x.x:5432/x-hiring?sslmode=false" 6 | 7 | # AI 8 | GEMINI_AI_API_KEY="token" 9 | 10 | # GithubToken 11 | GITHUB_TOKEN="ghp_xxx" 12 | 13 | # Local fetch proxy options 14 | # LOCAL_FETCH_PROXY="http://127.0.0.1:7890" 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | 6 | # database 7 | /prisma/db.sqlite 8 | /prisma/db.sqlite-journal 9 | 10 | # production 11 | /build 12 | 13 | # misc 14 | .DS_Store 15 | *.pem 16 | 17 | # debug 18 | npm-debug.log* 19 | yarn-debug.log* 20 | yarn-error.log* 21 | .pnpm-debug.log* 22 | 23 | # local env files 24 | # do not commit any .env files to git, except for the .env.example file. https://create.t3.gg/en/usage/env-variables#using-environment-variables 25 | .env 26 | .env*.local 27 | 28 | # typescript 29 | *.tsbuildinfo 30 | 31 | dist 32 | logs 33 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # x-hiring grab script 2 | 3 | 🤗 每日最新招聘信息,使用 Google AI 提取摘要 4 | 5 | - V2EX 抓取 6 | - 电鸭抓取 7 | - GoogleGemini 摘要分析 8 | 9 | ## ⌨️ 安装&运行 10 | 11 | 配置环境变量。 在根目录创建 `.env` 文件(参考 `.env.example`), 之后复制下面内容 12 | 13 | ```txt 14 | # Prisma postgresql 数据库 15 | DATABASE_URL="postgresql://x-hiring:password@0.0.0.0:5432/x-hiring" 16 | 17 | # Google Gemini AI 18 | GEMINI_AI_API_KEY="api_token" 19 | 20 | # 本地代理 (可选) 21 | LOCAL_FETCH_PROXY="http://127.0.0.1:7890" 22 | ``` 23 | 24 | ```shell 25 | npm install 26 | npm run dev 27 | ``` 28 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "x-hiring-grab", 3 | "version": "1.0.0", 4 | "main": "dist/index.js", 5 | "scripts": { 6 | "dev": "npx tsx src/main.ts", 7 | "start": "npm run build && node dist/main.cjs", 8 | "build": "tsup src/main.ts --format cjs", 9 | "postinstall": "prisma generate" 10 | }, 11 | "dependencies": { 12 | "@prisma/client": "^5.6.0", 13 | "cheerio": "1.0.0-rc.12", 14 | "cron": "^3.1.6", 15 | "dotenv": "^16.4.4", 16 | "https-proxy-agent": "^7.0.4", 17 | "node-fetch": "^3.3.2", 18 | "tsup": "^8.0.2", 19 | "winston": "^3.11.0", 20 | "winston-daily-rotate-file": "^5.0.0", 21 | "@octokit/core": "^6.1.2" 22 | }, 23 | "devDependencies": { 24 | "@types/node": "^20.11.19", 25 | "prisma": "^5.6.0", 26 | "tsx": "^4.7.1", 27 | "typescript": "^5.3.3" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | '@octokit/core': 9 | specifier: ^6.1.2 10 | version: 6.1.2 11 | '@prisma/client': 12 | specifier: ^5.6.0 13 | version: 5.9.1(prisma@5.9.1) 14 | cheerio: 15 | specifier: 1.0.0-rc.12 16 | version: 1.0.0-rc.12 17 | cron: 18 | specifier: ^3.1.6 19 | version: 3.1.6 20 | dotenv: 21 | specifier: ^16.4.4 22 | version: 16.4.4 23 | https-proxy-agent: 24 | specifier: ^7.0.4 25 | version: 7.0.4 26 | node-fetch: 27 | specifier: ^3.3.2 28 | version: 3.3.2 29 | tsup: 30 | specifier: ^8.0.2 31 | version: 8.0.2(typescript@5.3.3) 32 | winston: 33 | specifier: ^3.11.0 34 | version: 3.11.0 35 | winston-daily-rotate-file: 36 | specifier: ^5.0.0 37 | version: 5.0.0(winston@3.11.0) 38 | 39 | devDependencies: 40 | '@types/node': 41 | specifier: ^20.11.19 42 | version: 20.11.19 43 | prisma: 44 | specifier: ^5.6.0 45 | version: 5.9.1 46 | tsx: 47 | specifier: ^4.7.1 48 | version: 4.7.1 49 | typescript: 50 | specifier: ^5.3.3 51 | version: 5.3.3 52 | 53 | packages: 54 | 55 | /@colors/colors@1.6.0: 56 | resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} 57 | engines: {node: '>=0.1.90'} 58 | dev: false 59 | 60 | /@dabh/diagnostics@2.0.3: 61 | resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} 62 | dependencies: 63 | colorspace: 1.1.4 64 | enabled: 2.0.0 65 | kuler: 2.0.0 66 | dev: false 67 | 68 | /@esbuild/aix-ppc64@0.19.12: 69 | resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} 70 | engines: {node: '>=12'} 71 | cpu: [ppc64] 72 | os: [aix] 73 | requiresBuild: true 74 | optional: true 75 | 76 | /@esbuild/android-arm64@0.19.12: 77 | resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} 78 | engines: {node: '>=12'} 79 | cpu: [arm64] 80 | os: [android] 81 | requiresBuild: true 82 | optional: true 83 | 84 | /@esbuild/android-arm@0.19.12: 85 | resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} 86 | engines: {node: '>=12'} 87 | cpu: [arm] 88 | os: [android] 89 | requiresBuild: true 90 | optional: true 91 | 92 | /@esbuild/android-x64@0.19.12: 93 | resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} 94 | engines: {node: '>=12'} 95 | cpu: [x64] 96 | os: [android] 97 | requiresBuild: true 98 | optional: true 99 | 100 | /@esbuild/darwin-arm64@0.19.12: 101 | resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} 102 | engines: {node: '>=12'} 103 | cpu: [arm64] 104 | os: [darwin] 105 | requiresBuild: true 106 | optional: true 107 | 108 | /@esbuild/darwin-x64@0.19.12: 109 | resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} 110 | engines: {node: '>=12'} 111 | cpu: [x64] 112 | os: [darwin] 113 | requiresBuild: true 114 | optional: true 115 | 116 | /@esbuild/freebsd-arm64@0.19.12: 117 | resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} 118 | engines: {node: '>=12'} 119 | cpu: [arm64] 120 | os: [freebsd] 121 | requiresBuild: true 122 | optional: true 123 | 124 | /@esbuild/freebsd-x64@0.19.12: 125 | resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} 126 | engines: {node: '>=12'} 127 | cpu: [x64] 128 | os: [freebsd] 129 | requiresBuild: true 130 | optional: true 131 | 132 | /@esbuild/linux-arm64@0.19.12: 133 | resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} 134 | engines: {node: '>=12'} 135 | cpu: [arm64] 136 | os: [linux] 137 | requiresBuild: true 138 | optional: true 139 | 140 | /@esbuild/linux-arm@0.19.12: 141 | resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} 142 | engines: {node: '>=12'} 143 | cpu: [arm] 144 | os: [linux] 145 | requiresBuild: true 146 | optional: true 147 | 148 | /@esbuild/linux-ia32@0.19.12: 149 | resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} 150 | engines: {node: '>=12'} 151 | cpu: [ia32] 152 | os: [linux] 153 | requiresBuild: true 154 | optional: true 155 | 156 | /@esbuild/linux-loong64@0.19.12: 157 | resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} 158 | engines: {node: '>=12'} 159 | cpu: [loong64] 160 | os: [linux] 161 | requiresBuild: true 162 | optional: true 163 | 164 | /@esbuild/linux-mips64el@0.19.12: 165 | resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} 166 | engines: {node: '>=12'} 167 | cpu: [mips64el] 168 | os: [linux] 169 | requiresBuild: true 170 | optional: true 171 | 172 | /@esbuild/linux-ppc64@0.19.12: 173 | resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} 174 | engines: {node: '>=12'} 175 | cpu: [ppc64] 176 | os: [linux] 177 | requiresBuild: true 178 | optional: true 179 | 180 | /@esbuild/linux-riscv64@0.19.12: 181 | resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} 182 | engines: {node: '>=12'} 183 | cpu: [riscv64] 184 | os: [linux] 185 | requiresBuild: true 186 | optional: true 187 | 188 | /@esbuild/linux-s390x@0.19.12: 189 | resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} 190 | engines: {node: '>=12'} 191 | cpu: [s390x] 192 | os: [linux] 193 | requiresBuild: true 194 | optional: true 195 | 196 | /@esbuild/linux-x64@0.19.12: 197 | resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} 198 | engines: {node: '>=12'} 199 | cpu: [x64] 200 | os: [linux] 201 | requiresBuild: true 202 | optional: true 203 | 204 | /@esbuild/netbsd-x64@0.19.12: 205 | resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} 206 | engines: {node: '>=12'} 207 | cpu: [x64] 208 | os: [netbsd] 209 | requiresBuild: true 210 | optional: true 211 | 212 | /@esbuild/openbsd-x64@0.19.12: 213 | resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} 214 | engines: {node: '>=12'} 215 | cpu: [x64] 216 | os: [openbsd] 217 | requiresBuild: true 218 | optional: true 219 | 220 | /@esbuild/sunos-x64@0.19.12: 221 | resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} 222 | engines: {node: '>=12'} 223 | cpu: [x64] 224 | os: [sunos] 225 | requiresBuild: true 226 | optional: true 227 | 228 | /@esbuild/win32-arm64@0.19.12: 229 | resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} 230 | engines: {node: '>=12'} 231 | cpu: [arm64] 232 | os: [win32] 233 | requiresBuild: true 234 | optional: true 235 | 236 | /@esbuild/win32-ia32@0.19.12: 237 | resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} 238 | engines: {node: '>=12'} 239 | cpu: [ia32] 240 | os: [win32] 241 | requiresBuild: true 242 | optional: true 243 | 244 | /@esbuild/win32-x64@0.19.12: 245 | resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} 246 | engines: {node: '>=12'} 247 | cpu: [x64] 248 | os: [win32] 249 | requiresBuild: true 250 | optional: true 251 | 252 | /@isaacs/cliui@8.0.2: 253 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 254 | engines: {node: '>=12'} 255 | dependencies: 256 | string-width: 5.1.2 257 | string-width-cjs: /string-width@4.2.3 258 | strip-ansi: 7.1.0 259 | strip-ansi-cjs: /strip-ansi@6.0.1 260 | wrap-ansi: 8.1.0 261 | wrap-ansi-cjs: /wrap-ansi@7.0.0 262 | dev: false 263 | 264 | /@jridgewell/gen-mapping@0.3.3: 265 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} 266 | engines: {node: '>=6.0.0'} 267 | dependencies: 268 | '@jridgewell/set-array': 1.1.2 269 | '@jridgewell/sourcemap-codec': 1.4.15 270 | '@jridgewell/trace-mapping': 0.3.9 271 | dev: false 272 | 273 | /@jridgewell/resolve-uri@3.1.2: 274 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 275 | engines: {node: '>=6.0.0'} 276 | dev: false 277 | 278 | /@jridgewell/set-array@1.1.2: 279 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 280 | engines: {node: '>=6.0.0'} 281 | dev: false 282 | 283 | /@jridgewell/sourcemap-codec@1.4.15: 284 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 285 | dev: false 286 | 287 | /@jridgewell/trace-mapping@0.3.9: 288 | resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} 289 | dependencies: 290 | '@jridgewell/resolve-uri': 3.1.2 291 | '@jridgewell/sourcemap-codec': 1.4.15 292 | dev: false 293 | 294 | /@nodelib/fs.scandir@2.1.5: 295 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 296 | engines: {node: '>= 8'} 297 | dependencies: 298 | '@nodelib/fs.stat': 2.0.5 299 | run-parallel: 1.2.0 300 | dev: false 301 | 302 | /@nodelib/fs.stat@2.0.5: 303 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 304 | engines: {node: '>= 8'} 305 | dev: false 306 | 307 | /@nodelib/fs.walk@1.2.8: 308 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 309 | engines: {node: '>= 8'} 310 | dependencies: 311 | '@nodelib/fs.scandir': 2.1.5 312 | fastq: 1.17.1 313 | dev: false 314 | 315 | /@octokit/auth-token@5.1.1: 316 | resolution: {integrity: sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==} 317 | engines: {node: '>= 18'} 318 | dev: false 319 | 320 | /@octokit/core@6.1.2: 321 | resolution: {integrity: sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==} 322 | engines: {node: '>= 18'} 323 | dependencies: 324 | '@octokit/auth-token': 5.1.1 325 | '@octokit/graphql': 8.1.1 326 | '@octokit/request': 9.1.1 327 | '@octokit/request-error': 6.1.1 328 | '@octokit/types': 13.4.1 329 | before-after-hook: 3.0.2 330 | universal-user-agent: 7.0.2 331 | dev: false 332 | 333 | /@octokit/endpoint@10.1.1: 334 | resolution: {integrity: sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==} 335 | engines: {node: '>= 18'} 336 | dependencies: 337 | '@octokit/types': 13.4.1 338 | universal-user-agent: 7.0.2 339 | dev: false 340 | 341 | /@octokit/graphql@8.1.1: 342 | resolution: {integrity: sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==} 343 | engines: {node: '>= 18'} 344 | dependencies: 345 | '@octokit/request': 9.1.1 346 | '@octokit/types': 13.4.1 347 | universal-user-agent: 7.0.2 348 | dev: false 349 | 350 | /@octokit/openapi-types@22.1.0: 351 | resolution: {integrity: sha512-pGUdSP+eEPfZiQHNkZI0U01HLipxncisdJQB4G//OAmfeO8sqTQ9KRa0KF03TUPCziNsoXUrTg4B2Q1EX++T0Q==} 352 | dev: false 353 | 354 | /@octokit/request-error@6.1.1: 355 | resolution: {integrity: sha512-1mw1gqT3fR/WFvnoVpY/zUM2o/XkMs/2AszUUG9I69xn0JFLv6PGkPhNk5lbfvROs79wiS0bqiJNxfCZcRJJdg==} 356 | engines: {node: '>= 18'} 357 | dependencies: 358 | '@octokit/types': 13.4.1 359 | dev: false 360 | 361 | /@octokit/request@9.1.1: 362 | resolution: {integrity: sha512-pyAguc0p+f+GbQho0uNetNQMmLG1e80WjkIaqqgUkihqUp0boRU6nKItXO4VWnr+nbZiLGEyy4TeKRwqaLvYgw==} 363 | engines: {node: '>= 18'} 364 | dependencies: 365 | '@octokit/endpoint': 10.1.1 366 | '@octokit/request-error': 6.1.1 367 | '@octokit/types': 13.4.1 368 | universal-user-agent: 7.0.2 369 | dev: false 370 | 371 | /@octokit/types@13.4.1: 372 | resolution: {integrity: sha512-Y73oOAzRBAUzR/iRAbGULzpNkX8vaxKCqEtg6K74Ff3w9f5apFnWtE/2nade7dMWWW3bS5Kkd6DJS4HF04xreg==} 373 | dependencies: 374 | '@octokit/openapi-types': 22.1.0 375 | dev: false 376 | 377 | /@pkgjs/parseargs@0.11.0: 378 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 379 | engines: {node: '>=14'} 380 | requiresBuild: true 381 | dev: false 382 | optional: true 383 | 384 | /@prisma/client@5.9.1(prisma@5.9.1): 385 | resolution: {integrity: sha512-caSOnG4kxcSkhqC/2ShV7rEoWwd3XrftokxJqOCMVvia4NYV/TPtJlS9C2os3Igxw/Qyxumj9GBQzcStzECvtQ==} 386 | engines: {node: '>=16.13'} 387 | requiresBuild: true 388 | peerDependencies: 389 | prisma: '*' 390 | peerDependenciesMeta: 391 | prisma: 392 | optional: true 393 | dependencies: 394 | prisma: 5.9.1 395 | dev: false 396 | 397 | /@prisma/debug@5.9.1: 398 | resolution: {integrity: sha512-yAHFSFCg8KVoL0oRUno3m60GAjsUKYUDkQ+9BA2X2JfVR3kRVSJFc/GpQ2fSORi4pSHZR9orfM4UC9OVXIFFTA==} 399 | 400 | /@prisma/engines-version@5.9.0-32.23fdc5965b1e05fc54e5f26ed3de66776b93de64: 401 | resolution: {integrity: sha512-HFl7275yF0FWbdcNvcSRbbu9JCBSLMcurYwvWc8WGDnpu7APxQo2ONtZrUggU3WxLxUJ2uBX+0GOFIcJeVeOOQ==} 402 | 403 | /@prisma/engines@5.9.1: 404 | resolution: {integrity: sha512-gkdXmjxQ5jktxWNdDA5aZZ6R8rH74JkoKq6LD5mACSvxd2vbqWeWIOV0Py5wFC8vofOYShbt6XUeCIUmrOzOnQ==} 405 | requiresBuild: true 406 | dependencies: 407 | '@prisma/debug': 5.9.1 408 | '@prisma/engines-version': 5.9.0-32.23fdc5965b1e05fc54e5f26ed3de66776b93de64 409 | '@prisma/fetch-engine': 5.9.1 410 | '@prisma/get-platform': 5.9.1 411 | 412 | /@prisma/fetch-engine@5.9.1: 413 | resolution: {integrity: sha512-l0goQOMcNVOJs1kAcwqpKq3ylvkD9F04Ioe1oJoCqmz05mw22bNAKKGWuDd3zTUoUZr97va0c/UfLNru+PDmNA==} 414 | dependencies: 415 | '@prisma/debug': 5.9.1 416 | '@prisma/engines-version': 5.9.0-32.23fdc5965b1e05fc54e5f26ed3de66776b93de64 417 | '@prisma/get-platform': 5.9.1 418 | 419 | /@prisma/get-platform@5.9.1: 420 | resolution: {integrity: sha512-6OQsNxTyhvG+T2Ksr8FPFpuPeL4r9u0JF0OZHUBI/Uy9SS43sPyAIutt4ZEAyqWQt104ERh70EZedkHZKsnNbg==} 421 | dependencies: 422 | '@prisma/debug': 5.9.1 423 | 424 | /@rollup/rollup-android-arm-eabi@4.12.0: 425 | resolution: {integrity: sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==} 426 | cpu: [arm] 427 | os: [android] 428 | requiresBuild: true 429 | dev: false 430 | optional: true 431 | 432 | /@rollup/rollup-android-arm64@4.12.0: 433 | resolution: {integrity: sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==} 434 | cpu: [arm64] 435 | os: [android] 436 | requiresBuild: true 437 | dev: false 438 | optional: true 439 | 440 | /@rollup/rollup-darwin-arm64@4.12.0: 441 | resolution: {integrity: sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==} 442 | cpu: [arm64] 443 | os: [darwin] 444 | requiresBuild: true 445 | dev: false 446 | optional: true 447 | 448 | /@rollup/rollup-darwin-x64@4.12.0: 449 | resolution: {integrity: sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==} 450 | cpu: [x64] 451 | os: [darwin] 452 | requiresBuild: true 453 | dev: false 454 | optional: true 455 | 456 | /@rollup/rollup-linux-arm-gnueabihf@4.12.0: 457 | resolution: {integrity: sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==} 458 | cpu: [arm] 459 | os: [linux] 460 | requiresBuild: true 461 | dev: false 462 | optional: true 463 | 464 | /@rollup/rollup-linux-arm64-gnu@4.12.0: 465 | resolution: {integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==} 466 | cpu: [arm64] 467 | os: [linux] 468 | libc: [glibc] 469 | requiresBuild: true 470 | dev: false 471 | optional: true 472 | 473 | /@rollup/rollup-linux-arm64-musl@4.12.0: 474 | resolution: {integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==} 475 | cpu: [arm64] 476 | os: [linux] 477 | libc: [musl] 478 | requiresBuild: true 479 | dev: false 480 | optional: true 481 | 482 | /@rollup/rollup-linux-riscv64-gnu@4.12.0: 483 | resolution: {integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==} 484 | cpu: [riscv64] 485 | os: [linux] 486 | libc: [glibc] 487 | requiresBuild: true 488 | dev: false 489 | optional: true 490 | 491 | /@rollup/rollup-linux-x64-gnu@4.12.0: 492 | resolution: {integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==} 493 | cpu: [x64] 494 | os: [linux] 495 | libc: [glibc] 496 | requiresBuild: true 497 | dev: false 498 | optional: true 499 | 500 | /@rollup/rollup-linux-x64-musl@4.12.0: 501 | resolution: {integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==} 502 | cpu: [x64] 503 | os: [linux] 504 | libc: [musl] 505 | requiresBuild: true 506 | dev: false 507 | optional: true 508 | 509 | /@rollup/rollup-win32-arm64-msvc@4.12.0: 510 | resolution: {integrity: sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==} 511 | cpu: [arm64] 512 | os: [win32] 513 | requiresBuild: true 514 | dev: false 515 | optional: true 516 | 517 | /@rollup/rollup-win32-ia32-msvc@4.12.0: 518 | resolution: {integrity: sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==} 519 | cpu: [ia32] 520 | os: [win32] 521 | requiresBuild: true 522 | dev: false 523 | optional: true 524 | 525 | /@rollup/rollup-win32-x64-msvc@4.12.0: 526 | resolution: {integrity: sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==} 527 | cpu: [x64] 528 | os: [win32] 529 | requiresBuild: true 530 | dev: false 531 | optional: true 532 | 533 | /@types/estree@1.0.5: 534 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 535 | dev: false 536 | 537 | /@types/luxon@3.3.8: 538 | resolution: {integrity: sha512-jYvz8UMLDgy3a5SkGJne8H7VA7zPV2Lwohjx0V8V31+SqAjNmurWMkk9cQhfvlcnXWudBpK9xPM1n4rljOcHYQ==} 539 | dev: false 540 | 541 | /@types/node@20.11.19: 542 | resolution: {integrity: sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==} 543 | dependencies: 544 | undici-types: 5.26.5 545 | dev: true 546 | 547 | /@types/triple-beam@1.3.5: 548 | resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} 549 | dev: false 550 | 551 | /agent-base@7.1.0: 552 | resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} 553 | engines: {node: '>= 14'} 554 | dependencies: 555 | debug: 4.3.4 556 | transitivePeerDependencies: 557 | - supports-color 558 | dev: false 559 | 560 | /ansi-regex@5.0.1: 561 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 562 | engines: {node: '>=8'} 563 | dev: false 564 | 565 | /ansi-regex@6.0.1: 566 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 567 | engines: {node: '>=12'} 568 | dev: false 569 | 570 | /ansi-styles@4.3.0: 571 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 572 | engines: {node: '>=8'} 573 | dependencies: 574 | color-convert: 2.0.1 575 | dev: false 576 | 577 | /ansi-styles@6.2.1: 578 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 579 | engines: {node: '>=12'} 580 | dev: false 581 | 582 | /any-promise@1.3.0: 583 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 584 | dev: false 585 | 586 | /anymatch@3.1.3: 587 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 588 | engines: {node: '>= 8'} 589 | dependencies: 590 | normalize-path: 3.0.0 591 | picomatch: 2.3.1 592 | dev: false 593 | 594 | /array-union@2.1.0: 595 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 596 | engines: {node: '>=8'} 597 | dev: false 598 | 599 | /async@3.2.5: 600 | resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} 601 | dev: false 602 | 603 | /balanced-match@1.0.2: 604 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 605 | dev: false 606 | 607 | /before-after-hook@3.0.2: 608 | resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==} 609 | dev: false 610 | 611 | /binary-extensions@2.2.0: 612 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 613 | engines: {node: '>=8'} 614 | dev: false 615 | 616 | /boolbase@1.0.0: 617 | resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} 618 | dev: false 619 | 620 | /brace-expansion@2.0.1: 621 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 622 | dependencies: 623 | balanced-match: 1.0.2 624 | dev: false 625 | 626 | /braces@3.0.2: 627 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 628 | engines: {node: '>=8'} 629 | dependencies: 630 | fill-range: 7.0.1 631 | dev: false 632 | 633 | /bundle-require@4.0.2(esbuild@0.19.12): 634 | resolution: {integrity: sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==} 635 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 636 | peerDependencies: 637 | esbuild: '>=0.17' 638 | dependencies: 639 | esbuild: 0.19.12 640 | load-tsconfig: 0.2.5 641 | dev: false 642 | 643 | /cac@6.7.14: 644 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 645 | engines: {node: '>=8'} 646 | dev: false 647 | 648 | /cheerio-select@2.1.0: 649 | resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} 650 | dependencies: 651 | boolbase: 1.0.0 652 | css-select: 5.1.0 653 | css-what: 6.1.0 654 | domelementtype: 2.3.0 655 | domhandler: 5.0.3 656 | domutils: 3.1.0 657 | dev: false 658 | 659 | /cheerio@1.0.0-rc.12: 660 | resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} 661 | engines: {node: '>= 6'} 662 | dependencies: 663 | cheerio-select: 2.1.0 664 | dom-serializer: 2.0.0 665 | domhandler: 5.0.3 666 | domutils: 3.1.0 667 | htmlparser2: 8.0.2 668 | parse5: 7.1.2 669 | parse5-htmlparser2-tree-adapter: 7.0.0 670 | dev: false 671 | 672 | /chokidar@3.6.0: 673 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 674 | engines: {node: '>= 8.10.0'} 675 | dependencies: 676 | anymatch: 3.1.3 677 | braces: 3.0.2 678 | glob-parent: 5.1.2 679 | is-binary-path: 2.1.0 680 | is-glob: 4.0.3 681 | normalize-path: 3.0.0 682 | readdirp: 3.6.0 683 | optionalDependencies: 684 | fsevents: 2.3.3 685 | dev: false 686 | 687 | /color-convert@1.9.3: 688 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 689 | dependencies: 690 | color-name: 1.1.3 691 | dev: false 692 | 693 | /color-convert@2.0.1: 694 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 695 | engines: {node: '>=7.0.0'} 696 | dependencies: 697 | color-name: 1.1.4 698 | dev: false 699 | 700 | /color-name@1.1.3: 701 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 702 | dev: false 703 | 704 | /color-name@1.1.4: 705 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 706 | dev: false 707 | 708 | /color-string@1.9.1: 709 | resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} 710 | dependencies: 711 | color-name: 1.1.4 712 | simple-swizzle: 0.2.2 713 | dev: false 714 | 715 | /color@3.2.1: 716 | resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} 717 | dependencies: 718 | color-convert: 1.9.3 719 | color-string: 1.9.1 720 | dev: false 721 | 722 | /colorspace@1.1.4: 723 | resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} 724 | dependencies: 725 | color: 3.2.1 726 | text-hex: 1.0.0 727 | dev: false 728 | 729 | /commander@4.1.1: 730 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 731 | engines: {node: '>= 6'} 732 | dev: false 733 | 734 | /cron@3.1.6: 735 | resolution: {integrity: sha512-cvFiQCeVzsA+QPM6fhjBtlKGij7tLLISnTSvFxVdnFGLdz+ZdXN37kNe0i2gefmdD17XuZA6n2uPVwzl4FxW/w==} 736 | dependencies: 737 | '@types/luxon': 3.3.8 738 | luxon: 3.4.4 739 | dev: false 740 | 741 | /cross-spawn@7.0.3: 742 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 743 | engines: {node: '>= 8'} 744 | dependencies: 745 | path-key: 3.1.1 746 | shebang-command: 2.0.0 747 | which: 2.0.2 748 | dev: false 749 | 750 | /css-select@5.1.0: 751 | resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} 752 | dependencies: 753 | boolbase: 1.0.0 754 | css-what: 6.1.0 755 | domhandler: 5.0.3 756 | domutils: 3.1.0 757 | nth-check: 2.1.1 758 | dev: false 759 | 760 | /css-what@6.1.0: 761 | resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} 762 | engines: {node: '>= 6'} 763 | dev: false 764 | 765 | /data-uri-to-buffer@4.0.1: 766 | resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} 767 | engines: {node: '>= 12'} 768 | dev: false 769 | 770 | /debug@4.3.4: 771 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 772 | engines: {node: '>=6.0'} 773 | peerDependencies: 774 | supports-color: '*' 775 | peerDependenciesMeta: 776 | supports-color: 777 | optional: true 778 | dependencies: 779 | ms: 2.1.2 780 | dev: false 781 | 782 | /dir-glob@3.0.1: 783 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 784 | engines: {node: '>=8'} 785 | dependencies: 786 | path-type: 4.0.0 787 | dev: false 788 | 789 | /dom-serializer@2.0.0: 790 | resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} 791 | dependencies: 792 | domelementtype: 2.3.0 793 | domhandler: 5.0.3 794 | entities: 4.5.0 795 | dev: false 796 | 797 | /domelementtype@2.3.0: 798 | resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} 799 | dev: false 800 | 801 | /domhandler@5.0.3: 802 | resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} 803 | engines: {node: '>= 4'} 804 | dependencies: 805 | domelementtype: 2.3.0 806 | dev: false 807 | 808 | /domutils@3.1.0: 809 | resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} 810 | dependencies: 811 | dom-serializer: 2.0.0 812 | domelementtype: 2.3.0 813 | domhandler: 5.0.3 814 | dev: false 815 | 816 | /dotenv@16.4.4: 817 | resolution: {integrity: sha512-XvPXc8XAQThSjAbY6cQ/9PcBXmFoWuw1sQ3b8HqUCR6ziGXjkTi//kB9SWa2UwqlgdAIuRqAa/9hVljzPehbYg==} 818 | engines: {node: '>=12'} 819 | dev: false 820 | 821 | /eastasianwidth@0.2.0: 822 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 823 | dev: false 824 | 825 | /emoji-regex@8.0.0: 826 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 827 | dev: false 828 | 829 | /emoji-regex@9.2.2: 830 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 831 | dev: false 832 | 833 | /enabled@2.0.0: 834 | resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} 835 | dev: false 836 | 837 | /entities@4.5.0: 838 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 839 | engines: {node: '>=0.12'} 840 | dev: false 841 | 842 | /esbuild@0.19.12: 843 | resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} 844 | engines: {node: '>=12'} 845 | hasBin: true 846 | requiresBuild: true 847 | optionalDependencies: 848 | '@esbuild/aix-ppc64': 0.19.12 849 | '@esbuild/android-arm': 0.19.12 850 | '@esbuild/android-arm64': 0.19.12 851 | '@esbuild/android-x64': 0.19.12 852 | '@esbuild/darwin-arm64': 0.19.12 853 | '@esbuild/darwin-x64': 0.19.12 854 | '@esbuild/freebsd-arm64': 0.19.12 855 | '@esbuild/freebsd-x64': 0.19.12 856 | '@esbuild/linux-arm': 0.19.12 857 | '@esbuild/linux-arm64': 0.19.12 858 | '@esbuild/linux-ia32': 0.19.12 859 | '@esbuild/linux-loong64': 0.19.12 860 | '@esbuild/linux-mips64el': 0.19.12 861 | '@esbuild/linux-ppc64': 0.19.12 862 | '@esbuild/linux-riscv64': 0.19.12 863 | '@esbuild/linux-s390x': 0.19.12 864 | '@esbuild/linux-x64': 0.19.12 865 | '@esbuild/netbsd-x64': 0.19.12 866 | '@esbuild/openbsd-x64': 0.19.12 867 | '@esbuild/sunos-x64': 0.19.12 868 | '@esbuild/win32-arm64': 0.19.12 869 | '@esbuild/win32-ia32': 0.19.12 870 | '@esbuild/win32-x64': 0.19.12 871 | 872 | /execa@5.1.1: 873 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 874 | engines: {node: '>=10'} 875 | dependencies: 876 | cross-spawn: 7.0.3 877 | get-stream: 6.0.1 878 | human-signals: 2.1.0 879 | is-stream: 2.0.1 880 | merge-stream: 2.0.0 881 | npm-run-path: 4.0.1 882 | onetime: 5.1.2 883 | signal-exit: 3.0.7 884 | strip-final-newline: 2.0.0 885 | dev: false 886 | 887 | /fast-glob@3.3.2: 888 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 889 | engines: {node: '>=8.6.0'} 890 | dependencies: 891 | '@nodelib/fs.stat': 2.0.5 892 | '@nodelib/fs.walk': 1.2.8 893 | glob-parent: 5.1.2 894 | merge2: 1.4.1 895 | micromatch: 4.0.5 896 | dev: false 897 | 898 | /fastq@1.17.1: 899 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 900 | dependencies: 901 | reusify: 1.0.4 902 | dev: false 903 | 904 | /fecha@4.2.3: 905 | resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} 906 | dev: false 907 | 908 | /fetch-blob@3.2.0: 909 | resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} 910 | engines: {node: ^12.20 || >= 14.13} 911 | dependencies: 912 | node-domexception: 1.0.0 913 | web-streams-polyfill: 3.3.3 914 | dev: false 915 | 916 | /file-stream-rotator@0.6.1: 917 | resolution: {integrity: sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==} 918 | dependencies: 919 | moment: 2.30.1 920 | dev: false 921 | 922 | /fill-range@7.0.1: 923 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 924 | engines: {node: '>=8'} 925 | dependencies: 926 | to-regex-range: 5.0.1 927 | dev: false 928 | 929 | /fn.name@1.1.0: 930 | resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} 931 | dev: false 932 | 933 | /foreground-child@3.1.1: 934 | resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} 935 | engines: {node: '>=14'} 936 | dependencies: 937 | cross-spawn: 7.0.3 938 | signal-exit: 4.1.0 939 | dev: false 940 | 941 | /formdata-polyfill@4.0.10: 942 | resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} 943 | engines: {node: '>=12.20.0'} 944 | dependencies: 945 | fetch-blob: 3.2.0 946 | dev: false 947 | 948 | /fsevents@2.3.3: 949 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 950 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 951 | os: [darwin] 952 | requiresBuild: true 953 | optional: true 954 | 955 | /get-stream@6.0.1: 956 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 957 | engines: {node: '>=10'} 958 | dev: false 959 | 960 | /get-tsconfig@4.7.2: 961 | resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} 962 | dependencies: 963 | resolve-pkg-maps: 1.0.0 964 | dev: true 965 | 966 | /glob-parent@5.1.2: 967 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 968 | engines: {node: '>= 6'} 969 | dependencies: 970 | is-glob: 4.0.3 971 | dev: false 972 | 973 | /glob@10.3.10: 974 | resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} 975 | engines: {node: '>=16 || 14 >=14.17'} 976 | hasBin: true 977 | dependencies: 978 | foreground-child: 3.1.1 979 | jackspeak: 2.3.6 980 | minimatch: 9.0.3 981 | minipass: 7.0.4 982 | path-scurry: 1.10.1 983 | dev: false 984 | 985 | /globby@11.1.0: 986 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 987 | engines: {node: '>=10'} 988 | dependencies: 989 | array-union: 2.1.0 990 | dir-glob: 3.0.1 991 | fast-glob: 3.3.2 992 | ignore: 5.3.1 993 | merge2: 1.4.1 994 | slash: 3.0.0 995 | dev: false 996 | 997 | /htmlparser2@8.0.2: 998 | resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} 999 | dependencies: 1000 | domelementtype: 2.3.0 1001 | domhandler: 5.0.3 1002 | domutils: 3.1.0 1003 | entities: 4.5.0 1004 | dev: false 1005 | 1006 | /https-proxy-agent@7.0.4: 1007 | resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} 1008 | engines: {node: '>= 14'} 1009 | dependencies: 1010 | agent-base: 7.1.0 1011 | debug: 4.3.4 1012 | transitivePeerDependencies: 1013 | - supports-color 1014 | dev: false 1015 | 1016 | /human-signals@2.1.0: 1017 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 1018 | engines: {node: '>=10.17.0'} 1019 | dev: false 1020 | 1021 | /ignore@5.3.1: 1022 | resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} 1023 | engines: {node: '>= 4'} 1024 | dev: false 1025 | 1026 | /inherits@2.0.4: 1027 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1028 | dev: false 1029 | 1030 | /is-arrayish@0.3.2: 1031 | resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} 1032 | dev: false 1033 | 1034 | /is-binary-path@2.1.0: 1035 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1036 | engines: {node: '>=8'} 1037 | dependencies: 1038 | binary-extensions: 2.2.0 1039 | dev: false 1040 | 1041 | /is-extglob@2.1.1: 1042 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1043 | engines: {node: '>=0.10.0'} 1044 | dev: false 1045 | 1046 | /is-fullwidth-code-point@3.0.0: 1047 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1048 | engines: {node: '>=8'} 1049 | dev: false 1050 | 1051 | /is-glob@4.0.3: 1052 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1053 | engines: {node: '>=0.10.0'} 1054 | dependencies: 1055 | is-extglob: 2.1.1 1056 | dev: false 1057 | 1058 | /is-number@7.0.0: 1059 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1060 | engines: {node: '>=0.12.0'} 1061 | dev: false 1062 | 1063 | /is-stream@2.0.1: 1064 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 1065 | engines: {node: '>=8'} 1066 | dev: false 1067 | 1068 | /isexe@2.0.0: 1069 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1070 | dev: false 1071 | 1072 | /jackspeak@2.3.6: 1073 | resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} 1074 | engines: {node: '>=14'} 1075 | dependencies: 1076 | '@isaacs/cliui': 8.0.2 1077 | optionalDependencies: 1078 | '@pkgjs/parseargs': 0.11.0 1079 | dev: false 1080 | 1081 | /joycon@3.1.1: 1082 | resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} 1083 | engines: {node: '>=10'} 1084 | dev: false 1085 | 1086 | /kuler@2.0.0: 1087 | resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} 1088 | dev: false 1089 | 1090 | /lilconfig@3.1.1: 1091 | resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} 1092 | engines: {node: '>=14'} 1093 | dev: false 1094 | 1095 | /lines-and-columns@1.2.4: 1096 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1097 | dev: false 1098 | 1099 | /load-tsconfig@0.2.5: 1100 | resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} 1101 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1102 | dev: false 1103 | 1104 | /lodash.sortby@4.7.0: 1105 | resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} 1106 | dev: false 1107 | 1108 | /logform@2.6.0: 1109 | resolution: {integrity: sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==} 1110 | engines: {node: '>= 12.0.0'} 1111 | dependencies: 1112 | '@colors/colors': 1.6.0 1113 | '@types/triple-beam': 1.3.5 1114 | fecha: 4.2.3 1115 | ms: 2.1.2 1116 | safe-stable-stringify: 2.4.3 1117 | triple-beam: 1.4.1 1118 | dev: false 1119 | 1120 | /lru-cache@10.2.0: 1121 | resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} 1122 | engines: {node: 14 || >=16.14} 1123 | dev: false 1124 | 1125 | /luxon@3.4.4: 1126 | resolution: {integrity: sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==} 1127 | engines: {node: '>=12'} 1128 | dev: false 1129 | 1130 | /merge-stream@2.0.0: 1131 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 1132 | dev: false 1133 | 1134 | /merge2@1.4.1: 1135 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1136 | engines: {node: '>= 8'} 1137 | dev: false 1138 | 1139 | /micromatch@4.0.5: 1140 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1141 | engines: {node: '>=8.6'} 1142 | dependencies: 1143 | braces: 3.0.2 1144 | picomatch: 2.3.1 1145 | dev: false 1146 | 1147 | /mimic-fn@2.1.0: 1148 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 1149 | engines: {node: '>=6'} 1150 | dev: false 1151 | 1152 | /minimatch@9.0.3: 1153 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} 1154 | engines: {node: '>=16 || 14 >=14.17'} 1155 | dependencies: 1156 | brace-expansion: 2.0.1 1157 | dev: false 1158 | 1159 | /minipass@7.0.4: 1160 | resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} 1161 | engines: {node: '>=16 || 14 >=14.17'} 1162 | dev: false 1163 | 1164 | /moment@2.30.1: 1165 | resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} 1166 | dev: false 1167 | 1168 | /ms@2.1.2: 1169 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1170 | dev: false 1171 | 1172 | /mz@2.7.0: 1173 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 1174 | dependencies: 1175 | any-promise: 1.3.0 1176 | object-assign: 4.1.1 1177 | thenify-all: 1.6.0 1178 | dev: false 1179 | 1180 | /node-domexception@1.0.0: 1181 | resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} 1182 | engines: {node: '>=10.5.0'} 1183 | dev: false 1184 | 1185 | /node-fetch@3.3.2: 1186 | resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} 1187 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1188 | dependencies: 1189 | data-uri-to-buffer: 4.0.1 1190 | fetch-blob: 3.2.0 1191 | formdata-polyfill: 4.0.10 1192 | dev: false 1193 | 1194 | /normalize-path@3.0.0: 1195 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1196 | engines: {node: '>=0.10.0'} 1197 | dev: false 1198 | 1199 | /npm-run-path@4.0.1: 1200 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 1201 | engines: {node: '>=8'} 1202 | dependencies: 1203 | path-key: 3.1.1 1204 | dev: false 1205 | 1206 | /nth-check@2.1.1: 1207 | resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} 1208 | dependencies: 1209 | boolbase: 1.0.0 1210 | dev: false 1211 | 1212 | /object-assign@4.1.1: 1213 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1214 | engines: {node: '>=0.10.0'} 1215 | dev: false 1216 | 1217 | /object-hash@3.0.0: 1218 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 1219 | engines: {node: '>= 6'} 1220 | dev: false 1221 | 1222 | /one-time@1.0.0: 1223 | resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} 1224 | dependencies: 1225 | fn.name: 1.1.0 1226 | dev: false 1227 | 1228 | /onetime@5.1.2: 1229 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 1230 | engines: {node: '>=6'} 1231 | dependencies: 1232 | mimic-fn: 2.1.0 1233 | dev: false 1234 | 1235 | /parse5-htmlparser2-tree-adapter@7.0.0: 1236 | resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} 1237 | dependencies: 1238 | domhandler: 5.0.3 1239 | parse5: 7.1.2 1240 | dev: false 1241 | 1242 | /parse5@7.1.2: 1243 | resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} 1244 | dependencies: 1245 | entities: 4.5.0 1246 | dev: false 1247 | 1248 | /path-key@3.1.1: 1249 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1250 | engines: {node: '>=8'} 1251 | dev: false 1252 | 1253 | /path-scurry@1.10.1: 1254 | resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} 1255 | engines: {node: '>=16 || 14 >=14.17'} 1256 | dependencies: 1257 | lru-cache: 10.2.0 1258 | minipass: 7.0.4 1259 | dev: false 1260 | 1261 | /path-type@4.0.0: 1262 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 1263 | engines: {node: '>=8'} 1264 | dev: false 1265 | 1266 | /picomatch@2.3.1: 1267 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1268 | engines: {node: '>=8.6'} 1269 | dev: false 1270 | 1271 | /pirates@4.0.6: 1272 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 1273 | engines: {node: '>= 6'} 1274 | dev: false 1275 | 1276 | /postcss-load-config@4.0.2: 1277 | resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} 1278 | engines: {node: '>= 14'} 1279 | peerDependencies: 1280 | postcss: '>=8.0.9' 1281 | ts-node: '>=9.0.0' 1282 | peerDependenciesMeta: 1283 | postcss: 1284 | optional: true 1285 | ts-node: 1286 | optional: true 1287 | dependencies: 1288 | lilconfig: 3.1.1 1289 | yaml: 2.3.4 1290 | dev: false 1291 | 1292 | /prisma@5.9.1: 1293 | resolution: {integrity: sha512-Hy/8KJZz0ELtkw4FnG9MS9rNWlXcJhf98Z2QMqi0QiVMoS8PzsBkpla0/Y5hTlob8F3HeECYphBjqmBxrluUrQ==} 1294 | engines: {node: '>=16.13'} 1295 | hasBin: true 1296 | requiresBuild: true 1297 | dependencies: 1298 | '@prisma/engines': 5.9.1 1299 | 1300 | /punycode@2.3.1: 1301 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1302 | engines: {node: '>=6'} 1303 | dev: false 1304 | 1305 | /queue-microtask@1.2.3: 1306 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1307 | dev: false 1308 | 1309 | /readable-stream@3.6.2: 1310 | resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 1311 | engines: {node: '>= 6'} 1312 | dependencies: 1313 | inherits: 2.0.4 1314 | string_decoder: 1.3.0 1315 | util-deprecate: 1.0.2 1316 | dev: false 1317 | 1318 | /readdirp@3.6.0: 1319 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1320 | engines: {node: '>=8.10.0'} 1321 | dependencies: 1322 | picomatch: 2.3.1 1323 | dev: false 1324 | 1325 | /resolve-from@5.0.0: 1326 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1327 | engines: {node: '>=8'} 1328 | dev: false 1329 | 1330 | /resolve-pkg-maps@1.0.0: 1331 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 1332 | dev: true 1333 | 1334 | /reusify@1.0.4: 1335 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1336 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1337 | dev: false 1338 | 1339 | /rollup@4.12.0: 1340 | resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==} 1341 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1342 | hasBin: true 1343 | dependencies: 1344 | '@types/estree': 1.0.5 1345 | optionalDependencies: 1346 | '@rollup/rollup-android-arm-eabi': 4.12.0 1347 | '@rollup/rollup-android-arm64': 4.12.0 1348 | '@rollup/rollup-darwin-arm64': 4.12.0 1349 | '@rollup/rollup-darwin-x64': 4.12.0 1350 | '@rollup/rollup-linux-arm-gnueabihf': 4.12.0 1351 | '@rollup/rollup-linux-arm64-gnu': 4.12.0 1352 | '@rollup/rollup-linux-arm64-musl': 4.12.0 1353 | '@rollup/rollup-linux-riscv64-gnu': 4.12.0 1354 | '@rollup/rollup-linux-x64-gnu': 4.12.0 1355 | '@rollup/rollup-linux-x64-musl': 4.12.0 1356 | '@rollup/rollup-win32-arm64-msvc': 4.12.0 1357 | '@rollup/rollup-win32-ia32-msvc': 4.12.0 1358 | '@rollup/rollup-win32-x64-msvc': 4.12.0 1359 | fsevents: 2.3.3 1360 | dev: false 1361 | 1362 | /run-parallel@1.2.0: 1363 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1364 | dependencies: 1365 | queue-microtask: 1.2.3 1366 | dev: false 1367 | 1368 | /safe-buffer@5.2.1: 1369 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1370 | dev: false 1371 | 1372 | /safe-stable-stringify@2.4.3: 1373 | resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} 1374 | engines: {node: '>=10'} 1375 | dev: false 1376 | 1377 | /shebang-command@2.0.0: 1378 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1379 | engines: {node: '>=8'} 1380 | dependencies: 1381 | shebang-regex: 3.0.0 1382 | dev: false 1383 | 1384 | /shebang-regex@3.0.0: 1385 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1386 | engines: {node: '>=8'} 1387 | dev: false 1388 | 1389 | /signal-exit@3.0.7: 1390 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 1391 | dev: false 1392 | 1393 | /signal-exit@4.1.0: 1394 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1395 | engines: {node: '>=14'} 1396 | dev: false 1397 | 1398 | /simple-swizzle@0.2.2: 1399 | resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} 1400 | dependencies: 1401 | is-arrayish: 0.3.2 1402 | dev: false 1403 | 1404 | /slash@3.0.0: 1405 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1406 | engines: {node: '>=8'} 1407 | dev: false 1408 | 1409 | /source-map@0.8.0-beta.0: 1410 | resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} 1411 | engines: {node: '>= 8'} 1412 | dependencies: 1413 | whatwg-url: 7.1.0 1414 | dev: false 1415 | 1416 | /stack-trace@0.0.10: 1417 | resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} 1418 | dev: false 1419 | 1420 | /string-width@4.2.3: 1421 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1422 | engines: {node: '>=8'} 1423 | dependencies: 1424 | emoji-regex: 8.0.0 1425 | is-fullwidth-code-point: 3.0.0 1426 | strip-ansi: 6.0.1 1427 | dev: false 1428 | 1429 | /string-width@5.1.2: 1430 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1431 | engines: {node: '>=12'} 1432 | dependencies: 1433 | eastasianwidth: 0.2.0 1434 | emoji-regex: 9.2.2 1435 | strip-ansi: 7.1.0 1436 | dev: false 1437 | 1438 | /string_decoder@1.3.0: 1439 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 1440 | dependencies: 1441 | safe-buffer: 5.2.1 1442 | dev: false 1443 | 1444 | /strip-ansi@6.0.1: 1445 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1446 | engines: {node: '>=8'} 1447 | dependencies: 1448 | ansi-regex: 5.0.1 1449 | dev: false 1450 | 1451 | /strip-ansi@7.1.0: 1452 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1453 | engines: {node: '>=12'} 1454 | dependencies: 1455 | ansi-regex: 6.0.1 1456 | dev: false 1457 | 1458 | /strip-final-newline@2.0.0: 1459 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 1460 | engines: {node: '>=6'} 1461 | dev: false 1462 | 1463 | /sucrase@3.35.0: 1464 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 1465 | engines: {node: '>=16 || 14 >=14.17'} 1466 | hasBin: true 1467 | dependencies: 1468 | '@jridgewell/gen-mapping': 0.3.3 1469 | commander: 4.1.1 1470 | glob: 10.3.10 1471 | lines-and-columns: 1.2.4 1472 | mz: 2.7.0 1473 | pirates: 4.0.6 1474 | ts-interface-checker: 0.1.13 1475 | dev: false 1476 | 1477 | /text-hex@1.0.0: 1478 | resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} 1479 | dev: false 1480 | 1481 | /thenify-all@1.6.0: 1482 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 1483 | engines: {node: '>=0.8'} 1484 | dependencies: 1485 | thenify: 3.3.1 1486 | dev: false 1487 | 1488 | /thenify@3.3.1: 1489 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 1490 | dependencies: 1491 | any-promise: 1.3.0 1492 | dev: false 1493 | 1494 | /to-regex-range@5.0.1: 1495 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1496 | engines: {node: '>=8.0'} 1497 | dependencies: 1498 | is-number: 7.0.0 1499 | dev: false 1500 | 1501 | /tr46@1.0.1: 1502 | resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} 1503 | dependencies: 1504 | punycode: 2.3.1 1505 | dev: false 1506 | 1507 | /tree-kill@1.2.2: 1508 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 1509 | hasBin: true 1510 | dev: false 1511 | 1512 | /triple-beam@1.4.1: 1513 | resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} 1514 | engines: {node: '>= 14.0.0'} 1515 | dev: false 1516 | 1517 | /ts-interface-checker@0.1.13: 1518 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 1519 | dev: false 1520 | 1521 | /tsup@8.0.2(typescript@5.3.3): 1522 | resolution: {integrity: sha512-NY8xtQXdH7hDUAZwcQdY/Vzlw9johQsaqf7iwZ6g1DOUlFYQ5/AtVAjTvihhEyeRlGo4dLRVHtrRaL35M1daqQ==} 1523 | engines: {node: '>=18'} 1524 | hasBin: true 1525 | peerDependencies: 1526 | '@microsoft/api-extractor': ^7.36.0 1527 | '@swc/core': ^1 1528 | postcss: ^8.4.12 1529 | typescript: '>=4.5.0' 1530 | peerDependenciesMeta: 1531 | '@microsoft/api-extractor': 1532 | optional: true 1533 | '@swc/core': 1534 | optional: true 1535 | postcss: 1536 | optional: true 1537 | typescript: 1538 | optional: true 1539 | dependencies: 1540 | bundle-require: 4.0.2(esbuild@0.19.12) 1541 | cac: 6.7.14 1542 | chokidar: 3.6.0 1543 | debug: 4.3.4 1544 | esbuild: 0.19.12 1545 | execa: 5.1.1 1546 | globby: 11.1.0 1547 | joycon: 3.1.1 1548 | postcss-load-config: 4.0.2 1549 | resolve-from: 5.0.0 1550 | rollup: 4.12.0 1551 | source-map: 0.8.0-beta.0 1552 | sucrase: 3.35.0 1553 | tree-kill: 1.2.2 1554 | typescript: 5.3.3 1555 | transitivePeerDependencies: 1556 | - supports-color 1557 | - ts-node 1558 | dev: false 1559 | 1560 | /tsx@4.7.1: 1561 | resolution: {integrity: sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g==} 1562 | engines: {node: '>=18.0.0'} 1563 | hasBin: true 1564 | dependencies: 1565 | esbuild: 0.19.12 1566 | get-tsconfig: 4.7.2 1567 | optionalDependencies: 1568 | fsevents: 2.3.3 1569 | dev: true 1570 | 1571 | /typescript@5.3.3: 1572 | resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} 1573 | engines: {node: '>=14.17'} 1574 | hasBin: true 1575 | 1576 | /undici-types@5.26.5: 1577 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 1578 | dev: true 1579 | 1580 | /universal-user-agent@7.0.2: 1581 | resolution: {integrity: sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==} 1582 | dev: false 1583 | 1584 | /util-deprecate@1.0.2: 1585 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1586 | dev: false 1587 | 1588 | /web-streams-polyfill@3.3.3: 1589 | resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} 1590 | engines: {node: '>= 8'} 1591 | dev: false 1592 | 1593 | /webidl-conversions@4.0.2: 1594 | resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} 1595 | dev: false 1596 | 1597 | /whatwg-url@7.1.0: 1598 | resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} 1599 | dependencies: 1600 | lodash.sortby: 4.7.0 1601 | tr46: 1.0.1 1602 | webidl-conversions: 4.0.2 1603 | dev: false 1604 | 1605 | /which@2.0.2: 1606 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1607 | engines: {node: '>= 8'} 1608 | hasBin: true 1609 | dependencies: 1610 | isexe: 2.0.0 1611 | dev: false 1612 | 1613 | /winston-daily-rotate-file@5.0.0(winston@3.11.0): 1614 | resolution: {integrity: sha512-JDjiXXkM5qvwY06733vf09I2wnMXpZEhxEVOSPenZMii+g7pcDcTBt2MRugnoi8BwVSuCT2jfRXBUy+n1Zz/Yw==} 1615 | engines: {node: '>=8'} 1616 | peerDependencies: 1617 | winston: ^3 1618 | dependencies: 1619 | file-stream-rotator: 0.6.1 1620 | object-hash: 3.0.0 1621 | triple-beam: 1.4.1 1622 | winston: 3.11.0 1623 | winston-transport: 4.7.0 1624 | dev: false 1625 | 1626 | /winston-transport@4.7.0: 1627 | resolution: {integrity: sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==} 1628 | engines: {node: '>= 12.0.0'} 1629 | dependencies: 1630 | logform: 2.6.0 1631 | readable-stream: 3.6.2 1632 | triple-beam: 1.4.1 1633 | dev: false 1634 | 1635 | /winston@3.11.0: 1636 | resolution: {integrity: sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==} 1637 | engines: {node: '>= 12.0.0'} 1638 | dependencies: 1639 | '@colors/colors': 1.6.0 1640 | '@dabh/diagnostics': 2.0.3 1641 | async: 3.2.5 1642 | is-stream: 2.0.1 1643 | logform: 2.6.0 1644 | one-time: 1.0.0 1645 | readable-stream: 3.6.2 1646 | safe-stable-stringify: 2.4.3 1647 | stack-trace: 0.0.10 1648 | triple-beam: 1.4.1 1649 | winston-transport: 4.7.0 1650 | dev: false 1651 | 1652 | /wrap-ansi@7.0.0: 1653 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1654 | engines: {node: '>=10'} 1655 | dependencies: 1656 | ansi-styles: 4.3.0 1657 | string-width: 4.2.3 1658 | strip-ansi: 6.0.1 1659 | dev: false 1660 | 1661 | /wrap-ansi@8.1.0: 1662 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1663 | engines: {node: '>=12'} 1664 | dependencies: 1665 | ansi-styles: 6.2.1 1666 | string-width: 5.1.2 1667 | strip-ansi: 7.1.0 1668 | dev: false 1669 | 1670 | /yaml@2.3.4: 1671 | resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} 1672 | engines: {node: '>= 14'} 1673 | dev: false 1674 | -------------------------------------------------------------------------------- /prisma/schema.prisma: -------------------------------------------------------------------------------- 1 | // This is your Prisma schema file, 2 | // learn more about it in the docs: https://pris.ly/d/prisma-schema 3 | 4 | generator client { 5 | provider = "prisma-client-js" 6 | } 7 | 8 | datasource db { 9 | provider = "postgresql" 10 | url = env("DATABASE_URL") 11 | relationMode = "prisma" 12 | } 13 | 14 | enum OriginSite { 15 | V2EX 16 | ELE_DUCK 17 | RUANYF 18 | } 19 | 20 | model Job { 21 | id String @id @default(cuid()) 22 | originId String 23 | originUrl String 24 | originSite OriginSite 25 | originTitle String 26 | originContent String? @db.Text 27 | originCreateAt DateTime? 28 | originUsername String? 29 | originUserAvatar String? 30 | syncAt DateTime @default(now()) 31 | invalid Boolean @default(false) 32 | 33 | title String? 34 | tags String[] 35 | generatedContent String? @db.Text 36 | generatedAt DateTime? 37 | 38 | showCount Int @default(0) 39 | 40 | @@unique([originId, originSite]) 41 | @@map("job") 42 | } 43 | -------------------------------------------------------------------------------- /src/grab/constants.ts: -------------------------------------------------------------------------------- 1 | export const grabHeaders = { 2 | "User-Agent": 3 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.142.86 Safari/537.36", 4 | }; 5 | 6 | export const V2EX_LIST_URL = `https://www.v2ex.com/go/jobs?p=`; 7 | export const V2EX_DETAIL_URL = `https://www.v2ex.com/t/`; 8 | 9 | export const ELE_DUCK_LIST_URL = `https://eleduck.com/?sort=new&page=`; 10 | export const ELE_DUCK_DETAIL_URL = `https://eleduck.com/posts/`; 11 | 12 | export const RUANYF_OWNER = "ruanyf"; 13 | export const RUANYF_REPO = "weekly"; 14 | export const RUANYF_TITLE_PREFIX = "谁在招人"; 15 | -------------------------------------------------------------------------------- /src/grab/filter.ts: -------------------------------------------------------------------------------- 1 | const excludeJobKeyword = ['求职'] 2 | 3 | export function isAvailableContent(text: string) { 4 | if (!text) { 5 | return false 6 | } 7 | if (excludeJobKeyword.some((keyword) => text.includes(keyword))) { 8 | return false 9 | } 10 | return true 11 | } 12 | 13 | const excludeTagKeyword = ['----', ''] 14 | 15 | export function filterAvailableTags(tags: string[] = []) { 16 | return tags.filter((tag) => !excludeTagKeyword.includes(tag)) 17 | } 18 | 19 | const eleDuckExcludeCategory = [ 20 | 'jd', // 招聘 21 | 'talent', // 人才库 22 | 'upwork' // Upwork 23 | ] 24 | 25 | export function isAvailableCategory(code: string) { 26 | if (eleDuckExcludeCategory.includes(code)) { 27 | return true 28 | } 29 | return false 30 | } 31 | 32 | 33 | -------------------------------------------------------------------------------- /src/grab/index.ts: -------------------------------------------------------------------------------- 1 | import { db } from "../lib/db"; 2 | import { withAiAnalysis } from "../lib/with-ai/analysis"; 3 | import { 4 | type EleDuckArticle, 5 | eleDuckDetailRoute, 6 | eleDuckListRoute, 7 | } from "./routes/ele-duck"; 8 | import { 9 | type V2EXArticle, 10 | v2exDetailRoute, 11 | v2exListRoute, 12 | } from "./routes/v2ex"; 13 | import { randomInt, sleep } from "../lib/utils"; 14 | import { 15 | filterAvailableTags, 16 | isAvailableCategory, 17 | isAvailableContent, 18 | } from "./filter"; 19 | import logger from "../lib/logger"; 20 | import { RuanyfComment, ruanyfListRoute } from "./routes/ruanyf"; 21 | 22 | // 同步比较最小判断数 23 | const MIN_SYNC_DIFF = 5; 24 | 25 | // 最大单次同步数 26 | const MAX_SYNC_CHECK = 300; 27 | 28 | const v2exDataCapture = async () => { 29 | try { 30 | const latestSlice = await db.job.findMany({ 31 | select: { 32 | id: true, 33 | originId: true, 34 | }, 35 | where: { 36 | originSite: "V2EX", 37 | }, 38 | orderBy: { 39 | originCreateAt: "desc", 40 | }, 41 | take: MAX_SYNC_CHECK, 42 | }); 43 | if (latestSlice.length === 0) { 44 | // 第一次抓取 45 | logger.info("[V2EX] 第一次抓取"); 46 | } 47 | const savedOriginIds = latestSlice.map((item) => item.originId); 48 | 49 | let page = 1; 50 | const fetchArticles = new Map(); 51 | const syncedIds: string[] = []; 52 | 53 | // 遍历抓取 54 | while (true) { 55 | if (syncedIds.length > MIN_SYNC_DIFF) { 56 | break; 57 | } 58 | if (fetchArticles.size > MAX_SYNC_CHECK) { 59 | break; 60 | } 61 | 62 | // 列表 63 | const articles = await v2exListRoute(page.toString()); 64 | if (!articles?.length) { 65 | logger.warn("[V2EX] 未抓取到文章"); 66 | break; 67 | } 68 | 69 | // 同步判断 70 | articles.forEach((article) => { 71 | const syncIdx = savedOriginIds.indexOf(article.id); 72 | if (syncIdx === -1) { 73 | logger.info(`[V2EX] 未同步过 ${article.id}`); 74 | fetchArticles.set(article.id, article); 75 | } else { 76 | logger.warn(`[V2EX] 已同步过 ${article.id}`); 77 | syncedIds.push(article.id); 78 | } 79 | }); 80 | 81 | page += 1; 82 | // 等待⌛️ 83 | await sleep(randomInt(500, 1000)); 84 | } 85 | 86 | if (!fetchArticles.size) { 87 | logger.warn("[V2EX] 无新文章"); 88 | return; 89 | } 90 | 91 | logger.info(`[V2EX] 新文章数量 ${fetchArticles.size}`); 92 | 93 | // 详情 94 | for (const article of fetchArticles.values()) { 95 | const saveInvalid = async () => { 96 | logger.warn(`[V2EX] 文章摘要无效 ${article.id}`); 97 | const articleData = await db.job.create({ 98 | data: { 99 | originSite: "V2EX", 100 | originId: article.id, 101 | originUrl: article.href, 102 | originTitle: article.title, 103 | invalid: true, 104 | }, 105 | }); 106 | logger.info(`[V2EX] 无效文章数据已保存 ${articleData.id}`); 107 | }; 108 | // 判断招聘是否有效 109 | if (!isAvailableContent(article.title)) { 110 | await saveInvalid(); 111 | continue; 112 | } 113 | 114 | logger.info(`[V2EX] 查询文章详情 ${article.id}`); 115 | const abstract = await v2exDetailRoute(article.id); 116 | if (!abstract) { 117 | await saveInvalid(); 118 | continue; 119 | } 120 | logger.info(`[V2EX] 分析文章摘要 ${article.id}`); 121 | const analysis = await withAiAnalysis( 122 | `${article.title}\n${abstract.content}` 123 | ); 124 | 125 | if ( 126 | !analysis?.title.trim() || 127 | !analysis.content || 128 | analysis.content === "无" 129 | ) { 130 | await saveInvalid(); 131 | await sleep(randomInt(500, 1000)); 132 | continue; 133 | } 134 | 135 | logger.info(`[V2EX] 保持文章到数据库 ${article.id}`); 136 | const articleData = await db.job.create({ 137 | data: { 138 | originSite: "V2EX", 139 | originId: article.id, 140 | originUrl: article.href, 141 | originTitle: article.title, 142 | originContent: abstract.content, 143 | originCreateAt: new Date(abstract.createdAt), 144 | originUsername: article.authorName, 145 | originUserAvatar: article.authorAvatar, 146 | title: analysis.title, 147 | tags: filterAvailableTags(analysis.tags), 148 | generatedContent: analysis.content, 149 | generatedAt: new Date(), 150 | }, 151 | }); 152 | 153 | logger.info(`[V2EX] 文章数据已保存 ${articleData.id}`); 154 | // 等待⌛️ 155 | await sleep(randomInt(800, 1200)); 156 | } 157 | } catch (err) { 158 | console.error("[V2EX] 抓取失败 error", err); 159 | } 160 | }; 161 | 162 | const eleDuckDataCapture = async () => { 163 | try { 164 | const latestSlice = await db.job.findMany({ 165 | select: { 166 | id: true, 167 | originId: true, 168 | }, 169 | where: { 170 | originSite: "ELE_DUCK", 171 | }, 172 | orderBy: { 173 | originCreateAt: "desc", 174 | }, 175 | take: MAX_SYNC_CHECK, 176 | }); 177 | if (latestSlice.length === 0) { 178 | // 第一次抓取 179 | logger.info("[ELE_DUCK] 第一次抓取"); 180 | } 181 | const savedOriginIds = latestSlice.map((item) => item.originId); 182 | 183 | let page = 1; 184 | const fetchArticles = new Map(); 185 | const syncedIds: string[] = []; 186 | 187 | // 列表 188 | while (true) { 189 | if (syncedIds.length > MIN_SYNC_DIFF) { 190 | break; 191 | } 192 | if (fetchArticles.size > MAX_SYNC_CHECK) { 193 | break; 194 | } 195 | 196 | const articles = await eleDuckListRoute(page.toString()); 197 | if (!articles?.length) { 198 | logger.warn("[ELE_DUCK] 未抓取到文章"); 199 | break; 200 | } 201 | 202 | // 同步判断 203 | articles.forEach((article) => { 204 | const syncIdx = savedOriginIds.indexOf(article.id); 205 | if (syncIdx === -1) { 206 | logger.info(`[ELE_DUCK] 未同步过 ${article.id}`); 207 | fetchArticles.set(article.id, article); 208 | } else { 209 | logger.warn(`[ELE_DUCK] 已同步过 ${article.id}`); 210 | syncedIds.push(article.id); 211 | } 212 | }); 213 | 214 | page += 1; 215 | // 等待⌛️ 216 | await sleep(randomInt(500, 1000)); 217 | } 218 | 219 | if (!fetchArticles.size) { 220 | logger.warn("无新文章"); 221 | return; 222 | } 223 | 224 | logger.info(`[ELE_DUCK] 新文章数量 ${fetchArticles.size}`); 225 | 226 | // 详情 227 | for (const article of fetchArticles.values()) { 228 | const saveInvalid = async () => { 229 | logger.warn(`[ELE_DUCK] 文章摘要无效 ${article.id}`); 230 | const articleData = await db.job.create({ 231 | data: { 232 | originSite: "ELE_DUCK", 233 | originId: article.id, 234 | originUrl: article.href, 235 | originTitle: article.title, 236 | invalid: true, 237 | }, 238 | }); 239 | logger.info(`[ELE_DUCK] 无效文章数据已保存 ${articleData.id}`); 240 | await sleep(randomInt(500, 1000)); 241 | }; 242 | 243 | // 判断招聘是否有效 244 | if (!isAvailableCategory(article.category)) { 245 | await saveInvalid(); 246 | continue; 247 | } 248 | 249 | logger.info(`[ELE_DUCK] 查询文章详情 ${article.id}`); 250 | const abstract = await eleDuckDetailRoute(article.id); 251 | if (!abstract) { 252 | await saveInvalid(); 253 | continue; 254 | } 255 | logger.info(`[ELE_DUCK] 分析文章摘要 ${article.id}`); 256 | const analysis = await withAiAnalysis( 257 | `${article.title}\n${abstract.content}` 258 | ); 259 | 260 | if ( 261 | !analysis?.title.trim() || 262 | !analysis.content || 263 | analysis.content === "无" 264 | ) { 265 | await saveInvalid(); 266 | continue; 267 | } 268 | 269 | logger.info(`[ELE_DUCK] 保持文章到数据库 ${article.id}`); 270 | const articleData = await db.job.create({ 271 | data: { 272 | originSite: "ELE_DUCK", 273 | originId: article.id, 274 | originUrl: article.href, 275 | originTitle: article.title, 276 | originContent: abstract.content, 277 | originCreateAt: new Date(article.createdAt), 278 | originUsername: article.authorName, 279 | originUserAvatar: article.authorAvatar, 280 | title: analysis.title, 281 | tags: filterAvailableTags(analysis.tags), 282 | generatedContent: analysis.content, 283 | generatedAt: new Date(), 284 | }, 285 | }); 286 | 287 | logger.info(`[ELE_DUCK] 文章数据已保存 ${articleData.id}`); 288 | // 等待⌛️ 289 | await sleep(randomInt(800, 1200)); 290 | } 291 | } catch (err) { 292 | console.error("[ELE_DUCK] 抓取失败 error", err); 293 | } 294 | }; 295 | 296 | export async function ruanyfDataCapture() { 297 | try { 298 | const latestSlice = await db.job.findMany({ 299 | select: { 300 | id: true, 301 | originId: true, 302 | }, 303 | where: { 304 | originSite: "RUANYF", 305 | }, 306 | orderBy: { 307 | originCreateAt: "desc", 308 | }, 309 | take: MAX_SYNC_CHECK, 310 | }); 311 | if (latestSlice.length === 0) { 312 | // 第一次抓取 313 | logger.info("[RUANYF] 第一次抓取"); 314 | } 315 | const savedOriginIds = latestSlice.map((item) => item.originId); 316 | 317 | const fetchArticles = new Map(); 318 | const syncedIds: string[] = []; 319 | 320 | // 评论 321 | const data = await ruanyfListRoute(); 322 | if (!data || !data.comments.length) { 323 | logger.warn("[RUANYF] 未抓取到评论"); 324 | return; 325 | } 326 | 327 | // 同步判断 328 | data.comments.forEach((comment) => { 329 | const commentId = `${data.number}_${comment.id}`; 330 | const syncIdx = savedOriginIds.indexOf(commentId); 331 | if (syncIdx === -1) { 332 | logger.info(`[RUANYF] 未同步过 ${commentId}`); 333 | fetchArticles.set(commentId, comment); 334 | } else { 335 | logger.warn(`[RUANYF] 已同步过 ${commentId}`); 336 | syncedIds.push(commentId); 337 | } 338 | }); 339 | 340 | if (!fetchArticles.size) { 341 | logger.warn("无新文章"); 342 | return; 343 | } 344 | 345 | logger.info(`[RUANYF] 新文章数量 ${fetchArticles.size}`); 346 | 347 | // 详情 348 | for (const article of fetchArticles.values()) { 349 | const articleId = `${data.number}_${article.id}`; 350 | const saveInvalid = async () => { 351 | logger.warn(`[RUANYF] 文章摘要无效 ${articleId}`); 352 | const articleData = await db.job.create({ 353 | data: { 354 | originSite: "RUANYF", 355 | originId: articleId, 356 | originUrl: article.html_url, 357 | originContent: article.body, 358 | originTitle: data.title, 359 | invalid: true, 360 | }, 361 | }); 362 | logger.info(`[RUANYF] 无效文章数据已保存 ${articleData.id}`); 363 | await sleep(randomInt(500, 1000)); 364 | }; 365 | 366 | logger.info(`[RUANYF] 分析文章摘要 ${article.id}`); 367 | const analysis = await withAiAnalysis(`${article.body}`); 368 | 369 | if ( 370 | !analysis?.title.trim() || 371 | !analysis.content || 372 | analysis.title === "无" || 373 | analysis.content === "无" 374 | ) { 375 | await saveInvalid(); 376 | continue; 377 | } 378 | 379 | logger.info(`[RUANYF] 保持文章到数据库 ${article.id}`); 380 | const articleData = await db.job.create({ 381 | data: { 382 | originSite: "ELE_DUCK", 383 | originId: articleId, 384 | originUrl: article.html_url, 385 | originTitle: data.title, 386 | originContent: article.body, 387 | originCreateAt: new Date(article.created_at), 388 | originUsername: article.user.login, 389 | originUserAvatar: article.user.avatar_url, 390 | title: analysis.title, 391 | tags: filterAvailableTags(analysis.tags), 392 | generatedContent: analysis.content, 393 | generatedAt: new Date(), 394 | }, 395 | }); 396 | 397 | logger.info(`[RUANYF] 文章数据已保存 ${articleData.id}`); 398 | // 等待⌛️ 399 | await sleep(randomInt(800, 1200)); 400 | } 401 | } catch (err) { 402 | console.error("[RUANYF] 抓取失败 error", err); 403 | } 404 | } 405 | 406 | export async function grabHighFrequencyAction() { 407 | logger.info("抓取开始"); 408 | // 无法并发, Gemini API 限制并发 409 | await v2exDataCapture(); 410 | await eleDuckDataCapture(); 411 | logger.info("抓取结束"); 412 | } 413 | 414 | export async function grabLowFrequencyAction() { 415 | logger.info("抓取开始"); 416 | await ruanyfDataCapture(); 417 | logger.info("抓取结束"); 418 | } 419 | -------------------------------------------------------------------------------- /src/grab/routes/ele-duck.ts: -------------------------------------------------------------------------------- 1 | import { load } from "cheerio"; 2 | import fetch from "node-fetch"; 3 | import { 4 | ELE_DUCK_DETAIL_URL, 5 | ELE_DUCK_LIST_URL, 6 | grabHeaders, 7 | } from "../constants"; 8 | import logger from "../../lib/logger"; 9 | 10 | function extractContentFromScriptTag(html: string) { 11 | const regex = 12 | /