├── .gitignore ├── .npmignore ├── README.md ├── docs └── iam_erd.png ├── package-lock.json ├── package.json ├── src ├── commands │ └── erd.ts ├── index.ts └── lib │ └── metadata.ts └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | test/data/ 3 | 4 | *.png 5 | **/*.svg 6 | **/*.pdf 7 | 8 | **/.DS_Store 9 | 10 | *.db 11 | *.duckdb 12 | 13 | dist/ 14 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | # Source files 2 | src/ 3 | 4 | # TypeScript configuration 5 | tsconfig.json 6 | 7 | # Development and test files 8 | test/ 9 | *.test.ts 10 | *.spec.ts 11 | 12 | # Git related 13 | .git/ 14 | .gitignore 15 | 16 | # Editor configurations 17 | .vscode/ 18 | .idea/ 19 | 20 | # Logs 21 | *.log 22 | 23 | # Temporary files 24 | *.tmp 25 | *.temp 26 | 27 | # Build artifacts 28 | build/ 29 | 30 | # Dependency directories 31 | node_modules/ 32 | 33 | # Environment files 34 | .env 35 | .env.* 36 | 37 | # Documentation files (except README.md) 38 | docs/ 39 | 40 | # Example ERD outputs 41 | schema_erd.* 42 | 43 | # npm debug log 44 | npm-debug.log* 45 | 46 | # yarn error log 47 | yarn-error.log 48 | 49 | # macOS specific files 50 | .DS_Store 51 | 52 | # Windows specific files 53 | Thumbs.db 54 | 55 | *.png 56 | **/*.svg 57 | **/*.pdf 58 | 59 | test/data/ 60 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DuckERD CLI 2 | 3 | A CLI tool for generating ERD diagrams from DuckDB databases. 4 | 5 | ## Prerequisites 6 | 7 | - Node.js (v18.19.0 or later) 8 | 9 | ## Installation 10 | 11 | To install the CLI tool, run: 12 | 13 | ``` 14 | npm install -g duckerd 15 | ``` 16 | 17 | ## Usage 18 | 19 | ``` 20 | duckerd [options] 21 | ``` 22 | 23 | Generate an ERD diagram of the database schemas. 24 | 25 | #### Options: 26 | 27 | - `-d, --database `: Path to the database file 28 | - `-t, --theme [theme]`: Theme of the chart (choices: `default`, `forest`, `dark`, `neutral`, default: `default`) 29 | - `-o, --output `: Path to the output file 30 | - `-w, --width [width]`: Width of the page (default: `1024`) 31 | - `-H, --height [height]`: Height of the page (default: `768`) 32 | - `-f, --outputFormat [format]`: Output format for the generated image (choices: `svg`, `png`, `pdf`, default: `png`) 33 | 34 | #### Example: 35 | 36 | ```bash 37 | duckerd -d ./mydb.duckdb -o ./erd.png -f png -t neutral -w 1600 38 | ``` 39 | 40 | **It's possible that you need to re-run the command after the first execution, because the DuckERD CLI automatically installs the `@mermaid-js/mermaid-cli` package globally when it's missing on your system.** 41 | 42 | ## Usage example 43 | 44 | ### Download the example database 45 | For this example we use the [AWS IAM database](https://raw.githubusercontent.com/tobilg/aws-iam-data/main/data/db/iam.duckdb) from the [AWS IAM Data](https://github.com/tobilg/aws-iam-data) project. 46 | 47 | ```bash 48 | curl -LO https://raw.githubusercontent.com/tobilg/aws-iam-data/main/data/db/iam.duckdb 49 | ``` 50 | 51 | ### Generate the ERD 52 | Then, we can generate the ERD as PNG with the `neutral` theme and otherwise default settings: 53 | 54 | ```bash 55 | duckerd -d ./iam.duckdb -f png -t neutral 56 | ``` 57 | 58 | ### Result 59 | 60 | ![ERD of the AWS IAM DuckDB database](docs/iam_erd.png) 61 | -------------------------------------------------------------------------------- /docs/iam_erd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tobilg/duckerd/8807b01f0d3b846c00c80c1366d707aca30cc108/docs/iam_erd.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "duckerd", 3 | "version": "0.1.3", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "duckerd", 9 | "version": "0.1.3", 10 | "license": "MIT", 11 | "dependencies": { 12 | "commander": "^13.1.0", 13 | "duckdb-async": "^1.2.0" 14 | }, 15 | "bin": { 16 | "duckerd": "dist/index.js" 17 | }, 18 | "devDependencies": { 19 | "@types/node": "^18.11.9", 20 | "ts-node": "^10.9.2", 21 | "typescript": "^5.8.2" 22 | }, 23 | "engines": { 24 | "node": "^18.19 || >=20.0" 25 | } 26 | }, 27 | "node_modules/@cspotcode/source-map-support": { 28 | "version": "0.8.1", 29 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 30 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 31 | "dev": true, 32 | "dependencies": { 33 | "@jridgewell/trace-mapping": "0.3.9" 34 | }, 35 | "engines": { 36 | "node": ">=12" 37 | } 38 | }, 39 | "node_modules/@gar/promisify": { 40 | "version": "1.1.3", 41 | "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", 42 | "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", 43 | "license": "MIT" 44 | }, 45 | "node_modules/@isaacs/cliui": { 46 | "version": "8.0.2", 47 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 48 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 49 | "license": "ISC", 50 | "dependencies": { 51 | "string-width": "^5.1.2", 52 | "string-width-cjs": "npm:string-width@^4.2.0", 53 | "strip-ansi": "^7.0.1", 54 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 55 | "wrap-ansi": "^8.1.0", 56 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 57 | }, 58 | "engines": { 59 | "node": ">=12" 60 | } 61 | }, 62 | "node_modules/@isaacs/cliui/node_modules/ansi-regex": { 63 | "version": "6.1.0", 64 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 65 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 66 | "license": "MIT", 67 | "engines": { 68 | "node": ">=12" 69 | }, 70 | "funding": { 71 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 72 | } 73 | }, 74 | "node_modules/@isaacs/cliui/node_modules/ansi-styles": { 75 | "version": "6.2.1", 76 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 77 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 78 | "license": "MIT", 79 | "engines": { 80 | "node": ">=12" 81 | }, 82 | "funding": { 83 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 84 | } 85 | }, 86 | "node_modules/@isaacs/cliui/node_modules/emoji-regex": { 87 | "version": "9.2.2", 88 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 89 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 90 | "license": "MIT" 91 | }, 92 | "node_modules/@isaacs/cliui/node_modules/string-width": { 93 | "version": "5.1.2", 94 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 95 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 96 | "license": "MIT", 97 | "dependencies": { 98 | "eastasianwidth": "^0.2.0", 99 | "emoji-regex": "^9.2.2", 100 | "strip-ansi": "^7.0.1" 101 | }, 102 | "engines": { 103 | "node": ">=12" 104 | }, 105 | "funding": { 106 | "url": "https://github.com/sponsors/sindresorhus" 107 | } 108 | }, 109 | "node_modules/@isaacs/cliui/node_modules/strip-ansi": { 110 | "version": "7.1.0", 111 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 112 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 113 | "license": "MIT", 114 | "dependencies": { 115 | "ansi-regex": "^6.0.1" 116 | }, 117 | "engines": { 118 | "node": ">=12" 119 | }, 120 | "funding": { 121 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 122 | } 123 | }, 124 | "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { 125 | "version": "8.1.0", 126 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 127 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 128 | "license": "MIT", 129 | "dependencies": { 130 | "ansi-styles": "^6.1.0", 131 | "string-width": "^5.0.1", 132 | "strip-ansi": "^7.0.1" 133 | }, 134 | "engines": { 135 | "node": ">=12" 136 | }, 137 | "funding": { 138 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 139 | } 140 | }, 141 | "node_modules/@isaacs/fs-minipass": { 142 | "version": "4.0.1", 143 | "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", 144 | "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", 145 | "license": "ISC", 146 | "dependencies": { 147 | "minipass": "^7.0.4" 148 | }, 149 | "engines": { 150 | "node": ">=18.0.0" 151 | } 152 | }, 153 | "node_modules/@isaacs/fs-minipass/node_modules/minipass": { 154 | "version": "7.1.2", 155 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 156 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 157 | "license": "ISC", 158 | "engines": { 159 | "node": ">=16 || 14 >=14.17" 160 | } 161 | }, 162 | "node_modules/@jridgewell/resolve-uri": { 163 | "version": "3.1.2", 164 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 165 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 166 | "dev": true, 167 | "engines": { 168 | "node": ">=6.0.0" 169 | } 170 | }, 171 | "node_modules/@jridgewell/sourcemap-codec": { 172 | "version": "1.5.0", 173 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 174 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 175 | "dev": true 176 | }, 177 | "node_modules/@jridgewell/trace-mapping": { 178 | "version": "0.3.9", 179 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 180 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 181 | "dev": true, 182 | "dependencies": { 183 | "@jridgewell/resolve-uri": "^3.0.3", 184 | "@jridgewell/sourcemap-codec": "^1.4.10" 185 | } 186 | }, 187 | "node_modules/@mapbox/node-pre-gyp": { 188 | "version": "2.0.0", 189 | "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.0.tgz", 190 | "integrity": "sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==", 191 | "license": "BSD-3-Clause", 192 | "dependencies": { 193 | "consola": "^3.2.3", 194 | "detect-libc": "^2.0.0", 195 | "https-proxy-agent": "^7.0.5", 196 | "node-fetch": "^2.6.7", 197 | "nopt": "^8.0.0", 198 | "semver": "^7.5.3", 199 | "tar": "^7.4.0" 200 | }, 201 | "bin": { 202 | "node-pre-gyp": "bin/node-pre-gyp" 203 | }, 204 | "engines": { 205 | "node": ">=18" 206 | } 207 | }, 208 | "node_modules/@npmcli/fs": { 209 | "version": "2.1.2", 210 | "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", 211 | "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", 212 | "license": "ISC", 213 | "dependencies": { 214 | "@gar/promisify": "^1.1.3", 215 | "semver": "^7.3.5" 216 | }, 217 | "engines": { 218 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 219 | } 220 | }, 221 | "node_modules/@npmcli/move-file": { 222 | "version": "2.0.1", 223 | "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", 224 | "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", 225 | "deprecated": "This functionality has been moved to @npmcli/fs", 226 | "license": "MIT", 227 | "dependencies": { 228 | "mkdirp": "^1.0.4", 229 | "rimraf": "^3.0.2" 230 | }, 231 | "engines": { 232 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 233 | } 234 | }, 235 | "node_modules/@pkgjs/parseargs": { 236 | "version": "0.11.0", 237 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 238 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 239 | "license": "MIT", 240 | "optional": true, 241 | "engines": { 242 | "node": ">=14" 243 | } 244 | }, 245 | "node_modules/@tootallnate/once": { 246 | "version": "2.0.0", 247 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", 248 | "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", 249 | "license": "MIT", 250 | "engines": { 251 | "node": ">= 10" 252 | } 253 | }, 254 | "node_modules/@tsconfig/node10": { 255 | "version": "1.0.11", 256 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", 257 | "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", 258 | "dev": true 259 | }, 260 | "node_modules/@tsconfig/node12": { 261 | "version": "1.0.11", 262 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", 263 | "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", 264 | "dev": true 265 | }, 266 | "node_modules/@tsconfig/node14": { 267 | "version": "1.0.3", 268 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", 269 | "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", 270 | "dev": true 271 | }, 272 | "node_modules/@tsconfig/node16": { 273 | "version": "1.0.4", 274 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", 275 | "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", 276 | "dev": true 277 | }, 278 | "node_modules/@types/node": { 279 | "version": "18.19.50", 280 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.50.tgz", 281 | "integrity": "sha512-xonK+NRrMBRtkL1hVCc3G+uXtjh1Al4opBLjqVmipe5ZAaBYWW6cNAiBVZ1BvmkBhep698rP3UM3aRAdSALuhg==", 282 | "dev": true, 283 | "dependencies": { 284 | "undici-types": "~5.26.4" 285 | } 286 | }, 287 | "node_modules/abbrev": { 288 | "version": "3.0.0", 289 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz", 290 | "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==", 291 | "license": "ISC", 292 | "engines": { 293 | "node": "^18.17.0 || >=20.5.0" 294 | } 295 | }, 296 | "node_modules/acorn": { 297 | "version": "8.12.1", 298 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", 299 | "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", 300 | "dev": true, 301 | "bin": { 302 | "acorn": "bin/acorn" 303 | }, 304 | "engines": { 305 | "node": ">=0.4.0" 306 | } 307 | }, 308 | "node_modules/acorn-walk": { 309 | "version": "8.3.4", 310 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", 311 | "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", 312 | "dev": true, 313 | "dependencies": { 314 | "acorn": "^8.11.0" 315 | }, 316 | "engines": { 317 | "node": ">=0.4.0" 318 | } 319 | }, 320 | "node_modules/agent-base": { 321 | "version": "7.1.3", 322 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", 323 | "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", 324 | "license": "MIT", 325 | "engines": { 326 | "node": ">= 14" 327 | } 328 | }, 329 | "node_modules/agentkeepalive": { 330 | "version": "4.6.0", 331 | "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", 332 | "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", 333 | "license": "MIT", 334 | "dependencies": { 335 | "humanize-ms": "^1.2.1" 336 | }, 337 | "engines": { 338 | "node": ">= 8.0.0" 339 | } 340 | }, 341 | "node_modules/aggregate-error": { 342 | "version": "3.1.0", 343 | "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", 344 | "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", 345 | "license": "MIT", 346 | "dependencies": { 347 | "clean-stack": "^2.0.0", 348 | "indent-string": "^4.0.0" 349 | }, 350 | "engines": { 351 | "node": ">=8" 352 | } 353 | }, 354 | "node_modules/ansi-regex": { 355 | "version": "5.0.1", 356 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 357 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 358 | "engines": { 359 | "node": ">=8" 360 | } 361 | }, 362 | "node_modules/ansi-styles": { 363 | "version": "4.3.0", 364 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 365 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 366 | "dependencies": { 367 | "color-convert": "^2.0.1" 368 | }, 369 | "engines": { 370 | "node": ">=8" 371 | }, 372 | "funding": { 373 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 374 | } 375 | }, 376 | "node_modules/aproba": { 377 | "version": "2.0.0", 378 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", 379 | "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", 380 | "license": "ISC" 381 | }, 382 | "node_modules/are-we-there-yet": { 383 | "version": "3.0.1", 384 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", 385 | "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", 386 | "deprecated": "This package is no longer supported.", 387 | "license": "ISC", 388 | "dependencies": { 389 | "delegates": "^1.0.0", 390 | "readable-stream": "^3.6.0" 391 | }, 392 | "engines": { 393 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 394 | } 395 | }, 396 | "node_modules/arg": { 397 | "version": "4.1.3", 398 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 399 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 400 | "dev": true 401 | }, 402 | "node_modules/balanced-match": { 403 | "version": "1.0.2", 404 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 405 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 406 | "license": "MIT" 407 | }, 408 | "node_modules/brace-expansion": { 409 | "version": "1.1.11", 410 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 411 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 412 | "license": "MIT", 413 | "dependencies": { 414 | "balanced-match": "^1.0.0", 415 | "concat-map": "0.0.1" 416 | } 417 | }, 418 | "node_modules/cacache": { 419 | "version": "16.1.3", 420 | "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", 421 | "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", 422 | "license": "ISC", 423 | "dependencies": { 424 | "@npmcli/fs": "^2.1.0", 425 | "@npmcli/move-file": "^2.0.0", 426 | "chownr": "^2.0.0", 427 | "fs-minipass": "^2.1.0", 428 | "glob": "^8.0.1", 429 | "infer-owner": "^1.0.4", 430 | "lru-cache": "^7.7.1", 431 | "minipass": "^3.1.6", 432 | "minipass-collect": "^1.0.2", 433 | "minipass-flush": "^1.0.5", 434 | "minipass-pipeline": "^1.2.4", 435 | "mkdirp": "^1.0.4", 436 | "p-map": "^4.0.0", 437 | "promise-inflight": "^1.0.1", 438 | "rimraf": "^3.0.2", 439 | "ssri": "^9.0.0", 440 | "tar": "^6.1.11", 441 | "unique-filename": "^2.0.0" 442 | }, 443 | "engines": { 444 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 445 | } 446 | }, 447 | "node_modules/cacache/node_modules/brace-expansion": { 448 | "version": "2.0.1", 449 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 450 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 451 | "license": "MIT", 452 | "dependencies": { 453 | "balanced-match": "^1.0.0" 454 | } 455 | }, 456 | "node_modules/cacache/node_modules/glob": { 457 | "version": "8.1.0", 458 | "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", 459 | "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", 460 | "deprecated": "Glob versions prior to v9 are no longer supported", 461 | "license": "ISC", 462 | "dependencies": { 463 | "fs.realpath": "^1.0.0", 464 | "inflight": "^1.0.4", 465 | "inherits": "2", 466 | "minimatch": "^5.0.1", 467 | "once": "^1.3.0" 468 | }, 469 | "engines": { 470 | "node": ">=12" 471 | }, 472 | "funding": { 473 | "url": "https://github.com/sponsors/isaacs" 474 | } 475 | }, 476 | "node_modules/cacache/node_modules/minimatch": { 477 | "version": "5.1.6", 478 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", 479 | "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", 480 | "license": "ISC", 481 | "dependencies": { 482 | "brace-expansion": "^2.0.1" 483 | }, 484 | "engines": { 485 | "node": ">=10" 486 | } 487 | }, 488 | "node_modules/cacache/node_modules/tar": { 489 | "version": "6.2.1", 490 | "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", 491 | "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", 492 | "license": "ISC", 493 | "dependencies": { 494 | "chownr": "^2.0.0", 495 | "fs-minipass": "^2.0.0", 496 | "minipass": "^5.0.0", 497 | "minizlib": "^2.1.1", 498 | "mkdirp": "^1.0.3", 499 | "yallist": "^4.0.0" 500 | }, 501 | "engines": { 502 | "node": ">=10" 503 | } 504 | }, 505 | "node_modules/cacache/node_modules/tar/node_modules/minipass": { 506 | "version": "5.0.0", 507 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", 508 | "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", 509 | "license": "ISC", 510 | "engines": { 511 | "node": ">=8" 512 | } 513 | }, 514 | "node_modules/chownr": { 515 | "version": "2.0.0", 516 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", 517 | "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", 518 | "license": "ISC", 519 | "engines": { 520 | "node": ">=10" 521 | } 522 | }, 523 | "node_modules/clean-stack": { 524 | "version": "2.2.0", 525 | "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", 526 | "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", 527 | "license": "MIT", 528 | "engines": { 529 | "node": ">=6" 530 | } 531 | }, 532 | "node_modules/color-convert": { 533 | "version": "2.0.1", 534 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 535 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 536 | "dependencies": { 537 | "color-name": "~1.1.4" 538 | }, 539 | "engines": { 540 | "node": ">=7.0.0" 541 | } 542 | }, 543 | "node_modules/color-name": { 544 | "version": "1.1.4", 545 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 546 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 547 | }, 548 | "node_modules/color-support": { 549 | "version": "1.1.3", 550 | "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", 551 | "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", 552 | "license": "ISC", 553 | "bin": { 554 | "color-support": "bin.js" 555 | } 556 | }, 557 | "node_modules/commander": { 558 | "version": "13.1.0", 559 | "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", 560 | "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", 561 | "license": "MIT", 562 | "engines": { 563 | "node": ">=18" 564 | } 565 | }, 566 | "node_modules/concat-map": { 567 | "version": "0.0.1", 568 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 569 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 570 | "license": "MIT" 571 | }, 572 | "node_modules/consola": { 573 | "version": "3.4.0", 574 | "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.0.tgz", 575 | "integrity": "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==", 576 | "license": "MIT", 577 | "engines": { 578 | "node": "^14.18.0 || >=16.10.0" 579 | } 580 | }, 581 | "node_modules/console-control-strings": { 582 | "version": "1.1.0", 583 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 584 | "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", 585 | "license": "ISC" 586 | }, 587 | "node_modules/create-require": { 588 | "version": "1.1.1", 589 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 590 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 591 | "dev": true 592 | }, 593 | "node_modules/cross-spawn": { 594 | "version": "7.0.6", 595 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 596 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 597 | "license": "MIT", 598 | "dependencies": { 599 | "path-key": "^3.1.0", 600 | "shebang-command": "^2.0.0", 601 | "which": "^2.0.1" 602 | }, 603 | "engines": { 604 | "node": ">= 8" 605 | } 606 | }, 607 | "node_modules/debug": { 608 | "version": "4.3.7", 609 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 610 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 611 | "dependencies": { 612 | "ms": "^2.1.3" 613 | }, 614 | "engines": { 615 | "node": ">=6.0" 616 | }, 617 | "peerDependenciesMeta": { 618 | "supports-color": { 619 | "optional": true 620 | } 621 | } 622 | }, 623 | "node_modules/delegates": { 624 | "version": "1.0.0", 625 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 626 | "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", 627 | "license": "MIT" 628 | }, 629 | "node_modules/detect-libc": { 630 | "version": "2.0.3", 631 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", 632 | "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", 633 | "license": "Apache-2.0", 634 | "engines": { 635 | "node": ">=8" 636 | } 637 | }, 638 | "node_modules/diff": { 639 | "version": "4.0.2", 640 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 641 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 642 | "dev": true, 643 | "engines": { 644 | "node": ">=0.3.1" 645 | } 646 | }, 647 | "node_modules/duckdb": { 648 | "version": "1.2.0", 649 | "resolved": "https://registry.npmjs.org/duckdb/-/duckdb-1.2.0.tgz", 650 | "integrity": "sha512-zAHHRTMoZhWIwvOsyNkgV9c1nq0gR0j+ZyX0uTCRFZTNOlYO4lnErP5Fddt/6iKMXsTNL9v1oTG9E76S5jMh7w==", 651 | "hasInstallScript": true, 652 | "license": "MIT", 653 | "dependencies": { 654 | "@mapbox/node-pre-gyp": "^2.0.0", 655 | "node-addon-api": "^7.0.0", 656 | "node-gyp": "^9.3.0" 657 | } 658 | }, 659 | "node_modules/duckdb-async": { 660 | "version": "1.2.0", 661 | "resolved": "https://registry.npmjs.org/duckdb-async/-/duckdb-async-1.2.0.tgz", 662 | "integrity": "sha512-Ri8PL/TGZRhbW+53a/zqD4nJdH3p+mRB6owb7Hl5tXu3e1rvXVLil543aiVEnVKKxSHSBUwHyoutt+rOHrhc6g==", 663 | "license": "MIT", 664 | "dependencies": { 665 | "duckdb": "^1.2.0" 666 | } 667 | }, 668 | "node_modules/eastasianwidth": { 669 | "version": "0.2.0", 670 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 671 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 672 | "license": "MIT" 673 | }, 674 | "node_modules/emoji-regex": { 675 | "version": "8.0.0", 676 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 677 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 678 | }, 679 | "node_modules/encoding": { 680 | "version": "0.1.13", 681 | "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", 682 | "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", 683 | "license": "MIT", 684 | "optional": true, 685 | "dependencies": { 686 | "iconv-lite": "^0.6.2" 687 | } 688 | }, 689 | "node_modules/env-paths": { 690 | "version": "2.2.1", 691 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", 692 | "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", 693 | "engines": { 694 | "node": ">=6" 695 | } 696 | }, 697 | "node_modules/err-code": { 698 | "version": "2.0.3", 699 | "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", 700 | "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", 701 | "license": "MIT" 702 | }, 703 | "node_modules/exponential-backoff": { 704 | "version": "3.1.2", 705 | "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", 706 | "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", 707 | "license": "Apache-2.0" 708 | }, 709 | "node_modules/foreground-child": { 710 | "version": "3.3.1", 711 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", 712 | "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", 713 | "license": "ISC", 714 | "dependencies": { 715 | "cross-spawn": "^7.0.6", 716 | "signal-exit": "^4.0.1" 717 | }, 718 | "engines": { 719 | "node": ">=14" 720 | }, 721 | "funding": { 722 | "url": "https://github.com/sponsors/isaacs" 723 | } 724 | }, 725 | "node_modules/foreground-child/node_modules/signal-exit": { 726 | "version": "4.1.0", 727 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 728 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 729 | "license": "ISC", 730 | "engines": { 731 | "node": ">=14" 732 | }, 733 | "funding": { 734 | "url": "https://github.com/sponsors/isaacs" 735 | } 736 | }, 737 | "node_modules/fs-minipass": { 738 | "version": "2.1.0", 739 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", 740 | "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", 741 | "license": "ISC", 742 | "dependencies": { 743 | "minipass": "^3.0.0" 744 | }, 745 | "engines": { 746 | "node": ">= 8" 747 | } 748 | }, 749 | "node_modules/fs.realpath": { 750 | "version": "1.0.0", 751 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 752 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 753 | "license": "ISC" 754 | }, 755 | "node_modules/gauge": { 756 | "version": "4.0.4", 757 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", 758 | "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", 759 | "deprecated": "This package is no longer supported.", 760 | "license": "ISC", 761 | "dependencies": { 762 | "aproba": "^1.0.3 || ^2.0.0", 763 | "color-support": "^1.1.3", 764 | "console-control-strings": "^1.1.0", 765 | "has-unicode": "^2.0.1", 766 | "signal-exit": "^3.0.7", 767 | "string-width": "^4.2.3", 768 | "strip-ansi": "^6.0.1", 769 | "wide-align": "^1.1.5" 770 | }, 771 | "engines": { 772 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 773 | } 774 | }, 775 | "node_modules/glob": { 776 | "version": "7.2.3", 777 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 778 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 779 | "deprecated": "Glob versions prior to v9 are no longer supported", 780 | "license": "ISC", 781 | "dependencies": { 782 | "fs.realpath": "^1.0.0", 783 | "inflight": "^1.0.4", 784 | "inherits": "2", 785 | "minimatch": "^3.1.1", 786 | "once": "^1.3.0", 787 | "path-is-absolute": "^1.0.0" 788 | }, 789 | "engines": { 790 | "node": "*" 791 | }, 792 | "funding": { 793 | "url": "https://github.com/sponsors/isaacs" 794 | } 795 | }, 796 | "node_modules/graceful-fs": { 797 | "version": "4.2.11", 798 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 799 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" 800 | }, 801 | "node_modules/has-unicode": { 802 | "version": "2.0.1", 803 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 804 | "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", 805 | "license": "ISC" 806 | }, 807 | "node_modules/http-cache-semantics": { 808 | "version": "4.1.1", 809 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", 810 | "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", 811 | "license": "BSD-2-Clause" 812 | }, 813 | "node_modules/http-proxy-agent": { 814 | "version": "5.0.0", 815 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", 816 | "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", 817 | "license": "MIT", 818 | "dependencies": { 819 | "@tootallnate/once": "2", 820 | "agent-base": "6", 821 | "debug": "4" 822 | }, 823 | "engines": { 824 | "node": ">= 6" 825 | } 826 | }, 827 | "node_modules/http-proxy-agent/node_modules/agent-base": { 828 | "version": "6.0.2", 829 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 830 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 831 | "license": "MIT", 832 | "dependencies": { 833 | "debug": "4" 834 | }, 835 | "engines": { 836 | "node": ">= 6.0.0" 837 | } 838 | }, 839 | "node_modules/https-proxy-agent": { 840 | "version": "7.0.6", 841 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", 842 | "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", 843 | "license": "MIT", 844 | "dependencies": { 845 | "agent-base": "^7.1.2", 846 | "debug": "4" 847 | }, 848 | "engines": { 849 | "node": ">= 14" 850 | } 851 | }, 852 | "node_modules/humanize-ms": { 853 | "version": "1.2.1", 854 | "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", 855 | "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", 856 | "license": "MIT", 857 | "dependencies": { 858 | "ms": "^2.0.0" 859 | } 860 | }, 861 | "node_modules/iconv-lite": { 862 | "version": "0.6.3", 863 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 864 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 865 | "optional": true, 866 | "dependencies": { 867 | "safer-buffer": ">= 2.1.2 < 3.0.0" 868 | }, 869 | "engines": { 870 | "node": ">=0.10.0" 871 | } 872 | }, 873 | "node_modules/imurmurhash": { 874 | "version": "0.1.4", 875 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 876 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 877 | "license": "MIT", 878 | "engines": { 879 | "node": ">=0.8.19" 880 | } 881 | }, 882 | "node_modules/indent-string": { 883 | "version": "4.0.0", 884 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", 885 | "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", 886 | "license": "MIT", 887 | "engines": { 888 | "node": ">=8" 889 | } 890 | }, 891 | "node_modules/infer-owner": { 892 | "version": "1.0.4", 893 | "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", 894 | "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", 895 | "license": "ISC" 896 | }, 897 | "node_modules/inflight": { 898 | "version": "1.0.6", 899 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 900 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 901 | "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", 902 | "license": "ISC", 903 | "dependencies": { 904 | "once": "^1.3.0", 905 | "wrappy": "1" 906 | } 907 | }, 908 | "node_modules/inherits": { 909 | "version": "2.0.4", 910 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 911 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 912 | "license": "ISC" 913 | }, 914 | "node_modules/ip-address": { 915 | "version": "9.0.5", 916 | "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", 917 | "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", 918 | "dependencies": { 919 | "jsbn": "1.1.0", 920 | "sprintf-js": "^1.1.3" 921 | }, 922 | "engines": { 923 | "node": ">= 12" 924 | } 925 | }, 926 | "node_modules/is-fullwidth-code-point": { 927 | "version": "3.0.0", 928 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 929 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 930 | "engines": { 931 | "node": ">=8" 932 | } 933 | }, 934 | "node_modules/is-lambda": { 935 | "version": "1.0.1", 936 | "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", 937 | "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", 938 | "license": "MIT" 939 | }, 940 | "node_modules/isexe": { 941 | "version": "2.0.0", 942 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 943 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 944 | "license": "ISC" 945 | }, 946 | "node_modules/jackspeak": { 947 | "version": "3.4.3", 948 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", 949 | "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", 950 | "license": "BlueOak-1.0.0", 951 | "dependencies": { 952 | "@isaacs/cliui": "^8.0.2" 953 | }, 954 | "funding": { 955 | "url": "https://github.com/sponsors/isaacs" 956 | }, 957 | "optionalDependencies": { 958 | "@pkgjs/parseargs": "^0.11.0" 959 | } 960 | }, 961 | "node_modules/jsbn": { 962 | "version": "1.1.0", 963 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", 964 | "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" 965 | }, 966 | "node_modules/lru-cache": { 967 | "version": "7.18.3", 968 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", 969 | "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", 970 | "engines": { 971 | "node": ">=12" 972 | } 973 | }, 974 | "node_modules/make-error": { 975 | "version": "1.3.6", 976 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 977 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 978 | "dev": true 979 | }, 980 | "node_modules/make-fetch-happen": { 981 | "version": "10.2.1", 982 | "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", 983 | "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", 984 | "license": "ISC", 985 | "dependencies": { 986 | "agentkeepalive": "^4.2.1", 987 | "cacache": "^16.1.0", 988 | "http-cache-semantics": "^4.1.0", 989 | "http-proxy-agent": "^5.0.0", 990 | "https-proxy-agent": "^5.0.0", 991 | "is-lambda": "^1.0.1", 992 | "lru-cache": "^7.7.1", 993 | "minipass": "^3.1.6", 994 | "minipass-collect": "^1.0.2", 995 | "minipass-fetch": "^2.0.3", 996 | "minipass-flush": "^1.0.5", 997 | "minipass-pipeline": "^1.2.4", 998 | "negotiator": "^0.6.3", 999 | "promise-retry": "^2.0.1", 1000 | "socks-proxy-agent": "^7.0.0", 1001 | "ssri": "^9.0.0" 1002 | }, 1003 | "engines": { 1004 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1005 | } 1006 | }, 1007 | "node_modules/make-fetch-happen/node_modules/agent-base": { 1008 | "version": "6.0.2", 1009 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 1010 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 1011 | "license": "MIT", 1012 | "dependencies": { 1013 | "debug": "4" 1014 | }, 1015 | "engines": { 1016 | "node": ">= 6.0.0" 1017 | } 1018 | }, 1019 | "node_modules/make-fetch-happen/node_modules/https-proxy-agent": { 1020 | "version": "5.0.1", 1021 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", 1022 | "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", 1023 | "license": "MIT", 1024 | "dependencies": { 1025 | "agent-base": "6", 1026 | "debug": "4" 1027 | }, 1028 | "engines": { 1029 | "node": ">= 6" 1030 | } 1031 | }, 1032 | "node_modules/minimatch": { 1033 | "version": "3.1.2", 1034 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1035 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1036 | "license": "ISC", 1037 | "dependencies": { 1038 | "brace-expansion": "^1.1.7" 1039 | }, 1040 | "engines": { 1041 | "node": "*" 1042 | } 1043 | }, 1044 | "node_modules/minipass": { 1045 | "version": "3.3.6", 1046 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 1047 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 1048 | "license": "ISC", 1049 | "dependencies": { 1050 | "yallist": "^4.0.0" 1051 | }, 1052 | "engines": { 1053 | "node": ">=8" 1054 | } 1055 | }, 1056 | "node_modules/minipass-collect": { 1057 | "version": "1.0.2", 1058 | "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", 1059 | "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", 1060 | "license": "ISC", 1061 | "dependencies": { 1062 | "minipass": "^3.0.0" 1063 | }, 1064 | "engines": { 1065 | "node": ">= 8" 1066 | } 1067 | }, 1068 | "node_modules/minipass-fetch": { 1069 | "version": "2.1.2", 1070 | "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", 1071 | "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", 1072 | "license": "MIT", 1073 | "dependencies": { 1074 | "minipass": "^3.1.6", 1075 | "minipass-sized": "^1.0.3", 1076 | "minizlib": "^2.1.2" 1077 | }, 1078 | "engines": { 1079 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1080 | }, 1081 | "optionalDependencies": { 1082 | "encoding": "^0.1.13" 1083 | } 1084 | }, 1085 | "node_modules/minipass-flush": { 1086 | "version": "1.0.5", 1087 | "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", 1088 | "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", 1089 | "license": "ISC", 1090 | "dependencies": { 1091 | "minipass": "^3.0.0" 1092 | }, 1093 | "engines": { 1094 | "node": ">= 8" 1095 | } 1096 | }, 1097 | "node_modules/minipass-pipeline": { 1098 | "version": "1.2.4", 1099 | "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", 1100 | "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", 1101 | "license": "ISC", 1102 | "dependencies": { 1103 | "minipass": "^3.0.0" 1104 | }, 1105 | "engines": { 1106 | "node": ">=8" 1107 | } 1108 | }, 1109 | "node_modules/minipass-sized": { 1110 | "version": "1.0.3", 1111 | "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", 1112 | "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", 1113 | "license": "ISC", 1114 | "dependencies": { 1115 | "minipass": "^3.0.0" 1116 | }, 1117 | "engines": { 1118 | "node": ">=8" 1119 | } 1120 | }, 1121 | "node_modules/minizlib": { 1122 | "version": "2.1.2", 1123 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", 1124 | "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", 1125 | "license": "MIT", 1126 | "dependencies": { 1127 | "minipass": "^3.0.0", 1128 | "yallist": "^4.0.0" 1129 | }, 1130 | "engines": { 1131 | "node": ">= 8" 1132 | } 1133 | }, 1134 | "node_modules/mkdirp": { 1135 | "version": "1.0.4", 1136 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 1137 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 1138 | "license": "MIT", 1139 | "bin": { 1140 | "mkdirp": "bin/cmd.js" 1141 | }, 1142 | "engines": { 1143 | "node": ">=10" 1144 | } 1145 | }, 1146 | "node_modules/ms": { 1147 | "version": "2.1.3", 1148 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1149 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1150 | }, 1151 | "node_modules/negotiator": { 1152 | "version": "0.6.4", 1153 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", 1154 | "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", 1155 | "license": "MIT", 1156 | "engines": { 1157 | "node": ">= 0.6" 1158 | } 1159 | }, 1160 | "node_modules/node-addon-api": { 1161 | "version": "7.1.1", 1162 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", 1163 | "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", 1164 | "license": "MIT" 1165 | }, 1166 | "node_modules/node-fetch": { 1167 | "version": "2.7.0", 1168 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", 1169 | "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", 1170 | "license": "MIT", 1171 | "dependencies": { 1172 | "whatwg-url": "^5.0.0" 1173 | }, 1174 | "engines": { 1175 | "node": "4.x || >=6.0.0" 1176 | }, 1177 | "peerDependencies": { 1178 | "encoding": "^0.1.0" 1179 | }, 1180 | "peerDependenciesMeta": { 1181 | "encoding": { 1182 | "optional": true 1183 | } 1184 | } 1185 | }, 1186 | "node_modules/node-gyp": { 1187 | "version": "9.4.1", 1188 | "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", 1189 | "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", 1190 | "license": "MIT", 1191 | "dependencies": { 1192 | "env-paths": "^2.2.0", 1193 | "exponential-backoff": "^3.1.1", 1194 | "glob": "^7.1.4", 1195 | "graceful-fs": "^4.2.6", 1196 | "make-fetch-happen": "^10.0.3", 1197 | "nopt": "^6.0.0", 1198 | "npmlog": "^6.0.0", 1199 | "rimraf": "^3.0.2", 1200 | "semver": "^7.3.5", 1201 | "tar": "^6.1.2", 1202 | "which": "^2.0.2" 1203 | }, 1204 | "bin": { 1205 | "node-gyp": "bin/node-gyp.js" 1206 | }, 1207 | "engines": { 1208 | "node": "^12.13 || ^14.13 || >=16" 1209 | } 1210 | }, 1211 | "node_modules/node-gyp/node_modules/abbrev": { 1212 | "version": "1.1.1", 1213 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 1214 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 1215 | "license": "ISC" 1216 | }, 1217 | "node_modules/node-gyp/node_modules/minipass": { 1218 | "version": "5.0.0", 1219 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", 1220 | "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", 1221 | "license": "ISC", 1222 | "engines": { 1223 | "node": ">=8" 1224 | } 1225 | }, 1226 | "node_modules/node-gyp/node_modules/nopt": { 1227 | "version": "6.0.0", 1228 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", 1229 | "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", 1230 | "license": "ISC", 1231 | "dependencies": { 1232 | "abbrev": "^1.0.0" 1233 | }, 1234 | "bin": { 1235 | "nopt": "bin/nopt.js" 1236 | }, 1237 | "engines": { 1238 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1239 | } 1240 | }, 1241 | "node_modules/node-gyp/node_modules/tar": { 1242 | "version": "6.2.1", 1243 | "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", 1244 | "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", 1245 | "license": "ISC", 1246 | "dependencies": { 1247 | "chownr": "^2.0.0", 1248 | "fs-minipass": "^2.0.0", 1249 | "minipass": "^5.0.0", 1250 | "minizlib": "^2.1.1", 1251 | "mkdirp": "^1.0.3", 1252 | "yallist": "^4.0.0" 1253 | }, 1254 | "engines": { 1255 | "node": ">=10" 1256 | } 1257 | }, 1258 | "node_modules/nopt": { 1259 | "version": "8.1.0", 1260 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", 1261 | "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", 1262 | "license": "ISC", 1263 | "dependencies": { 1264 | "abbrev": "^3.0.0" 1265 | }, 1266 | "bin": { 1267 | "nopt": "bin/nopt.js" 1268 | }, 1269 | "engines": { 1270 | "node": "^18.17.0 || >=20.5.0" 1271 | } 1272 | }, 1273 | "node_modules/npmlog": { 1274 | "version": "6.0.2", 1275 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", 1276 | "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", 1277 | "deprecated": "This package is no longer supported.", 1278 | "license": "ISC", 1279 | "dependencies": { 1280 | "are-we-there-yet": "^3.0.0", 1281 | "console-control-strings": "^1.1.0", 1282 | "gauge": "^4.0.3", 1283 | "set-blocking": "^2.0.0" 1284 | }, 1285 | "engines": { 1286 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1287 | } 1288 | }, 1289 | "node_modules/once": { 1290 | "version": "1.4.0", 1291 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1292 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1293 | "dependencies": { 1294 | "wrappy": "1" 1295 | } 1296 | }, 1297 | "node_modules/p-map": { 1298 | "version": "4.0.0", 1299 | "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", 1300 | "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", 1301 | "license": "MIT", 1302 | "dependencies": { 1303 | "aggregate-error": "^3.0.0" 1304 | }, 1305 | "engines": { 1306 | "node": ">=10" 1307 | }, 1308 | "funding": { 1309 | "url": "https://github.com/sponsors/sindresorhus" 1310 | } 1311 | }, 1312 | "node_modules/package-json-from-dist": { 1313 | "version": "1.0.1", 1314 | "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", 1315 | "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", 1316 | "license": "BlueOak-1.0.0" 1317 | }, 1318 | "node_modules/path-is-absolute": { 1319 | "version": "1.0.1", 1320 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1321 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1322 | "license": "MIT", 1323 | "engines": { 1324 | "node": ">=0.10.0" 1325 | } 1326 | }, 1327 | "node_modules/path-key": { 1328 | "version": "3.1.1", 1329 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1330 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1331 | "license": "MIT", 1332 | "engines": { 1333 | "node": ">=8" 1334 | } 1335 | }, 1336 | "node_modules/path-scurry": { 1337 | "version": "1.11.1", 1338 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", 1339 | "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", 1340 | "license": "BlueOak-1.0.0", 1341 | "dependencies": { 1342 | "lru-cache": "^10.2.0", 1343 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 1344 | }, 1345 | "engines": { 1346 | "node": ">=16 || 14 >=14.18" 1347 | }, 1348 | "funding": { 1349 | "url": "https://github.com/sponsors/isaacs" 1350 | } 1351 | }, 1352 | "node_modules/path-scurry/node_modules/lru-cache": { 1353 | "version": "10.4.3", 1354 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 1355 | "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 1356 | "license": "ISC" 1357 | }, 1358 | "node_modules/path-scurry/node_modules/minipass": { 1359 | "version": "7.1.2", 1360 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 1361 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 1362 | "license": "ISC", 1363 | "engines": { 1364 | "node": ">=16 || 14 >=14.17" 1365 | } 1366 | }, 1367 | "node_modules/promise-inflight": { 1368 | "version": "1.0.1", 1369 | "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", 1370 | "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", 1371 | "license": "ISC" 1372 | }, 1373 | "node_modules/promise-retry": { 1374 | "version": "2.0.1", 1375 | "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", 1376 | "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", 1377 | "license": "MIT", 1378 | "dependencies": { 1379 | "err-code": "^2.0.2", 1380 | "retry": "^0.12.0" 1381 | }, 1382 | "engines": { 1383 | "node": ">=10" 1384 | } 1385 | }, 1386 | "node_modules/readable-stream": { 1387 | "version": "3.6.2", 1388 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 1389 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 1390 | "license": "MIT", 1391 | "dependencies": { 1392 | "inherits": "^2.0.3", 1393 | "string_decoder": "^1.1.1", 1394 | "util-deprecate": "^1.0.1" 1395 | }, 1396 | "engines": { 1397 | "node": ">= 6" 1398 | } 1399 | }, 1400 | "node_modules/retry": { 1401 | "version": "0.12.0", 1402 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", 1403 | "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", 1404 | "license": "MIT", 1405 | "engines": { 1406 | "node": ">= 4" 1407 | } 1408 | }, 1409 | "node_modules/rimraf": { 1410 | "version": "3.0.2", 1411 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1412 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1413 | "deprecated": "Rimraf versions prior to v4 are no longer supported", 1414 | "license": "ISC", 1415 | "dependencies": { 1416 | "glob": "^7.1.3" 1417 | }, 1418 | "bin": { 1419 | "rimraf": "bin.js" 1420 | }, 1421 | "funding": { 1422 | "url": "https://github.com/sponsors/isaacs" 1423 | } 1424 | }, 1425 | "node_modules/safe-buffer": { 1426 | "version": "5.2.1", 1427 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1428 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1429 | "funding": [ 1430 | { 1431 | "type": "github", 1432 | "url": "https://github.com/sponsors/feross" 1433 | }, 1434 | { 1435 | "type": "patreon", 1436 | "url": "https://www.patreon.com/feross" 1437 | }, 1438 | { 1439 | "type": "consulting", 1440 | "url": "https://feross.org/support" 1441 | } 1442 | ], 1443 | "license": "MIT" 1444 | }, 1445 | "node_modules/safer-buffer": { 1446 | "version": "2.1.2", 1447 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1448 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1449 | "optional": true 1450 | }, 1451 | "node_modules/semver": { 1452 | "version": "7.6.3", 1453 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", 1454 | "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", 1455 | "bin": { 1456 | "semver": "bin/semver.js" 1457 | }, 1458 | "engines": { 1459 | "node": ">=10" 1460 | } 1461 | }, 1462 | "node_modules/set-blocking": { 1463 | "version": "2.0.0", 1464 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1465 | "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", 1466 | "license": "ISC" 1467 | }, 1468 | "node_modules/shebang-command": { 1469 | "version": "2.0.0", 1470 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1471 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1472 | "license": "MIT", 1473 | "dependencies": { 1474 | "shebang-regex": "^3.0.0" 1475 | }, 1476 | "engines": { 1477 | "node": ">=8" 1478 | } 1479 | }, 1480 | "node_modules/shebang-regex": { 1481 | "version": "3.0.0", 1482 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1483 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1484 | "license": "MIT", 1485 | "engines": { 1486 | "node": ">=8" 1487 | } 1488 | }, 1489 | "node_modules/signal-exit": { 1490 | "version": "3.0.7", 1491 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 1492 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 1493 | "license": "ISC" 1494 | }, 1495 | "node_modules/smart-buffer": { 1496 | "version": "4.2.0", 1497 | "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", 1498 | "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", 1499 | "engines": { 1500 | "node": ">= 6.0.0", 1501 | "npm": ">= 3.0.0" 1502 | } 1503 | }, 1504 | "node_modules/socks": { 1505 | "version": "2.8.3", 1506 | "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", 1507 | "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", 1508 | "dependencies": { 1509 | "ip-address": "^9.0.5", 1510 | "smart-buffer": "^4.2.0" 1511 | }, 1512 | "engines": { 1513 | "node": ">= 10.0.0", 1514 | "npm": ">= 3.0.0" 1515 | } 1516 | }, 1517 | "node_modules/socks-proxy-agent": { 1518 | "version": "7.0.0", 1519 | "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", 1520 | "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", 1521 | "license": "MIT", 1522 | "dependencies": { 1523 | "agent-base": "^6.0.2", 1524 | "debug": "^4.3.3", 1525 | "socks": "^2.6.2" 1526 | }, 1527 | "engines": { 1528 | "node": ">= 10" 1529 | } 1530 | }, 1531 | "node_modules/socks-proxy-agent/node_modules/agent-base": { 1532 | "version": "6.0.2", 1533 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 1534 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 1535 | "license": "MIT", 1536 | "dependencies": { 1537 | "debug": "4" 1538 | }, 1539 | "engines": { 1540 | "node": ">= 6.0.0" 1541 | } 1542 | }, 1543 | "node_modules/sprintf-js": { 1544 | "version": "1.1.3", 1545 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", 1546 | "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" 1547 | }, 1548 | "node_modules/ssri": { 1549 | "version": "9.0.1", 1550 | "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", 1551 | "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", 1552 | "license": "ISC", 1553 | "dependencies": { 1554 | "minipass": "^3.1.1" 1555 | }, 1556 | "engines": { 1557 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1558 | } 1559 | }, 1560 | "node_modules/string_decoder": { 1561 | "version": "1.3.0", 1562 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1563 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1564 | "license": "MIT", 1565 | "dependencies": { 1566 | "safe-buffer": "~5.2.0" 1567 | } 1568 | }, 1569 | "node_modules/string-width": { 1570 | "version": "4.2.3", 1571 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1572 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1573 | "dependencies": { 1574 | "emoji-regex": "^8.0.0", 1575 | "is-fullwidth-code-point": "^3.0.0", 1576 | "strip-ansi": "^6.0.1" 1577 | }, 1578 | "engines": { 1579 | "node": ">=8" 1580 | } 1581 | }, 1582 | "node_modules/string-width-cjs": { 1583 | "name": "string-width", 1584 | "version": "4.2.3", 1585 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1586 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1587 | "license": "MIT", 1588 | "dependencies": { 1589 | "emoji-regex": "^8.0.0", 1590 | "is-fullwidth-code-point": "^3.0.0", 1591 | "strip-ansi": "^6.0.1" 1592 | }, 1593 | "engines": { 1594 | "node": ">=8" 1595 | } 1596 | }, 1597 | "node_modules/strip-ansi": { 1598 | "version": "6.0.1", 1599 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1600 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1601 | "dependencies": { 1602 | "ansi-regex": "^5.0.1" 1603 | }, 1604 | "engines": { 1605 | "node": ">=8" 1606 | } 1607 | }, 1608 | "node_modules/strip-ansi-cjs": { 1609 | "name": "strip-ansi", 1610 | "version": "6.0.1", 1611 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1612 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1613 | "license": "MIT", 1614 | "dependencies": { 1615 | "ansi-regex": "^5.0.1" 1616 | }, 1617 | "engines": { 1618 | "node": ">=8" 1619 | } 1620 | }, 1621 | "node_modules/tar": { 1622 | "version": "7.4.3", 1623 | "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", 1624 | "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", 1625 | "license": "ISC", 1626 | "dependencies": { 1627 | "@isaacs/fs-minipass": "^4.0.0", 1628 | "chownr": "^3.0.0", 1629 | "minipass": "^7.1.2", 1630 | "minizlib": "^3.0.1", 1631 | "mkdirp": "^3.0.1", 1632 | "yallist": "^5.0.0" 1633 | }, 1634 | "engines": { 1635 | "node": ">=18" 1636 | } 1637 | }, 1638 | "node_modules/tar/node_modules/brace-expansion": { 1639 | "version": "2.0.1", 1640 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1641 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1642 | "license": "MIT", 1643 | "dependencies": { 1644 | "balanced-match": "^1.0.0" 1645 | } 1646 | }, 1647 | "node_modules/tar/node_modules/chownr": { 1648 | "version": "3.0.0", 1649 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", 1650 | "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", 1651 | "license": "BlueOak-1.0.0", 1652 | "engines": { 1653 | "node": ">=18" 1654 | } 1655 | }, 1656 | "node_modules/tar/node_modules/glob": { 1657 | "version": "10.4.5", 1658 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", 1659 | "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", 1660 | "license": "ISC", 1661 | "dependencies": { 1662 | "foreground-child": "^3.1.0", 1663 | "jackspeak": "^3.1.2", 1664 | "minimatch": "^9.0.4", 1665 | "minipass": "^7.1.2", 1666 | "package-json-from-dist": "^1.0.0", 1667 | "path-scurry": "^1.11.1" 1668 | }, 1669 | "bin": { 1670 | "glob": "dist/esm/bin.mjs" 1671 | }, 1672 | "funding": { 1673 | "url": "https://github.com/sponsors/isaacs" 1674 | } 1675 | }, 1676 | "node_modules/tar/node_modules/minimatch": { 1677 | "version": "9.0.5", 1678 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 1679 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 1680 | "license": "ISC", 1681 | "dependencies": { 1682 | "brace-expansion": "^2.0.1" 1683 | }, 1684 | "engines": { 1685 | "node": ">=16 || 14 >=14.17" 1686 | }, 1687 | "funding": { 1688 | "url": "https://github.com/sponsors/isaacs" 1689 | } 1690 | }, 1691 | "node_modules/tar/node_modules/minipass": { 1692 | "version": "7.1.2", 1693 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 1694 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 1695 | "license": "ISC", 1696 | "engines": { 1697 | "node": ">=16 || 14 >=14.17" 1698 | } 1699 | }, 1700 | "node_modules/tar/node_modules/minizlib": { 1701 | "version": "3.0.1", 1702 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", 1703 | "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", 1704 | "license": "MIT", 1705 | "dependencies": { 1706 | "minipass": "^7.0.4", 1707 | "rimraf": "^5.0.5" 1708 | }, 1709 | "engines": { 1710 | "node": ">= 18" 1711 | } 1712 | }, 1713 | "node_modules/tar/node_modules/mkdirp": { 1714 | "version": "3.0.1", 1715 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", 1716 | "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", 1717 | "license": "MIT", 1718 | "bin": { 1719 | "mkdirp": "dist/cjs/src/bin.js" 1720 | }, 1721 | "engines": { 1722 | "node": ">=10" 1723 | }, 1724 | "funding": { 1725 | "url": "https://github.com/sponsors/isaacs" 1726 | } 1727 | }, 1728 | "node_modules/tar/node_modules/rimraf": { 1729 | "version": "5.0.10", 1730 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", 1731 | "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", 1732 | "license": "ISC", 1733 | "dependencies": { 1734 | "glob": "^10.3.7" 1735 | }, 1736 | "bin": { 1737 | "rimraf": "dist/esm/bin.mjs" 1738 | }, 1739 | "funding": { 1740 | "url": "https://github.com/sponsors/isaacs" 1741 | } 1742 | }, 1743 | "node_modules/tar/node_modules/yallist": { 1744 | "version": "5.0.0", 1745 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", 1746 | "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", 1747 | "license": "BlueOak-1.0.0", 1748 | "engines": { 1749 | "node": ">=18" 1750 | } 1751 | }, 1752 | "node_modules/tr46": { 1753 | "version": "0.0.3", 1754 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 1755 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", 1756 | "license": "MIT" 1757 | }, 1758 | "node_modules/ts-node": { 1759 | "version": "10.9.2", 1760 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", 1761 | "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", 1762 | "dev": true, 1763 | "dependencies": { 1764 | "@cspotcode/source-map-support": "^0.8.0", 1765 | "@tsconfig/node10": "^1.0.7", 1766 | "@tsconfig/node12": "^1.0.7", 1767 | "@tsconfig/node14": "^1.0.0", 1768 | "@tsconfig/node16": "^1.0.2", 1769 | "acorn": "^8.4.1", 1770 | "acorn-walk": "^8.1.1", 1771 | "arg": "^4.1.0", 1772 | "create-require": "^1.1.0", 1773 | "diff": "^4.0.1", 1774 | "make-error": "^1.1.1", 1775 | "v8-compile-cache-lib": "^3.0.1", 1776 | "yn": "3.1.1" 1777 | }, 1778 | "bin": { 1779 | "ts-node": "dist/bin.js", 1780 | "ts-node-cwd": "dist/bin-cwd.js", 1781 | "ts-node-esm": "dist/bin-esm.js", 1782 | "ts-node-script": "dist/bin-script.js", 1783 | "ts-node-transpile-only": "dist/bin-transpile.js", 1784 | "ts-script": "dist/bin-script-deprecated.js" 1785 | }, 1786 | "peerDependencies": { 1787 | "@swc/core": ">=1.2.50", 1788 | "@swc/wasm": ">=1.2.50", 1789 | "@types/node": "*", 1790 | "typescript": ">=2.7" 1791 | }, 1792 | "peerDependenciesMeta": { 1793 | "@swc/core": { 1794 | "optional": true 1795 | }, 1796 | "@swc/wasm": { 1797 | "optional": true 1798 | } 1799 | } 1800 | }, 1801 | "node_modules/typescript": { 1802 | "version": "5.8.2", 1803 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", 1804 | "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", 1805 | "dev": true, 1806 | "license": "Apache-2.0", 1807 | "bin": { 1808 | "tsc": "bin/tsc", 1809 | "tsserver": "bin/tsserver" 1810 | }, 1811 | "engines": { 1812 | "node": ">=14.17" 1813 | } 1814 | }, 1815 | "node_modules/undici-types": { 1816 | "version": "5.26.5", 1817 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 1818 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", 1819 | "dev": true 1820 | }, 1821 | "node_modules/unique-filename": { 1822 | "version": "2.0.1", 1823 | "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", 1824 | "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", 1825 | "license": "ISC", 1826 | "dependencies": { 1827 | "unique-slug": "^3.0.0" 1828 | }, 1829 | "engines": { 1830 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1831 | } 1832 | }, 1833 | "node_modules/unique-slug": { 1834 | "version": "3.0.0", 1835 | "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", 1836 | "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", 1837 | "license": "ISC", 1838 | "dependencies": { 1839 | "imurmurhash": "^0.1.4" 1840 | }, 1841 | "engines": { 1842 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1843 | } 1844 | }, 1845 | "node_modules/util-deprecate": { 1846 | "version": "1.0.2", 1847 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1848 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 1849 | "license": "MIT" 1850 | }, 1851 | "node_modules/v8-compile-cache-lib": { 1852 | "version": "3.0.1", 1853 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", 1854 | "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", 1855 | "dev": true 1856 | }, 1857 | "node_modules/webidl-conversions": { 1858 | "version": "3.0.1", 1859 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 1860 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", 1861 | "license": "BSD-2-Clause" 1862 | }, 1863 | "node_modules/whatwg-url": { 1864 | "version": "5.0.0", 1865 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 1866 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 1867 | "license": "MIT", 1868 | "dependencies": { 1869 | "tr46": "~0.0.3", 1870 | "webidl-conversions": "^3.0.0" 1871 | } 1872 | }, 1873 | "node_modules/which": { 1874 | "version": "2.0.2", 1875 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1876 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1877 | "license": "ISC", 1878 | "dependencies": { 1879 | "isexe": "^2.0.0" 1880 | }, 1881 | "bin": { 1882 | "node-which": "bin/node-which" 1883 | }, 1884 | "engines": { 1885 | "node": ">= 8" 1886 | } 1887 | }, 1888 | "node_modules/wide-align": { 1889 | "version": "1.1.5", 1890 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", 1891 | "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", 1892 | "license": "ISC", 1893 | "dependencies": { 1894 | "string-width": "^1.0.2 || 2 || 3 || 4" 1895 | } 1896 | }, 1897 | "node_modules/wrap-ansi-cjs": { 1898 | "name": "wrap-ansi", 1899 | "version": "7.0.0", 1900 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1901 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1902 | "license": "MIT", 1903 | "dependencies": { 1904 | "ansi-styles": "^4.0.0", 1905 | "string-width": "^4.1.0", 1906 | "strip-ansi": "^6.0.0" 1907 | }, 1908 | "engines": { 1909 | "node": ">=10" 1910 | }, 1911 | "funding": { 1912 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1913 | } 1914 | }, 1915 | "node_modules/wrappy": { 1916 | "version": "1.0.2", 1917 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1918 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 1919 | }, 1920 | "node_modules/yallist": { 1921 | "version": "4.0.0", 1922 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1923 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1924 | "license": "ISC" 1925 | }, 1926 | "node_modules/yn": { 1927 | "version": "3.1.1", 1928 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 1929 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 1930 | "dev": true, 1931 | "engines": { 1932 | "node": ">=6" 1933 | } 1934 | } 1935 | } 1936 | } 1937 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "duckerd", 3 | "version": "0.1.4", 4 | "description": "A CLI tool for generating ERD diagrams from DuckDB databases", 5 | "author": "TobiLG ", 6 | "repository": { 7 | "type": "git", 8 | "url": "git+https://github.com/tobilg/duckerd.git" 9 | }, 10 | "license": "MIT", 11 | "bugs": { 12 | "url": "https://github.com/tobilg/duckerd/issues" 13 | }, 14 | "homepage": "https://github.com/tobilg/duckerd#readme", 15 | "bin": { 16 | "duckerd": "dist/index.js" 17 | }, 18 | "scripts": { 19 | "build": "rm -rf dist && tsc", 20 | "start": "ts-node src/index.ts" 21 | }, 22 | "engines": { 23 | "node": "^18.19 || >=20.0" 24 | }, 25 | "keywords": ["duckdb", "erd", "diagram", "cli"], 26 | "dependencies": { 27 | "commander": "^13.1.0", 28 | "duckdb-async": "^1.2.0" 29 | }, 30 | "devDependencies": { 31 | "@types/node": "^18.11.9", 32 | "ts-node": "^10.9.2", 33 | "typescript": "^5.8.2" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/commands/erd.ts: -------------------------------------------------------------------------------- 1 | import { Database } from 'duckdb-async'; 2 | import { generateMermaidCodeForAllDBs, getMetadata } from '../lib/metadata'; 3 | 4 | export const createERD = async (databasePath: string): Promise => { 5 | const db = await Database.create(databasePath); 6 | const conn = await db.connect(); 7 | const metadata = await getMetadata(conn); 8 | await db.close(); 9 | 10 | const mermaidCode = generateMermaidCodeForAllDBs(metadata); 11 | 12 | return mermaidCode; 13 | } -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import { Command } from 'commander'; 4 | import * as path from 'path'; 5 | import { exec } from 'child_process'; 6 | import * as fs from 'fs'; 7 | import { createERD } from './commands/erd'; 8 | import { version } from '../package.json'; 9 | 10 | const program = new Command(); 11 | 12 | program 13 | .version(version) 14 | .description('A CLI tool for generating ERD diagrams from DuckDB databases') 15 | .option('-d, --database ', 'Path to the database file') 16 | .option('-t, --theme [theme]', 'Theme of the chart (choices: "default", "forest", "dark", "neutral", default: "default")') 17 | .option('-o, --output ', 'Path to the output file') 18 | .option('-w, --width [width]', 'Width of the page (default: 1024)') 19 | .option('-H, --height [height]', 'Height of the page (default: 768)') 20 | .option('-f, --outputFormat [format]', 'Output format for the generated image. (choices: "svg", "png", "pdf")') 21 | .action((options) => { 22 | const dbPath = options.database ? path.resolve(options.database) : ':memory:'; 23 | console.log('Generating ERD diagram...'); 24 | 25 | // Check if the database file exists 26 | if (dbPath !== ':memory:' && !fs.existsSync(dbPath)) { 27 | console.error(`Error: Database file not found at ${dbPath}`); 28 | process.exit(1); 29 | } 30 | 31 | run(dbPath, options); 32 | }); 33 | 34 | const run = async (dbPath: string, options: any) => { 35 | const mermaidDiagram = await createERD(dbPath); 36 | const mermaidFile = path.resolve('schema_erd.mmd'); 37 | 38 | if (mermaidDiagram) { 39 | fs.writeFileSync(mermaidFile, mermaidDiagram); 40 | 41 | // Extract the database name from the dbPath 42 | const dbName = dbPath === ':memory:' ? 'memory_db' : path.basename(dbPath, path.extname(dbPath)); 43 | 44 | const outputFile = options.output || `${dbName}_erd.${options.outputFormat || 'png'}`; 45 | const width = options.width || 1024; 46 | const height = options.height || 768; 47 | const theme = options.theme || 'default'; 48 | 49 | const command = `npm exec --package=@mermaid-js/mermaid-cli mmdc -- -i ${mermaidFile} -o ${outputFile} -t ${theme} -w ${width} -H ${height}`; 50 | 51 | exec(command, (error, stdout, stderr) => { 52 | if (error) { 53 | console.error(`Error generating ERD: ${error.message}`); 54 | return; 55 | } 56 | if (stderr) { 57 | console.error(`ERD generation: ${stderr}`); 58 | console.error(`Please re-run the command!`); 59 | return; 60 | } 61 | console.log(`ERD diagram generated: ${outputFile}`); 62 | 63 | fs.unlinkSync(mermaidFile); 64 | }); 65 | } 66 | }; 67 | 68 | program.parse(process.argv); 69 | -------------------------------------------------------------------------------- /src/lib/metadata.ts: -------------------------------------------------------------------------------- 1 | import { Connection } from 'duckdb-async'; 2 | 3 | export interface Metadata { 4 | databases?: Database[]; 5 | } 6 | 7 | export interface Database { 8 | name: string; 9 | schemas?: Schema[]; 10 | } 11 | 12 | interface RawDatabase { 13 | databaseName: string; 14 | } 15 | 16 | interface RawSchema { 17 | databaseName: string; 18 | schemaName: string; 19 | } 20 | 21 | export interface Schema { 22 | name: string; 23 | tables?: Table[]; 24 | sequences?: Sequence[]; 25 | } 26 | 27 | export interface Table { 28 | databaseName?: string; 29 | schemaName?: string; 30 | name: string; 31 | hasPrimaryKey: boolean; 32 | estimatedRowCount: number; 33 | columnCount: number; 34 | indexCount: number; 35 | checkConstraintCount: number; 36 | sql: string; 37 | columns?: Column[]; 38 | indexes?: Index[]; 39 | constraints?: Constraint[]; 40 | } 41 | 42 | export interface Column { 43 | databaseName?: string; 44 | schemaName?: string; 45 | tableName?: string; 46 | name: string; 47 | dataType: string; 48 | precision: number; 49 | scale: number; 50 | isNullable: boolean; 51 | } 52 | 53 | export interface Sequence { 54 | databaseName?: string; 55 | schemaName?: string; 56 | name: string; 57 | isTemporary: boolean; 58 | startValue: number; 59 | lastValue: number; 60 | minValue: number; 61 | maxValue: number; 62 | incrementBy: number; 63 | sql: string; 64 | } 65 | 66 | export interface Constraint { 67 | databaseName?: string; 68 | schemaName?: string; 69 | tableName?: string; 70 | columnName: string; 71 | constraintType: string; 72 | sql: string; 73 | } 74 | 75 | export interface Index { 76 | databaseName?: string; 77 | schemaName?: string; 78 | tableName?: string; 79 | name: string; 80 | isUnique: boolean; 81 | sql: string; 82 | } 83 | 84 | // Database metadata query 85 | const databaseMetadataQuery = `SELECT database_name as databaseName FROM duckdb_databases() WHERE database_name NOT IN ('system', 'temp') ORDER BY database_name`; 86 | // Schema metadata query 87 | const schemaMetadataQuery = `SELECT database_name as databaseName, schema_name as schemaName FROM duckdb_schemas() WHERE database_name NOT IN ('system', 'temp') and schema_name NOT IN ('information_schema', 'pg_catalog') ORDER BY database_name, schema_name`; 88 | // Table metadata query 89 | const tablesMetadataQuery = `SELECT database_name as databaseName, schema_name as schemaName, table_name as name, has_primary_key as hasPrimaryKey, estimated_size as estimatedRowCount, column_count as columnCount, index_count as indexCount, check_constraint_count as checkConstraintCount, sql FROM duckdb_tables() WHERE internal = false ORDER BY database_name, schema_name, table_name`; 90 | // Column metadata query 91 | const columnsMetadataQuery = `SELECT database_name as databaseName, schema_name as schemaName, table_name as tableName, column_name as name, data_type as dataType, numeric_precision as precision, numeric_scale as scale, is_nullable as isNullable FROM duckdb_columns() WHERE internal = false ORDER BY database_name, schema_name, table_name, column_index`; 92 | // Index metadata query 93 | const indexesMetadataQuery = `SELECT database_name as databaseName, schema_name as schemaName, table_name as tableName, index_name as name, is_unique as isUnique, sql FROM duckdb_indexes() ORDER BY database_name, schema_name, table_name, index_name`; 94 | // Constraints metadata query 95 | const contraintsMetadataQuery = `SELECT database_name as databaseName, schema_name as schemaName, table_name as tableName, unnest(constraint_column_names) as columnName, constraint_type as constraintType, constraint_text as sql FROM duckdb_constraints() ORDER BY database_name, schema_name, table_name`; 96 | // Constraints metadata query 97 | const sequencesMetadataQuery = `SELECT database_name as databaseName, schema_name as schemaName, sequence_name as name, temporary as isTemporary, start_value as startValue, last_value as lastValue, min_value as minValue, max_value as maxValue, increment_by as incrementBy, sql FROM duckdb_sequences() ORDER BY database_name, schema_name, sequence_name`; 98 | 99 | export const getMetadata = async (conn: Connection): Promise => { 100 | const databaseRaw = await conn.all(databaseMetadataQuery) as RawDatabase[]; 101 | const schemas = await conn.all(schemaMetadataQuery) as RawSchema[]; 102 | const tables = await conn.all(tablesMetadataQuery) as Table[]; 103 | const columns = await conn.all(columnsMetadataQuery) as Column[]; 104 | const indexes = await conn.all(indexesMetadataQuery) as Index[]; 105 | const constraints = await conn.all(contraintsMetadataQuery) as Constraint[]; 106 | const sequences = await conn.all(sequencesMetadataQuery) as Sequence[]; 107 | 108 | const databases = databaseRaw.map(database => ({ 109 | name: database.databaseName, 110 | schemas: [...new Set(schemas.filter(schema => database.databaseName === schema.databaseName).map(schema => ({ 111 | name: schema.schemaName, 112 | tables: [...new Set(tables.filter(table => schema.databaseName === table.databaseName && schema.schemaName === table.schemaName).map(table => ({ 113 | databaseName: database.databaseName, 114 | schemaName: schema.schemaName, 115 | name: table.name, 116 | hasPrimaryKey: table.hasPrimaryKey, 117 | estimatedRowCount: table.estimatedRowCount, 118 | columnCount: table.columnCount, 119 | indexCount: table.indexCount, 120 | checkConstraintCount: table.checkConstraintCount, 121 | sql: table.sql, 122 | columns: [...new Set(columns.filter(column => column.databaseName === table.databaseName && column.schemaName === table.schemaName && column.tableName === table.name).map(column => ({ 123 | name: column.name, 124 | dataType: column.dataType, 125 | precision: column.precision, 126 | scale: column.scale, 127 | isNullable: column.isNullable, 128 | }) as Column))], 129 | indexes: [...new Set(indexes.filter(index => index.databaseName === table.databaseName && index.schemaName === table.schemaName && index.tableName === table.name).map(index => ({ 130 | name: index.name, 131 | isUnique: index.isUnique, 132 | sql: index.sql, 133 | }) as Index))], 134 | constraints: [...new Set(constraints.filter((constraint) => constraint.databaseName === table.databaseName && constraint.schemaName === table.schemaName && constraint.tableName === table.name).map(constraint => ({ 135 | columnName: constraint.columnName, 136 | constraintType: constraint.constraintType, 137 | sql: constraint.sql, 138 | }) as Constraint))], 139 | })))], 140 | sequences: [...new Set(sequences.filter(sequence => sequence.databaseName === schema.databaseName && sequence.schemaName === schema.schemaName).map(sequence => ({ 141 | name: sequence.name, 142 | isTemporary: sequence.isTemporary, 143 | startValue: sequence.startValue, 144 | lastValue: sequence.lastValue, 145 | minValue: sequence.minValue, 146 | maxValue: sequence.maxValue, 147 | incrementBy: sequence.incrementBy, 148 | sql: sequence.sql, 149 | }) as Sequence))], 150 | }) as Schema))], 151 | })); 152 | 153 | const metadata: Metadata = { 154 | databases, 155 | }; 156 | 157 | return metadata; 158 | } 159 | 160 | export const generateMermaidCodeForAllDBs = (metadata: Metadata): string | undefined => { 161 | let mermaidCode = `erDiagram 162 | 163 | `; 164 | 165 | if (metadata.databases && metadata.databases.length > 0 && metadata.databases[0].schemas && metadata.databases[0].schemas?.length > 0) { 166 | // Get tables 167 | const tables = metadata.databases!.map((db) => db.schemas!.map((s) => s.tables!).flat()).flat(); 168 | 169 | if (tables && tables.length > 0) { 170 | // Add tables, columns and constraints 171 | mermaidCode += tables.map((table) => { 172 | return `"${table.databaseName}.${table.name}" { 173 | ${table.columns!.map((column) => ` ${sanitizeDataType(column.dataType.toUpperCase())} ${column.name} ${table.constraints?.filter((constraint) => constraint.columnName === column.name).map((constraint) => ((constraint.constraintType === "PRIMARY KEY" ? "PK" : "") || (constraint.constraintType === "FOREIGN KEY" ? "FK" : "") || "")).filter(str => str)}${addCommentIfNecessary(column.dataType)}`).join("\n")} 174 | }\n${table.constraints?.filter((constraint) => constraint.constraintType === "FOREIGN KEY").map((constraint) => ` "${table.databaseName}.${constraint.sql.match(/(?:^|)REFERENCES\s([^*]+?)\b\(/i)![1]}" ||--o{ "${table.databaseName}.${table.name}" : has`).join("\n")}` 175 | }).join("\n ") 176 | 177 | return mermaidCode; 178 | } else { 179 | return undefined; 180 | } 181 | } else { 182 | return undefined; 183 | } 184 | } 185 | 186 | export const sanitizeDataType = (dataType: string): string => { 187 | if (dataType.startsWith("STRUCT(")) { 188 | return dataType.replace("STRUCT(", "STRUCT").replace(")", ""); 189 | } 190 | 191 | if (dataType.startsWith("ENUM(")) { 192 | return "ENUM"; 193 | } 194 | 195 | if (dataType.includes(",")) { 196 | return dataType.replace(",", "_"); 197 | } 198 | 199 | return dataType; 200 | } 201 | 202 | export const addCommentIfNecessary = (dataType: string): string => { 203 | if (dataType.startsWith("ENUM(")) { 204 | return ` "${dataType.replace("ENUM(", "").replace(")", "").split(",").map((value) => value.trim().replace(/'/g, "").replace(/"/g, "")).join(", ")}"`; 205 | } 206 | 207 | return ""; 208 | } 209 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2021", 4 | "module": "CommonJS", 5 | "outDir": "./dist", 6 | "rootDir": "./src", 7 | "strict": true, 8 | "esModuleInterop": true, 9 | "skipLibCheck": true, 10 | "forceConsistentCasingInFileNames": true, 11 | "resolveJsonModule": true 12 | }, 13 | "include": ["src/**/*"], 14 | "exclude": ["node_modules", "**/*.spec.ts"] 15 | } --------------------------------------------------------------------------------