├── .github └── workflows │ └── npm-release.yml ├── .gitignore ├── README.md ├── package.json ├── pnpm-lock.yaml ├── rollup.config.mjs ├── scripts └── test.ts ├── src ├── __tests__ │ └── apiWithLog.spec.ts ├── apiCache.ts ├── apiDebug.ts ├── apiWithLog.ts ├── cloneResponse.ts ├── createResponse.ts ├── dataResponse.ts ├── dataResponseResult.ts ├── debugConsole.ts ├── filterPassword.ts ├── getCurl.ts ├── getDebug.ts ├── index.ts ├── jsonOrText.ts ├── logSecurity.ts ├── sanitizeBody.ts └── timeSpan.ts ├── testutils ├── cleanupTest.ts └── setupFiles.ts ├── tsconfig.build.json ├── tsconfig.json └── vitest.config.ts /.github/workflows/npm-release.yml: -------------------------------------------------------------------------------- 1 | name: Node.js Package 2 | 3 | on: 4 | workflow_dispatch: 5 | branches: [main] 6 | release: 7 | types: [created] 8 | 9 | jobs: 10 | test-on-all-os: 11 | name: Test on Node ${{ matrix.node }} on ${{ matrix.os }} 12 | 13 | runs-on: ${{ matrix.os }} 14 | strategy: 15 | matrix: 16 | node: ['12.x', '14.x', '16.x'] 17 | os: [ubuntu-latest, windows-2022, macOS-latest] 18 | 19 | steps: 20 | - name: Checkout repo 21 | uses: actions/checkout@v2 22 | 23 | - name: Use Node ${{ matrix.node }} 24 | uses: actions/setup-node@v1 25 | with: 26 | node-version: ${{ matrix.node }} 27 | 28 | - name: Dependency install 29 | run: yarn install --frozen-lockfile 30 | 31 | - name: Test 32 | run: yarn test 33 | 34 | publish-npm: 35 | needs: test-on-all-os 36 | runs-on: ubuntu-latest 37 | steps: 38 | - uses: actions/checkout@v2 39 | 40 | - uses: actions/setup-node@v2 41 | with: 42 | node-version: '16.x' 43 | registry-url: 'https://registry.npmjs.org' 44 | 45 | 46 | - name: Dependency install 47 | run: yarn install --frozen-lockfile 48 | 49 | - name: Compile 50 | run: yarn build 51 | 52 | - name: Publish 53 | run: npm publish --access public 54 | 55 | env: 56 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 57 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | 3 | .env 4 | build 5 | yarn-error.log 6 | md 7 | lib -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # @woovi/apiWithLog 2 | 3 | Powerful `fetch` wrapper with the given functionallies: 4 | 5 | - log request and response when using env `DEBUG=true` 6 | - save request when using env `WRITE_MOCK=true` 7 | - reply request when using env `USE_MOCK=true` 8 | - send error to slack and sentry based on your setup 9 | 10 | ## Usage 11 | 12 | This will make the request but it won't show any logs 13 | 14 | ```bash 15 | yarn es scripts/test.ts 16 | ``` 17 | 18 | Show request and response logs 19 | 20 | ```bash 21 | DEBUG=true yarn es scripts/test.ts 22 | ``` 23 | 24 | Output example 25 | 26 | ````shell 27 | GET https://cat-fact.herokuapp.com/facts 28 | { 29 | time: 'NaNms', 30 | init: 'https://cat-fact.herokuapp.com/facts', 31 | options: { headers: { 'user-agent': 'node-fetch' } }, 32 | json: [ 33 | { 34 | status: { verified: true, feedback: '', sentCount: 1 }, 35 | _id: '5887e1d85c873e0011036889', 36 | user: '5a9ac18c7478810ea6c06381', 37 | text: 'Cats make about 100 different sounds. Dogs make only about 10.', 38 | __v: 0, 39 | source: 'user', 40 | updatedAt: '2020-09-03T16:39:39.578Z', 41 | type: 'cat', 42 | createdAt: '2018-01-15T21:20:00.003Z', 43 | deleted: false, 44 | used: true 45 | }, 46 | ], 47 | ok: true, 48 | status: 200, 49 | curl: `curl 'https://cat-fact.herokuapp.com/facts' -H "user-agent: node-fetch"` 50 | } 51 | ```` 52 | 53 | Save request to mock 54 | 55 | ```bash 56 | WRITE_MOCK=true DEBUG=true yarn es scripts/test.ts 57 | ``` 58 | 59 | Go check `mock-requests.json` 60 | 61 | Reply requests from mock 62 | 63 | ```bash 64 | USE_MOCK=true DEBUG=true yarn es scripts/test.ts 65 | ``` -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@woovi/apiwithlog", 3 | "version": "2.6.2", 4 | "dependencies": { 5 | "chalk": "^5.4.1", 6 | "pretty-format": "^29.7.0", 7 | "vitest": "^3.1.1", 8 | "write-file-atomic": "^6.0.0" 9 | }, 10 | "devDependencies": { 11 | "@rollup/plugin-commonjs": "^28.0.3", 12 | "@rollup/plugin-node-resolve": "^16.0.1", 13 | "@rollup/plugin-terser": "^0.4.4", 14 | "@rollup/plugin-typescript": "^12.1.2", 15 | "@types/node": "^22.14.0", 16 | "@types/write-file-atomic": "~4.0.3", 17 | "domexception": "^4.0.0", 18 | "rollup": "^4.39.0", 19 | "rollup-plugin-dts": "^6.2.1", 20 | "rollup-plugin-polyfill-node": "^0.13.0", 21 | "tslib": "^2.6.2", 22 | "typescript": "^5.8.3", 23 | "vitest-fetch-mock": "^0.4.5" 24 | }, 25 | "exports": { 26 | ".": { 27 | "require": "./lib/index.cjs.js", 28 | "import": "./lib/index.esm.js" 29 | } 30 | }, 31 | "files": [ 32 | "lib" 33 | ], 34 | "homepage": "https://woovi.com/", 35 | "packageManager": "pnpm@10.8.0", 36 | "license": "MIT", 37 | "main": "lib/index.cjs.js", 38 | "module": "lib/index.esm.js", 39 | "publishConfig": { 40 | "access": "public" 41 | }, 42 | "scripts": { 43 | "build": "rollup -c --bundleConfigAsCjs", 44 | "prepublishOnly": "rollup -c --bundleConfigAsCjs", 45 | "release:major": "npm version major && git push --follow-tags", 46 | "release:minor": "npm version minor && git push --follow-tags", 47 | "release:patch": "npm version patch && git push --follow-tags", 48 | "ts:check": "tsc --noEmit", 49 | "ts:dev": "tsc --noEmit --watch", 50 | "ts:export": "tsc -p tsconfig.build.json" 51 | }, 52 | "type": "module", 53 | "types": "lib/index.d.ts" 54 | } 55 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | chalk: 12 | specifier: ^5.4.1 13 | version: 5.4.1 14 | pretty-format: 15 | specifier: ^29.7.0 16 | version: 29.7.0 17 | vitest: 18 | specifier: ^3.1.1 19 | version: 3.1.1(@types/node@22.14.0)(terser@5.37.0) 20 | write-file-atomic: 21 | specifier: ^6.0.0 22 | version: 6.0.0 23 | devDependencies: 24 | '@rollup/plugin-commonjs': 25 | specifier: ^28.0.3 26 | version: 28.0.3(rollup@4.39.0) 27 | '@rollup/plugin-node-resolve': 28 | specifier: ^16.0.1 29 | version: 16.0.1(rollup@4.39.0) 30 | '@rollup/plugin-terser': 31 | specifier: ^0.4.4 32 | version: 0.4.4(rollup@4.39.0) 33 | '@rollup/plugin-typescript': 34 | specifier: ^12.1.2 35 | version: 12.1.2(rollup@4.39.0)(tslib@2.8.1)(typescript@5.8.3) 36 | '@sentry/node': 37 | specifier: ^9.11.0 38 | version: 9.11.0 39 | '@types/node': 40 | specifier: ^22.14.0 41 | version: 22.14.0 42 | '@types/write-file-atomic': 43 | specifier: ~4.0.3 44 | version: 4.0.3 45 | domexception: 46 | specifier: ^4.0.0 47 | version: 4.0.0 48 | rollup: 49 | specifier: ^4.39.0 50 | version: 4.39.0 51 | rollup-plugin-dts: 52 | specifier: ^6.2.1 53 | version: 6.2.1(rollup@4.39.0)(typescript@5.8.3) 54 | rollup-plugin-polyfill-node: 55 | specifier: ^0.13.0 56 | version: 0.13.0(rollup@4.39.0) 57 | tslib: 58 | specifier: ^2.6.2 59 | version: 2.8.1 60 | typescript: 61 | specifier: ^5.8.3 62 | version: 5.8.3 63 | vitest-fetch-mock: 64 | specifier: ^0.4.5 65 | version: 0.4.5(vitest@3.1.1(@types/node@22.14.0)(terser@5.37.0)) 66 | 67 | packages: 68 | 69 | '@babel/code-frame@7.26.2': 70 | resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} 71 | engines: {node: '>=6.9.0'} 72 | 73 | '@babel/helper-validator-identifier@7.25.9': 74 | resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} 75 | engines: {node: '>=6.9.0'} 76 | 77 | '@esbuild/aix-ppc64@0.25.2': 78 | resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} 79 | engines: {node: '>=18'} 80 | cpu: [ppc64] 81 | os: [aix] 82 | 83 | '@esbuild/android-arm64@0.25.2': 84 | resolution: {integrity: sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==} 85 | engines: {node: '>=18'} 86 | cpu: [arm64] 87 | os: [android] 88 | 89 | '@esbuild/android-arm@0.25.2': 90 | resolution: {integrity: sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==} 91 | engines: {node: '>=18'} 92 | cpu: [arm] 93 | os: [android] 94 | 95 | '@esbuild/android-x64@0.25.2': 96 | resolution: {integrity: sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==} 97 | engines: {node: '>=18'} 98 | cpu: [x64] 99 | os: [android] 100 | 101 | '@esbuild/darwin-arm64@0.25.2': 102 | resolution: {integrity: sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==} 103 | engines: {node: '>=18'} 104 | cpu: [arm64] 105 | os: [darwin] 106 | 107 | '@esbuild/darwin-x64@0.25.2': 108 | resolution: {integrity: sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==} 109 | engines: {node: '>=18'} 110 | cpu: [x64] 111 | os: [darwin] 112 | 113 | '@esbuild/freebsd-arm64@0.25.2': 114 | resolution: {integrity: sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==} 115 | engines: {node: '>=18'} 116 | cpu: [arm64] 117 | os: [freebsd] 118 | 119 | '@esbuild/freebsd-x64@0.25.2': 120 | resolution: {integrity: sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==} 121 | engines: {node: '>=18'} 122 | cpu: [x64] 123 | os: [freebsd] 124 | 125 | '@esbuild/linux-arm64@0.25.2': 126 | resolution: {integrity: sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==} 127 | engines: {node: '>=18'} 128 | cpu: [arm64] 129 | os: [linux] 130 | 131 | '@esbuild/linux-arm@0.25.2': 132 | resolution: {integrity: sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==} 133 | engines: {node: '>=18'} 134 | cpu: [arm] 135 | os: [linux] 136 | 137 | '@esbuild/linux-ia32@0.25.2': 138 | resolution: {integrity: sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==} 139 | engines: {node: '>=18'} 140 | cpu: [ia32] 141 | os: [linux] 142 | 143 | '@esbuild/linux-loong64@0.25.2': 144 | resolution: {integrity: sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==} 145 | engines: {node: '>=18'} 146 | cpu: [loong64] 147 | os: [linux] 148 | 149 | '@esbuild/linux-mips64el@0.25.2': 150 | resolution: {integrity: sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==} 151 | engines: {node: '>=18'} 152 | cpu: [mips64el] 153 | os: [linux] 154 | 155 | '@esbuild/linux-ppc64@0.25.2': 156 | resolution: {integrity: sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==} 157 | engines: {node: '>=18'} 158 | cpu: [ppc64] 159 | os: [linux] 160 | 161 | '@esbuild/linux-riscv64@0.25.2': 162 | resolution: {integrity: sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==} 163 | engines: {node: '>=18'} 164 | cpu: [riscv64] 165 | os: [linux] 166 | 167 | '@esbuild/linux-s390x@0.25.2': 168 | resolution: {integrity: sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==} 169 | engines: {node: '>=18'} 170 | cpu: [s390x] 171 | os: [linux] 172 | 173 | '@esbuild/linux-x64@0.25.2': 174 | resolution: {integrity: sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==} 175 | engines: {node: '>=18'} 176 | cpu: [x64] 177 | os: [linux] 178 | 179 | '@esbuild/netbsd-arm64@0.25.2': 180 | resolution: {integrity: sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==} 181 | engines: {node: '>=18'} 182 | cpu: [arm64] 183 | os: [netbsd] 184 | 185 | '@esbuild/netbsd-x64@0.25.2': 186 | resolution: {integrity: sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==} 187 | engines: {node: '>=18'} 188 | cpu: [x64] 189 | os: [netbsd] 190 | 191 | '@esbuild/openbsd-arm64@0.25.2': 192 | resolution: {integrity: sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==} 193 | engines: {node: '>=18'} 194 | cpu: [arm64] 195 | os: [openbsd] 196 | 197 | '@esbuild/openbsd-x64@0.25.2': 198 | resolution: {integrity: sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==} 199 | engines: {node: '>=18'} 200 | cpu: [x64] 201 | os: [openbsd] 202 | 203 | '@esbuild/sunos-x64@0.25.2': 204 | resolution: {integrity: sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==} 205 | engines: {node: '>=18'} 206 | cpu: [x64] 207 | os: [sunos] 208 | 209 | '@esbuild/win32-arm64@0.25.2': 210 | resolution: {integrity: sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==} 211 | engines: {node: '>=18'} 212 | cpu: [arm64] 213 | os: [win32] 214 | 215 | '@esbuild/win32-ia32@0.25.2': 216 | resolution: {integrity: sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==} 217 | engines: {node: '>=18'} 218 | cpu: [ia32] 219 | os: [win32] 220 | 221 | '@esbuild/win32-x64@0.25.2': 222 | resolution: {integrity: sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==} 223 | engines: {node: '>=18'} 224 | cpu: [x64] 225 | os: [win32] 226 | 227 | '@jest/schemas@29.6.3': 228 | resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} 229 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 230 | 231 | '@jridgewell/gen-mapping@0.3.8': 232 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 233 | engines: {node: '>=6.0.0'} 234 | 235 | '@jridgewell/resolve-uri@3.1.2': 236 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 237 | engines: {node: '>=6.0.0'} 238 | 239 | '@jridgewell/set-array@1.2.1': 240 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 241 | engines: {node: '>=6.0.0'} 242 | 243 | '@jridgewell/source-map@0.3.6': 244 | resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} 245 | 246 | '@jridgewell/sourcemap-codec@1.5.0': 247 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 248 | 249 | '@jridgewell/trace-mapping@0.3.25': 250 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 251 | 252 | '@opentelemetry/api-logs@0.57.2': 253 | resolution: {integrity: sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==} 254 | engines: {node: '>=14'} 255 | 256 | '@opentelemetry/api@1.9.0': 257 | resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} 258 | engines: {node: '>=8.0.0'} 259 | 260 | '@opentelemetry/context-async-hooks@1.30.1': 261 | resolution: {integrity: sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA==} 262 | engines: {node: '>=14'} 263 | peerDependencies: 264 | '@opentelemetry/api': '>=1.0.0 <1.10.0' 265 | 266 | '@opentelemetry/core@1.30.1': 267 | resolution: {integrity: sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==} 268 | engines: {node: '>=14'} 269 | peerDependencies: 270 | '@opentelemetry/api': '>=1.0.0 <1.10.0' 271 | 272 | '@opentelemetry/instrumentation-amqplib@0.46.1': 273 | resolution: {integrity: sha512-AyXVnlCf/xV3K/rNumzKxZqsULyITJH6OVLiW6730JPRqWA7Zc9bvYoVNpN6iOpTU8CasH34SU/ksVJmObFibQ==} 274 | engines: {node: '>=14'} 275 | peerDependencies: 276 | '@opentelemetry/api': ^1.3.0 277 | 278 | '@opentelemetry/instrumentation-connect@0.43.1': 279 | resolution: {integrity: sha512-ht7YGWQuV5BopMcw5Q2hXn3I8eG8TH0J/kc/GMcW4CuNTgiP6wCu44BOnucJWL3CmFWaRHI//vWyAhaC8BwePw==} 280 | engines: {node: '>=14'} 281 | peerDependencies: 282 | '@opentelemetry/api': ^1.3.0 283 | 284 | '@opentelemetry/instrumentation-dataloader@0.16.1': 285 | resolution: {integrity: sha512-K/qU4CjnzOpNkkKO4DfCLSQshejRNAJtd4esgigo/50nxCB6XCyi1dhAblUHM9jG5dRm8eu0FB+t87nIo99LYQ==} 286 | engines: {node: '>=14'} 287 | peerDependencies: 288 | '@opentelemetry/api': ^1.3.0 289 | 290 | '@opentelemetry/instrumentation-express@0.47.1': 291 | resolution: {integrity: sha512-QNXPTWteDclR2B4pDFpz0TNghgB33UMjUt14B+BZPmtH1MwUFAfLHBaP5If0Z5NZC+jaH8oF2glgYjrmhZWmSw==} 292 | engines: {node: '>=14'} 293 | peerDependencies: 294 | '@opentelemetry/api': ^1.3.0 295 | 296 | '@opentelemetry/instrumentation-fastify@0.44.2': 297 | resolution: {integrity: sha512-arSp97Y4D2NWogoXRb8CzFK3W2ooVdvqRRtQDljFt9uC3zI6OuShgey6CVFC0JxT1iGjkAr1r4PDz23mWrFULQ==} 298 | engines: {node: '>=14'} 299 | peerDependencies: 300 | '@opentelemetry/api': ^1.3.0 301 | 302 | '@opentelemetry/instrumentation-fs@0.19.1': 303 | resolution: {integrity: sha512-6g0FhB3B9UobAR60BGTcXg4IHZ6aaYJzp0Ki5FhnxyAPt8Ns+9SSvgcrnsN2eGmk3RWG5vYycUGOEApycQL24A==} 304 | engines: {node: '>=14'} 305 | peerDependencies: 306 | '@opentelemetry/api': ^1.3.0 307 | 308 | '@opentelemetry/instrumentation-generic-pool@0.43.1': 309 | resolution: {integrity: sha512-M6qGYsp1cURtvVLGDrPPZemMFEbuMmCXgQYTReC/IbimV5sGrLBjB+/hANUpRZjX67nGLdKSVLZuQQAiNz+sww==} 310 | engines: {node: '>=14'} 311 | peerDependencies: 312 | '@opentelemetry/api': ^1.3.0 313 | 314 | '@opentelemetry/instrumentation-graphql@0.47.1': 315 | resolution: {integrity: sha512-EGQRWMGqwiuVma8ZLAZnExQ7sBvbOx0N/AE/nlafISPs8S+QtXX+Viy6dcQwVWwYHQPAcuY3bFt3xgoAwb4ZNQ==} 316 | engines: {node: '>=14'} 317 | peerDependencies: 318 | '@opentelemetry/api': ^1.3.0 319 | 320 | '@opentelemetry/instrumentation-hapi@0.45.2': 321 | resolution: {integrity: sha512-7Ehow/7Wp3aoyCrZwQpU7a2CnoMq0XhIcioFuKjBb0PLYfBfmTsFTUyatlHu0fRxhwcRsSQRTvEhmZu8CppBpQ==} 322 | engines: {node: '>=14'} 323 | peerDependencies: 324 | '@opentelemetry/api': ^1.3.0 325 | 326 | '@opentelemetry/instrumentation-http@0.57.2': 327 | resolution: {integrity: sha512-1Uz5iJ9ZAlFOiPuwYg29Bf7bJJc/GeoeJIFKJYQf67nTVKFe8RHbEtxgkOmK4UGZNHKXcpW4P8cWBYzBn1USpg==} 328 | engines: {node: '>=14'} 329 | peerDependencies: 330 | '@opentelemetry/api': ^1.3.0 331 | 332 | '@opentelemetry/instrumentation-ioredis@0.47.1': 333 | resolution: {integrity: sha512-OtFGSN+kgk/aoKgdkKQnBsQFDiG8WdCxu+UrHr0bXScdAmtSzLSraLo7wFIb25RVHfRWvzI5kZomqJYEg/l1iA==} 334 | engines: {node: '>=14'} 335 | peerDependencies: 336 | '@opentelemetry/api': ^1.3.0 337 | 338 | '@opentelemetry/instrumentation-kafkajs@0.7.1': 339 | resolution: {integrity: sha512-OtjaKs8H7oysfErajdYr1yuWSjMAectT7Dwr+axIoZqT9lmEOkD/H/3rgAs8h/NIuEi2imSXD+vL4MZtOuJfqQ==} 340 | engines: {node: '>=14'} 341 | peerDependencies: 342 | '@opentelemetry/api': ^1.3.0 343 | 344 | '@opentelemetry/instrumentation-knex@0.44.1': 345 | resolution: {integrity: sha512-U4dQxkNhvPexffjEmGwCq68FuftFK15JgUF05y/HlK3M6W/G2iEaACIfXdSnwVNe9Qh0sPfw8LbOPxrWzGWGMQ==} 346 | engines: {node: '>=14'} 347 | peerDependencies: 348 | '@opentelemetry/api': ^1.3.0 349 | 350 | '@opentelemetry/instrumentation-koa@0.47.1': 351 | resolution: {integrity: sha512-l/c+Z9F86cOiPJUllUCt09v+kICKvT+Vg1vOAJHtHPsJIzurGayucfCMq2acd/A/yxeNWunl9d9eqZ0G+XiI6A==} 352 | engines: {node: '>=14'} 353 | peerDependencies: 354 | '@opentelemetry/api': ^1.3.0 355 | 356 | '@opentelemetry/instrumentation-lru-memoizer@0.44.1': 357 | resolution: {integrity: sha512-5MPkYCvG2yw7WONEjYj5lr5JFehTobW7wX+ZUFy81oF2lr9IPfZk9qO+FTaM0bGEiymwfLwKe6jE15nHn1nmHg==} 358 | engines: {node: '>=14'} 359 | peerDependencies: 360 | '@opentelemetry/api': ^1.3.0 361 | 362 | '@opentelemetry/instrumentation-mongodb@0.52.0': 363 | resolution: {integrity: sha512-1xmAqOtRUQGR7QfJFfGV/M2kC7wmI2WgZdpru8hJl3S0r4hW0n3OQpEHlSGXJAaNFyvT+ilnwkT+g5L4ljHR6g==} 364 | engines: {node: '>=14'} 365 | peerDependencies: 366 | '@opentelemetry/api': ^1.3.0 367 | 368 | '@opentelemetry/instrumentation-mongoose@0.46.1': 369 | resolution: {integrity: sha512-3kINtW1LUTPkiXFRSSBmva1SXzS/72we/jL22N+BnF3DFcoewkdkHPYOIdAAk9gSicJ4d5Ojtt1/HeibEc5OQg==} 370 | engines: {node: '>=14'} 371 | peerDependencies: 372 | '@opentelemetry/api': ^1.3.0 373 | 374 | '@opentelemetry/instrumentation-mysql2@0.45.2': 375 | resolution: {integrity: sha512-h6Ad60FjCYdJZ5DTz1Lk2VmQsShiViKe0G7sYikb0GHI0NVvApp2XQNRHNjEMz87roFttGPLHOYVPlfy+yVIhQ==} 376 | engines: {node: '>=14'} 377 | peerDependencies: 378 | '@opentelemetry/api': ^1.3.0 379 | 380 | '@opentelemetry/instrumentation-mysql@0.45.1': 381 | resolution: {integrity: sha512-TKp4hQ8iKQsY7vnp/j0yJJ4ZsP109Ht6l4RHTj0lNEG1TfgTrIH5vJMbgmoYXWzNHAqBH2e7fncN12p3BP8LFg==} 382 | engines: {node: '>=14'} 383 | peerDependencies: 384 | '@opentelemetry/api': ^1.3.0 385 | 386 | '@opentelemetry/instrumentation-pg@0.51.1': 387 | resolution: {integrity: sha512-QxgjSrxyWZc7Vk+qGSfsejPVFL1AgAJdSBMYZdDUbwg730D09ub3PXScB9d04vIqPriZ+0dqzjmQx0yWKiCi2Q==} 388 | engines: {node: '>=14'} 389 | peerDependencies: 390 | '@opentelemetry/api': ^1.3.0 391 | 392 | '@opentelemetry/instrumentation-redis-4@0.46.1': 393 | resolution: {integrity: sha512-UMqleEoabYMsWoTkqyt9WAzXwZ4BlFZHO40wr3d5ZvtjKCHlD4YXLm+6OLCeIi/HkX7EXvQaz8gtAwkwwSEvcQ==} 394 | engines: {node: '>=14'} 395 | peerDependencies: 396 | '@opentelemetry/api': ^1.3.0 397 | 398 | '@opentelemetry/instrumentation-tedious@0.18.1': 399 | resolution: {integrity: sha512-5Cuy/nj0HBaH+ZJ4leuD7RjgvA844aY2WW+B5uLcWtxGjRZl3MNLuxnNg5DYWZNPO+NafSSnra0q49KWAHsKBg==} 400 | engines: {node: '>=14'} 401 | peerDependencies: 402 | '@opentelemetry/api': ^1.3.0 403 | 404 | '@opentelemetry/instrumentation-undici@0.10.1': 405 | resolution: {integrity: sha512-rkOGikPEyRpMCmNu9AQuV5dtRlDmJp2dK5sw8roVshAGoB6hH/3QjDtRhdwd75SsJwgynWUNRUYe0wAkTo16tQ==} 406 | engines: {node: '>=14'} 407 | peerDependencies: 408 | '@opentelemetry/api': ^1.7.0 409 | 410 | '@opentelemetry/instrumentation@0.57.2': 411 | resolution: {integrity: sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==} 412 | engines: {node: '>=14'} 413 | peerDependencies: 414 | '@opentelemetry/api': ^1.3.0 415 | 416 | '@opentelemetry/redis-common@0.36.2': 417 | resolution: {integrity: sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==} 418 | engines: {node: '>=14'} 419 | 420 | '@opentelemetry/resources@1.30.1': 421 | resolution: {integrity: sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==} 422 | engines: {node: '>=14'} 423 | peerDependencies: 424 | '@opentelemetry/api': '>=1.0.0 <1.10.0' 425 | 426 | '@opentelemetry/sdk-trace-base@1.30.1': 427 | resolution: {integrity: sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==} 428 | engines: {node: '>=14'} 429 | peerDependencies: 430 | '@opentelemetry/api': '>=1.0.0 <1.10.0' 431 | 432 | '@opentelemetry/semantic-conventions@1.28.0': 433 | resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} 434 | engines: {node: '>=14'} 435 | 436 | '@opentelemetry/semantic-conventions@1.30.0': 437 | resolution: {integrity: sha512-4VlGgo32k2EQ2wcCY3vEU28A0O13aOtHz3Xt2/2U5FAh9EfhD6t6DqL5Z6yAnRCntbTFDU4YfbpyzSlHNWycPw==} 438 | engines: {node: '>=14'} 439 | 440 | '@opentelemetry/sql-common@0.40.1': 441 | resolution: {integrity: sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==} 442 | engines: {node: '>=14'} 443 | peerDependencies: 444 | '@opentelemetry/api': ^1.1.0 445 | 446 | '@prisma/instrumentation@6.5.0': 447 | resolution: {integrity: sha512-morJDtFRoAp5d/KENEm+K6Y3PQcn5bCvpJ5a9y3V3DNMrNy/ZSn2zulPGj+ld+Xj2UYVoaMJ8DpBX/o6iF6OiA==} 448 | peerDependencies: 449 | '@opentelemetry/api': ^1.8 450 | 451 | '@rollup/plugin-commonjs@28.0.3': 452 | resolution: {integrity: sha512-pyltgilam1QPdn+Zd9gaCfOLcnjMEJ9gV+bTw6/r73INdvzf1ah9zLIJBm+kW7R6IUFIQ1YO+VqZtYxZNWFPEQ==} 453 | engines: {node: '>=16.0.0 || 14 >= 14.17'} 454 | peerDependencies: 455 | rollup: ^2.68.0||^3.0.0||^4.0.0 456 | peerDependenciesMeta: 457 | rollup: 458 | optional: true 459 | 460 | '@rollup/plugin-inject@5.0.5': 461 | resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} 462 | engines: {node: '>=14.0.0'} 463 | peerDependencies: 464 | rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 465 | peerDependenciesMeta: 466 | rollup: 467 | optional: true 468 | 469 | '@rollup/plugin-node-resolve@16.0.1': 470 | resolution: {integrity: sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==} 471 | engines: {node: '>=14.0.0'} 472 | peerDependencies: 473 | rollup: ^2.78.0||^3.0.0||^4.0.0 474 | peerDependenciesMeta: 475 | rollup: 476 | optional: true 477 | 478 | '@rollup/plugin-terser@0.4.4': 479 | resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} 480 | engines: {node: '>=14.0.0'} 481 | peerDependencies: 482 | rollup: ^2.0.0||^3.0.0||^4.0.0 483 | peerDependenciesMeta: 484 | rollup: 485 | optional: true 486 | 487 | '@rollup/plugin-typescript@12.1.2': 488 | resolution: {integrity: sha512-cdtSp154H5sv637uMr1a8OTWB0L1SWDSm1rDGiyfcGcvQ6cuTs4MDk2BVEBGysUWago4OJN4EQZqOTl/QY3Jgg==} 489 | engines: {node: '>=14.0.0'} 490 | peerDependencies: 491 | rollup: ^2.14.0||^3.0.0||^4.0.0 492 | tslib: '*' 493 | typescript: '>=3.7.0' 494 | peerDependenciesMeta: 495 | rollup: 496 | optional: true 497 | tslib: 498 | optional: true 499 | 500 | '@rollup/pluginutils@5.1.4': 501 | resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} 502 | engines: {node: '>=14.0.0'} 503 | peerDependencies: 504 | rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 505 | peerDependenciesMeta: 506 | rollup: 507 | optional: true 508 | 509 | '@rollup/rollup-android-arm-eabi@4.39.0': 510 | resolution: {integrity: sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==} 511 | cpu: [arm] 512 | os: [android] 513 | 514 | '@rollup/rollup-android-arm64@4.39.0': 515 | resolution: {integrity: sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==} 516 | cpu: [arm64] 517 | os: [android] 518 | 519 | '@rollup/rollup-darwin-arm64@4.39.0': 520 | resolution: {integrity: sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==} 521 | cpu: [arm64] 522 | os: [darwin] 523 | 524 | '@rollup/rollup-darwin-x64@4.39.0': 525 | resolution: {integrity: sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==} 526 | cpu: [x64] 527 | os: [darwin] 528 | 529 | '@rollup/rollup-freebsd-arm64@4.39.0': 530 | resolution: {integrity: sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==} 531 | cpu: [arm64] 532 | os: [freebsd] 533 | 534 | '@rollup/rollup-freebsd-x64@4.39.0': 535 | resolution: {integrity: sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==} 536 | cpu: [x64] 537 | os: [freebsd] 538 | 539 | '@rollup/rollup-linux-arm-gnueabihf@4.39.0': 540 | resolution: {integrity: sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==} 541 | cpu: [arm] 542 | os: [linux] 543 | 544 | '@rollup/rollup-linux-arm-musleabihf@4.39.0': 545 | resolution: {integrity: sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==} 546 | cpu: [arm] 547 | os: [linux] 548 | 549 | '@rollup/rollup-linux-arm64-gnu@4.39.0': 550 | resolution: {integrity: sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==} 551 | cpu: [arm64] 552 | os: [linux] 553 | 554 | '@rollup/rollup-linux-arm64-musl@4.39.0': 555 | resolution: {integrity: sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==} 556 | cpu: [arm64] 557 | os: [linux] 558 | 559 | '@rollup/rollup-linux-loongarch64-gnu@4.39.0': 560 | resolution: {integrity: sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==} 561 | cpu: [loong64] 562 | os: [linux] 563 | 564 | '@rollup/rollup-linux-powerpc64le-gnu@4.39.0': 565 | resolution: {integrity: sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==} 566 | cpu: [ppc64] 567 | os: [linux] 568 | 569 | '@rollup/rollup-linux-riscv64-gnu@4.39.0': 570 | resolution: {integrity: sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==} 571 | cpu: [riscv64] 572 | os: [linux] 573 | 574 | '@rollup/rollup-linux-riscv64-musl@4.39.0': 575 | resolution: {integrity: sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==} 576 | cpu: [riscv64] 577 | os: [linux] 578 | 579 | '@rollup/rollup-linux-s390x-gnu@4.39.0': 580 | resolution: {integrity: sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==} 581 | cpu: [s390x] 582 | os: [linux] 583 | 584 | '@rollup/rollup-linux-x64-gnu@4.39.0': 585 | resolution: {integrity: sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==} 586 | cpu: [x64] 587 | os: [linux] 588 | 589 | '@rollup/rollup-linux-x64-musl@4.39.0': 590 | resolution: {integrity: sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==} 591 | cpu: [x64] 592 | os: [linux] 593 | 594 | '@rollup/rollup-win32-arm64-msvc@4.39.0': 595 | resolution: {integrity: sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==} 596 | cpu: [arm64] 597 | os: [win32] 598 | 599 | '@rollup/rollup-win32-ia32-msvc@4.39.0': 600 | resolution: {integrity: sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==} 601 | cpu: [ia32] 602 | os: [win32] 603 | 604 | '@rollup/rollup-win32-x64-msvc@4.39.0': 605 | resolution: {integrity: sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==} 606 | cpu: [x64] 607 | os: [win32] 608 | 609 | '@sentry/core@9.11.0': 610 | resolution: {integrity: sha512-qfb4ahGZubbrNh1MnbEqyHFp87rIwQIZapyQLCaYpudXrP1biEpLOV3mMDvDJWCdX460hoOwQ3SkwipV3We/7w==} 611 | engines: {node: '>=18'} 612 | 613 | '@sentry/node@9.11.0': 614 | resolution: {integrity: sha512-luDsNDHsHkoXbL2Rf1cEKijh6hBfjzGQe09iP6kdZr+HB0bO+qoLe+nZLzSIQTWgWSt2XYNQyiLAsaMlbJZhJg==} 615 | engines: {node: '>=18'} 616 | 617 | '@sentry/opentelemetry@9.11.0': 618 | resolution: {integrity: sha512-B6RumUFGb1+Q4MymY7IZbdl1Ayz2srqf46itFr1ohE/IpwY7OWKMntop8fxyccUW3ptmPp9cPkBJOaa9UdJhSg==} 619 | engines: {node: '>=18'} 620 | peerDependencies: 621 | '@opentelemetry/api': ^1.9.0 622 | '@opentelemetry/context-async-hooks': ^1.30.1 623 | '@opentelemetry/core': ^1.30.1 624 | '@opentelemetry/instrumentation': ^0.57.1 625 | '@opentelemetry/sdk-trace-base': ^1.30.1 626 | '@opentelemetry/semantic-conventions': ^1.28.0 627 | 628 | '@sinclair/typebox@0.27.8': 629 | resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} 630 | 631 | '@types/connect@3.4.38': 632 | resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} 633 | 634 | '@types/estree@1.0.6': 635 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 636 | 637 | '@types/estree@1.0.7': 638 | resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} 639 | 640 | '@types/mysql@2.15.26': 641 | resolution: {integrity: sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==} 642 | 643 | '@types/node@22.14.0': 644 | resolution: {integrity: sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==} 645 | 646 | '@types/pg-pool@2.0.6': 647 | resolution: {integrity: sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==} 648 | 649 | '@types/pg@8.6.1': 650 | resolution: {integrity: sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==} 651 | 652 | '@types/resolve@1.20.2': 653 | resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} 654 | 655 | '@types/shimmer@1.2.0': 656 | resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==} 657 | 658 | '@types/tedious@4.0.14': 659 | resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} 660 | 661 | '@types/write-file-atomic@4.0.3': 662 | resolution: {integrity: sha512-qdo+vZRchyJIHNeuI1nrpsLw+hnkgqP/8mlaN6Wle/NKhydHmUN9l4p3ZE8yP90AJNJW4uB8HQhedb4f1vNayQ==} 663 | 664 | '@vitest/expect@3.1.1': 665 | resolution: {integrity: sha512-q/zjrW9lgynctNbwvFtQkGK9+vvHA5UzVi2V8APrp1C6fG6/MuYYkmlx4FubuqLycCeSdHD5aadWfua/Vr0EUA==} 666 | 667 | '@vitest/mocker@3.1.1': 668 | resolution: {integrity: sha512-bmpJJm7Y7i9BBELlLuuM1J1Q6EQ6K5Ye4wcyOpOMXMcePYKSIYlpcrCm4l/O6ja4VJA5G2aMJiuZkZdnxlC3SA==} 669 | peerDependencies: 670 | msw: ^2.4.9 671 | vite: ^5.0.0 || ^6.0.0 672 | peerDependenciesMeta: 673 | msw: 674 | optional: true 675 | vite: 676 | optional: true 677 | 678 | '@vitest/pretty-format@3.1.1': 679 | resolution: {integrity: sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA==} 680 | 681 | '@vitest/runner@3.1.1': 682 | resolution: {integrity: sha512-X/d46qzJuEDO8ueyjtKfxffiXraPRfmYasoC4i5+mlLEJ10UvPb0XH5M9C3gWuxd7BAQhpK42cJgJtq53YnWVA==} 683 | 684 | '@vitest/snapshot@3.1.1': 685 | resolution: {integrity: sha512-bByMwaVWe/+1WDf9exFxWWgAixelSdiwo2p33tpqIlM14vW7PRV5ppayVXtfycqze4Qhtwag5sVhX400MLBOOw==} 686 | 687 | '@vitest/spy@3.1.1': 688 | resolution: {integrity: sha512-+EmrUOOXbKzLkTDwlsc/xrwOlPDXyVk3Z6P6K4oiCndxz7YLpp/0R0UsWVOKT0IXWjjBJuSMk6D27qipaupcvQ==} 689 | 690 | '@vitest/utils@3.1.1': 691 | resolution: {integrity: sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==} 692 | 693 | acorn-import-attributes@1.9.5: 694 | resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} 695 | peerDependencies: 696 | acorn: ^8 697 | 698 | acorn@8.14.0: 699 | resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} 700 | engines: {node: '>=0.4.0'} 701 | hasBin: true 702 | 703 | acorn@8.14.1: 704 | resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} 705 | engines: {node: '>=0.4.0'} 706 | hasBin: true 707 | 708 | ansi-styles@5.2.0: 709 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 710 | engines: {node: '>=10'} 711 | 712 | assertion-error@2.0.1: 713 | resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 714 | engines: {node: '>=12'} 715 | 716 | buffer-from@1.1.2: 717 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 718 | 719 | cac@6.7.14: 720 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 721 | engines: {node: '>=8'} 722 | 723 | chai@5.2.0: 724 | resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} 725 | engines: {node: '>=12'} 726 | 727 | chalk@5.4.1: 728 | resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} 729 | engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} 730 | 731 | check-error@2.1.1: 732 | resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 733 | engines: {node: '>= 16'} 734 | 735 | cjs-module-lexer@1.4.3: 736 | resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} 737 | 738 | commander@2.20.3: 739 | resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 740 | 741 | commondir@1.0.1: 742 | resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} 743 | 744 | debug@4.4.0: 745 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 746 | engines: {node: '>=6.0'} 747 | peerDependencies: 748 | supports-color: '*' 749 | peerDependenciesMeta: 750 | supports-color: 751 | optional: true 752 | 753 | deep-eql@5.0.2: 754 | resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} 755 | engines: {node: '>=6'} 756 | 757 | deepmerge@4.3.1: 758 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 759 | engines: {node: '>=0.10.0'} 760 | 761 | domexception@4.0.0: 762 | resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} 763 | engines: {node: '>=12'} 764 | deprecated: Use your platform's native DOMException instead 765 | 766 | es-module-lexer@1.6.0: 767 | resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} 768 | 769 | esbuild@0.25.2: 770 | resolution: {integrity: sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==} 771 | engines: {node: '>=18'} 772 | hasBin: true 773 | 774 | estree-walker@2.0.2: 775 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 776 | 777 | estree-walker@3.0.3: 778 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 779 | 780 | expect-type@1.2.1: 781 | resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} 782 | engines: {node: '>=12.0.0'} 783 | 784 | fdir@6.4.3: 785 | resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} 786 | peerDependencies: 787 | picomatch: ^3 || ^4 788 | peerDependenciesMeta: 789 | picomatch: 790 | optional: true 791 | 792 | forwarded-parse@2.1.2: 793 | resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} 794 | 795 | fsevents@2.3.3: 796 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 797 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 798 | os: [darwin] 799 | 800 | function-bind@1.1.2: 801 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 802 | 803 | hasown@2.0.2: 804 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 805 | engines: {node: '>= 0.4'} 806 | 807 | import-in-the-middle@1.13.1: 808 | resolution: {integrity: sha512-k2V9wNm9B+ysuelDTHjI9d5KPc4l8zAZTGqj+pcynvWkypZd857ryzN8jNC7Pg2YZXNMJcHRPpaDyCBbNyVRpA==} 809 | 810 | imurmurhash@0.1.4: 811 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 812 | engines: {node: '>=0.8.19'} 813 | 814 | is-core-module@2.16.1: 815 | resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 816 | engines: {node: '>= 0.4'} 817 | 818 | is-module@1.0.0: 819 | resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} 820 | 821 | is-reference@1.2.1: 822 | resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} 823 | 824 | js-tokens@4.0.0: 825 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 826 | 827 | loupe@3.1.3: 828 | resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} 829 | 830 | magic-string@0.30.17: 831 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 832 | 833 | module-details-from-path@1.0.3: 834 | resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} 835 | 836 | ms@2.1.3: 837 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 838 | 839 | nanoid@3.3.11: 840 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 841 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 842 | hasBin: true 843 | 844 | path-parse@1.0.7: 845 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 846 | 847 | pathe@2.0.3: 848 | resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 849 | 850 | pathval@2.0.0: 851 | resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} 852 | engines: {node: '>= 14.16'} 853 | 854 | pg-int8@1.0.1: 855 | resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} 856 | engines: {node: '>=4.0.0'} 857 | 858 | pg-protocol@1.8.0: 859 | resolution: {integrity: sha512-jvuYlEkL03NRvOoyoRktBK7+qU5kOvlAwvmrH8sr3wbLrOdVWsRxQfz8mMy9sZFsqJ1hEWNfdWKI4SAmoL+j7g==} 860 | 861 | pg-types@2.2.0: 862 | resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} 863 | engines: {node: '>=4'} 864 | 865 | picocolors@1.1.1: 866 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 867 | 868 | picomatch@4.0.2: 869 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 870 | engines: {node: '>=12'} 871 | 872 | postcss@8.5.3: 873 | resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} 874 | engines: {node: ^10 || ^12 || >=14} 875 | 876 | postgres-array@2.0.0: 877 | resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} 878 | engines: {node: '>=4'} 879 | 880 | postgres-bytea@1.0.0: 881 | resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} 882 | engines: {node: '>=0.10.0'} 883 | 884 | postgres-date@1.0.7: 885 | resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} 886 | engines: {node: '>=0.10.0'} 887 | 888 | postgres-interval@1.2.0: 889 | resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} 890 | engines: {node: '>=0.10.0'} 891 | 892 | pretty-format@29.7.0: 893 | resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} 894 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 895 | 896 | randombytes@2.1.0: 897 | resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} 898 | 899 | react-is@18.3.1: 900 | resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} 901 | 902 | require-in-the-middle@7.5.2: 903 | resolution: {integrity: sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==} 904 | engines: {node: '>=8.6.0'} 905 | 906 | resolve@1.22.10: 907 | resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} 908 | engines: {node: '>= 0.4'} 909 | hasBin: true 910 | 911 | rollup-plugin-dts@6.2.1: 912 | resolution: {integrity: sha512-sR3CxYUl7i2CHa0O7bA45mCrgADyAQ0tVtGSqi3yvH28M+eg1+g5d7kQ9hLvEz5dorK3XVsH5L2jwHLQf72DzA==} 913 | engines: {node: '>=16'} 914 | peerDependencies: 915 | rollup: ^3.29.4 || ^4 916 | typescript: ^4.5 || ^5.0 917 | 918 | rollup-plugin-polyfill-node@0.13.0: 919 | resolution: {integrity: sha512-FYEvpCaD5jGtyBuBFcQImEGmTxDTPbiHjJdrYIp+mFIwgXiXabxvKUK7ZT9P31ozu2Tqm9llYQMRWsfvTMTAOw==} 920 | peerDependencies: 921 | rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 922 | 923 | rollup@4.39.0: 924 | resolution: {integrity: sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==} 925 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 926 | hasBin: true 927 | 928 | safe-buffer@5.2.1: 929 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 930 | 931 | semver@7.7.1: 932 | resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} 933 | engines: {node: '>=10'} 934 | hasBin: true 935 | 936 | serialize-javascript@6.0.2: 937 | resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} 938 | 939 | shimmer@1.2.1: 940 | resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} 941 | 942 | siginfo@2.0.0: 943 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 944 | 945 | signal-exit@4.1.0: 946 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 947 | engines: {node: '>=14'} 948 | 949 | smob@1.5.0: 950 | resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} 951 | 952 | source-map-js@1.2.1: 953 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 954 | engines: {node: '>=0.10.0'} 955 | 956 | source-map-support@0.5.21: 957 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 958 | 959 | source-map@0.6.1: 960 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 961 | engines: {node: '>=0.10.0'} 962 | 963 | stackback@0.0.2: 964 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 965 | 966 | std-env@3.9.0: 967 | resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} 968 | 969 | supports-preserve-symlinks-flag@1.0.0: 970 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 971 | engines: {node: '>= 0.4'} 972 | 973 | terser@5.37.0: 974 | resolution: {integrity: sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==} 975 | engines: {node: '>=10'} 976 | hasBin: true 977 | 978 | tinybench@2.9.0: 979 | resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 980 | 981 | tinyexec@0.3.2: 982 | resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 983 | 984 | tinypool@1.0.2: 985 | resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} 986 | engines: {node: ^18.0.0 || >=20.0.0} 987 | 988 | tinyrainbow@2.0.0: 989 | resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} 990 | engines: {node: '>=14.0.0'} 991 | 992 | tinyspy@3.0.2: 993 | resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} 994 | engines: {node: '>=14.0.0'} 995 | 996 | tslib@2.8.1: 997 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 998 | 999 | typescript@5.8.3: 1000 | resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 1001 | engines: {node: '>=14.17'} 1002 | hasBin: true 1003 | 1004 | undici-types@6.21.0: 1005 | resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 1006 | 1007 | vite-node@3.1.1: 1008 | resolution: {integrity: sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w==} 1009 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1010 | hasBin: true 1011 | 1012 | vite@6.2.5: 1013 | resolution: {integrity: sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA==} 1014 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1015 | hasBin: true 1016 | peerDependencies: 1017 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1018 | jiti: '>=1.21.0' 1019 | less: '*' 1020 | lightningcss: ^1.21.0 1021 | sass: '*' 1022 | sass-embedded: '*' 1023 | stylus: '*' 1024 | sugarss: '*' 1025 | terser: ^5.16.0 1026 | tsx: ^4.8.1 1027 | yaml: ^2.4.2 1028 | peerDependenciesMeta: 1029 | '@types/node': 1030 | optional: true 1031 | jiti: 1032 | optional: true 1033 | less: 1034 | optional: true 1035 | lightningcss: 1036 | optional: true 1037 | sass: 1038 | optional: true 1039 | sass-embedded: 1040 | optional: true 1041 | stylus: 1042 | optional: true 1043 | sugarss: 1044 | optional: true 1045 | terser: 1046 | optional: true 1047 | tsx: 1048 | optional: true 1049 | yaml: 1050 | optional: true 1051 | 1052 | vitest-fetch-mock@0.4.5: 1053 | resolution: {integrity: sha512-nhWdCQIGtaSEUVl96pMm0WggyDGPDv5FUy/Q9Hx3cs2RGmh3Q/uRsLClGbdG3kXBkJ3br5yTUjB2MeW25TwdOA==} 1054 | engines: {node: '>=18.0.0'} 1055 | peerDependencies: 1056 | vitest: '>=2.0.0' 1057 | 1058 | vitest@3.1.1: 1059 | resolution: {integrity: sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==} 1060 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1061 | hasBin: true 1062 | peerDependencies: 1063 | '@edge-runtime/vm': '*' 1064 | '@types/debug': ^4.1.12 1065 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1066 | '@vitest/browser': 3.1.1 1067 | '@vitest/ui': 3.1.1 1068 | happy-dom: '*' 1069 | jsdom: '*' 1070 | peerDependenciesMeta: 1071 | '@edge-runtime/vm': 1072 | optional: true 1073 | '@types/debug': 1074 | optional: true 1075 | '@types/node': 1076 | optional: true 1077 | '@vitest/browser': 1078 | optional: true 1079 | '@vitest/ui': 1080 | optional: true 1081 | happy-dom: 1082 | optional: true 1083 | jsdom: 1084 | optional: true 1085 | 1086 | webidl-conversions@7.0.0: 1087 | resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} 1088 | engines: {node: '>=12'} 1089 | 1090 | why-is-node-running@2.3.0: 1091 | resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 1092 | engines: {node: '>=8'} 1093 | hasBin: true 1094 | 1095 | write-file-atomic@6.0.0: 1096 | resolution: {integrity: sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ==} 1097 | engines: {node: ^18.17.0 || >=20.5.0} 1098 | 1099 | xtend@4.0.2: 1100 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} 1101 | engines: {node: '>=0.4'} 1102 | 1103 | snapshots: 1104 | 1105 | '@babel/code-frame@7.26.2': 1106 | dependencies: 1107 | '@babel/helper-validator-identifier': 7.25.9 1108 | js-tokens: 4.0.0 1109 | picocolors: 1.1.1 1110 | optional: true 1111 | 1112 | '@babel/helper-validator-identifier@7.25.9': 1113 | optional: true 1114 | 1115 | '@esbuild/aix-ppc64@0.25.2': 1116 | optional: true 1117 | 1118 | '@esbuild/android-arm64@0.25.2': 1119 | optional: true 1120 | 1121 | '@esbuild/android-arm@0.25.2': 1122 | optional: true 1123 | 1124 | '@esbuild/android-x64@0.25.2': 1125 | optional: true 1126 | 1127 | '@esbuild/darwin-arm64@0.25.2': 1128 | optional: true 1129 | 1130 | '@esbuild/darwin-x64@0.25.2': 1131 | optional: true 1132 | 1133 | '@esbuild/freebsd-arm64@0.25.2': 1134 | optional: true 1135 | 1136 | '@esbuild/freebsd-x64@0.25.2': 1137 | optional: true 1138 | 1139 | '@esbuild/linux-arm64@0.25.2': 1140 | optional: true 1141 | 1142 | '@esbuild/linux-arm@0.25.2': 1143 | optional: true 1144 | 1145 | '@esbuild/linux-ia32@0.25.2': 1146 | optional: true 1147 | 1148 | '@esbuild/linux-loong64@0.25.2': 1149 | optional: true 1150 | 1151 | '@esbuild/linux-mips64el@0.25.2': 1152 | optional: true 1153 | 1154 | '@esbuild/linux-ppc64@0.25.2': 1155 | optional: true 1156 | 1157 | '@esbuild/linux-riscv64@0.25.2': 1158 | optional: true 1159 | 1160 | '@esbuild/linux-s390x@0.25.2': 1161 | optional: true 1162 | 1163 | '@esbuild/linux-x64@0.25.2': 1164 | optional: true 1165 | 1166 | '@esbuild/netbsd-arm64@0.25.2': 1167 | optional: true 1168 | 1169 | '@esbuild/netbsd-x64@0.25.2': 1170 | optional: true 1171 | 1172 | '@esbuild/openbsd-arm64@0.25.2': 1173 | optional: true 1174 | 1175 | '@esbuild/openbsd-x64@0.25.2': 1176 | optional: true 1177 | 1178 | '@esbuild/sunos-x64@0.25.2': 1179 | optional: true 1180 | 1181 | '@esbuild/win32-arm64@0.25.2': 1182 | optional: true 1183 | 1184 | '@esbuild/win32-ia32@0.25.2': 1185 | optional: true 1186 | 1187 | '@esbuild/win32-x64@0.25.2': 1188 | optional: true 1189 | 1190 | '@jest/schemas@29.6.3': 1191 | dependencies: 1192 | '@sinclair/typebox': 0.27.8 1193 | 1194 | '@jridgewell/gen-mapping@0.3.8': 1195 | dependencies: 1196 | '@jridgewell/set-array': 1.2.1 1197 | '@jridgewell/sourcemap-codec': 1.5.0 1198 | '@jridgewell/trace-mapping': 0.3.25 1199 | 1200 | '@jridgewell/resolve-uri@3.1.2': {} 1201 | 1202 | '@jridgewell/set-array@1.2.1': {} 1203 | 1204 | '@jridgewell/source-map@0.3.6': 1205 | dependencies: 1206 | '@jridgewell/gen-mapping': 0.3.8 1207 | '@jridgewell/trace-mapping': 0.3.25 1208 | 1209 | '@jridgewell/sourcemap-codec@1.5.0': {} 1210 | 1211 | '@jridgewell/trace-mapping@0.3.25': 1212 | dependencies: 1213 | '@jridgewell/resolve-uri': 3.1.2 1214 | '@jridgewell/sourcemap-codec': 1.5.0 1215 | 1216 | '@opentelemetry/api-logs@0.57.2': 1217 | dependencies: 1218 | '@opentelemetry/api': 1.9.0 1219 | 1220 | '@opentelemetry/api@1.9.0': {} 1221 | 1222 | '@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0)': 1223 | dependencies: 1224 | '@opentelemetry/api': 1.9.0 1225 | 1226 | '@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0)': 1227 | dependencies: 1228 | '@opentelemetry/api': 1.9.0 1229 | '@opentelemetry/semantic-conventions': 1.28.0 1230 | 1231 | '@opentelemetry/instrumentation-amqplib@0.46.1(@opentelemetry/api@1.9.0)': 1232 | dependencies: 1233 | '@opentelemetry/api': 1.9.0 1234 | '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) 1235 | '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) 1236 | '@opentelemetry/semantic-conventions': 1.30.0 1237 | transitivePeerDependencies: 1238 | - supports-color 1239 | 1240 | '@opentelemetry/instrumentation-connect@0.43.1(@opentelemetry/api@1.9.0)': 1241 | dependencies: 1242 | '@opentelemetry/api': 1.9.0 1243 | '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) 1244 | '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) 1245 | '@opentelemetry/semantic-conventions': 1.30.0 1246 | '@types/connect': 3.4.38 1247 | transitivePeerDependencies: 1248 | - supports-color 1249 | 1250 | '@opentelemetry/instrumentation-dataloader@0.16.1(@opentelemetry/api@1.9.0)': 1251 | dependencies: 1252 | '@opentelemetry/api': 1.9.0 1253 | '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) 1254 | transitivePeerDependencies: 1255 | - supports-color 1256 | 1257 | '@opentelemetry/instrumentation-express@0.47.1(@opentelemetry/api@1.9.0)': 1258 | dependencies: 1259 | '@opentelemetry/api': 1.9.0 1260 | '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) 1261 | '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) 1262 | '@opentelemetry/semantic-conventions': 1.30.0 1263 | transitivePeerDependencies: 1264 | - supports-color 1265 | 1266 | '@opentelemetry/instrumentation-fastify@0.44.2(@opentelemetry/api@1.9.0)': 1267 | dependencies: 1268 | '@opentelemetry/api': 1.9.0 1269 | '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) 1270 | '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) 1271 | '@opentelemetry/semantic-conventions': 1.30.0 1272 | transitivePeerDependencies: 1273 | - supports-color 1274 | 1275 | '@opentelemetry/instrumentation-fs@0.19.1(@opentelemetry/api@1.9.0)': 1276 | dependencies: 1277 | '@opentelemetry/api': 1.9.0 1278 | '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) 1279 | '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) 1280 | transitivePeerDependencies: 1281 | - supports-color 1282 | 1283 | '@opentelemetry/instrumentation-generic-pool@0.43.1(@opentelemetry/api@1.9.0)': 1284 | dependencies: 1285 | '@opentelemetry/api': 1.9.0 1286 | '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) 1287 | transitivePeerDependencies: 1288 | - supports-color 1289 | 1290 | '@opentelemetry/instrumentation-graphql@0.47.1(@opentelemetry/api@1.9.0)': 1291 | dependencies: 1292 | '@opentelemetry/api': 1.9.0 1293 | '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) 1294 | transitivePeerDependencies: 1295 | - supports-color 1296 | 1297 | '@opentelemetry/instrumentation-hapi@0.45.2(@opentelemetry/api@1.9.0)': 1298 | dependencies: 1299 | '@opentelemetry/api': 1.9.0 1300 | '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) 1301 | '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) 1302 | '@opentelemetry/semantic-conventions': 1.30.0 1303 | transitivePeerDependencies: 1304 | - supports-color 1305 | 1306 | '@opentelemetry/instrumentation-http@0.57.2(@opentelemetry/api@1.9.0)': 1307 | dependencies: 1308 | '@opentelemetry/api': 1.9.0 1309 | '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) 1310 | '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) 1311 | '@opentelemetry/semantic-conventions': 1.28.0 1312 | forwarded-parse: 2.1.2 1313 | semver: 7.7.1 1314 | transitivePeerDependencies: 1315 | - supports-color 1316 | 1317 | '@opentelemetry/instrumentation-ioredis@0.47.1(@opentelemetry/api@1.9.0)': 1318 | dependencies: 1319 | '@opentelemetry/api': 1.9.0 1320 | '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) 1321 | '@opentelemetry/redis-common': 0.36.2 1322 | '@opentelemetry/semantic-conventions': 1.30.0 1323 | transitivePeerDependencies: 1324 | - supports-color 1325 | 1326 | '@opentelemetry/instrumentation-kafkajs@0.7.1(@opentelemetry/api@1.9.0)': 1327 | dependencies: 1328 | '@opentelemetry/api': 1.9.0 1329 | '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) 1330 | '@opentelemetry/semantic-conventions': 1.30.0 1331 | transitivePeerDependencies: 1332 | - supports-color 1333 | 1334 | '@opentelemetry/instrumentation-knex@0.44.1(@opentelemetry/api@1.9.0)': 1335 | dependencies: 1336 | '@opentelemetry/api': 1.9.0 1337 | '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) 1338 | '@opentelemetry/semantic-conventions': 1.30.0 1339 | transitivePeerDependencies: 1340 | - supports-color 1341 | 1342 | '@opentelemetry/instrumentation-koa@0.47.1(@opentelemetry/api@1.9.0)': 1343 | dependencies: 1344 | '@opentelemetry/api': 1.9.0 1345 | '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) 1346 | '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) 1347 | '@opentelemetry/semantic-conventions': 1.30.0 1348 | transitivePeerDependencies: 1349 | - supports-color 1350 | 1351 | '@opentelemetry/instrumentation-lru-memoizer@0.44.1(@opentelemetry/api@1.9.0)': 1352 | dependencies: 1353 | '@opentelemetry/api': 1.9.0 1354 | '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) 1355 | transitivePeerDependencies: 1356 | - supports-color 1357 | 1358 | '@opentelemetry/instrumentation-mongodb@0.52.0(@opentelemetry/api@1.9.0)': 1359 | dependencies: 1360 | '@opentelemetry/api': 1.9.0 1361 | '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) 1362 | '@opentelemetry/semantic-conventions': 1.30.0 1363 | transitivePeerDependencies: 1364 | - supports-color 1365 | 1366 | '@opentelemetry/instrumentation-mongoose@0.46.1(@opentelemetry/api@1.9.0)': 1367 | dependencies: 1368 | '@opentelemetry/api': 1.9.0 1369 | '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) 1370 | '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) 1371 | '@opentelemetry/semantic-conventions': 1.30.0 1372 | transitivePeerDependencies: 1373 | - supports-color 1374 | 1375 | '@opentelemetry/instrumentation-mysql2@0.45.2(@opentelemetry/api@1.9.0)': 1376 | dependencies: 1377 | '@opentelemetry/api': 1.9.0 1378 | '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) 1379 | '@opentelemetry/semantic-conventions': 1.30.0 1380 | '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.9.0) 1381 | transitivePeerDependencies: 1382 | - supports-color 1383 | 1384 | '@opentelemetry/instrumentation-mysql@0.45.1(@opentelemetry/api@1.9.0)': 1385 | dependencies: 1386 | '@opentelemetry/api': 1.9.0 1387 | '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) 1388 | '@opentelemetry/semantic-conventions': 1.30.0 1389 | '@types/mysql': 2.15.26 1390 | transitivePeerDependencies: 1391 | - supports-color 1392 | 1393 | '@opentelemetry/instrumentation-pg@0.51.1(@opentelemetry/api@1.9.0)': 1394 | dependencies: 1395 | '@opentelemetry/api': 1.9.0 1396 | '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) 1397 | '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) 1398 | '@opentelemetry/semantic-conventions': 1.30.0 1399 | '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.9.0) 1400 | '@types/pg': 8.6.1 1401 | '@types/pg-pool': 2.0.6 1402 | transitivePeerDependencies: 1403 | - supports-color 1404 | 1405 | '@opentelemetry/instrumentation-redis-4@0.46.1(@opentelemetry/api@1.9.0)': 1406 | dependencies: 1407 | '@opentelemetry/api': 1.9.0 1408 | '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) 1409 | '@opentelemetry/redis-common': 0.36.2 1410 | '@opentelemetry/semantic-conventions': 1.30.0 1411 | transitivePeerDependencies: 1412 | - supports-color 1413 | 1414 | '@opentelemetry/instrumentation-tedious@0.18.1(@opentelemetry/api@1.9.0)': 1415 | dependencies: 1416 | '@opentelemetry/api': 1.9.0 1417 | '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) 1418 | '@opentelemetry/semantic-conventions': 1.30.0 1419 | '@types/tedious': 4.0.14 1420 | transitivePeerDependencies: 1421 | - supports-color 1422 | 1423 | '@opentelemetry/instrumentation-undici@0.10.1(@opentelemetry/api@1.9.0)': 1424 | dependencies: 1425 | '@opentelemetry/api': 1.9.0 1426 | '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) 1427 | '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) 1428 | transitivePeerDependencies: 1429 | - supports-color 1430 | 1431 | '@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0)': 1432 | dependencies: 1433 | '@opentelemetry/api': 1.9.0 1434 | '@opentelemetry/api-logs': 0.57.2 1435 | '@types/shimmer': 1.2.0 1436 | import-in-the-middle: 1.13.1 1437 | require-in-the-middle: 7.5.2 1438 | semver: 7.7.1 1439 | shimmer: 1.2.1 1440 | transitivePeerDependencies: 1441 | - supports-color 1442 | 1443 | '@opentelemetry/redis-common@0.36.2': {} 1444 | 1445 | '@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0)': 1446 | dependencies: 1447 | '@opentelemetry/api': 1.9.0 1448 | '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) 1449 | '@opentelemetry/semantic-conventions': 1.28.0 1450 | 1451 | '@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)': 1452 | dependencies: 1453 | '@opentelemetry/api': 1.9.0 1454 | '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) 1455 | '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) 1456 | '@opentelemetry/semantic-conventions': 1.28.0 1457 | 1458 | '@opentelemetry/semantic-conventions@1.28.0': {} 1459 | 1460 | '@opentelemetry/semantic-conventions@1.30.0': {} 1461 | 1462 | '@opentelemetry/sql-common@0.40.1(@opentelemetry/api@1.9.0)': 1463 | dependencies: 1464 | '@opentelemetry/api': 1.9.0 1465 | '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) 1466 | 1467 | '@prisma/instrumentation@6.5.0(@opentelemetry/api@1.9.0)': 1468 | dependencies: 1469 | '@opentelemetry/api': 1.9.0 1470 | '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) 1471 | transitivePeerDependencies: 1472 | - supports-color 1473 | 1474 | '@rollup/plugin-commonjs@28.0.3(rollup@4.39.0)': 1475 | dependencies: 1476 | '@rollup/pluginutils': 5.1.4(rollup@4.39.0) 1477 | commondir: 1.0.1 1478 | estree-walker: 2.0.2 1479 | fdir: 6.4.3(picomatch@4.0.2) 1480 | is-reference: 1.2.1 1481 | magic-string: 0.30.17 1482 | picomatch: 4.0.2 1483 | optionalDependencies: 1484 | rollup: 4.39.0 1485 | 1486 | '@rollup/plugin-inject@5.0.5(rollup@4.39.0)': 1487 | dependencies: 1488 | '@rollup/pluginutils': 5.1.4(rollup@4.39.0) 1489 | estree-walker: 2.0.2 1490 | magic-string: 0.30.17 1491 | optionalDependencies: 1492 | rollup: 4.39.0 1493 | 1494 | '@rollup/plugin-node-resolve@16.0.1(rollup@4.39.0)': 1495 | dependencies: 1496 | '@rollup/pluginutils': 5.1.4(rollup@4.39.0) 1497 | '@types/resolve': 1.20.2 1498 | deepmerge: 4.3.1 1499 | is-module: 1.0.0 1500 | resolve: 1.22.10 1501 | optionalDependencies: 1502 | rollup: 4.39.0 1503 | 1504 | '@rollup/plugin-terser@0.4.4(rollup@4.39.0)': 1505 | dependencies: 1506 | serialize-javascript: 6.0.2 1507 | smob: 1.5.0 1508 | terser: 5.37.0 1509 | optionalDependencies: 1510 | rollup: 4.39.0 1511 | 1512 | '@rollup/plugin-typescript@12.1.2(rollup@4.39.0)(tslib@2.8.1)(typescript@5.8.3)': 1513 | dependencies: 1514 | '@rollup/pluginutils': 5.1.4(rollup@4.39.0) 1515 | resolve: 1.22.10 1516 | typescript: 5.8.3 1517 | optionalDependencies: 1518 | rollup: 4.39.0 1519 | tslib: 2.8.1 1520 | 1521 | '@rollup/pluginutils@5.1.4(rollup@4.39.0)': 1522 | dependencies: 1523 | '@types/estree': 1.0.6 1524 | estree-walker: 2.0.2 1525 | picomatch: 4.0.2 1526 | optionalDependencies: 1527 | rollup: 4.39.0 1528 | 1529 | '@rollup/rollup-android-arm-eabi@4.39.0': 1530 | optional: true 1531 | 1532 | '@rollup/rollup-android-arm64@4.39.0': 1533 | optional: true 1534 | 1535 | '@rollup/rollup-darwin-arm64@4.39.0': 1536 | optional: true 1537 | 1538 | '@rollup/rollup-darwin-x64@4.39.0': 1539 | optional: true 1540 | 1541 | '@rollup/rollup-freebsd-arm64@4.39.0': 1542 | optional: true 1543 | 1544 | '@rollup/rollup-freebsd-x64@4.39.0': 1545 | optional: true 1546 | 1547 | '@rollup/rollup-linux-arm-gnueabihf@4.39.0': 1548 | optional: true 1549 | 1550 | '@rollup/rollup-linux-arm-musleabihf@4.39.0': 1551 | optional: true 1552 | 1553 | '@rollup/rollup-linux-arm64-gnu@4.39.0': 1554 | optional: true 1555 | 1556 | '@rollup/rollup-linux-arm64-musl@4.39.0': 1557 | optional: true 1558 | 1559 | '@rollup/rollup-linux-loongarch64-gnu@4.39.0': 1560 | optional: true 1561 | 1562 | '@rollup/rollup-linux-powerpc64le-gnu@4.39.0': 1563 | optional: true 1564 | 1565 | '@rollup/rollup-linux-riscv64-gnu@4.39.0': 1566 | optional: true 1567 | 1568 | '@rollup/rollup-linux-riscv64-musl@4.39.0': 1569 | optional: true 1570 | 1571 | '@rollup/rollup-linux-s390x-gnu@4.39.0': 1572 | optional: true 1573 | 1574 | '@rollup/rollup-linux-x64-gnu@4.39.0': 1575 | optional: true 1576 | 1577 | '@rollup/rollup-linux-x64-musl@4.39.0': 1578 | optional: true 1579 | 1580 | '@rollup/rollup-win32-arm64-msvc@4.39.0': 1581 | optional: true 1582 | 1583 | '@rollup/rollup-win32-ia32-msvc@4.39.0': 1584 | optional: true 1585 | 1586 | '@rollup/rollup-win32-x64-msvc@4.39.0': 1587 | optional: true 1588 | 1589 | '@sentry/core@9.11.0': {} 1590 | 1591 | '@sentry/node@9.11.0': 1592 | dependencies: 1593 | '@opentelemetry/api': 1.9.0 1594 | '@opentelemetry/context-async-hooks': 1.30.1(@opentelemetry/api@1.9.0) 1595 | '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) 1596 | '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) 1597 | '@opentelemetry/instrumentation-amqplib': 0.46.1(@opentelemetry/api@1.9.0) 1598 | '@opentelemetry/instrumentation-connect': 0.43.1(@opentelemetry/api@1.9.0) 1599 | '@opentelemetry/instrumentation-dataloader': 0.16.1(@opentelemetry/api@1.9.0) 1600 | '@opentelemetry/instrumentation-express': 0.47.1(@opentelemetry/api@1.9.0) 1601 | '@opentelemetry/instrumentation-fastify': 0.44.2(@opentelemetry/api@1.9.0) 1602 | '@opentelemetry/instrumentation-fs': 0.19.1(@opentelemetry/api@1.9.0) 1603 | '@opentelemetry/instrumentation-generic-pool': 0.43.1(@opentelemetry/api@1.9.0) 1604 | '@opentelemetry/instrumentation-graphql': 0.47.1(@opentelemetry/api@1.9.0) 1605 | '@opentelemetry/instrumentation-hapi': 0.45.2(@opentelemetry/api@1.9.0) 1606 | '@opentelemetry/instrumentation-http': 0.57.2(@opentelemetry/api@1.9.0) 1607 | '@opentelemetry/instrumentation-ioredis': 0.47.1(@opentelemetry/api@1.9.0) 1608 | '@opentelemetry/instrumentation-kafkajs': 0.7.1(@opentelemetry/api@1.9.0) 1609 | '@opentelemetry/instrumentation-knex': 0.44.1(@opentelemetry/api@1.9.0) 1610 | '@opentelemetry/instrumentation-koa': 0.47.1(@opentelemetry/api@1.9.0) 1611 | '@opentelemetry/instrumentation-lru-memoizer': 0.44.1(@opentelemetry/api@1.9.0) 1612 | '@opentelemetry/instrumentation-mongodb': 0.52.0(@opentelemetry/api@1.9.0) 1613 | '@opentelemetry/instrumentation-mongoose': 0.46.1(@opentelemetry/api@1.9.0) 1614 | '@opentelemetry/instrumentation-mysql': 0.45.1(@opentelemetry/api@1.9.0) 1615 | '@opentelemetry/instrumentation-mysql2': 0.45.2(@opentelemetry/api@1.9.0) 1616 | '@opentelemetry/instrumentation-pg': 0.51.1(@opentelemetry/api@1.9.0) 1617 | '@opentelemetry/instrumentation-redis-4': 0.46.1(@opentelemetry/api@1.9.0) 1618 | '@opentelemetry/instrumentation-tedious': 0.18.1(@opentelemetry/api@1.9.0) 1619 | '@opentelemetry/instrumentation-undici': 0.10.1(@opentelemetry/api@1.9.0) 1620 | '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) 1621 | '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) 1622 | '@opentelemetry/semantic-conventions': 1.30.0 1623 | '@prisma/instrumentation': 6.5.0(@opentelemetry/api@1.9.0) 1624 | '@sentry/core': 9.11.0 1625 | '@sentry/opentelemetry': 9.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.30.0) 1626 | import-in-the-middle: 1.13.1 1627 | transitivePeerDependencies: 1628 | - supports-color 1629 | 1630 | '@sentry/opentelemetry@9.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.30.0)': 1631 | dependencies: 1632 | '@opentelemetry/api': 1.9.0 1633 | '@opentelemetry/context-async-hooks': 1.30.1(@opentelemetry/api@1.9.0) 1634 | '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) 1635 | '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) 1636 | '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) 1637 | '@opentelemetry/semantic-conventions': 1.30.0 1638 | '@sentry/core': 9.11.0 1639 | 1640 | '@sinclair/typebox@0.27.8': {} 1641 | 1642 | '@types/connect@3.4.38': 1643 | dependencies: 1644 | '@types/node': 22.14.0 1645 | 1646 | '@types/estree@1.0.6': {} 1647 | 1648 | '@types/estree@1.0.7': {} 1649 | 1650 | '@types/mysql@2.15.26': 1651 | dependencies: 1652 | '@types/node': 22.14.0 1653 | 1654 | '@types/node@22.14.0': 1655 | dependencies: 1656 | undici-types: 6.21.0 1657 | 1658 | '@types/pg-pool@2.0.6': 1659 | dependencies: 1660 | '@types/pg': 8.6.1 1661 | 1662 | '@types/pg@8.6.1': 1663 | dependencies: 1664 | '@types/node': 22.14.0 1665 | pg-protocol: 1.8.0 1666 | pg-types: 2.2.0 1667 | 1668 | '@types/resolve@1.20.2': {} 1669 | 1670 | '@types/shimmer@1.2.0': {} 1671 | 1672 | '@types/tedious@4.0.14': 1673 | dependencies: 1674 | '@types/node': 22.14.0 1675 | 1676 | '@types/write-file-atomic@4.0.3': 1677 | dependencies: 1678 | '@types/node': 22.14.0 1679 | 1680 | '@vitest/expect@3.1.1': 1681 | dependencies: 1682 | '@vitest/spy': 3.1.1 1683 | '@vitest/utils': 3.1.1 1684 | chai: 5.2.0 1685 | tinyrainbow: 2.0.0 1686 | 1687 | '@vitest/mocker@3.1.1(vite@6.2.5(@types/node@22.14.0)(terser@5.37.0))': 1688 | dependencies: 1689 | '@vitest/spy': 3.1.1 1690 | estree-walker: 3.0.3 1691 | magic-string: 0.30.17 1692 | optionalDependencies: 1693 | vite: 6.2.5(@types/node@22.14.0)(terser@5.37.0) 1694 | 1695 | '@vitest/pretty-format@3.1.1': 1696 | dependencies: 1697 | tinyrainbow: 2.0.0 1698 | 1699 | '@vitest/runner@3.1.1': 1700 | dependencies: 1701 | '@vitest/utils': 3.1.1 1702 | pathe: 2.0.3 1703 | 1704 | '@vitest/snapshot@3.1.1': 1705 | dependencies: 1706 | '@vitest/pretty-format': 3.1.1 1707 | magic-string: 0.30.17 1708 | pathe: 2.0.3 1709 | 1710 | '@vitest/spy@3.1.1': 1711 | dependencies: 1712 | tinyspy: 3.0.2 1713 | 1714 | '@vitest/utils@3.1.1': 1715 | dependencies: 1716 | '@vitest/pretty-format': 3.1.1 1717 | loupe: 3.1.3 1718 | tinyrainbow: 2.0.0 1719 | 1720 | acorn-import-attributes@1.9.5(acorn@8.14.1): 1721 | dependencies: 1722 | acorn: 8.14.1 1723 | 1724 | acorn@8.14.0: {} 1725 | 1726 | acorn@8.14.1: {} 1727 | 1728 | ansi-styles@5.2.0: {} 1729 | 1730 | assertion-error@2.0.1: {} 1731 | 1732 | buffer-from@1.1.2: {} 1733 | 1734 | cac@6.7.14: {} 1735 | 1736 | chai@5.2.0: 1737 | dependencies: 1738 | assertion-error: 2.0.1 1739 | check-error: 2.1.1 1740 | deep-eql: 5.0.2 1741 | loupe: 3.1.3 1742 | pathval: 2.0.0 1743 | 1744 | chalk@5.4.1: {} 1745 | 1746 | check-error@2.1.1: {} 1747 | 1748 | cjs-module-lexer@1.4.3: {} 1749 | 1750 | commander@2.20.3: {} 1751 | 1752 | commondir@1.0.1: {} 1753 | 1754 | debug@4.4.0: 1755 | dependencies: 1756 | ms: 2.1.3 1757 | 1758 | deep-eql@5.0.2: {} 1759 | 1760 | deepmerge@4.3.1: {} 1761 | 1762 | domexception@4.0.0: 1763 | dependencies: 1764 | webidl-conversions: 7.0.0 1765 | 1766 | es-module-lexer@1.6.0: {} 1767 | 1768 | esbuild@0.25.2: 1769 | optionalDependencies: 1770 | '@esbuild/aix-ppc64': 0.25.2 1771 | '@esbuild/android-arm': 0.25.2 1772 | '@esbuild/android-arm64': 0.25.2 1773 | '@esbuild/android-x64': 0.25.2 1774 | '@esbuild/darwin-arm64': 0.25.2 1775 | '@esbuild/darwin-x64': 0.25.2 1776 | '@esbuild/freebsd-arm64': 0.25.2 1777 | '@esbuild/freebsd-x64': 0.25.2 1778 | '@esbuild/linux-arm': 0.25.2 1779 | '@esbuild/linux-arm64': 0.25.2 1780 | '@esbuild/linux-ia32': 0.25.2 1781 | '@esbuild/linux-loong64': 0.25.2 1782 | '@esbuild/linux-mips64el': 0.25.2 1783 | '@esbuild/linux-ppc64': 0.25.2 1784 | '@esbuild/linux-riscv64': 0.25.2 1785 | '@esbuild/linux-s390x': 0.25.2 1786 | '@esbuild/linux-x64': 0.25.2 1787 | '@esbuild/netbsd-arm64': 0.25.2 1788 | '@esbuild/netbsd-x64': 0.25.2 1789 | '@esbuild/openbsd-arm64': 0.25.2 1790 | '@esbuild/openbsd-x64': 0.25.2 1791 | '@esbuild/sunos-x64': 0.25.2 1792 | '@esbuild/win32-arm64': 0.25.2 1793 | '@esbuild/win32-ia32': 0.25.2 1794 | '@esbuild/win32-x64': 0.25.2 1795 | 1796 | estree-walker@2.0.2: {} 1797 | 1798 | estree-walker@3.0.3: 1799 | dependencies: 1800 | '@types/estree': 1.0.7 1801 | 1802 | expect-type@1.2.1: {} 1803 | 1804 | fdir@6.4.3(picomatch@4.0.2): 1805 | optionalDependencies: 1806 | picomatch: 4.0.2 1807 | 1808 | forwarded-parse@2.1.2: {} 1809 | 1810 | fsevents@2.3.3: 1811 | optional: true 1812 | 1813 | function-bind@1.1.2: {} 1814 | 1815 | hasown@2.0.2: 1816 | dependencies: 1817 | function-bind: 1.1.2 1818 | 1819 | import-in-the-middle@1.13.1: 1820 | dependencies: 1821 | acorn: 8.14.1 1822 | acorn-import-attributes: 1.9.5(acorn@8.14.1) 1823 | cjs-module-lexer: 1.4.3 1824 | module-details-from-path: 1.0.3 1825 | 1826 | imurmurhash@0.1.4: {} 1827 | 1828 | is-core-module@2.16.1: 1829 | dependencies: 1830 | hasown: 2.0.2 1831 | 1832 | is-module@1.0.0: {} 1833 | 1834 | is-reference@1.2.1: 1835 | dependencies: 1836 | '@types/estree': 1.0.6 1837 | 1838 | js-tokens@4.0.0: 1839 | optional: true 1840 | 1841 | loupe@3.1.3: {} 1842 | 1843 | magic-string@0.30.17: 1844 | dependencies: 1845 | '@jridgewell/sourcemap-codec': 1.5.0 1846 | 1847 | module-details-from-path@1.0.3: {} 1848 | 1849 | ms@2.1.3: {} 1850 | 1851 | nanoid@3.3.11: {} 1852 | 1853 | path-parse@1.0.7: {} 1854 | 1855 | pathe@2.0.3: {} 1856 | 1857 | pathval@2.0.0: {} 1858 | 1859 | pg-int8@1.0.1: {} 1860 | 1861 | pg-protocol@1.8.0: {} 1862 | 1863 | pg-types@2.2.0: 1864 | dependencies: 1865 | pg-int8: 1.0.1 1866 | postgres-array: 2.0.0 1867 | postgres-bytea: 1.0.0 1868 | postgres-date: 1.0.7 1869 | postgres-interval: 1.2.0 1870 | 1871 | picocolors@1.1.1: {} 1872 | 1873 | picomatch@4.0.2: {} 1874 | 1875 | postcss@8.5.3: 1876 | dependencies: 1877 | nanoid: 3.3.11 1878 | picocolors: 1.1.1 1879 | source-map-js: 1.2.1 1880 | 1881 | postgres-array@2.0.0: {} 1882 | 1883 | postgres-bytea@1.0.0: {} 1884 | 1885 | postgres-date@1.0.7: {} 1886 | 1887 | postgres-interval@1.2.0: 1888 | dependencies: 1889 | xtend: 4.0.2 1890 | 1891 | pretty-format@29.7.0: 1892 | dependencies: 1893 | '@jest/schemas': 29.6.3 1894 | ansi-styles: 5.2.0 1895 | react-is: 18.3.1 1896 | 1897 | randombytes@2.1.0: 1898 | dependencies: 1899 | safe-buffer: 5.2.1 1900 | 1901 | react-is@18.3.1: {} 1902 | 1903 | require-in-the-middle@7.5.2: 1904 | dependencies: 1905 | debug: 4.4.0 1906 | module-details-from-path: 1.0.3 1907 | resolve: 1.22.10 1908 | transitivePeerDependencies: 1909 | - supports-color 1910 | 1911 | resolve@1.22.10: 1912 | dependencies: 1913 | is-core-module: 2.16.1 1914 | path-parse: 1.0.7 1915 | supports-preserve-symlinks-flag: 1.0.0 1916 | 1917 | rollup-plugin-dts@6.2.1(rollup@4.39.0)(typescript@5.8.3): 1918 | dependencies: 1919 | magic-string: 0.30.17 1920 | rollup: 4.39.0 1921 | typescript: 5.8.3 1922 | optionalDependencies: 1923 | '@babel/code-frame': 7.26.2 1924 | 1925 | rollup-plugin-polyfill-node@0.13.0(rollup@4.39.0): 1926 | dependencies: 1927 | '@rollup/plugin-inject': 5.0.5(rollup@4.39.0) 1928 | rollup: 4.39.0 1929 | 1930 | rollup@4.39.0: 1931 | dependencies: 1932 | '@types/estree': 1.0.7 1933 | optionalDependencies: 1934 | '@rollup/rollup-android-arm-eabi': 4.39.0 1935 | '@rollup/rollup-android-arm64': 4.39.0 1936 | '@rollup/rollup-darwin-arm64': 4.39.0 1937 | '@rollup/rollup-darwin-x64': 4.39.0 1938 | '@rollup/rollup-freebsd-arm64': 4.39.0 1939 | '@rollup/rollup-freebsd-x64': 4.39.0 1940 | '@rollup/rollup-linux-arm-gnueabihf': 4.39.0 1941 | '@rollup/rollup-linux-arm-musleabihf': 4.39.0 1942 | '@rollup/rollup-linux-arm64-gnu': 4.39.0 1943 | '@rollup/rollup-linux-arm64-musl': 4.39.0 1944 | '@rollup/rollup-linux-loongarch64-gnu': 4.39.0 1945 | '@rollup/rollup-linux-powerpc64le-gnu': 4.39.0 1946 | '@rollup/rollup-linux-riscv64-gnu': 4.39.0 1947 | '@rollup/rollup-linux-riscv64-musl': 4.39.0 1948 | '@rollup/rollup-linux-s390x-gnu': 4.39.0 1949 | '@rollup/rollup-linux-x64-gnu': 4.39.0 1950 | '@rollup/rollup-linux-x64-musl': 4.39.0 1951 | '@rollup/rollup-win32-arm64-msvc': 4.39.0 1952 | '@rollup/rollup-win32-ia32-msvc': 4.39.0 1953 | '@rollup/rollup-win32-x64-msvc': 4.39.0 1954 | fsevents: 2.3.3 1955 | 1956 | safe-buffer@5.2.1: {} 1957 | 1958 | semver@7.7.1: {} 1959 | 1960 | serialize-javascript@6.0.2: 1961 | dependencies: 1962 | randombytes: 2.1.0 1963 | 1964 | shimmer@1.2.1: {} 1965 | 1966 | siginfo@2.0.0: {} 1967 | 1968 | signal-exit@4.1.0: {} 1969 | 1970 | smob@1.5.0: {} 1971 | 1972 | source-map-js@1.2.1: {} 1973 | 1974 | source-map-support@0.5.21: 1975 | dependencies: 1976 | buffer-from: 1.1.2 1977 | source-map: 0.6.1 1978 | 1979 | source-map@0.6.1: {} 1980 | 1981 | stackback@0.0.2: {} 1982 | 1983 | std-env@3.9.0: {} 1984 | 1985 | supports-preserve-symlinks-flag@1.0.0: {} 1986 | 1987 | terser@5.37.0: 1988 | dependencies: 1989 | '@jridgewell/source-map': 0.3.6 1990 | acorn: 8.14.0 1991 | commander: 2.20.3 1992 | source-map-support: 0.5.21 1993 | 1994 | tinybench@2.9.0: {} 1995 | 1996 | tinyexec@0.3.2: {} 1997 | 1998 | tinypool@1.0.2: {} 1999 | 2000 | tinyrainbow@2.0.0: {} 2001 | 2002 | tinyspy@3.0.2: {} 2003 | 2004 | tslib@2.8.1: {} 2005 | 2006 | typescript@5.8.3: {} 2007 | 2008 | undici-types@6.21.0: {} 2009 | 2010 | vite-node@3.1.1(@types/node@22.14.0)(terser@5.37.0): 2011 | dependencies: 2012 | cac: 6.7.14 2013 | debug: 4.4.0 2014 | es-module-lexer: 1.6.0 2015 | pathe: 2.0.3 2016 | vite: 6.2.5(@types/node@22.14.0)(terser@5.37.0) 2017 | transitivePeerDependencies: 2018 | - '@types/node' 2019 | - jiti 2020 | - less 2021 | - lightningcss 2022 | - sass 2023 | - sass-embedded 2024 | - stylus 2025 | - sugarss 2026 | - supports-color 2027 | - terser 2028 | - tsx 2029 | - yaml 2030 | 2031 | vite@6.2.5(@types/node@22.14.0)(terser@5.37.0): 2032 | dependencies: 2033 | esbuild: 0.25.2 2034 | postcss: 8.5.3 2035 | rollup: 4.39.0 2036 | optionalDependencies: 2037 | '@types/node': 22.14.0 2038 | fsevents: 2.3.3 2039 | terser: 5.37.0 2040 | 2041 | vitest-fetch-mock@0.4.5(vitest@3.1.1(@types/node@22.14.0)(terser@5.37.0)): 2042 | dependencies: 2043 | vitest: 3.1.1(@types/node@22.14.0)(terser@5.37.0) 2044 | 2045 | vitest@3.1.1(@types/node@22.14.0)(terser@5.37.0): 2046 | dependencies: 2047 | '@vitest/expect': 3.1.1 2048 | '@vitest/mocker': 3.1.1(vite@6.2.5(@types/node@22.14.0)(terser@5.37.0)) 2049 | '@vitest/pretty-format': 3.1.1 2050 | '@vitest/runner': 3.1.1 2051 | '@vitest/snapshot': 3.1.1 2052 | '@vitest/spy': 3.1.1 2053 | '@vitest/utils': 3.1.1 2054 | chai: 5.2.0 2055 | debug: 4.4.0 2056 | expect-type: 1.2.1 2057 | magic-string: 0.30.17 2058 | pathe: 2.0.3 2059 | std-env: 3.9.0 2060 | tinybench: 2.9.0 2061 | tinyexec: 0.3.2 2062 | tinypool: 1.0.2 2063 | tinyrainbow: 2.0.0 2064 | vite: 6.2.5(@types/node@22.14.0)(terser@5.37.0) 2065 | vite-node: 3.1.1(@types/node@22.14.0)(terser@5.37.0) 2066 | why-is-node-running: 2.3.0 2067 | optionalDependencies: 2068 | '@types/node': 22.14.0 2069 | transitivePeerDependencies: 2070 | - jiti 2071 | - less 2072 | - lightningcss 2073 | - msw 2074 | - sass 2075 | - sass-embedded 2076 | - stylus 2077 | - sugarss 2078 | - supports-color 2079 | - terser 2080 | - tsx 2081 | - yaml 2082 | 2083 | webidl-conversions@7.0.0: {} 2084 | 2085 | why-is-node-running@2.3.0: 2086 | dependencies: 2087 | siginfo: 2.0.0 2088 | stackback: 0.0.2 2089 | 2090 | write-file-atomic@6.0.0: 2091 | dependencies: 2092 | imurmurhash: 0.1.4 2093 | signal-exit: 4.1.0 2094 | 2095 | xtend@4.0.2: {} 2096 | -------------------------------------------------------------------------------- /rollup.config.mjs: -------------------------------------------------------------------------------- 1 | import typescript from "@rollup/plugin-typescript"; 2 | import commonjs from "@rollup/plugin-commonjs"; 3 | import resolve from '@rollup/plugin-node-resolve' 4 | import terser from "@rollup/plugin-terser"; 5 | import nodePolyfills from "rollup-plugin-polyfill-node"; 6 | import dts from "rollup-plugin-dts"; 7 | 8 | import pkg from "./package.json"; 9 | 10 | export default [ 11 | { 12 | input: "src/index.ts", 13 | output: [ 14 | { 15 | file: pkg.main, 16 | format: "cjs", 17 | sourcemap: false, 18 | }, 19 | { 20 | file: pkg.module, 21 | format: "es", 22 | sourcemap: false, 23 | }, 24 | ], 25 | plugins: [ 26 | typescript({ 27 | tsconfig: "./tsconfig.build.json", 28 | sourceMap: false, 29 | }), 30 | resolve(), 31 | commonjs({ 32 | include: ["./node_modules/**"], 33 | }), 34 | nodePolyfills(), 35 | terser(), 36 | ], 37 | external: [ 38 | "fs", 39 | "util", 40 | "path", 41 | "node-fetch", 42 | "child_process", 43 | "domain", 44 | ], 45 | }, 46 | { 47 | input: "./lib/types/index.d.ts", 48 | output: [{ file: pkg.types, format: "es" }], 49 | plugins: [dts.default()], 50 | }, 51 | ]; 52 | -------------------------------------------------------------------------------- /scripts/test.ts: -------------------------------------------------------------------------------- 1 | import { apiWithLog } from '../src/apiWithLog'; 2 | 3 | 4 | const run = async () => { 5 | const url = 'https://cat-fact.herokuapp.com/facts' 6 | await apiWithLog(url); 7 | }; 8 | 9 | (async () => { 10 | try { 11 | await run(); 12 | } catch (err) { 13 | // eslint-disable-next-line 14 | console.log({ 15 | err, 16 | }); 17 | process.exit(1); 18 | } 19 | 20 | process.exit(0); 21 | })(); 22 | -------------------------------------------------------------------------------- /src/__tests__/apiWithLog.spec.ts: -------------------------------------------------------------------------------- 1 | import { beforeEach, expect, it, vi } from 'vitest'; 2 | import DOMException from 'domexception'; 3 | import 'vitest-fetch-mock'; 4 | 5 | import { apiWithLog } from '../apiWithLog.ts'; 6 | import { jsonOrText } from '../jsonOrText.ts'; 7 | import {cleanupTest} from '../../testutils/cleanupTest'; 8 | 9 | global.DOMException = DOMException; 10 | 11 | beforeEach(cleanupTest); 12 | 13 | it('should call apiWithLog', async () => { 14 | vi.useFakeTimers(); 15 | 16 | // /oauth/token 17 | fetchMock.mockResponseOnce( 18 | JSON.stringify({ 19 | items: [], 20 | }), 21 | ); 22 | 23 | const url = 'http://localhost:5001/api/openpix/v1/charge'; 24 | 25 | const options = { 26 | headers: { 27 | Accept: 'application/json', 28 | 'Content-Type': 'application/json', 29 | }, 30 | }; 31 | 32 | const response = await apiWithLog(url, options); 33 | 34 | const data = await jsonOrText(response); 35 | 36 | expect(response.ok).toBe(true); 37 | 38 | expect(data).toEqual({ 39 | items: [], 40 | }); 41 | }); -------------------------------------------------------------------------------- /src/apiCache.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs'; 2 | import path from 'path'; 3 | import util from 'util'; 4 | import writeFileAtomicCallback from 'write-file-atomic'; 5 | 6 | import { cloneResponse } from './cloneResponse.ts'; 7 | import { debugConsole } from './debugConsole.ts'; 8 | import { getCurl } from './getCurl.ts'; 9 | 10 | const readFile = util.promisify(fs.readFile); 11 | const writeFile = util.promisify(fs.writeFile); 12 | const writeFileAtomic = util.promisify(writeFileAtomicCallback); 13 | 14 | const cwd = process.cwd(); 15 | const dirPath = 'mock-requests.json'; 16 | const output = path.join(cwd, dirPath); 17 | 18 | export const getRequestKey = (init: string | URL | globalThis.Request, options: RequestInit) => { 19 | if (!options?.body) { 20 | return `${options.method}:${init}`; 21 | } 22 | 23 | return `${options.method}:${init}:${JSON.stringify(options.body)}`; 24 | }; 25 | 26 | export const saveRequestMock = async ( 27 | init: string | URL | globalThis.Request, 28 | options: RequestInit, 29 | text: string, 30 | response: Response, 31 | ) => { 32 | if (process.env.WRITE_MOCK !== 'true') { 33 | return; 34 | } 35 | 36 | // only save ok requests 200 37 | if (!response.ok) { 38 | return; 39 | } 40 | 41 | const requestKey = getRequestKey(init, options); 42 | 43 | let dataString = null; 44 | 45 | try { 46 | if (fs.existsSync(output)) { 47 | dataString = await readFile(output, 'utf8'); 48 | console.log(dataString); 49 | } else { 50 | await writeFile(output, ''); 51 | } 52 | } catch (err) { 53 | // eslint-disable-next-line 54 | console.log({ err }); 55 | } 56 | 57 | try { 58 | const currentMock = dataString ? JSON.parse(dataString) : {}; 59 | 60 | const newRequest = { 61 | text, 62 | response: { 63 | status: response.status, 64 | statusText: response.statusText, 65 | headers: response.headers, 66 | ok: response?.ok, 67 | size: response?.size, 68 | url: response?.url, 69 | }, 70 | }; 71 | 72 | const newMock = { 73 | ...currentMock, 74 | [requestKey]: newRequest, 75 | }; 76 | 77 | const newMockString = JSON.stringify(newMock); 78 | 79 | await writeFileAtomic(output, newMockString); 80 | 81 | //eslint-disable-next-line 82 | console.log(`saved to ${output}`); 83 | } catch (err) { 84 | // eslint-disable-next-line 85 | console.log({ err }); 86 | } 87 | }; 88 | 89 | export const getRequestMock = async ( 90 | init: string | URL | globalThis.Request, 91 | options: RequestInit, 92 | ) => { 93 | if (process.env.USE_MOCK !== 'true') { 94 | return; 95 | } 96 | 97 | const requestKey = getRequestKey(init, options); 98 | 99 | try { 100 | const dataString = await readFile(output, 'utf8'); 101 | 102 | if (!dataString) { 103 | return null; 104 | } 105 | 106 | const currentMock = JSON.parse(dataString); 107 | 108 | const mock = currentMock[requestKey]; 109 | 110 | if (!mock) { 111 | return null; 112 | } 113 | 114 | const { text, response } = mock; 115 | 116 | const { responseCopy } = await cloneResponse(response, text); 117 | 118 | // eslint-disable-next-line 119 | console.log('mock-cache: ', requestKey); 120 | 121 | const isDebug = ['true', 'api', '*'].includes(process.env.DEBUG); 122 | 123 | if (isDebug) { 124 | // eslint-disable-next-line 125 | const { agent, ...optionsWithoutAgent } = options; 126 | 127 | const curl = getCurl(init, options); 128 | 129 | const getBody = () => { 130 | let json = null; 131 | 132 | try { 133 | json = JSON.parse(text); 134 | } catch (err) {} 135 | 136 | if (json) { 137 | return { 138 | json, 139 | }; 140 | } 141 | 142 | return { 143 | text, 144 | }; 145 | }; 146 | 147 | // eslint-disable-next-line 148 | debugConsole({ 149 | init, 150 | options: optionsWithoutAgent, 151 | ...getBody(), 152 | ok: response.ok, 153 | status: response.status, 154 | curl, 155 | }); 156 | } 157 | 158 | return responseCopy; 159 | } catch (err) { 160 | // eslint-disable-next-line 161 | console.log({ err }); 162 | } 163 | 164 | return null; 165 | }; 166 | -------------------------------------------------------------------------------- /src/apiDebug.ts: -------------------------------------------------------------------------------- 1 | import chalk from 'chalk'; 2 | 3 | import { getCurl } from './getCurl.ts'; 4 | import { debugConsole } from './debugConsole.ts'; 5 | import { ignoredHeaders } from './logSecurity.ts'; 6 | import zlib from 'node:zlib'; 7 | import { sanitizeBody } from './sanitizeBody.ts'; 8 | 9 | const getCleanBody = (options: RequestInit): { body?: string } => { 10 | if (!options.body) { 11 | return {}; 12 | } 13 | 14 | if (options.headers) { 15 | if (options.headers['X-Woovi-Proxy'] === 'true') { 16 | try { 17 | const result = zlib.gunzipSync(options.body); 18 | 19 | const parsed = JSON.parse(result.toString()); 20 | 21 | const body = zlib.gunzipSync(Buffer.from(parsed.body)); 22 | 23 | return { 24 | body: JSON.stringify({ 25 | ...parsed, 26 | body: body.toString(), 27 | }), 28 | }; 29 | } catch (e) { 30 | // ignore 31 | } 32 | } 33 | 34 | if (options.headers['Content-Encoding'] === 'gzip') { 35 | try { 36 | const result = zlib.gunzipSync(options.body); 37 | 38 | return { 39 | body: result.toString(), 40 | }; 41 | } catch (e) { 42 | // ignore 43 | } 44 | } 45 | } 46 | 47 | if (typeof options.body === 'string') { 48 | return { 49 | body: sanitizeBody(options.body), 50 | }; 51 | } 52 | 53 | return { 54 | body: options.body, 55 | }; 56 | }; 57 | 58 | type ApiDebug = { 59 | init: string | URL | globalThis.Request; 60 | options: RequestInit; 61 | durationTime: number; 62 | getBody: () => Record; 63 | response: Response; 64 | }; 65 | export const apiDebug = async ({ 66 | init, 67 | options, 68 | durationTime, 69 | getBody, 70 | response, 71 | }: ApiDebug) => { 72 | const isDebug = ['true', 'api', '*'].includes(process.env.DEBUG); 73 | 74 | if (!isDebug) { 75 | return; 76 | } 77 | 78 | // eslint-disable-next-line 79 | const { agent, dispatcher, headers, ...optionsWithoutAgent } = options; 80 | 81 | const cleanHeaders = Object.keys(headers || {}).reduce((acc, key) => { 82 | if (!headers || ignoredHeaders.includes(key)) { 83 | return acc; 84 | } 85 | 86 | return { 87 | ...acc, 88 | [key]: (headers as Record)[key], 89 | }; 90 | }, {}); 91 | 92 | const cleanOptions = { 93 | ...optionsWithoutAgent, 94 | headers: cleanHeaders, 95 | ...getCleanBody(options), 96 | }; 97 | 98 | const responseHeaders = Object.fromEntries(response.headers.entries()); 99 | 100 | const curl = getCurl(init, options); 101 | // eslint-disable-next-line 102 | console.log(chalk.yellow(options.method || 'GET'), chalk.blue(init)); 103 | // eslint-disable-next-line 104 | debugConsole({ 105 | time: `${durationTime}ms`, 106 | init, 107 | agent: !!agent, 108 | dispatcher: !!dispatcher, 109 | options: cleanOptions, 110 | // text, 111 | // json, 112 | ...getBody(), 113 | ok: response.ok, 114 | status: response.status, 115 | responseHeaders, 116 | curl, 117 | }); 118 | }; 119 | -------------------------------------------------------------------------------- /src/apiWithLog.ts: -------------------------------------------------------------------------------- 1 | import chalk from 'chalk'; 2 | import { cloneResponse } from './cloneResponse.ts'; 3 | import { timeSpan } from './timeSpan.ts'; 4 | import { apiDebug }from './apiDebug.ts'; 5 | import { getRequestMock, saveRequestMock } from './apiCache.ts'; 6 | import {createResponse} from './createResponse.ts'; 7 | import {getCurl} from './getCurl.ts'; 8 | import {getDebug} from './getDebug.ts'; 9 | 10 | const debug = getDebug('api'); 11 | 12 | type RequestOptions = RequestInit & { 13 | shouldReport?: boolean; 14 | }; 15 | 16 | export const apiWithLog = async ( 17 | init: string | URL | globalThis.Request, 18 | optionsApi: RequestOptions = { method: 'GET' }, 19 | ): Promise => { 20 | const end = timeSpan(); 21 | 22 | const options = { 23 | ...optionsApi, 24 | headers: { 25 | ...(optionsApi.headers || {}), 26 | 'user-agent': 'node-fetch', 27 | }, 28 | }; 29 | 30 | const requestMock = await getRequestMock(init, options); 31 | 32 | if (requestMock) { 33 | return requestMock; 34 | } 35 | 36 | return fetch(init, options).then(async (response) => { 37 | const durationTime = end(); 38 | 39 | const text = await response.text(); 40 | 41 | let json: any = null; 42 | 43 | try { 44 | json = JSON.parse(text); 45 | } catch (err) { 46 | // eslint-disable-next-line 47 | } 48 | 49 | const getBody = (): Record => { 50 | if (json) { 51 | return { 52 | json, 53 | }; 54 | } 55 | 56 | return { 57 | text, 58 | }; 59 | }; 60 | 61 | await saveRequestMock(init, options, text, response); 62 | 63 | await apiDebug({ 64 | init, 65 | options, 66 | durationTime, 67 | getBody, 68 | response, 69 | }); 70 | 71 | const { responseCopy } = await cloneResponse(response, text); 72 | 73 | return responseCopy; 74 | }).catch(async (error) => { 75 | const body = { 76 | error: error?.message, 77 | }; 78 | 79 | // FetchError is more related to 5xx 80 | const createdResponse = await createResponse( 81 | { 82 | status: 502, 83 | ok: false, 84 | }, 85 | body, 86 | ); 87 | 88 | const curl = getCurl(init, options); 89 | // eslint-disable-next-line 90 | debug(chalk.yellow(options.method), chalk.blue(init)); 91 | 92 | debug.inspect({ 93 | init, 94 | body, 95 | ok: createdResponse.ok, 96 | status: createdResponse.status, 97 | curl, 98 | }); 99 | 100 | return createdResponse; 101 | }); 102 | }; 103 | -------------------------------------------------------------------------------- /src/cloneResponse.ts: -------------------------------------------------------------------------------- 1 | // This function clone the response consume your body and return the same response 2 | // `clone()` is broken in `node-fetch` and results in a stalled Promise 3 | // for responses above a certain size threshold. So construct a similar 4 | // clone ourselves... 5 | type CloneResponse = { 6 | responseCopy: Response; 7 | text: string; 8 | json: string; 9 | }; 10 | 11 | export const cloneResponse = async ( 12 | response: Response, 13 | responseText?: string | null, 14 | ): Promise => { 15 | const text = responseText ?? (await response.text()); 16 | 17 | let json = null; 18 | 19 | try { 20 | json = JSON.parse(text); 21 | } catch (err) { 22 | // eslint-disable-next-line 23 | } 24 | 25 | // eslint-disable-next-line 26 | // @ts-ignore 27 | const ResponseConstructor = fetch.Response || global.Response || response.constructor; 28 | 29 | const body = response.status === 204 ? null : text; 30 | 31 | const responseCopy = new ResponseConstructor(body, { 32 | status: response.status, 33 | statusText: response.statusText, 34 | headers: response.headers, 35 | // These are not spec-compliant `Response` options, but `node-fetch` 36 | // has them. 37 | ok: response?.ok, 38 | size: response?.size, 39 | url: response?.url, 40 | }); 41 | 42 | return { 43 | responseCopy, 44 | text, 45 | json, 46 | }; 47 | }; 48 | -------------------------------------------------------------------------------- /src/createResponse.ts: -------------------------------------------------------------------------------- 1 | export const createResponse = async ( 2 | options: Response, 3 | body?: Record, 4 | ): Promise => { 5 | const Response = fetch.Response || global.Response || options.constructor; 6 | 7 | const responseOptions = { 8 | status: options.status, 9 | statusText: options.statusText, 10 | headers: options.headers, 11 | ok: options.ok, 12 | size: options.size, 13 | url: options.url, 14 | }; 15 | 16 | const getResponseBody = () => { 17 | if (options?.status === 204) { 18 | return null; 19 | } 20 | 21 | if (body) { 22 | return JSON.stringify(body); 23 | } 24 | 25 | return JSON.stringify(responseOptions); 26 | } 27 | 28 | const responseBody = getResponseBody(); 29 | 30 | try { 31 | return new Response(responseBody, responseOptions); 32 | } catch (error) { 33 | return responseOptions; 34 | } 35 | }; 36 | -------------------------------------------------------------------------------- /src/dataResponse.ts: -------------------------------------------------------------------------------- 1 | // fix @tagged-union 2 | export type DataResponse = T extends false 3 | ? { 4 | data: T; 5 | response: Response; 6 | } 7 | : T extends string 8 | ? { data: T; message: T; response: Response } 9 | : T & { response: Response }; 10 | 11 | // bind response to data 12 | export const dataResponse = ( 13 | data: T, 14 | response: Response, 15 | ): DataResponse => { 16 | if (!data) { 17 | return { 18 | data, 19 | response, 20 | } as DataResponse; 21 | } 22 | 23 | if (typeof data === 'string') { 24 | return { 25 | data, 26 | message: data, 27 | response, 28 | } as DataResponse; 29 | } 30 | 31 | data.response = response; 32 | 33 | return data as DataResponse; 34 | }; 35 | 36 | export const dataResponseRemove = (data: T) => { 37 | if (!data?.response) { 38 | return data; 39 | } 40 | 41 | // eslint-disable-next-line 42 | const { response, ...restData } = data; 43 | 44 | return restData; 45 | }; 46 | -------------------------------------------------------------------------------- /src/dataResponseResult.ts: -------------------------------------------------------------------------------- 1 | export type DataResponseResult = 2 | | { 3 | ok: true; 4 | response: globalThis.Response; 5 | data: TData; 6 | } 7 | | { 8 | ok: false; 9 | response: globalThis.Response; 10 | data: TError; 11 | }; 12 | 13 | export const dataResponseResult = ( 14 | data: TData | TError, 15 | response: globalThis.Response, 16 | ): DataResponseResult => { 17 | if (!response.ok) { 18 | return { 19 | ok: false, 20 | data: data as TError, 21 | response: response, 22 | }; 23 | } 24 | 25 | return { 26 | ok: true, 27 | data: data as TData, 28 | response: response, 29 | }; 30 | }; 31 | -------------------------------------------------------------------------------- /src/debugConsole.ts: -------------------------------------------------------------------------------- 1 | import util from 'util'; 2 | // import prettyFormat from 'pretty-format'; 3 | 4 | export const debugConsole = (obj: Record) => { 5 | // eslint-disable-next-line 6 | console.log( 7 | util.inspect(obj, { 8 | showHidden: false, 9 | depth: null, 10 | colors: true, 11 | showProxy: false, 12 | }), 13 | ); 14 | // eslint-disable-next-line 15 | // console.log(prettyFormat(obj)); 16 | }; 17 | -------------------------------------------------------------------------------- /src/filterPassword.ts: -------------------------------------------------------------------------------- 1 | export const blocklist = [ 2 | 'password', 3 | 'newPassword', 4 | 'transational_password', 5 | 'client_secret', 6 | 'expMonth', 7 | 'expYear', 8 | 'cvv', 9 | 'number', 10 | 'AccessToken', 11 | 'Api-Access-Key', 12 | 'Authorization', 13 | ]; 14 | 15 | export const filterPassword = ( 16 | obj: Record | null, 17 | ): Record => { 18 | if (!obj) { 19 | return obj; 20 | } 21 | 22 | return Object.keys(obj).reduce((acc, key) => { 23 | const value = obj[key]; 24 | 25 | if (Array.isArray(value)) { 26 | return { 27 | ...acc, 28 | [key]: value, 29 | }; 30 | } 31 | 32 | if (typeof value === 'object') { 33 | const sanitize = filterPassword(value); 34 | 35 | return { 36 | ...acc, 37 | [key]: sanitize, 38 | }; 39 | } 40 | 41 | if (blocklist.includes(key)) { 42 | return { 43 | ...acc, 44 | [key]: '********', 45 | }; 46 | } 47 | 48 | return { 49 | ...acc, 50 | [key]: value, 51 | }; 52 | }, {}); 53 | }; 54 | -------------------------------------------------------------------------------- /src/getCurl.ts: -------------------------------------------------------------------------------- 1 | import zlib from 'node:zlib'; 2 | 3 | export const ignoredHeaders = [ 4 | 'host', 5 | 'method', 6 | 'path', 7 | 'scheme', 8 | 'version', 9 | 'Api-Access-Key', 10 | 'Authorization', 11 | ]; 12 | 13 | /** 14 | * see https://fetch.spec.whatwg.org/#methods 15 | * 16 | * @export 17 | * @param {any} options 18 | * @returns {string} 19 | */ 20 | export const generateMethod = (options: Request | RequestInit): string => { 21 | const method = options.method; 22 | 23 | if (!method) return ''; 24 | 25 | const type: Record = { 26 | GET: ' -X GET', 27 | POST: ' -X POST', 28 | PUT: ' -X PUT', 29 | PATCH: ' -X PATCH', 30 | DELETE: ' -X DELETE', 31 | HEAD: ' -X HEAD', 32 | OPTIONS: ' -X OPTIONS', 33 | }; 34 | 35 | return type[method.toUpperCase()] || ''; 36 | }; 37 | 38 | /** 39 | * @export 40 | * @param {any} val 41 | * @returns true if the envirtonment supports Headers and val is of instance Headers 42 | */ 43 | export const isInstanceOfHeaders = (val: any): val is Headers => { 44 | if (typeof Headers !== 'function') { 45 | /** 46 | * Environment does not support the Headers constructor 47 | * old internet explorer? 48 | */ 49 | return false; 50 | } 51 | 52 | return val instanceof Headers; 53 | }; 54 | 55 | /** 56 | * @typedef {Object} HeaderParams 57 | * @property {Boolean} isEncode - A flag which is set to true if the request should set the --compressed flag 58 | * @property {String} params - The header params as string 59 | */ 60 | 61 | const getHeaderString = (name: string, val: string) => { 62 | if (!val) { 63 | return ''; 64 | } 65 | 66 | return ` -H "${name}: ${val.replace(/(\\|")/g, '\\$1')}"`; 67 | }; 68 | 69 | /** 70 | * @export 71 | * @param {object={}} options 72 | * @param {object|Headers} options.headers 73 | * @returns {HeaderParams} An Object with the header info 74 | */ 75 | export const generateHeader = (options = {} as any) => { 76 | const { headers } = options; 77 | 78 | let isEncode = false; 79 | let headerParam = ''; 80 | 81 | if (isInstanceOfHeaders(headers)) { 82 | headers.forEach((val: string, name: string) => { 83 | if (ignoredHeaders.indexOf(name) === -1) { 84 | if (name.toLocaleLowerCase() !== 'content-length') { 85 | headerParam += getHeaderString(name, val); 86 | } 87 | 88 | if (name.toLocaleLowerCase() === 'accept-encoding') { 89 | isEncode = true; 90 | } 91 | } 92 | }); 93 | } else if (headers) { 94 | Object.keys(headers) 95 | .filter((name) => ignoredHeaders.indexOf(name) === -1) 96 | .map((name) => { 97 | if (name.toLocaleLowerCase() !== 'content-length') { 98 | headerParam += getHeaderString(name, headers[name]); 99 | } 100 | 101 | if (name.toLocaleLowerCase() === 'accept-encoding') { 102 | isEncode = true; 103 | } 104 | }); 105 | } 106 | 107 | return { 108 | params: headerParam, 109 | isEncode, 110 | }; 111 | }; 112 | 113 | /** 114 | * 115 | * 116 | * @export 117 | * @param {Object} body 118 | * @returns {string} 119 | */ 120 | export function generateBody(body: string | object | null | undefined, options: RequestInit): string { 121 | if (!body) return ''; 122 | 123 | if (options.headers) { 124 | if (options.headers['Content-Encoding'] === 'gzip') { 125 | if (Buffer.isBuffer(body)) { 126 | try { 127 | const result = zlib.gunzipSync(body); 128 | 129 | if (options.headers['X-Woovi-Proxy'] === 'true') { 130 | const parsed = JSON.parse(result.toString()); 131 | 132 | const resultBody = zlib.gunzipSync(Buffer.from(parsed.body)); 133 | 134 | const bodyParsed = { 135 | ...parsed, 136 | body: resultBody.toString(), 137 | }; 138 | 139 | return ` --data-binary '${JSON.stringify(bodyParsed)}'`; 140 | } 141 | 142 | return ` --data-binary '${result.toString()}'`; 143 | } catch (e) { 144 | // ignore 145 | } 146 | } 147 | 148 | // parse string and gunzip body 149 | try { 150 | const parsed = JSON.parse(body); 151 | 152 | let result; 153 | 154 | if (parsed.body) { 155 | if (parsed.body.type) { 156 | try { 157 | result = zlib.gunzipSync(parsed.body.data); 158 | } catch (e) { 159 | // ignore 160 | } 161 | } 162 | } 163 | 164 | if (result) { 165 | return ` --data-binary '${result.toString()}'`; 166 | } 167 | } catch (e) {} 168 | } 169 | } 170 | 171 | if (typeof body === 'object') { 172 | if (body.hasOwnProperty('has')) { 173 | return ` --data-urlencode '${body.toString()}'`; 174 | } 175 | 176 | return ` --data-binary '${JSON.stringify(body)}'`; 177 | } 178 | 179 | return ` --data-binary '${body}'`; 180 | } 181 | 182 | /** 183 | * 184 | * 185 | * @export 186 | * @param {boolean} isEncode 187 | * @return {string} 188 | */ 189 | export function generateCompress(isEncode: boolean): string { 190 | return isEncode ? ' --compressed' : ''; 191 | } 192 | 193 | /** 194 | * 195 | * 196 | * @export 197 | * @param {string|object} init 198 | * @param {object={}} requestInit 199 | */ 200 | export const getCurl = (init: Request, requestInit: RequestInit) => { 201 | let url; 202 | let options; 203 | 204 | /** 205 | * initialization with an empty object is done here to 206 | * keep everything backwards compatible to 0.4.0 and below 207 | */ 208 | if (typeof init === 'string') { 209 | url = init; 210 | options = requestInit || {}; 211 | } else { 212 | url = (init || {}).url; 213 | options = init || {}; 214 | } 215 | 216 | const { body } = options; 217 | const headers = generateHeader(options); 218 | 219 | return `curl '${url}'${generateMethod(options)}${ 220 | headers.params || '' 221 | }${generateBody(body, options)}${generateCompress(headers.isEncode)}`; 222 | }; 223 | -------------------------------------------------------------------------------- /src/getDebug.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * DEBUG=api,worker pnpm graphql 3 | * const debug = getDebug('api'); 4 | * 5 | * debug('message'); // api message 6 | * debug.inspect(obj); // api { obj } 7 | */ 8 | import {debugConsole} from './debugConsole.ts'; 9 | 10 | 11 | const getDebugLogs = () => { 12 | const logs = process.env.DEBUG?.split(',') || []; 13 | 14 | return logs; 15 | }; 16 | 17 | const isLogEnabled = (name = '*') => { 18 | const logs = getDebugLogs(); 19 | 20 | return logs.includes(name) || logs.includes('*') || logs.includes('true'); 21 | }; 22 | 23 | type Log = (message?: any, ...optionalParams: any[]) => void; 24 | 25 | interface Debug { 26 | (message?: any, ...optionalParams: any[]): void; 27 | inspect: Log; 28 | trace: Log; 29 | } 30 | export const getDebug = (name = '*'): Debug => { 31 | function log(...args) { 32 | const isEnabled = isLogEnabled(name); 33 | 34 | if (!isEnabled) { 35 | return; 36 | } 37 | 38 | const logArgs = name !== '*' ? [`${name} `, ...args] : args; 39 | 40 | // eslint-disable-next-line 41 | console.log.apply(this, logArgs); 42 | } 43 | 44 | function trace(...args) { 45 | const isEnabled = isLogEnabled(name); 46 | 47 | if (!isEnabled) { 48 | return; 49 | } 50 | 51 | const logArgs = name !== '*' ? [`${name} `, ...args] : args; 52 | 53 | // eslint-disable-next-line 54 | console.trace.apply(this, logArgs); 55 | } 56 | 57 | function inspect() { 58 | const isEnabled = isLogEnabled(name); 59 | 60 | if (!isEnabled) { 61 | return; 62 | } 63 | 64 | debugConsole.apply(this, arguments); 65 | } 66 | 67 | const debug = log; 68 | 69 | debug.inspect = inspect; 70 | debug.trace = trace; 71 | 72 | return debug; 73 | }; 74 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export { apiWithLog } from "./apiWithLog" 2 | export { dataResponse, dataResponseRemove, type DataResponse } from './dataResponse.ts'; 3 | export { jsonOrText } from './jsonOrText.ts' 4 | export { dataResponseResult, type DataResponseResult } from './dataResponseResult.ts' -------------------------------------------------------------------------------- /src/jsonOrText.ts: -------------------------------------------------------------------------------- 1 | export type JsonOrText = T extends string ? T : T; 2 | 3 | export const jsonOrText = async ( 4 | response: Response, 5 | ): Promise> => { 6 | const text = await response.text(); 7 | 8 | try { 9 | return JSON.parse(text); 10 | } catch (err) { 11 | return text as JsonOrText; 12 | } 13 | }; 14 | -------------------------------------------------------------------------------- /src/logSecurity.ts: -------------------------------------------------------------------------------- 1 | // find a b 2 | export const ignoredHeaders = ['host', 'method', 'path', 'scheme', 'version', 'Api-Access-Key', 'Authorization']; -------------------------------------------------------------------------------- /src/sanitizeBody.ts: -------------------------------------------------------------------------------- 1 | import { filterPassword } from './filterPassword.ts'; 2 | 3 | export const sanitizeBody = (rawBody: string): string => { 4 | try { 5 | // Parse the JSON string 6 | const requestBody = JSON.parse(rawBody); 7 | 8 | const filtered = filterPassword(requestBody); 9 | 10 | return JSON.stringify(filtered); 11 | } catch (error) { 12 | // console.error('Error parsing rawBody as JSON:', error); 13 | 14 | return rawBody; 15 | } 16 | }; 17 | -------------------------------------------------------------------------------- /src/timeSpan.ts: -------------------------------------------------------------------------------- 1 | type timeMeasureProps = 2 | | "milliseconds" 3 | | "nanoseconds" 4 | | "seconds" 5 | 6 | const conversionFactors: Record = { 7 | 'nanoseconds': 1, 8 | 'milliseconds': 1e6, 9 | 'seconds': 1e9, 10 | }; 11 | 12 | export const timeSpan = () => { 13 | const start = process.hrtime.bigint(); 14 | 15 | const end = (timeMeasure: timeMeasureProps) => { 16 | const diff = process.hrtime.bigint() - start; 17 | const factor = conversionFactors[timeMeasure]; 18 | return Number(diff) / factor; 19 | }; 20 | 21 | const returnValue = () => end('milliseconds'); 22 | returnValue.rounded = () => Math.round(end('milliseconds')); 23 | returnValue.seconds = () => end('seconds'); 24 | returnValue.nanoseconds = () => end('nanoseconds'); 25 | 26 | return returnValue; 27 | }; 28 | -------------------------------------------------------------------------------- /testutils/cleanupTest.ts: -------------------------------------------------------------------------------- 1 | export const cleanupTest = async () => { 2 | const { vi } = await import(/*webpackChunkName: "[request]"*/ 'vitest'); 3 | 4 | const { default: createFetchMocker } = await import( 5 | /*webpackChunkName: "[request]"*/ 6 | 'vitest-fetch-mock' 7 | ); 8 | 9 | const fetchMock = createFetchMocker(vi); 10 | 11 | fetchMock.enableMocks(); 12 | fetchMock.resetMocks(); 13 | }; 14 | -------------------------------------------------------------------------------- /testutils/setupFiles.ts: -------------------------------------------------------------------------------- 1 | import { vi } from 'vitest'; 2 | import createFetchMock from 'vitest-fetch-mock'; 3 | 4 | vi.setConfig({ 5 | testTimeout: 20_000, 6 | }); 7 | 8 | vi.mock('node-abort-controller'); 9 | 10 | const fetchMocker = createFetchMock(vi); 11 | 12 | // sets globalThis.fetch and globalThis.fetchMock to our mocked version 13 | fetchMocker.enableMocks(); 14 | -------------------------------------------------------------------------------- /tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "skipLibCheck": true, 4 | "lib": ["es2017", "es2019"], 5 | "module": "esnext", 6 | "types": ["node"], 7 | "moduleResolution": "node", 8 | "noImplicitAny": true, 9 | "removeComments": true, 10 | "strictNullChecks": true, 11 | "strict": true, 12 | "preserveConstEnums": true, 13 | "resolveJsonModule": true, 14 | "declaration": true, 15 | "declarationDir": "lib/types", 16 | "outDir": "./lib", 17 | "rootDir": "src", 18 | "target": "es2019", 19 | "sourceMap": true, 20 | "esModuleInterop": true, 21 | "useUnknownInCatchVariables": false, 22 | "noEmit": true, 23 | "emitDeclarationOnly": true, 24 | "verbatimModuleSyntax": true, 25 | "allowImportingTsExtensions": true 26 | }, 27 | "include": [ 28 | "src/*", 29 | "scripts/*.ts", 30 | "testutils/*" 31 | ], 32 | "exclude": ["scripts/*"] 33 | } 34 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "skipLibCheck": true, 4 | "lib": ["es2017", "es2019"], 5 | "module": "esnext", 6 | "types": ["node"], 7 | "moduleResolution": "node", 8 | "noImplicitAny": true, 9 | "removeComments": true, 10 | "strictNullChecks": true, 11 | "strict": true, 12 | "preserveConstEnums": true, 13 | "resolveJsonModule": true, 14 | "declaration": true, 15 | "outDir": "./lib", 16 | "target": "es2019", 17 | "sourceMap": true, 18 | "esModuleInterop": true, 19 | "useUnknownInCatchVariables": false, 20 | "verbatimModuleSyntax": true, 21 | "allowImportingTsExtensions": true, 22 | "noEmit": true 23 | }, 24 | "include": [ 25 | "src/*", 26 | "scripts/*.ts", 27 | "testutils/*" 28 | ] 29 | } 30 | -------------------------------------------------------------------------------- /vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitest/config'; 2 | 3 | export default defineConfig({ 4 | test: { 5 | globals: true, 6 | setupFiles: ['./testutils/setupFiles.ts'], 7 | include: ['./src/**/*.spec.ts'], 8 | }, 9 | }); 10 | --------------------------------------------------------------------------------