├── .github └── workflows │ └── build.yml ├── .gitignore ├── .vscode └── settings.json ├── README.md ├── entitlements.plist ├── import-meta-url.js ├── package-lock.json ├── package.json ├── src ├── app.ts ├── archive-util.ts ├── bin │ ├── bash-complete.ts │ └── cli.ts ├── context.ts ├── env-to-bool.ts ├── impl.ts ├── node-util.ts ├── postject.d.ts └── tsconfig.json └── test ├── asset.txt └── sample.cjs /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build & Test 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | pull_request: 7 | 8 | concurrency: 9 | group: ${{ github.ref_name || github.sha }} 10 | cancel-in-progress: true 11 | 12 | defaults: 13 | run: 14 | shell: bash 15 | 16 | env: 17 | BUILD_CACHE_KEY: ${{ github.sha }} 18 | CACHED_BUILD_PATHS: | 19 | ${{ github.workspace }}/packages/*/dist 20 | 21 | jobs: 22 | build: 23 | name: Build 24 | runs-on: ubuntu-latest 25 | steps: 26 | - name: Checkout 27 | uses: actions/checkout@v4 28 | with: 29 | fetch-depth: 0 30 | 31 | - name: Set up Node 32 | uses: actions/setup-node@v4 33 | with: 34 | node-version-file: package.json 35 | cache: npm 36 | 37 | - name: Setup NPM dependencies 38 | run: npm install 39 | 40 | - name: Build 41 | run: npm run build 42 | 43 | - name: Store dist 44 | uses: actions/upload-artifact@v4 45 | with: 46 | name: dist 47 | if-no-files-found: error 48 | path: dist/** 49 | 50 | test: 51 | name: Smoke Test 52 | strategy: 53 | fail-fast: false 54 | matrix: 55 | os: [ubuntu-latest, windows-latest, macos-latest] 56 | runs-on: ${{ matrix.os }} 57 | needs: build 58 | steps: 59 | - name: Checkout 60 | uses: actions/checkout@v4 61 | with: 62 | fetch-depth: 0 63 | 64 | - name: Set up Node 65 | uses: actions/setup-node@v4 66 | with: 67 | node-version-file: package.json 68 | cache: npm 69 | 70 | - name: Setup NPM dependencies 71 | run: npm install 72 | 73 | - name: Download dist 74 | uses: actions/download-artifact@v4 75 | with: 76 | name: dist 77 | path: dist 78 | merge-multiple: true 79 | 80 | - name: Smoke test 81 | run: | 82 | node dist/cli.js 83 | 84 | - name: Test with asset 85 | if: ${{ matrix.os == 'ubuntu-latest' }} 86 | run: | 87 | cd test 88 | node ../dist/cli.js -a asset.txt --no-bundle sample.cjs 89 | expected=$(cat asset.txt) 90 | actual=$(./dist-bin/sample-linux-x64) 91 | [ "$actual" = "$expected" ] 92 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Runtime data 10 | pids 11 | *.pid 12 | *.seed 13 | *.pid.lock 14 | 15 | # Coverage directory used by tools like istanbul 16 | coverage 17 | *.lcov 18 | 19 | # nyc test coverage 20 | .nyc_output 21 | 22 | # Dependency directories 23 | node_modules/ 24 | jspm_packages/ 25 | 26 | *.tsbuildinfo 27 | dist 28 | dist-bin 29 | .node-cache 30 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "cSpell.words": ["postject", "rcodesign", "stricli", "unsign", "untar"] 3 | } 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Fossilize 2 | 3 | ![NPM Version][1] ![Build Status][2] 4 | 5 | Create self-contained binaries for all platforms supported by Node.js using [Node SEA][3]. 6 | 7 | ## Usage 8 | 9 | ### With `npx` 10 | 11 | In the root of your Node.js project 12 | 13 | ```shell 14 | npx fossilize 15 | ``` 16 | 17 | or just give it your entrypoint file 18 | 19 | ```shell 20 | npx fossilize main.js 21 | ``` 22 | 23 | ### As a dev dependency 24 | 25 | It is also possible to use fossilize as a dev dependency. Add it to your project first: 26 | 27 | ```shell 28 | npm add --save-dev fossilize 29 | ``` 30 | 31 | and then add a `compile` script to your project referencing fossilize: 32 | 33 | ```json 34 | { 35 | "scripts": { 36 | "compile": "fossilize -a some.html -n lts" 37 | } 38 | } 39 | ``` 40 | 41 | ### Supported Environment Variables 42 | 43 | - `FOSSILIZE_SIGN` 44 | - `FOSSILIZE_NODE_VERSION` 45 | - `FOSSILIZE_CACHE_DIR` 46 | - `FOSSILIZE_PLATFORMS` (comma separated) 47 | - `FOSSILIZE_CONCURRENCY_LIMIT` 48 | 49 | ## What is it? 50 | 51 | Fossilize is a tool to create Node SEAs (Single Executable Applications) 52 | for different platforms. It bundles your Node.js application and its dependencies 53 | into a single CJS file using `esbuild`. Then creates a self-contained binary from 54 | that using the [Node SEA][3] feature. 55 | 56 | It also supports embedding assets either file by file, from a directory, or 57 | through a Vite manifest. 58 | 59 | ## Why? 60 | 61 | Long version: [https://byk.im/posts/fossilize/](https://byk.im/posts/fossilize/) 62 | 63 | ### Why would I want a single-executable Node.js application? 64 | 65 | If you are building a CLI application using Node.js, it becomes a challenge to 66 | distribute it. You may rely on `npx` which requires Node.js but you'd also need 67 | to make sure your app works with many Node.js versions. Your tool being written 68 | in JS does not necessarily mean it is for Node.js users but it would require 69 | Node.js on their system. With Node SEA, you just give them a self-contained 70 | binary without any other system requirements (except for `libc`) and you are 71 | done. 72 | 73 | Alternatively, you might be developing a server application that you want to 74 | distribute and deploy using Docker. Now you need to maintain a Docker image 75 | build pipeline, optimize the image building process based on dependencies, 76 | learn how to minimize image size by deleting package manager caches etc. 77 | On the other hand, if you distribute your application as a Node SEA, then 78 | all you need to do is copy a single binary into a base Linux distro image 79 | that has `libc` (sorry Alpine) and you are good to go. 80 | 81 | ### Why do I need `fossilize`? 82 | 83 | If you go check the documentation for Node SEA, not only you'd see that it is 84 | marked as "under active development", you'd also realize that there are these 85 | manual and hand-wavy steps that you need to follow to build a Node SEA binary. 86 | Just the macOS signing part is a big discovery journey itself whereas if you 87 | are using [Deno][5] for instance, it is just [`deno compile`][6]. 88 | 89 | _Yes, we can improve the docs and we probably should but an automated tool is still better._ 90 | 91 | ### Why is `fossilize` itself not a Node SEA? 92 | 93 | Oh the irony! I actually tried but there are two main blockers right now: 94 | 95 | 1. I want to include a bundler and both `esbuild` and `rollup` have native 96 | components. They do support and have WASM so this is still possible but 97 | I just didn't have that time to work on this yet. 98 | 2. [postject][7], the library we use to inject your app into the Node.js binary 99 | gets confused if you try to inject itself (or some code contains itself). 100 | This is most probably solvable with a pull request but that requires time 101 | like the item above, which I've yet to spend. 102 | 103 | ## Notes 104 | 105 | Currently, it supports signing macOS binaries which is required for them to run 106 | on any system. It uses [`rcodesign`][4] for this through the following env variables: 107 | 108 | - `APPLE_TEAM_ID` 109 | - `APPLE_CERT_PATH` 110 | - `APPLE_CERT_PASSWORD` 111 | - `APPLE_API_KEY_PATH` 112 | 113 | Further documentation will be added about how to obtain and use these. 114 | 115 | [1]: https://img.shields.io/npm/v/fossilize 116 | [2]: https://github.com/BYK/fossilize/actions/workflows/build.yml/badge.svg?branch=main 117 | [3]: https://nodejs.org/api/single-executable-applications.html#single-executable-applications 118 | [4]: https://github.com/indygreg/apple-platform-rs/releases 119 | [5]: https://deno.com/ 120 | [6]: https://docs.deno.com/runtime/reference/cli/compile/ 121 | [7]: https://www.npmjs.com/package/postject 122 | -------------------------------------------------------------------------------- /entitlements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | com.apple.security.cs.allow-jit 7 | 8 | com.apple.security.cs.allow-unsigned-executable-memory 9 | 10 | com.apple.security.cs.disable-executable-page-protection 11 | 12 | com.apple.security.cs.allow-dyld-environment-variables 13 | 14 | com.apple.security.cs.disable-library-validation 15 | 16 | com.apple.security.get-task-allow 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /import-meta-url.js: -------------------------------------------------------------------------------- 1 | export var import_meta_url = require('url').pathToFileURL(__filename); 2 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fossilize", 3 | "version": "0.4.2", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "fossilize", 9 | "version": "0.4.2", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@stricli/auto-complete": "^1.1.0", 13 | "@stricli/core": "^1.1.0", 14 | "esbuild": "^0.25.0", 15 | "macho-unsign": "^2.0.6", 16 | "p-limit": "^6.2.0", 17 | "portable-executable-signature": "^2.0.6", 18 | "postject": "^1.0.0-alpha.6", 19 | "tar-stream": "^3.1.7", 20 | "xz-decompress": "^0.2.2", 21 | "yauzl": "^3.2.0" 22 | }, 23 | "bin": { 24 | "__fossilize_bash_complete": "dist/bash-complete.js", 25 | "fossilize": "dist/cli.js" 26 | }, 27 | "devDependencies": { 28 | "@types/node": "22.x", 29 | "@types/tar-stream": "^3.1.3", 30 | "@types/yauzl": "^2.10.3", 31 | "tsup": "^6.7.0", 32 | "typescript": "5.6.x" 33 | }, 34 | "engines": { 35 | "node": ">=22" 36 | } 37 | }, 38 | "node_modules/@esbuild/aix-ppc64": { 39 | "version": "0.25.0", 40 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", 41 | "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", 42 | "cpu": [ 43 | "ppc64" 44 | ], 45 | "license": "MIT", 46 | "optional": true, 47 | "os": [ 48 | "aix" 49 | ], 50 | "engines": { 51 | "node": ">=18" 52 | } 53 | }, 54 | "node_modules/@esbuild/android-arm": { 55 | "version": "0.25.0", 56 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", 57 | "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", 58 | "cpu": [ 59 | "arm" 60 | ], 61 | "license": "MIT", 62 | "optional": true, 63 | "os": [ 64 | "android" 65 | ], 66 | "engines": { 67 | "node": ">=18" 68 | } 69 | }, 70 | "node_modules/@esbuild/android-arm64": { 71 | "version": "0.25.0", 72 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", 73 | "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", 74 | "cpu": [ 75 | "arm64" 76 | ], 77 | "license": "MIT", 78 | "optional": true, 79 | "os": [ 80 | "android" 81 | ], 82 | "engines": { 83 | "node": ">=18" 84 | } 85 | }, 86 | "node_modules/@esbuild/android-x64": { 87 | "version": "0.25.0", 88 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", 89 | "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", 90 | "cpu": [ 91 | "x64" 92 | ], 93 | "license": "MIT", 94 | "optional": true, 95 | "os": [ 96 | "android" 97 | ], 98 | "engines": { 99 | "node": ">=18" 100 | } 101 | }, 102 | "node_modules/@esbuild/darwin-arm64": { 103 | "version": "0.25.0", 104 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", 105 | "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", 106 | "cpu": [ 107 | "arm64" 108 | ], 109 | "license": "MIT", 110 | "optional": true, 111 | "os": [ 112 | "darwin" 113 | ], 114 | "engines": { 115 | "node": ">=18" 116 | } 117 | }, 118 | "node_modules/@esbuild/darwin-x64": { 119 | "version": "0.25.0", 120 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", 121 | "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", 122 | "cpu": [ 123 | "x64" 124 | ], 125 | "license": "MIT", 126 | "optional": true, 127 | "os": [ 128 | "darwin" 129 | ], 130 | "engines": { 131 | "node": ">=18" 132 | } 133 | }, 134 | "node_modules/@esbuild/freebsd-arm64": { 135 | "version": "0.25.0", 136 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", 137 | "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", 138 | "cpu": [ 139 | "arm64" 140 | ], 141 | "license": "MIT", 142 | "optional": true, 143 | "os": [ 144 | "freebsd" 145 | ], 146 | "engines": { 147 | "node": ">=18" 148 | } 149 | }, 150 | "node_modules/@esbuild/freebsd-x64": { 151 | "version": "0.25.0", 152 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", 153 | "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", 154 | "cpu": [ 155 | "x64" 156 | ], 157 | "license": "MIT", 158 | "optional": true, 159 | "os": [ 160 | "freebsd" 161 | ], 162 | "engines": { 163 | "node": ">=18" 164 | } 165 | }, 166 | "node_modules/@esbuild/linux-arm": { 167 | "version": "0.25.0", 168 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", 169 | "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", 170 | "cpu": [ 171 | "arm" 172 | ], 173 | "license": "MIT", 174 | "optional": true, 175 | "os": [ 176 | "linux" 177 | ], 178 | "engines": { 179 | "node": ">=18" 180 | } 181 | }, 182 | "node_modules/@esbuild/linux-arm64": { 183 | "version": "0.25.0", 184 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", 185 | "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", 186 | "cpu": [ 187 | "arm64" 188 | ], 189 | "license": "MIT", 190 | "optional": true, 191 | "os": [ 192 | "linux" 193 | ], 194 | "engines": { 195 | "node": ">=18" 196 | } 197 | }, 198 | "node_modules/@esbuild/linux-ia32": { 199 | "version": "0.25.0", 200 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", 201 | "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", 202 | "cpu": [ 203 | "ia32" 204 | ], 205 | "license": "MIT", 206 | "optional": true, 207 | "os": [ 208 | "linux" 209 | ], 210 | "engines": { 211 | "node": ">=18" 212 | } 213 | }, 214 | "node_modules/@esbuild/linux-loong64": { 215 | "version": "0.25.0", 216 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", 217 | "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", 218 | "cpu": [ 219 | "loong64" 220 | ], 221 | "license": "MIT", 222 | "optional": true, 223 | "os": [ 224 | "linux" 225 | ], 226 | "engines": { 227 | "node": ">=18" 228 | } 229 | }, 230 | "node_modules/@esbuild/linux-mips64el": { 231 | "version": "0.25.0", 232 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", 233 | "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", 234 | "cpu": [ 235 | "mips64el" 236 | ], 237 | "license": "MIT", 238 | "optional": true, 239 | "os": [ 240 | "linux" 241 | ], 242 | "engines": { 243 | "node": ">=18" 244 | } 245 | }, 246 | "node_modules/@esbuild/linux-ppc64": { 247 | "version": "0.25.0", 248 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", 249 | "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", 250 | "cpu": [ 251 | "ppc64" 252 | ], 253 | "license": "MIT", 254 | "optional": true, 255 | "os": [ 256 | "linux" 257 | ], 258 | "engines": { 259 | "node": ">=18" 260 | } 261 | }, 262 | "node_modules/@esbuild/linux-riscv64": { 263 | "version": "0.25.0", 264 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", 265 | "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", 266 | "cpu": [ 267 | "riscv64" 268 | ], 269 | "license": "MIT", 270 | "optional": true, 271 | "os": [ 272 | "linux" 273 | ], 274 | "engines": { 275 | "node": ">=18" 276 | } 277 | }, 278 | "node_modules/@esbuild/linux-s390x": { 279 | "version": "0.25.0", 280 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", 281 | "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", 282 | "cpu": [ 283 | "s390x" 284 | ], 285 | "license": "MIT", 286 | "optional": true, 287 | "os": [ 288 | "linux" 289 | ], 290 | "engines": { 291 | "node": ">=18" 292 | } 293 | }, 294 | "node_modules/@esbuild/linux-x64": { 295 | "version": "0.25.0", 296 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", 297 | "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", 298 | "cpu": [ 299 | "x64" 300 | ], 301 | "license": "MIT", 302 | "optional": true, 303 | "os": [ 304 | "linux" 305 | ], 306 | "engines": { 307 | "node": ">=18" 308 | } 309 | }, 310 | "node_modules/@esbuild/netbsd-arm64": { 311 | "version": "0.25.0", 312 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", 313 | "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", 314 | "cpu": [ 315 | "arm64" 316 | ], 317 | "license": "MIT", 318 | "optional": true, 319 | "os": [ 320 | "netbsd" 321 | ], 322 | "engines": { 323 | "node": ">=18" 324 | } 325 | }, 326 | "node_modules/@esbuild/netbsd-x64": { 327 | "version": "0.25.0", 328 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", 329 | "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", 330 | "cpu": [ 331 | "x64" 332 | ], 333 | "license": "MIT", 334 | "optional": true, 335 | "os": [ 336 | "netbsd" 337 | ], 338 | "engines": { 339 | "node": ">=18" 340 | } 341 | }, 342 | "node_modules/@esbuild/openbsd-arm64": { 343 | "version": "0.25.0", 344 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", 345 | "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", 346 | "cpu": [ 347 | "arm64" 348 | ], 349 | "license": "MIT", 350 | "optional": true, 351 | "os": [ 352 | "openbsd" 353 | ], 354 | "engines": { 355 | "node": ">=18" 356 | } 357 | }, 358 | "node_modules/@esbuild/openbsd-x64": { 359 | "version": "0.25.0", 360 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", 361 | "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", 362 | "cpu": [ 363 | "x64" 364 | ], 365 | "license": "MIT", 366 | "optional": true, 367 | "os": [ 368 | "openbsd" 369 | ], 370 | "engines": { 371 | "node": ">=18" 372 | } 373 | }, 374 | "node_modules/@esbuild/sunos-x64": { 375 | "version": "0.25.0", 376 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", 377 | "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", 378 | "cpu": [ 379 | "x64" 380 | ], 381 | "license": "MIT", 382 | "optional": true, 383 | "os": [ 384 | "sunos" 385 | ], 386 | "engines": { 387 | "node": ">=18" 388 | } 389 | }, 390 | "node_modules/@esbuild/win32-arm64": { 391 | "version": "0.25.0", 392 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", 393 | "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", 394 | "cpu": [ 395 | "arm64" 396 | ], 397 | "license": "MIT", 398 | "optional": true, 399 | "os": [ 400 | "win32" 401 | ], 402 | "engines": { 403 | "node": ">=18" 404 | } 405 | }, 406 | "node_modules/@esbuild/win32-ia32": { 407 | "version": "0.25.0", 408 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", 409 | "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", 410 | "cpu": [ 411 | "ia32" 412 | ], 413 | "license": "MIT", 414 | "optional": true, 415 | "os": [ 416 | "win32" 417 | ], 418 | "engines": { 419 | "node": ">=18" 420 | } 421 | }, 422 | "node_modules/@esbuild/win32-x64": { 423 | "version": "0.25.0", 424 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", 425 | "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", 426 | "cpu": [ 427 | "x64" 428 | ], 429 | "license": "MIT", 430 | "optional": true, 431 | "os": [ 432 | "win32" 433 | ], 434 | "engines": { 435 | "node": ">=18" 436 | } 437 | }, 438 | "node_modules/@isaacs/cliui": { 439 | "version": "8.0.2", 440 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 441 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 442 | "dev": true, 443 | "license": "ISC", 444 | "dependencies": { 445 | "string-width": "^5.1.2", 446 | "string-width-cjs": "npm:string-width@^4.2.0", 447 | "strip-ansi": "^7.0.1", 448 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 449 | "wrap-ansi": "^8.1.0", 450 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 451 | }, 452 | "engines": { 453 | "node": ">=12" 454 | } 455 | }, 456 | "node_modules/@jridgewell/gen-mapping": { 457 | "version": "0.3.8", 458 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", 459 | "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", 460 | "dev": true, 461 | "license": "MIT", 462 | "dependencies": { 463 | "@jridgewell/set-array": "^1.2.1", 464 | "@jridgewell/sourcemap-codec": "^1.4.10", 465 | "@jridgewell/trace-mapping": "^0.3.24" 466 | }, 467 | "engines": { 468 | "node": ">=6.0.0" 469 | } 470 | }, 471 | "node_modules/@jridgewell/resolve-uri": { 472 | "version": "3.1.2", 473 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 474 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 475 | "dev": true, 476 | "license": "MIT", 477 | "engines": { 478 | "node": ">=6.0.0" 479 | } 480 | }, 481 | "node_modules/@jridgewell/set-array": { 482 | "version": "1.2.1", 483 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 484 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 485 | "dev": true, 486 | "license": "MIT", 487 | "engines": { 488 | "node": ">=6.0.0" 489 | } 490 | }, 491 | "node_modules/@jridgewell/sourcemap-codec": { 492 | "version": "1.5.0", 493 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 494 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 495 | "dev": true, 496 | "license": "MIT" 497 | }, 498 | "node_modules/@jridgewell/trace-mapping": { 499 | "version": "0.3.25", 500 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 501 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 502 | "dev": true, 503 | "license": "MIT", 504 | "dependencies": { 505 | "@jridgewell/resolve-uri": "^3.1.0", 506 | "@jridgewell/sourcemap-codec": "^1.4.14" 507 | } 508 | }, 509 | "node_modules/@nodelib/fs.scandir": { 510 | "version": "2.1.5", 511 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 512 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 513 | "dev": true, 514 | "license": "MIT", 515 | "dependencies": { 516 | "@nodelib/fs.stat": "2.0.5", 517 | "run-parallel": "^1.1.9" 518 | }, 519 | "engines": { 520 | "node": ">= 8" 521 | } 522 | }, 523 | "node_modules/@nodelib/fs.stat": { 524 | "version": "2.0.5", 525 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 526 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 527 | "dev": true, 528 | "license": "MIT", 529 | "engines": { 530 | "node": ">= 8" 531 | } 532 | }, 533 | "node_modules/@nodelib/fs.walk": { 534 | "version": "1.2.8", 535 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 536 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 537 | "dev": true, 538 | "license": "MIT", 539 | "dependencies": { 540 | "@nodelib/fs.scandir": "2.1.5", 541 | "fastq": "^1.6.0" 542 | }, 543 | "engines": { 544 | "node": ">= 8" 545 | } 546 | }, 547 | "node_modules/@pkgjs/parseargs": { 548 | "version": "0.11.0", 549 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 550 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 551 | "dev": true, 552 | "license": "MIT", 553 | "optional": true, 554 | "engines": { 555 | "node": ">=14" 556 | } 557 | }, 558 | "node_modules/@stricli/auto-complete": { 559 | "version": "1.1.0", 560 | "resolved": "https://registry.npmjs.org/@stricli/auto-complete/-/auto-complete-1.1.0.tgz", 561 | "integrity": "sha512-yedU+X2ukaG7N5PhIrFWjuTb0Kc6g4/eXiAo+A1dzc7ihvxKZKe4uclfWGDsbzCWl1vSluFLB0db9HqYgBiREg==", 562 | "license": "Apache-2.0", 563 | "dependencies": { 564 | "@stricli/core": "^1.1.0" 565 | }, 566 | "bin": { 567 | "auto-complete": "dist/bin/cli.js" 568 | } 569 | }, 570 | "node_modules/@stricli/core": { 571 | "version": "1.1.0", 572 | "resolved": "https://registry.npmjs.org/@stricli/core/-/core-1.1.0.tgz", 573 | "integrity": "sha512-2dLUunRqYRvfaoYXhOWqLJzOl8H1RjTdOAYyXkls7MMwcA11gABqJuNZZSxOSqwTLDKjTfJkmgyaZCU7bfEX5w==", 574 | "license": "Apache-2.0" 575 | }, 576 | "node_modules/@types/node": { 577 | "version": "22.10.2", 578 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", 579 | "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", 580 | "dev": true, 581 | "license": "MIT", 582 | "dependencies": { 583 | "undici-types": "~6.20.0" 584 | } 585 | }, 586 | "node_modules/@types/tar-stream": { 587 | "version": "3.1.3", 588 | "resolved": "https://registry.npmjs.org/@types/tar-stream/-/tar-stream-3.1.3.tgz", 589 | "integrity": "sha512-Zbnx4wpkWBMBSu5CytMbrT5ZpMiF55qgM+EpHzR4yIDu7mv52cej8hTkOc6K+LzpkOAbxwn/m7j3iO+/l42YkQ==", 590 | "dev": true, 591 | "license": "MIT", 592 | "dependencies": { 593 | "@types/node": "*" 594 | } 595 | }, 596 | "node_modules/@types/yauzl": { 597 | "version": "2.10.3", 598 | "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", 599 | "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", 600 | "dev": true, 601 | "license": "MIT", 602 | "dependencies": { 603 | "@types/node": "*" 604 | } 605 | }, 606 | "node_modules/ansi-regex": { 607 | "version": "6.1.0", 608 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 609 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 610 | "dev": true, 611 | "license": "MIT", 612 | "engines": { 613 | "node": ">=12" 614 | }, 615 | "funding": { 616 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 617 | } 618 | }, 619 | "node_modules/ansi-styles": { 620 | "version": "6.2.1", 621 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 622 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 623 | "dev": true, 624 | "license": "MIT", 625 | "engines": { 626 | "node": ">=12" 627 | }, 628 | "funding": { 629 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 630 | } 631 | }, 632 | "node_modules/any-promise": { 633 | "version": "1.3.0", 634 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 635 | "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", 636 | "dev": true, 637 | "license": "MIT" 638 | }, 639 | "node_modules/anymatch": { 640 | "version": "3.1.3", 641 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 642 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 643 | "dev": true, 644 | "license": "ISC", 645 | "dependencies": { 646 | "normalize-path": "^3.0.0", 647 | "picomatch": "^2.0.4" 648 | }, 649 | "engines": { 650 | "node": ">= 8" 651 | } 652 | }, 653 | "node_modules/array-union": { 654 | "version": "2.1.0", 655 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 656 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", 657 | "dev": true, 658 | "license": "MIT", 659 | "engines": { 660 | "node": ">=8" 661 | } 662 | }, 663 | "node_modules/b4a": { 664 | "version": "1.6.7", 665 | "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", 666 | "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", 667 | "license": "Apache-2.0" 668 | }, 669 | "node_modules/balanced-match": { 670 | "version": "1.0.2", 671 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 672 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 673 | "dev": true, 674 | "license": "MIT" 675 | }, 676 | "node_modules/bare-events": { 677 | "version": "2.5.4", 678 | "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", 679 | "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", 680 | "license": "Apache-2.0", 681 | "optional": true 682 | }, 683 | "node_modules/binary-extensions": { 684 | "version": "2.3.0", 685 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", 686 | "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", 687 | "dev": true, 688 | "license": "MIT", 689 | "engines": { 690 | "node": ">=8" 691 | }, 692 | "funding": { 693 | "url": "https://github.com/sponsors/sindresorhus" 694 | } 695 | }, 696 | "node_modules/brace-expansion": { 697 | "version": "2.0.1", 698 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 699 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 700 | "dev": true, 701 | "license": "MIT", 702 | "dependencies": { 703 | "balanced-match": "^1.0.0" 704 | } 705 | }, 706 | "node_modules/braces": { 707 | "version": "3.0.3", 708 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 709 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 710 | "dev": true, 711 | "license": "MIT", 712 | "dependencies": { 713 | "fill-range": "^7.1.1" 714 | }, 715 | "engines": { 716 | "node": ">=8" 717 | } 718 | }, 719 | "node_modules/buffer-crc32": { 720 | "version": "0.2.13", 721 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 722 | "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", 723 | "license": "MIT", 724 | "engines": { 725 | "node": "*" 726 | } 727 | }, 728 | "node_modules/bundle-require": { 729 | "version": "4.2.1", 730 | "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-4.2.1.tgz", 731 | "integrity": "sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==", 732 | "dev": true, 733 | "license": "MIT", 734 | "dependencies": { 735 | "load-tsconfig": "^0.2.3" 736 | }, 737 | "engines": { 738 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 739 | }, 740 | "peerDependencies": { 741 | "esbuild": ">=0.17" 742 | } 743 | }, 744 | "node_modules/cac": { 745 | "version": "6.7.14", 746 | "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", 747 | "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", 748 | "dev": true, 749 | "license": "MIT", 750 | "engines": { 751 | "node": ">=8" 752 | } 753 | }, 754 | "node_modules/chokidar": { 755 | "version": "3.6.0", 756 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", 757 | "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", 758 | "dev": true, 759 | "license": "MIT", 760 | "dependencies": { 761 | "anymatch": "~3.1.2", 762 | "braces": "~3.0.2", 763 | "glob-parent": "~5.1.2", 764 | "is-binary-path": "~2.1.0", 765 | "is-glob": "~4.0.1", 766 | "normalize-path": "~3.0.0", 767 | "readdirp": "~3.6.0" 768 | }, 769 | "engines": { 770 | "node": ">= 8.10.0" 771 | }, 772 | "funding": { 773 | "url": "https://paulmillr.com/funding/" 774 | }, 775 | "optionalDependencies": { 776 | "fsevents": "~2.3.2" 777 | } 778 | }, 779 | "node_modules/color-convert": { 780 | "version": "2.0.1", 781 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 782 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 783 | "dev": true, 784 | "license": "MIT", 785 | "dependencies": { 786 | "color-name": "~1.1.4" 787 | }, 788 | "engines": { 789 | "node": ">=7.0.0" 790 | } 791 | }, 792 | "node_modules/color-name": { 793 | "version": "1.1.4", 794 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 795 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 796 | "dev": true, 797 | "license": "MIT" 798 | }, 799 | "node_modules/commander": { 800 | "version": "9.5.0", 801 | "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", 802 | "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", 803 | "license": "MIT", 804 | "engines": { 805 | "node": "^12.20.0 || >=14" 806 | } 807 | }, 808 | "node_modules/cross-spawn": { 809 | "version": "7.0.6", 810 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 811 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 812 | "dev": true, 813 | "license": "MIT", 814 | "dependencies": { 815 | "path-key": "^3.1.0", 816 | "shebang-command": "^2.0.0", 817 | "which": "^2.0.1" 818 | }, 819 | "engines": { 820 | "node": ">= 8" 821 | } 822 | }, 823 | "node_modules/debug": { 824 | "version": "4.4.0", 825 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 826 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 827 | "dev": true, 828 | "license": "MIT", 829 | "dependencies": { 830 | "ms": "^2.1.3" 831 | }, 832 | "engines": { 833 | "node": ">=6.0" 834 | }, 835 | "peerDependenciesMeta": { 836 | "supports-color": { 837 | "optional": true 838 | } 839 | } 840 | }, 841 | "node_modules/dir-glob": { 842 | "version": "3.0.1", 843 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 844 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 845 | "dev": true, 846 | "license": "MIT", 847 | "dependencies": { 848 | "path-type": "^4.0.0" 849 | }, 850 | "engines": { 851 | "node": ">=8" 852 | } 853 | }, 854 | "node_modules/eastasianwidth": { 855 | "version": "0.2.0", 856 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 857 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 858 | "dev": true, 859 | "license": "MIT" 860 | }, 861 | "node_modules/emoji-regex": { 862 | "version": "9.2.2", 863 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 864 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 865 | "dev": true, 866 | "license": "MIT" 867 | }, 868 | "node_modules/esbuild": { 869 | "version": "0.25.0", 870 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", 871 | "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", 872 | "hasInstallScript": true, 873 | "license": "MIT", 874 | "bin": { 875 | "esbuild": "bin/esbuild" 876 | }, 877 | "engines": { 878 | "node": ">=18" 879 | }, 880 | "optionalDependencies": { 881 | "@esbuild/aix-ppc64": "0.25.0", 882 | "@esbuild/android-arm": "0.25.0", 883 | "@esbuild/android-arm64": "0.25.0", 884 | "@esbuild/android-x64": "0.25.0", 885 | "@esbuild/darwin-arm64": "0.25.0", 886 | "@esbuild/darwin-x64": "0.25.0", 887 | "@esbuild/freebsd-arm64": "0.25.0", 888 | "@esbuild/freebsd-x64": "0.25.0", 889 | "@esbuild/linux-arm": "0.25.0", 890 | "@esbuild/linux-arm64": "0.25.0", 891 | "@esbuild/linux-ia32": "0.25.0", 892 | "@esbuild/linux-loong64": "0.25.0", 893 | "@esbuild/linux-mips64el": "0.25.0", 894 | "@esbuild/linux-ppc64": "0.25.0", 895 | "@esbuild/linux-riscv64": "0.25.0", 896 | "@esbuild/linux-s390x": "0.25.0", 897 | "@esbuild/linux-x64": "0.25.0", 898 | "@esbuild/netbsd-arm64": "0.25.0", 899 | "@esbuild/netbsd-x64": "0.25.0", 900 | "@esbuild/openbsd-arm64": "0.25.0", 901 | "@esbuild/openbsd-x64": "0.25.0", 902 | "@esbuild/sunos-x64": "0.25.0", 903 | "@esbuild/win32-arm64": "0.25.0", 904 | "@esbuild/win32-ia32": "0.25.0", 905 | "@esbuild/win32-x64": "0.25.0" 906 | } 907 | }, 908 | "node_modules/execa": { 909 | "version": "5.1.1", 910 | "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", 911 | "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", 912 | "dev": true, 913 | "license": "MIT", 914 | "dependencies": { 915 | "cross-spawn": "^7.0.3", 916 | "get-stream": "^6.0.0", 917 | "human-signals": "^2.1.0", 918 | "is-stream": "^2.0.0", 919 | "merge-stream": "^2.0.0", 920 | "npm-run-path": "^4.0.1", 921 | "onetime": "^5.1.2", 922 | "signal-exit": "^3.0.3", 923 | "strip-final-newline": "^2.0.0" 924 | }, 925 | "engines": { 926 | "node": ">=10" 927 | }, 928 | "funding": { 929 | "url": "https://github.com/sindresorhus/execa?sponsor=1" 930 | } 931 | }, 932 | "node_modules/fast-fifo": { 933 | "version": "1.3.2", 934 | "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", 935 | "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", 936 | "license": "MIT" 937 | }, 938 | "node_modules/fast-glob": { 939 | "version": "3.3.2", 940 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", 941 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 942 | "dev": true, 943 | "license": "MIT", 944 | "dependencies": { 945 | "@nodelib/fs.stat": "^2.0.2", 946 | "@nodelib/fs.walk": "^1.2.3", 947 | "glob-parent": "^5.1.2", 948 | "merge2": "^1.3.0", 949 | "micromatch": "^4.0.4" 950 | }, 951 | "engines": { 952 | "node": ">=8.6.0" 953 | } 954 | }, 955 | "node_modules/fastq": { 956 | "version": "1.18.0", 957 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", 958 | "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", 959 | "dev": true, 960 | "license": "ISC", 961 | "dependencies": { 962 | "reusify": "^1.0.4" 963 | } 964 | }, 965 | "node_modules/fill-range": { 966 | "version": "7.1.1", 967 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 968 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 969 | "dev": true, 970 | "license": "MIT", 971 | "dependencies": { 972 | "to-regex-range": "^5.0.1" 973 | }, 974 | "engines": { 975 | "node": ">=8" 976 | } 977 | }, 978 | "node_modules/foreground-child": { 979 | "version": "3.3.0", 980 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", 981 | "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", 982 | "dev": true, 983 | "license": "ISC", 984 | "dependencies": { 985 | "cross-spawn": "^7.0.0", 986 | "signal-exit": "^4.0.1" 987 | }, 988 | "engines": { 989 | "node": ">=14" 990 | }, 991 | "funding": { 992 | "url": "https://github.com/sponsors/isaacs" 993 | } 994 | }, 995 | "node_modules/foreground-child/node_modules/signal-exit": { 996 | "version": "4.1.0", 997 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 998 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 999 | "dev": true, 1000 | "license": "ISC", 1001 | "engines": { 1002 | "node": ">=14" 1003 | }, 1004 | "funding": { 1005 | "url": "https://github.com/sponsors/isaacs" 1006 | } 1007 | }, 1008 | "node_modules/fsevents": { 1009 | "version": "2.3.3", 1010 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1011 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1012 | "dev": true, 1013 | "hasInstallScript": true, 1014 | "license": "MIT", 1015 | "optional": true, 1016 | "os": [ 1017 | "darwin" 1018 | ], 1019 | "engines": { 1020 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1021 | } 1022 | }, 1023 | "node_modules/get-stream": { 1024 | "version": "6.0.1", 1025 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", 1026 | "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", 1027 | "dev": true, 1028 | "license": "MIT", 1029 | "engines": { 1030 | "node": ">=10" 1031 | }, 1032 | "funding": { 1033 | "url": "https://github.com/sponsors/sindresorhus" 1034 | } 1035 | }, 1036 | "node_modules/glob": { 1037 | "version": "10.4.5", 1038 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", 1039 | "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", 1040 | "dev": true, 1041 | "license": "ISC", 1042 | "dependencies": { 1043 | "foreground-child": "^3.1.0", 1044 | "jackspeak": "^3.1.2", 1045 | "minimatch": "^9.0.4", 1046 | "minipass": "^7.1.2", 1047 | "package-json-from-dist": "^1.0.0", 1048 | "path-scurry": "^1.11.1" 1049 | }, 1050 | "bin": { 1051 | "glob": "dist/esm/bin.mjs" 1052 | }, 1053 | "funding": { 1054 | "url": "https://github.com/sponsors/isaacs" 1055 | } 1056 | }, 1057 | "node_modules/glob-parent": { 1058 | "version": "5.1.2", 1059 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1060 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1061 | "dev": true, 1062 | "license": "ISC", 1063 | "dependencies": { 1064 | "is-glob": "^4.0.1" 1065 | }, 1066 | "engines": { 1067 | "node": ">= 6" 1068 | } 1069 | }, 1070 | "node_modules/globby": { 1071 | "version": "11.1.0", 1072 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", 1073 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", 1074 | "dev": true, 1075 | "license": "MIT", 1076 | "dependencies": { 1077 | "array-union": "^2.1.0", 1078 | "dir-glob": "^3.0.1", 1079 | "fast-glob": "^3.2.9", 1080 | "ignore": "^5.2.0", 1081 | "merge2": "^1.4.1", 1082 | "slash": "^3.0.0" 1083 | }, 1084 | "engines": { 1085 | "node": ">=10" 1086 | }, 1087 | "funding": { 1088 | "url": "https://github.com/sponsors/sindresorhus" 1089 | } 1090 | }, 1091 | "node_modules/human-signals": { 1092 | "version": "2.1.0", 1093 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", 1094 | "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", 1095 | "dev": true, 1096 | "license": "Apache-2.0", 1097 | "engines": { 1098 | "node": ">=10.17.0" 1099 | } 1100 | }, 1101 | "node_modules/ignore": { 1102 | "version": "5.3.2", 1103 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", 1104 | "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 1105 | "dev": true, 1106 | "license": "MIT", 1107 | "engines": { 1108 | "node": ">= 4" 1109 | } 1110 | }, 1111 | "node_modules/is-binary-path": { 1112 | "version": "2.1.0", 1113 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1114 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1115 | "dev": true, 1116 | "license": "MIT", 1117 | "dependencies": { 1118 | "binary-extensions": "^2.0.0" 1119 | }, 1120 | "engines": { 1121 | "node": ">=8" 1122 | } 1123 | }, 1124 | "node_modules/is-extglob": { 1125 | "version": "2.1.1", 1126 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1127 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1128 | "dev": true, 1129 | "license": "MIT", 1130 | "engines": { 1131 | "node": ">=0.10.0" 1132 | } 1133 | }, 1134 | "node_modules/is-fullwidth-code-point": { 1135 | "version": "3.0.0", 1136 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1137 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1138 | "dev": true, 1139 | "license": "MIT", 1140 | "engines": { 1141 | "node": ">=8" 1142 | } 1143 | }, 1144 | "node_modules/is-glob": { 1145 | "version": "4.0.3", 1146 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1147 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1148 | "dev": true, 1149 | "license": "MIT", 1150 | "dependencies": { 1151 | "is-extglob": "^2.1.1" 1152 | }, 1153 | "engines": { 1154 | "node": ">=0.10.0" 1155 | } 1156 | }, 1157 | "node_modules/is-number": { 1158 | "version": "7.0.0", 1159 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1160 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1161 | "dev": true, 1162 | "license": "MIT", 1163 | "engines": { 1164 | "node": ">=0.12.0" 1165 | } 1166 | }, 1167 | "node_modules/is-stream": { 1168 | "version": "2.0.1", 1169 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", 1170 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", 1171 | "dev": true, 1172 | "license": "MIT", 1173 | "engines": { 1174 | "node": ">=8" 1175 | }, 1176 | "funding": { 1177 | "url": "https://github.com/sponsors/sindresorhus" 1178 | } 1179 | }, 1180 | "node_modules/isexe": { 1181 | "version": "2.0.0", 1182 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1183 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1184 | "dev": true, 1185 | "license": "ISC" 1186 | }, 1187 | "node_modules/jackspeak": { 1188 | "version": "3.4.3", 1189 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", 1190 | "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", 1191 | "dev": true, 1192 | "license": "BlueOak-1.0.0", 1193 | "dependencies": { 1194 | "@isaacs/cliui": "^8.0.2" 1195 | }, 1196 | "funding": { 1197 | "url": "https://github.com/sponsors/isaacs" 1198 | }, 1199 | "optionalDependencies": { 1200 | "@pkgjs/parseargs": "^0.11.0" 1201 | } 1202 | }, 1203 | "node_modules/joycon": { 1204 | "version": "3.1.1", 1205 | "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", 1206 | "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", 1207 | "dev": true, 1208 | "license": "MIT", 1209 | "engines": { 1210 | "node": ">=10" 1211 | } 1212 | }, 1213 | "node_modules/lilconfig": { 1214 | "version": "2.1.0", 1215 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", 1216 | "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", 1217 | "dev": true, 1218 | "license": "MIT", 1219 | "engines": { 1220 | "node": ">=10" 1221 | } 1222 | }, 1223 | "node_modules/lines-and-columns": { 1224 | "version": "1.2.4", 1225 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 1226 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 1227 | "dev": true, 1228 | "license": "MIT" 1229 | }, 1230 | "node_modules/load-tsconfig": { 1231 | "version": "0.2.5", 1232 | "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", 1233 | "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", 1234 | "dev": true, 1235 | "license": "MIT", 1236 | "engines": { 1237 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1238 | } 1239 | }, 1240 | "node_modules/lodash.sortby": { 1241 | "version": "4.7.0", 1242 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", 1243 | "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", 1244 | "dev": true, 1245 | "license": "MIT" 1246 | }, 1247 | "node_modules/lru-cache": { 1248 | "version": "10.4.3", 1249 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 1250 | "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 1251 | "dev": true, 1252 | "license": "ISC" 1253 | }, 1254 | "node_modules/macho-unsign": { 1255 | "version": "2.0.6", 1256 | "resolved": "https://registry.npmjs.org/macho-unsign/-/macho-unsign-2.0.6.tgz", 1257 | "integrity": "sha512-YkIVGFnpVHJMMwfy4bHo79Vy05ddVk/PZGSCmmiCT4zepx+FMP/JAt9hOoXuc31s2bbcOtnzznOGca5fRhgZOg==", 1258 | "license": "MPL-2.0", 1259 | "engines": { 1260 | "node": ">=18.12.0" 1261 | } 1262 | }, 1263 | "node_modules/merge-stream": { 1264 | "version": "2.0.0", 1265 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 1266 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 1267 | "dev": true, 1268 | "license": "MIT" 1269 | }, 1270 | "node_modules/merge2": { 1271 | "version": "1.4.1", 1272 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1273 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1274 | "dev": true, 1275 | "license": "MIT", 1276 | "engines": { 1277 | "node": ">= 8" 1278 | } 1279 | }, 1280 | "node_modules/micromatch": { 1281 | "version": "4.0.8", 1282 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 1283 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 1284 | "dev": true, 1285 | "license": "MIT", 1286 | "dependencies": { 1287 | "braces": "^3.0.3", 1288 | "picomatch": "^2.3.1" 1289 | }, 1290 | "engines": { 1291 | "node": ">=8.6" 1292 | } 1293 | }, 1294 | "node_modules/mimic-fn": { 1295 | "version": "2.1.0", 1296 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 1297 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 1298 | "dev": true, 1299 | "license": "MIT", 1300 | "engines": { 1301 | "node": ">=6" 1302 | } 1303 | }, 1304 | "node_modules/minimatch": { 1305 | "version": "9.0.5", 1306 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 1307 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 1308 | "dev": true, 1309 | "license": "ISC", 1310 | "dependencies": { 1311 | "brace-expansion": "^2.0.1" 1312 | }, 1313 | "engines": { 1314 | "node": ">=16 || 14 >=14.17" 1315 | }, 1316 | "funding": { 1317 | "url": "https://github.com/sponsors/isaacs" 1318 | } 1319 | }, 1320 | "node_modules/minipass": { 1321 | "version": "7.1.2", 1322 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 1323 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 1324 | "dev": true, 1325 | "license": "ISC", 1326 | "engines": { 1327 | "node": ">=16 || 14 >=14.17" 1328 | } 1329 | }, 1330 | "node_modules/ms": { 1331 | "version": "2.1.3", 1332 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1333 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1334 | "dev": true, 1335 | "license": "MIT" 1336 | }, 1337 | "node_modules/mz": { 1338 | "version": "2.7.0", 1339 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", 1340 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", 1341 | "dev": true, 1342 | "license": "MIT", 1343 | "dependencies": { 1344 | "any-promise": "^1.0.0", 1345 | "object-assign": "^4.0.1", 1346 | "thenify-all": "^1.0.0" 1347 | } 1348 | }, 1349 | "node_modules/normalize-path": { 1350 | "version": "3.0.0", 1351 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1352 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1353 | "dev": true, 1354 | "license": "MIT", 1355 | "engines": { 1356 | "node": ">=0.10.0" 1357 | } 1358 | }, 1359 | "node_modules/npm-run-path": { 1360 | "version": "4.0.1", 1361 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", 1362 | "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", 1363 | "dev": true, 1364 | "license": "MIT", 1365 | "dependencies": { 1366 | "path-key": "^3.0.0" 1367 | }, 1368 | "engines": { 1369 | "node": ">=8" 1370 | } 1371 | }, 1372 | "node_modules/object-assign": { 1373 | "version": "4.1.1", 1374 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1375 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 1376 | "dev": true, 1377 | "license": "MIT", 1378 | "engines": { 1379 | "node": ">=0.10.0" 1380 | } 1381 | }, 1382 | "node_modules/onetime": { 1383 | "version": "5.1.2", 1384 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 1385 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 1386 | "dev": true, 1387 | "license": "MIT", 1388 | "dependencies": { 1389 | "mimic-fn": "^2.1.0" 1390 | }, 1391 | "engines": { 1392 | "node": ">=6" 1393 | }, 1394 | "funding": { 1395 | "url": "https://github.com/sponsors/sindresorhus" 1396 | } 1397 | }, 1398 | "node_modules/p-limit": { 1399 | "version": "6.2.0", 1400 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz", 1401 | "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==", 1402 | "license": "MIT", 1403 | "dependencies": { 1404 | "yocto-queue": "^1.1.1" 1405 | }, 1406 | "engines": { 1407 | "node": ">=18" 1408 | }, 1409 | "funding": { 1410 | "url": "https://github.com/sponsors/sindresorhus" 1411 | } 1412 | }, 1413 | "node_modules/package-json-from-dist": { 1414 | "version": "1.0.1", 1415 | "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", 1416 | "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", 1417 | "dev": true, 1418 | "license": "BlueOak-1.0.0" 1419 | }, 1420 | "node_modules/path-key": { 1421 | "version": "3.1.1", 1422 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1423 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1424 | "dev": true, 1425 | "license": "MIT", 1426 | "engines": { 1427 | "node": ">=8" 1428 | } 1429 | }, 1430 | "node_modules/path-scurry": { 1431 | "version": "1.11.1", 1432 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", 1433 | "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", 1434 | "dev": true, 1435 | "license": "BlueOak-1.0.0", 1436 | "dependencies": { 1437 | "lru-cache": "^10.2.0", 1438 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 1439 | }, 1440 | "engines": { 1441 | "node": ">=16 || 14 >=14.18" 1442 | }, 1443 | "funding": { 1444 | "url": "https://github.com/sponsors/isaacs" 1445 | } 1446 | }, 1447 | "node_modules/path-type": { 1448 | "version": "4.0.0", 1449 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 1450 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 1451 | "dev": true, 1452 | "license": "MIT", 1453 | "engines": { 1454 | "node": ">=8" 1455 | } 1456 | }, 1457 | "node_modules/pend": { 1458 | "version": "1.2.0", 1459 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 1460 | "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", 1461 | "license": "MIT" 1462 | }, 1463 | "node_modules/picomatch": { 1464 | "version": "2.3.1", 1465 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1466 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1467 | "dev": true, 1468 | "license": "MIT", 1469 | "engines": { 1470 | "node": ">=8.6" 1471 | }, 1472 | "funding": { 1473 | "url": "https://github.com/sponsors/jonschlinkert" 1474 | } 1475 | }, 1476 | "node_modules/pirates": { 1477 | "version": "4.0.6", 1478 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", 1479 | "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", 1480 | "dev": true, 1481 | "license": "MIT", 1482 | "engines": { 1483 | "node": ">= 6" 1484 | } 1485 | }, 1486 | "node_modules/portable-executable-signature": { 1487 | "version": "2.0.6", 1488 | "resolved": "https://registry.npmjs.org/portable-executable-signature/-/portable-executable-signature-2.0.6.tgz", 1489 | "integrity": "sha512-VV+1GuJca0cJ0PFwnCW/xK8Ro9DDX38e4iUDh6ngPjd9vj7VLiemh9rSlqquvcVGtClkVzYaV/UseMVnUrxS/Q==", 1490 | "license": "MPL-2.0", 1491 | "engines": { 1492 | "node": ">=18.12.0" 1493 | } 1494 | }, 1495 | "node_modules/postcss-load-config": { 1496 | "version": "3.1.4", 1497 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", 1498 | "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", 1499 | "dev": true, 1500 | "license": "MIT", 1501 | "dependencies": { 1502 | "lilconfig": "^2.0.5", 1503 | "yaml": "^1.10.2" 1504 | }, 1505 | "engines": { 1506 | "node": ">= 10" 1507 | }, 1508 | "funding": { 1509 | "type": "opencollective", 1510 | "url": "https://opencollective.com/postcss/" 1511 | }, 1512 | "peerDependencies": { 1513 | "postcss": ">=8.0.9", 1514 | "ts-node": ">=9.0.0" 1515 | }, 1516 | "peerDependenciesMeta": { 1517 | "postcss": { 1518 | "optional": true 1519 | }, 1520 | "ts-node": { 1521 | "optional": true 1522 | } 1523 | } 1524 | }, 1525 | "node_modules/postject": { 1526 | "version": "1.0.0-alpha.6", 1527 | "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", 1528 | "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", 1529 | "license": "MIT", 1530 | "dependencies": { 1531 | "commander": "^9.4.0" 1532 | }, 1533 | "bin": { 1534 | "postject": "dist/cli.js" 1535 | }, 1536 | "engines": { 1537 | "node": ">=14.0.0" 1538 | } 1539 | }, 1540 | "node_modules/punycode": { 1541 | "version": "2.3.1", 1542 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 1543 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 1544 | "dev": true, 1545 | "license": "MIT", 1546 | "engines": { 1547 | "node": ">=6" 1548 | } 1549 | }, 1550 | "node_modules/queue-microtask": { 1551 | "version": "1.2.3", 1552 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1553 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1554 | "dev": true, 1555 | "funding": [ 1556 | { 1557 | "type": "github", 1558 | "url": "https://github.com/sponsors/feross" 1559 | }, 1560 | { 1561 | "type": "patreon", 1562 | "url": "https://www.patreon.com/feross" 1563 | }, 1564 | { 1565 | "type": "consulting", 1566 | "url": "https://feross.org/support" 1567 | } 1568 | ], 1569 | "license": "MIT" 1570 | }, 1571 | "node_modules/readdirp": { 1572 | "version": "3.6.0", 1573 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1574 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1575 | "dev": true, 1576 | "license": "MIT", 1577 | "dependencies": { 1578 | "picomatch": "^2.2.1" 1579 | }, 1580 | "engines": { 1581 | "node": ">=8.10.0" 1582 | } 1583 | }, 1584 | "node_modules/resolve-from": { 1585 | "version": "5.0.0", 1586 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", 1587 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", 1588 | "dev": true, 1589 | "license": "MIT", 1590 | "engines": { 1591 | "node": ">=8" 1592 | } 1593 | }, 1594 | "node_modules/reusify": { 1595 | "version": "1.0.4", 1596 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1597 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1598 | "dev": true, 1599 | "license": "MIT", 1600 | "engines": { 1601 | "iojs": ">=1.0.0", 1602 | "node": ">=0.10.0" 1603 | } 1604 | }, 1605 | "node_modules/run-parallel": { 1606 | "version": "1.2.0", 1607 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1608 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1609 | "dev": true, 1610 | "funding": [ 1611 | { 1612 | "type": "github", 1613 | "url": "https://github.com/sponsors/feross" 1614 | }, 1615 | { 1616 | "type": "patreon", 1617 | "url": "https://www.patreon.com/feross" 1618 | }, 1619 | { 1620 | "type": "consulting", 1621 | "url": "https://feross.org/support" 1622 | } 1623 | ], 1624 | "license": "MIT", 1625 | "dependencies": { 1626 | "queue-microtask": "^1.2.2" 1627 | } 1628 | }, 1629 | "node_modules/shebang-command": { 1630 | "version": "2.0.0", 1631 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1632 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1633 | "dev": true, 1634 | "license": "MIT", 1635 | "dependencies": { 1636 | "shebang-regex": "^3.0.0" 1637 | }, 1638 | "engines": { 1639 | "node": ">=8" 1640 | } 1641 | }, 1642 | "node_modules/shebang-regex": { 1643 | "version": "3.0.0", 1644 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1645 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1646 | "dev": true, 1647 | "license": "MIT", 1648 | "engines": { 1649 | "node": ">=8" 1650 | } 1651 | }, 1652 | "node_modules/signal-exit": { 1653 | "version": "3.0.7", 1654 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 1655 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 1656 | "dev": true, 1657 | "license": "ISC" 1658 | }, 1659 | "node_modules/slash": { 1660 | "version": "3.0.0", 1661 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 1662 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 1663 | "dev": true, 1664 | "license": "MIT", 1665 | "engines": { 1666 | "node": ">=8" 1667 | } 1668 | }, 1669 | "node_modules/source-map": { 1670 | "version": "0.8.0-beta.0", 1671 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", 1672 | "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", 1673 | "dev": true, 1674 | "license": "BSD-3-Clause", 1675 | "dependencies": { 1676 | "whatwg-url": "^7.0.0" 1677 | }, 1678 | "engines": { 1679 | "node": ">= 8" 1680 | } 1681 | }, 1682 | "node_modules/streamx": { 1683 | "version": "2.22.0", 1684 | "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", 1685 | "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", 1686 | "license": "MIT", 1687 | "dependencies": { 1688 | "fast-fifo": "^1.3.2", 1689 | "text-decoder": "^1.1.0" 1690 | }, 1691 | "optionalDependencies": { 1692 | "bare-events": "^2.2.0" 1693 | } 1694 | }, 1695 | "node_modules/string-width": { 1696 | "version": "5.1.2", 1697 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 1698 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 1699 | "dev": true, 1700 | "license": "MIT", 1701 | "dependencies": { 1702 | "eastasianwidth": "^0.2.0", 1703 | "emoji-regex": "^9.2.2", 1704 | "strip-ansi": "^7.0.1" 1705 | }, 1706 | "engines": { 1707 | "node": ">=12" 1708 | }, 1709 | "funding": { 1710 | "url": "https://github.com/sponsors/sindresorhus" 1711 | } 1712 | }, 1713 | "node_modules/string-width-cjs": { 1714 | "name": "string-width", 1715 | "version": "4.2.3", 1716 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1717 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1718 | "dev": true, 1719 | "license": "MIT", 1720 | "dependencies": { 1721 | "emoji-regex": "^8.0.0", 1722 | "is-fullwidth-code-point": "^3.0.0", 1723 | "strip-ansi": "^6.0.1" 1724 | }, 1725 | "engines": { 1726 | "node": ">=8" 1727 | } 1728 | }, 1729 | "node_modules/string-width-cjs/node_modules/ansi-regex": { 1730 | "version": "5.0.1", 1731 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1732 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1733 | "dev": true, 1734 | "license": "MIT", 1735 | "engines": { 1736 | "node": ">=8" 1737 | } 1738 | }, 1739 | "node_modules/string-width-cjs/node_modules/emoji-regex": { 1740 | "version": "8.0.0", 1741 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1742 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1743 | "dev": true, 1744 | "license": "MIT" 1745 | }, 1746 | "node_modules/string-width-cjs/node_modules/strip-ansi": { 1747 | "version": "6.0.1", 1748 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1749 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1750 | "dev": true, 1751 | "license": "MIT", 1752 | "dependencies": { 1753 | "ansi-regex": "^5.0.1" 1754 | }, 1755 | "engines": { 1756 | "node": ">=8" 1757 | } 1758 | }, 1759 | "node_modules/strip-ansi": { 1760 | "version": "7.1.0", 1761 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 1762 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 1763 | "dev": true, 1764 | "license": "MIT", 1765 | "dependencies": { 1766 | "ansi-regex": "^6.0.1" 1767 | }, 1768 | "engines": { 1769 | "node": ">=12" 1770 | }, 1771 | "funding": { 1772 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 1773 | } 1774 | }, 1775 | "node_modules/strip-ansi-cjs": { 1776 | "name": "strip-ansi", 1777 | "version": "6.0.1", 1778 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1779 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1780 | "dev": true, 1781 | "license": "MIT", 1782 | "dependencies": { 1783 | "ansi-regex": "^5.0.1" 1784 | }, 1785 | "engines": { 1786 | "node": ">=8" 1787 | } 1788 | }, 1789 | "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { 1790 | "version": "5.0.1", 1791 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1792 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1793 | "dev": true, 1794 | "license": "MIT", 1795 | "engines": { 1796 | "node": ">=8" 1797 | } 1798 | }, 1799 | "node_modules/strip-final-newline": { 1800 | "version": "2.0.0", 1801 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", 1802 | "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", 1803 | "dev": true, 1804 | "license": "MIT", 1805 | "engines": { 1806 | "node": ">=6" 1807 | } 1808 | }, 1809 | "node_modules/sucrase": { 1810 | "version": "3.35.0", 1811 | "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", 1812 | "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", 1813 | "dev": true, 1814 | "license": "MIT", 1815 | "dependencies": { 1816 | "@jridgewell/gen-mapping": "^0.3.2", 1817 | "commander": "^4.0.0", 1818 | "glob": "^10.3.10", 1819 | "lines-and-columns": "^1.1.6", 1820 | "mz": "^2.7.0", 1821 | "pirates": "^4.0.1", 1822 | "ts-interface-checker": "^0.1.9" 1823 | }, 1824 | "bin": { 1825 | "sucrase": "bin/sucrase", 1826 | "sucrase-node": "bin/sucrase-node" 1827 | }, 1828 | "engines": { 1829 | "node": ">=16 || 14 >=14.17" 1830 | } 1831 | }, 1832 | "node_modules/sucrase/node_modules/commander": { 1833 | "version": "4.1.1", 1834 | "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", 1835 | "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", 1836 | "dev": true, 1837 | "license": "MIT", 1838 | "engines": { 1839 | "node": ">= 6" 1840 | } 1841 | }, 1842 | "node_modules/tar-stream": { 1843 | "version": "3.1.7", 1844 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", 1845 | "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", 1846 | "license": "MIT", 1847 | "dependencies": { 1848 | "b4a": "^1.6.4", 1849 | "fast-fifo": "^1.2.0", 1850 | "streamx": "^2.15.0" 1851 | } 1852 | }, 1853 | "node_modules/text-decoder": { 1854 | "version": "1.2.3", 1855 | "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", 1856 | "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", 1857 | "license": "Apache-2.0", 1858 | "dependencies": { 1859 | "b4a": "^1.6.4" 1860 | } 1861 | }, 1862 | "node_modules/thenify": { 1863 | "version": "3.3.1", 1864 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", 1865 | "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", 1866 | "dev": true, 1867 | "license": "MIT", 1868 | "dependencies": { 1869 | "any-promise": "^1.0.0" 1870 | } 1871 | }, 1872 | "node_modules/thenify-all": { 1873 | "version": "1.6.0", 1874 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", 1875 | "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", 1876 | "dev": true, 1877 | "license": "MIT", 1878 | "dependencies": { 1879 | "thenify": ">= 3.1.0 < 4" 1880 | }, 1881 | "engines": { 1882 | "node": ">=0.8" 1883 | } 1884 | }, 1885 | "node_modules/to-regex-range": { 1886 | "version": "5.0.1", 1887 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1888 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1889 | "dev": true, 1890 | "license": "MIT", 1891 | "dependencies": { 1892 | "is-number": "^7.0.0" 1893 | }, 1894 | "engines": { 1895 | "node": ">=8.0" 1896 | } 1897 | }, 1898 | "node_modules/tr46": { 1899 | "version": "1.0.1", 1900 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", 1901 | "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", 1902 | "dev": true, 1903 | "license": "MIT", 1904 | "dependencies": { 1905 | "punycode": "^2.1.0" 1906 | } 1907 | }, 1908 | "node_modules/tree-kill": { 1909 | "version": "1.2.2", 1910 | "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", 1911 | "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", 1912 | "dev": true, 1913 | "license": "MIT", 1914 | "bin": { 1915 | "tree-kill": "cli.js" 1916 | } 1917 | }, 1918 | "node_modules/ts-interface-checker": { 1919 | "version": "0.1.13", 1920 | "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", 1921 | "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", 1922 | "dev": true, 1923 | "license": "Apache-2.0" 1924 | }, 1925 | "node_modules/tsup": { 1926 | "version": "6.7.0", 1927 | "resolved": "https://registry.npmjs.org/tsup/-/tsup-6.7.0.tgz", 1928 | "integrity": "sha512-L3o8hGkaHnu5TdJns+mCqFsDBo83bJ44rlK7e6VdanIvpea4ArPcU3swWGsLVbXak1PqQx/V+SSmFPujBK+zEQ==", 1929 | "dev": true, 1930 | "license": "MIT", 1931 | "dependencies": { 1932 | "bundle-require": "^4.0.0", 1933 | "cac": "^6.7.12", 1934 | "chokidar": "^3.5.1", 1935 | "debug": "^4.3.1", 1936 | "esbuild": "^0.17.6", 1937 | "execa": "^5.0.0", 1938 | "globby": "^11.0.3", 1939 | "joycon": "^3.0.1", 1940 | "postcss-load-config": "^3.0.1", 1941 | "resolve-from": "^5.0.0", 1942 | "rollup": "^3.2.5", 1943 | "source-map": "0.8.0-beta.0", 1944 | "sucrase": "^3.20.3", 1945 | "tree-kill": "^1.2.2" 1946 | }, 1947 | "bin": { 1948 | "tsup": "dist/cli-default.js", 1949 | "tsup-node": "dist/cli-node.js" 1950 | }, 1951 | "engines": { 1952 | "node": ">=14.18" 1953 | }, 1954 | "peerDependencies": { 1955 | "@swc/core": "^1", 1956 | "postcss": "^8.4.12", 1957 | "typescript": ">=4.1.0" 1958 | }, 1959 | "peerDependenciesMeta": { 1960 | "@swc/core": { 1961 | "optional": true 1962 | }, 1963 | "postcss": { 1964 | "optional": true 1965 | }, 1966 | "typescript": { 1967 | "optional": true 1968 | } 1969 | } 1970 | }, 1971 | "node_modules/tsup/node_modules/@esbuild/android-arm": { 1972 | "version": "0.17.19", 1973 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", 1974 | "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", 1975 | "cpu": [ 1976 | "arm" 1977 | ], 1978 | "dev": true, 1979 | "license": "MIT", 1980 | "optional": true, 1981 | "os": [ 1982 | "android" 1983 | ], 1984 | "engines": { 1985 | "node": ">=12" 1986 | } 1987 | }, 1988 | "node_modules/tsup/node_modules/@esbuild/android-arm64": { 1989 | "version": "0.17.19", 1990 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", 1991 | "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", 1992 | "cpu": [ 1993 | "arm64" 1994 | ], 1995 | "dev": true, 1996 | "license": "MIT", 1997 | "optional": true, 1998 | "os": [ 1999 | "android" 2000 | ], 2001 | "engines": { 2002 | "node": ">=12" 2003 | } 2004 | }, 2005 | "node_modules/tsup/node_modules/@esbuild/android-x64": { 2006 | "version": "0.17.19", 2007 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", 2008 | "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", 2009 | "cpu": [ 2010 | "x64" 2011 | ], 2012 | "dev": true, 2013 | "license": "MIT", 2014 | "optional": true, 2015 | "os": [ 2016 | "android" 2017 | ], 2018 | "engines": { 2019 | "node": ">=12" 2020 | } 2021 | }, 2022 | "node_modules/tsup/node_modules/@esbuild/darwin-arm64": { 2023 | "version": "0.17.19", 2024 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", 2025 | "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", 2026 | "cpu": [ 2027 | "arm64" 2028 | ], 2029 | "dev": true, 2030 | "license": "MIT", 2031 | "optional": true, 2032 | "os": [ 2033 | "darwin" 2034 | ], 2035 | "engines": { 2036 | "node": ">=12" 2037 | } 2038 | }, 2039 | "node_modules/tsup/node_modules/@esbuild/darwin-x64": { 2040 | "version": "0.17.19", 2041 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", 2042 | "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", 2043 | "cpu": [ 2044 | "x64" 2045 | ], 2046 | "dev": true, 2047 | "license": "MIT", 2048 | "optional": true, 2049 | "os": [ 2050 | "darwin" 2051 | ], 2052 | "engines": { 2053 | "node": ">=12" 2054 | } 2055 | }, 2056 | "node_modules/tsup/node_modules/@esbuild/freebsd-arm64": { 2057 | "version": "0.17.19", 2058 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", 2059 | "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", 2060 | "cpu": [ 2061 | "arm64" 2062 | ], 2063 | "dev": true, 2064 | "license": "MIT", 2065 | "optional": true, 2066 | "os": [ 2067 | "freebsd" 2068 | ], 2069 | "engines": { 2070 | "node": ">=12" 2071 | } 2072 | }, 2073 | "node_modules/tsup/node_modules/@esbuild/freebsd-x64": { 2074 | "version": "0.17.19", 2075 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", 2076 | "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", 2077 | "cpu": [ 2078 | "x64" 2079 | ], 2080 | "dev": true, 2081 | "license": "MIT", 2082 | "optional": true, 2083 | "os": [ 2084 | "freebsd" 2085 | ], 2086 | "engines": { 2087 | "node": ">=12" 2088 | } 2089 | }, 2090 | "node_modules/tsup/node_modules/@esbuild/linux-arm": { 2091 | "version": "0.17.19", 2092 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", 2093 | "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", 2094 | "cpu": [ 2095 | "arm" 2096 | ], 2097 | "dev": true, 2098 | "license": "MIT", 2099 | "optional": true, 2100 | "os": [ 2101 | "linux" 2102 | ], 2103 | "engines": { 2104 | "node": ">=12" 2105 | } 2106 | }, 2107 | "node_modules/tsup/node_modules/@esbuild/linux-arm64": { 2108 | "version": "0.17.19", 2109 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", 2110 | "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", 2111 | "cpu": [ 2112 | "arm64" 2113 | ], 2114 | "dev": true, 2115 | "license": "MIT", 2116 | "optional": true, 2117 | "os": [ 2118 | "linux" 2119 | ], 2120 | "engines": { 2121 | "node": ">=12" 2122 | } 2123 | }, 2124 | "node_modules/tsup/node_modules/@esbuild/linux-ia32": { 2125 | "version": "0.17.19", 2126 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", 2127 | "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", 2128 | "cpu": [ 2129 | "ia32" 2130 | ], 2131 | "dev": true, 2132 | "license": "MIT", 2133 | "optional": true, 2134 | "os": [ 2135 | "linux" 2136 | ], 2137 | "engines": { 2138 | "node": ">=12" 2139 | } 2140 | }, 2141 | "node_modules/tsup/node_modules/@esbuild/linux-loong64": { 2142 | "version": "0.17.19", 2143 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", 2144 | "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", 2145 | "cpu": [ 2146 | "loong64" 2147 | ], 2148 | "dev": true, 2149 | "license": "MIT", 2150 | "optional": true, 2151 | "os": [ 2152 | "linux" 2153 | ], 2154 | "engines": { 2155 | "node": ">=12" 2156 | } 2157 | }, 2158 | "node_modules/tsup/node_modules/@esbuild/linux-mips64el": { 2159 | "version": "0.17.19", 2160 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", 2161 | "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", 2162 | "cpu": [ 2163 | "mips64el" 2164 | ], 2165 | "dev": true, 2166 | "license": "MIT", 2167 | "optional": true, 2168 | "os": [ 2169 | "linux" 2170 | ], 2171 | "engines": { 2172 | "node": ">=12" 2173 | } 2174 | }, 2175 | "node_modules/tsup/node_modules/@esbuild/linux-ppc64": { 2176 | "version": "0.17.19", 2177 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", 2178 | "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", 2179 | "cpu": [ 2180 | "ppc64" 2181 | ], 2182 | "dev": true, 2183 | "license": "MIT", 2184 | "optional": true, 2185 | "os": [ 2186 | "linux" 2187 | ], 2188 | "engines": { 2189 | "node": ">=12" 2190 | } 2191 | }, 2192 | "node_modules/tsup/node_modules/@esbuild/linux-riscv64": { 2193 | "version": "0.17.19", 2194 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", 2195 | "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", 2196 | "cpu": [ 2197 | "riscv64" 2198 | ], 2199 | "dev": true, 2200 | "license": "MIT", 2201 | "optional": true, 2202 | "os": [ 2203 | "linux" 2204 | ], 2205 | "engines": { 2206 | "node": ">=12" 2207 | } 2208 | }, 2209 | "node_modules/tsup/node_modules/@esbuild/linux-s390x": { 2210 | "version": "0.17.19", 2211 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", 2212 | "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", 2213 | "cpu": [ 2214 | "s390x" 2215 | ], 2216 | "dev": true, 2217 | "license": "MIT", 2218 | "optional": true, 2219 | "os": [ 2220 | "linux" 2221 | ], 2222 | "engines": { 2223 | "node": ">=12" 2224 | } 2225 | }, 2226 | "node_modules/tsup/node_modules/@esbuild/linux-x64": { 2227 | "version": "0.17.19", 2228 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", 2229 | "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", 2230 | "cpu": [ 2231 | "x64" 2232 | ], 2233 | "dev": true, 2234 | "license": "MIT", 2235 | "optional": true, 2236 | "os": [ 2237 | "linux" 2238 | ], 2239 | "engines": { 2240 | "node": ">=12" 2241 | } 2242 | }, 2243 | "node_modules/tsup/node_modules/@esbuild/netbsd-x64": { 2244 | "version": "0.17.19", 2245 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", 2246 | "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", 2247 | "cpu": [ 2248 | "x64" 2249 | ], 2250 | "dev": true, 2251 | "license": "MIT", 2252 | "optional": true, 2253 | "os": [ 2254 | "netbsd" 2255 | ], 2256 | "engines": { 2257 | "node": ">=12" 2258 | } 2259 | }, 2260 | "node_modules/tsup/node_modules/@esbuild/openbsd-x64": { 2261 | "version": "0.17.19", 2262 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", 2263 | "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", 2264 | "cpu": [ 2265 | "x64" 2266 | ], 2267 | "dev": true, 2268 | "license": "MIT", 2269 | "optional": true, 2270 | "os": [ 2271 | "openbsd" 2272 | ], 2273 | "engines": { 2274 | "node": ">=12" 2275 | } 2276 | }, 2277 | "node_modules/tsup/node_modules/@esbuild/sunos-x64": { 2278 | "version": "0.17.19", 2279 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", 2280 | "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", 2281 | "cpu": [ 2282 | "x64" 2283 | ], 2284 | "dev": true, 2285 | "license": "MIT", 2286 | "optional": true, 2287 | "os": [ 2288 | "sunos" 2289 | ], 2290 | "engines": { 2291 | "node": ">=12" 2292 | } 2293 | }, 2294 | "node_modules/tsup/node_modules/@esbuild/win32-arm64": { 2295 | "version": "0.17.19", 2296 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", 2297 | "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", 2298 | "cpu": [ 2299 | "arm64" 2300 | ], 2301 | "dev": true, 2302 | "license": "MIT", 2303 | "optional": true, 2304 | "os": [ 2305 | "win32" 2306 | ], 2307 | "engines": { 2308 | "node": ">=12" 2309 | } 2310 | }, 2311 | "node_modules/tsup/node_modules/@esbuild/win32-ia32": { 2312 | "version": "0.17.19", 2313 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", 2314 | "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", 2315 | "cpu": [ 2316 | "ia32" 2317 | ], 2318 | "dev": true, 2319 | "license": "MIT", 2320 | "optional": true, 2321 | "os": [ 2322 | "win32" 2323 | ], 2324 | "engines": { 2325 | "node": ">=12" 2326 | } 2327 | }, 2328 | "node_modules/tsup/node_modules/@esbuild/win32-x64": { 2329 | "version": "0.17.19", 2330 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", 2331 | "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", 2332 | "cpu": [ 2333 | "x64" 2334 | ], 2335 | "dev": true, 2336 | "license": "MIT", 2337 | "optional": true, 2338 | "os": [ 2339 | "win32" 2340 | ], 2341 | "engines": { 2342 | "node": ">=12" 2343 | } 2344 | }, 2345 | "node_modules/tsup/node_modules/esbuild": { 2346 | "version": "0.17.19", 2347 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", 2348 | "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", 2349 | "dev": true, 2350 | "hasInstallScript": true, 2351 | "license": "MIT", 2352 | "bin": { 2353 | "esbuild": "bin/esbuild" 2354 | }, 2355 | "engines": { 2356 | "node": ">=12" 2357 | }, 2358 | "optionalDependencies": { 2359 | "@esbuild/android-arm": "0.17.19", 2360 | "@esbuild/android-arm64": "0.17.19", 2361 | "@esbuild/android-x64": "0.17.19", 2362 | "@esbuild/darwin-arm64": "0.17.19", 2363 | "@esbuild/darwin-x64": "0.17.19", 2364 | "@esbuild/freebsd-arm64": "0.17.19", 2365 | "@esbuild/freebsd-x64": "0.17.19", 2366 | "@esbuild/linux-arm": "0.17.19", 2367 | "@esbuild/linux-arm64": "0.17.19", 2368 | "@esbuild/linux-ia32": "0.17.19", 2369 | "@esbuild/linux-loong64": "0.17.19", 2370 | "@esbuild/linux-mips64el": "0.17.19", 2371 | "@esbuild/linux-ppc64": "0.17.19", 2372 | "@esbuild/linux-riscv64": "0.17.19", 2373 | "@esbuild/linux-s390x": "0.17.19", 2374 | "@esbuild/linux-x64": "0.17.19", 2375 | "@esbuild/netbsd-x64": "0.17.19", 2376 | "@esbuild/openbsd-x64": "0.17.19", 2377 | "@esbuild/sunos-x64": "0.17.19", 2378 | "@esbuild/win32-arm64": "0.17.19", 2379 | "@esbuild/win32-ia32": "0.17.19", 2380 | "@esbuild/win32-x64": "0.17.19" 2381 | } 2382 | }, 2383 | "node_modules/tsup/node_modules/rollup": { 2384 | "version": "3.29.5", 2385 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", 2386 | "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", 2387 | "dev": true, 2388 | "license": "MIT", 2389 | "bin": { 2390 | "rollup": "dist/bin/rollup" 2391 | }, 2392 | "engines": { 2393 | "node": ">=14.18.0", 2394 | "npm": ">=8.0.0" 2395 | }, 2396 | "optionalDependencies": { 2397 | "fsevents": "~2.3.2" 2398 | } 2399 | }, 2400 | "node_modules/typescript": { 2401 | "version": "5.6.3", 2402 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", 2403 | "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", 2404 | "dev": true, 2405 | "license": "Apache-2.0", 2406 | "bin": { 2407 | "tsc": "bin/tsc", 2408 | "tsserver": "bin/tsserver" 2409 | }, 2410 | "engines": { 2411 | "node": ">=14.17" 2412 | } 2413 | }, 2414 | "node_modules/undici-types": { 2415 | "version": "6.20.0", 2416 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", 2417 | "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", 2418 | "dev": true, 2419 | "license": "MIT" 2420 | }, 2421 | "node_modules/webidl-conversions": { 2422 | "version": "4.0.2", 2423 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", 2424 | "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", 2425 | "dev": true, 2426 | "license": "BSD-2-Clause" 2427 | }, 2428 | "node_modules/whatwg-url": { 2429 | "version": "7.1.0", 2430 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", 2431 | "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", 2432 | "dev": true, 2433 | "license": "MIT", 2434 | "dependencies": { 2435 | "lodash.sortby": "^4.7.0", 2436 | "tr46": "^1.0.1", 2437 | "webidl-conversions": "^4.0.2" 2438 | } 2439 | }, 2440 | "node_modules/which": { 2441 | "version": "2.0.2", 2442 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2443 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2444 | "dev": true, 2445 | "license": "ISC", 2446 | "dependencies": { 2447 | "isexe": "^2.0.0" 2448 | }, 2449 | "bin": { 2450 | "node-which": "bin/node-which" 2451 | }, 2452 | "engines": { 2453 | "node": ">= 8" 2454 | } 2455 | }, 2456 | "node_modules/wrap-ansi": { 2457 | "version": "8.1.0", 2458 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 2459 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 2460 | "dev": true, 2461 | "license": "MIT", 2462 | "dependencies": { 2463 | "ansi-styles": "^6.1.0", 2464 | "string-width": "^5.0.1", 2465 | "strip-ansi": "^7.0.1" 2466 | }, 2467 | "engines": { 2468 | "node": ">=12" 2469 | }, 2470 | "funding": { 2471 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2472 | } 2473 | }, 2474 | "node_modules/wrap-ansi-cjs": { 2475 | "name": "wrap-ansi", 2476 | "version": "7.0.0", 2477 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2478 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2479 | "dev": true, 2480 | "license": "MIT", 2481 | "dependencies": { 2482 | "ansi-styles": "^4.0.0", 2483 | "string-width": "^4.1.0", 2484 | "strip-ansi": "^6.0.0" 2485 | }, 2486 | "engines": { 2487 | "node": ">=10" 2488 | }, 2489 | "funding": { 2490 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2491 | } 2492 | }, 2493 | "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { 2494 | "version": "5.0.1", 2495 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2496 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2497 | "dev": true, 2498 | "license": "MIT", 2499 | "engines": { 2500 | "node": ">=8" 2501 | } 2502 | }, 2503 | "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { 2504 | "version": "4.3.0", 2505 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 2506 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 2507 | "dev": true, 2508 | "license": "MIT", 2509 | "dependencies": { 2510 | "color-convert": "^2.0.1" 2511 | }, 2512 | "engines": { 2513 | "node": ">=8" 2514 | }, 2515 | "funding": { 2516 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 2517 | } 2518 | }, 2519 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 2520 | "version": "8.0.0", 2521 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2522 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2523 | "dev": true, 2524 | "license": "MIT" 2525 | }, 2526 | "node_modules/wrap-ansi-cjs/node_modules/string-width": { 2527 | "version": "4.2.3", 2528 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2529 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2530 | "dev": true, 2531 | "license": "MIT", 2532 | "dependencies": { 2533 | "emoji-regex": "^8.0.0", 2534 | "is-fullwidth-code-point": "^3.0.0", 2535 | "strip-ansi": "^6.0.1" 2536 | }, 2537 | "engines": { 2538 | "node": ">=8" 2539 | } 2540 | }, 2541 | "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { 2542 | "version": "6.0.1", 2543 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2544 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2545 | "dev": true, 2546 | "license": "MIT", 2547 | "dependencies": { 2548 | "ansi-regex": "^5.0.1" 2549 | }, 2550 | "engines": { 2551 | "node": ">=8" 2552 | } 2553 | }, 2554 | "node_modules/xz-decompress": { 2555 | "version": "0.2.2", 2556 | "resolved": "https://registry.npmjs.org/xz-decompress/-/xz-decompress-0.2.2.tgz", 2557 | "integrity": "sha512-DSOnX+ZLVTrsW+CtjZPwjrMWvuRkzCcEpwLsY2faZyVgLH/ZHpTg3h3+KyN16mGuduMgO+/pc9rSEG735oGN0g==", 2558 | "license": "MIT", 2559 | "engines": { 2560 | "node": ">=16" 2561 | } 2562 | }, 2563 | "node_modules/yaml": { 2564 | "version": "1.10.2", 2565 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", 2566 | "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", 2567 | "dev": true, 2568 | "license": "ISC", 2569 | "engines": { 2570 | "node": ">= 6" 2571 | } 2572 | }, 2573 | "node_modules/yauzl": { 2574 | "version": "3.2.0", 2575 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz", 2576 | "integrity": "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==", 2577 | "license": "MIT", 2578 | "dependencies": { 2579 | "buffer-crc32": "~0.2.3", 2580 | "pend": "~1.2.0" 2581 | }, 2582 | "engines": { 2583 | "node": ">=12" 2584 | } 2585 | }, 2586 | "node_modules/yocto-queue": { 2587 | "version": "1.1.1", 2588 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", 2589 | "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", 2590 | "license": "MIT", 2591 | "engines": { 2592 | "node": ">=12.20" 2593 | }, 2594 | "funding": { 2595 | "url": "https://github.com/sponsors/sindresorhus" 2596 | } 2597 | } 2598 | } 2599 | } 2600 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fossilize", 3 | "author": "Burak Yigit Kaya (https://byk.im)", 4 | "description": "Create Node SEA binaries across platforms with ease", 5 | "homepage": "https://github.com/BYK/fossilize", 6 | "repository": "github:BYK/fossilize", 7 | "license": "MIT", 8 | "type": "module", 9 | "version": "0.4.2", 10 | "keywords": [ 11 | "node", 12 | "sea", 13 | "binary", 14 | "packaging", 15 | "packager", 16 | "fossilize" 17 | ], 18 | "files": [ 19 | "dist", 20 | "import-meta-url.js", 21 | "entitlements.plist" 22 | ], 23 | "main": "dist/cli.js", 24 | "bin": { 25 | "fossilize": "dist/cli.js", 26 | "__fossilize_bash_complete": "dist/bash-complete.js" 27 | }, 28 | "engines": { 29 | "node": ">=18" 30 | }, 31 | "scripts": { 32 | "prebuild": "tsc -p src/tsconfig.json", 33 | "build": "tsup", 34 | "prepublishOnly": "npm run build", 35 | "#postinstall": "npx @stricli/auto-complete@latest install fossilize __fossilize_bash_complete" 36 | }, 37 | "tsup": { 38 | "entry": [ 39 | "src/bin/cli.ts", 40 | "src/bin/bash-complete.ts" 41 | ], 42 | "format": [ 43 | "esm" 44 | ], 45 | "tsconfig": "src/tsconfig.json", 46 | "clean": true, 47 | "splitting": true, 48 | "minify": true, 49 | "sourcemap": true 50 | }, 51 | "dependencies": { 52 | "@stricli/auto-complete": "^1.1.0", 53 | "@stricli/core": "^1.1.0", 54 | "esbuild": "^0.25.0", 55 | "macho-unsign": "^2.0.6", 56 | "p-limit": "^6.2.0", 57 | "portable-executable-signature": "^2.0.6", 58 | "postject": "^1.0.0-alpha.6", 59 | "tar-stream": "^3.1.7", 60 | "xz-decompress": "^0.2.2", 61 | "yauzl": "^3.2.0" 62 | }, 63 | "devDependencies": { 64 | "@types/node": "22.x", 65 | "@types/tar-stream": "^3.1.3", 66 | "@types/yauzl": "^2.10.3", 67 | "tsup": "^6.7.0", 68 | "typescript": "5.6.x" 69 | }, 70 | "volta": { 71 | "node": "22.14.0" 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/app.ts: -------------------------------------------------------------------------------- 1 | import { buildApplication, buildCommand } from "@stricli/core"; 2 | import { envToBool } from "./env-to-bool"; 3 | import { description, name, version } from "../package.json"; 4 | 5 | const command = buildCommand({ 6 | loader: async () => import("./impl"), 7 | parameters: { 8 | positional: { 9 | kind: "tuple", 10 | parameters: [ 11 | { 12 | placeholder: "entrypoint", 13 | brief: "Path to the file or project to fossilize", 14 | parse: String, 15 | default: ".", 16 | }, 17 | ], 18 | }, 19 | flags: { 20 | nodeVersion: { 21 | kind: "parsed", 22 | parse: String, 23 | brief: "Node.js version to fossilize with", 24 | default: process.env["FOSSILIZE_NODE_VERSION"] ?? "local", 25 | }, 26 | platforms: { 27 | kind: "parsed", 28 | parse: String, 29 | brief: "Target platforms to fossilize for", 30 | variadic: true, 31 | optional: true, 32 | }, 33 | assets: { 34 | kind: "parsed", 35 | parse: String, 36 | brief: "Any assets to bundle in", // Mention SEA read assets 37 | variadic: true, 38 | optional: true, 39 | }, 40 | assetManifest: { 41 | kind: "parsed", 42 | parse: String, 43 | brief: 44 | "Path to the asset manifest.json from Vite (this will auto discover assets)", 45 | optional: true, 46 | }, 47 | outDir: { 48 | kind: "parsed", 49 | parse: String, 50 | brief: "Output directory", 51 | default: "dist-bin", 52 | }, 53 | outputName: { 54 | kind: "parsed", 55 | parse: String, 56 | brief: "Output file name (overrides inferred name from package.json)", 57 | optional: true, 58 | }, 59 | cacheDir: { 60 | kind: "parsed", 61 | parse: String, 62 | brief: "Cache directory for Node.js binaries", 63 | default: process.env["FOSSILIZE_CACHE_DIR"] ?? ".node-cache", // todo, change this to global 64 | }, 65 | noCache: { 66 | kind: "boolean", 67 | brief: "Do not use the cache for Node.js binaries", 68 | optional: true, 69 | }, 70 | noBundle: { 71 | kind: "boolean", 72 | brief: "Do not bundle the entrypoint using esbuild", 73 | optional: false, 74 | }, 75 | sign: { 76 | kind: "boolean", 77 | brief: "Skip signing for macOS and Windows", 78 | optional: false, 79 | default: envToBool(process.env["FOSSILIZE_SIGN"]), 80 | }, 81 | concurrencyLimit: { 82 | kind: "parsed", 83 | parse: Number, 84 | brief: "Limit the number of concurrent downloads or builds", 85 | default: process.env["FOSSILIZE_CONCURRENCY_LIMIT"] ?? "3", 86 | }, 87 | }, 88 | aliases: { 89 | n: "nodeVersion", 90 | d: "outDir", 91 | o: "outputName", 92 | p: "platforms", 93 | a: "assets", 94 | m: "assetManifest", 95 | l: "concurrencyLimit", 96 | }, 97 | }, 98 | docs: { 99 | brief: description, 100 | }, 101 | }); 102 | 103 | export const app = buildApplication(command, { 104 | name, 105 | scanner: { 106 | caseStyle: "allow-kebab-for-camel", 107 | }, 108 | versionInfo: { 109 | currentVersion: version, 110 | }, 111 | }); 112 | -------------------------------------------------------------------------------- /src/archive-util.ts: -------------------------------------------------------------------------------- 1 | import { Writable } from "node:stream"; 2 | import { promisify } from "node:util"; 3 | import * as tar from "tar-stream"; 4 | import XZDecompress from "xz-decompress"; 5 | import yauzl from "yauzl"; 6 | 7 | type BufferPromiseConstructorParams = Parameters< 8 | ConstructorParameters>[0] 9 | >; 10 | 11 | async function bufferFromAsync(iterator: { 12 | [Symbol.asyncIterator](): AsyncIterableIterator; 13 | }): Promise { 14 | const chunks = []; 15 | for await (const chunk of iterator) { 16 | chunks.push(chunk); 17 | } 18 | return Buffer.concat(chunks); 19 | } 20 | 21 | const yauzlOpen = promisify(yauzl.open); 22 | export async function unzip( 23 | sourceFile: string, 24 | targetFile: string 25 | ): Promise { 26 | let found = false; 27 | // @ts-expect-error -- For some reason, TS is selecting the wrong overload for yauzl.open with promisify above 28 | const zipfile = await yauzlOpen(sourceFile, { lazyEntries: true }); 29 | let resolve: BufferPromiseConstructorParams[0], 30 | reject: BufferPromiseConstructorParams[1]; 31 | const promise = new Promise((res, rej) => { 32 | resolve = res; 33 | reject = rej; 34 | }); 35 | 36 | zipfile.on("entry", (entry) => { 37 | if (entry.fileName !== targetFile) { 38 | zipfile.readEntry(); 39 | return; 40 | } 41 | zipfile.openReadStream(entry, async (err, readStream) => { 42 | if (err) { 43 | reject(err); 44 | return; 45 | } 46 | found = true; 47 | resolve(bufferFromAsync(readStream)); 48 | }); 49 | }); 50 | zipfile.once("end", () => { 51 | if (!found) 52 | reject( 53 | new Error( 54 | `File "${targetFile}" not found in zip archive: ${sourceFile}` 55 | ) 56 | ); 57 | }); 58 | zipfile.readEntry(); 59 | 60 | return promise; 61 | } 62 | export async function untar( 63 | sourceStream: ReadableStream, 64 | targetFile: string 65 | ): Promise { 66 | const extract = tar.extract(); 67 | new XZDecompress.XzReadableStream(sourceStream).pipeTo( 68 | Writable.toWeb(extract) 69 | ); 70 | 71 | let result: Buffer | undefined; 72 | for await (const entry of extract) { 73 | if (entry.header.name !== targetFile) { 74 | entry.resume(); 75 | continue; 76 | } 77 | // We cannot return here as we need to consume the 78 | // stream to completion to avoid resource leaks and 79 | // early termination of the decompression, causing a 80 | // corrupted buffer. 81 | result = await bufferFromAsync(entry); 82 | } 83 | 84 | if (!result) { 85 | throw new Error(`File "${targetFile}" not found in tar archive.`); 86 | } 87 | return result; 88 | } 89 | -------------------------------------------------------------------------------- /src/bin/bash-complete.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | import { proposeCompletions } from "@stricli/core"; 3 | import { buildContext } from "../context"; 4 | import { app } from "../app"; 5 | const inputs = process.argv.slice(3); 6 | if (process.env["COMP_LINE"]?.endsWith(" ")) { 7 | inputs.push(""); 8 | } 9 | proposeCompletions(app, inputs, buildContext(process)) 10 | .then(async () => { 11 | for (const { completion } of await proposeCompletions( 12 | app, 13 | inputs, 14 | buildContext(process) 15 | )) { 16 | process.stdout.write(`${completion}\n`); 17 | } 18 | }) 19 | .catch((e) => {}); 20 | -------------------------------------------------------------------------------- /src/bin/cli.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | import { run } from "@stricli/core"; 3 | import { buildContext } from "../context"; 4 | import { app } from "../app"; 5 | run(app, process.argv.slice(2), buildContext(process)); 6 | -------------------------------------------------------------------------------- /src/context.ts: -------------------------------------------------------------------------------- 1 | import type { CommandContext } from "@stricli/core"; 2 | import type { StricliAutoCompleteContext } from "@stricli/auto-complete"; 3 | import fs from "node:fs"; 4 | import os from "node:os"; 5 | import path from "node:path"; 6 | 7 | export interface LocalContext extends CommandContext, StricliAutoCompleteContext { 8 | readonly process: NodeJS.Process; 9 | // ... 10 | } 11 | 12 | export function buildContext(process: NodeJS.Process): LocalContext { 13 | return { 14 | process, 15 | os, 16 | fs, 17 | path, 18 | }; 19 | } 20 | -------------------------------------------------------------------------------- /src/env-to-bool.ts: -------------------------------------------------------------------------------- 1 | // This file is lifted from https://raw.githubusercontent.com/getsentry/sentry-javascript/refs/heads/develop/packages/node/src/utils/envToBool.ts 2 | export const FALSY_ENV_VALUES = new Set(['false', 'f', 'n', 'no', 'off', '0']); 3 | export const TRUTHY_ENV_VALUES = new Set(['true', 't', 'y', 'yes', 'on', '1']); 4 | 5 | export type StrictBoolCast = { 6 | strict: true; 7 | }; 8 | 9 | export type LooseBoolCast = { 10 | strict?: false; 11 | }; 12 | 13 | export type BoolCastOptions = StrictBoolCast | LooseBoolCast; 14 | 15 | export function envToBool(value: unknown, options?: LooseBoolCast): boolean; 16 | export function envToBool(value: unknown, options: StrictBoolCast): boolean | null; 17 | export function envToBool(value: unknown, options?: BoolCastOptions): boolean | null; 18 | /** 19 | * A helper function which casts an ENV variable value to `true` or `false` using the constants defined above. 20 | * In strict mode, it may return `null` if the value doesn't match any of the predefined values. 21 | * 22 | * @param value The value of the env variable 23 | * @param options -- Only has `strict` key for now, which requires a strict match for `true` in TRUTHY_ENV_VALUES 24 | * @returns true/false if the lowercase value matches the predefined values above. If not, null in strict mode, 25 | * and Boolean(value) in loose mode. 26 | */ 27 | export function envToBool(value: unknown, options?: BoolCastOptions): boolean | null { 28 | const normalized = String(value).toLowerCase(); 29 | 30 | if (FALSY_ENV_VALUES.has(normalized)) { 31 | return false; 32 | } 33 | 34 | if (TRUTHY_ENV_VALUES.has(normalized)) { 35 | return true; 36 | } 37 | 38 | return options?.strict ? null : Boolean(value); 39 | } 40 | -------------------------------------------------------------------------------- /src/impl.ts: -------------------------------------------------------------------------------- 1 | import { execFile } from "node:child_process"; 2 | import { promises as fs } from "node:fs"; 3 | import path from "node:path"; 4 | import { fileURLToPath } from "node:url"; 5 | import { promisify } from "node:util"; 6 | import * as esbuild from "esbuild"; 7 | import { inject } from "postject"; 8 | import type { LocalContext } from "./context"; 9 | import { getNodeBinary, resolveNodeVersion } from "./node-util"; 10 | import pLimit from "p-limit"; 11 | 12 | interface CommandFlags { 13 | readonly nodeVersion: string; 14 | readonly platforms?: string[]; 15 | readonly assets?: string[]; 16 | readonly assetManifest?: string; 17 | readonly outDir: string; 18 | readonly outputName?: string; 19 | readonly cacheDir: string; 20 | readonly noCache?: boolean; 21 | readonly noBundle: boolean; 22 | readonly sign: boolean; 23 | readonly concurrencyLimit: number; 24 | } 25 | 26 | export type SEAConfig = { 27 | main: string; 28 | output: string; 29 | disableExperimentalSEAWarning?: boolean; 30 | useSnapshot?: boolean; 31 | useCodeCache?: boolean; 32 | assets?: Record; 33 | }; 34 | 35 | type ExecResult = { stdout: string; stderr: string }; 36 | type ExecError = Error & { code: string } & ExecResult; 37 | 38 | const PACKAGE_JSON = "package.json"; 39 | const SEA_CONFIG_JSON = "sea-config.json"; 40 | const SEA_BLOB = "sea.blob"; 41 | const NODE_SEA_FUSE = "fce680ab2cc467b6e072b8b5df1996b2"; 42 | 43 | const execFileAsync = promisify(execFile); 44 | async function run(cmd: string, ...args: string[]): Promise { 45 | let output: ExecResult; 46 | try { 47 | output = await execFileAsync(cmd, args, { encoding: "utf8" }); 48 | } catch (err) { 49 | console.error(`Failed to \`run ${cmd} ${args.join(" ")}\``); 50 | console.error((err as ExecError).stdout); 51 | console.error((err as ExecError).stderr); 52 | const errorCode = (err as ExecError).code; 53 | if (errorCode && Number.isInteger(errorCode)) { 54 | process.exit((err as ExecError).code); 55 | } else { 56 | throw new Error("Bailing out as the command failed"); 57 | } 58 | } 59 | if (output.stdout.trim()) { 60 | console.log(output.stdout); 61 | } else { 62 | console.log(`> ${[cmd, ...args].join(" ")}`); 63 | } 64 | return output.stdout; 65 | } 66 | 67 | export default async function ( 68 | this: LocalContext, 69 | flags: CommandFlags, 70 | entrypoint: string 71 | ): Promise { 72 | const entrypointStat = await fs.stat(entrypoint); 73 | let entrypointPath = entrypoint; 74 | let appVersion = "0.0.0"; 75 | let outputName: string | undefined; 76 | if (entrypointStat.isDirectory()) { 77 | const packageJson = JSON.parse( 78 | await fs.readFile(path.join(entrypoint, PACKAGE_JSON), "utf-8") 79 | ); 80 | appVersion = packageJson.version; 81 | const binDefs = Object.entries(packageJson.bin || {}); 82 | if (binDefs.length === 1) { 83 | outputName = binDefs[0]![0]; 84 | entrypointPath = binDefs[0]![1] as string; 85 | } else { 86 | outputName = packageJson.name.split("/").pop(); 87 | entrypointPath = packageJson.main; 88 | } 89 | } else { 90 | outputName = path.basename(entrypoint).split(".")[0]; 91 | } 92 | outputName = flags.outputName || outputName || "bundled"; 93 | // For Windows, `process.platform` is `win32` but the archives just use `win`, sigh... 94 | const normalizedPlatform = 95 | process.platform === "win32" ? "win" : process.platform; 96 | const currentPlatform = `${normalizedPlatform}-${process.arch}`; 97 | const platforms = 98 | !flags.platforms || flags.platforms.length === 0 99 | ? (process.env["FOSSILIZE_PLATFORMS"] || currentPlatform) 100 | .split(",") 101 | .map((platform) => platform.trim()) 102 | : flags.platforms; 103 | this.process.stdout.write(`Platforms: ${platforms.join(", ")}\n`); 104 | 105 | const seaConfigPath = path.join(flags.outDir, SEA_CONFIG_JSON); 106 | const blobPath = path.join(flags.outDir, SEA_BLOB); 107 | 108 | console.log(`Cleaning up ${flags.outDir}...`); 109 | await fs 110 | .rm(flags.outDir, { recursive: true }) 111 | .catch(() => {}) 112 | .finally(() => fs.mkdir(flags.outDir, { recursive: true })); 113 | 114 | let jsBundlePath: string; 115 | if (flags.noBundle) { 116 | jsBundlePath = entrypointPath; 117 | } else { 118 | console.log(`Bundling ${entrypointPath}...`); 119 | jsBundlePath = path.join(flags.outDir, `${outputName}.cjs`); 120 | const bundleResult = await esbuild.build({ 121 | logLevel: "info", 122 | entryPoints: [entrypointPath], 123 | bundle: true, 124 | minify: true, 125 | platform: "node", 126 | target: `node${ 127 | (await resolveNodeVersion(flags.nodeVersion)).split(".", 1)[0] 128 | }`, 129 | format: "cjs", 130 | treeShaking: true, 131 | inject: [fileURLToPath(import.meta.resolve("../import-meta-url.js"))], 132 | define: { 133 | "import.meta.url": "import_meta_url", 134 | "process.env.npm_package_version": JSON.stringify(appVersion), 135 | "process.env.NODE_ENV": JSON.stringify( 136 | process.env["NODE_ENV"] || "development" 137 | ), 138 | }, 139 | outfile: jsBundlePath, 140 | allowOverwrite: true, 141 | }); 142 | 143 | if (bundleResult.errors.length) { 144 | throw new Error(bundleResult.errors.map((e) => e.text).join("\n")); 145 | } 146 | } 147 | 148 | const seaConfig: SEAConfig = { 149 | main: jsBundlePath, 150 | output: blobPath, 151 | disableExperimentalSEAWarning: true, 152 | useSnapshot: false, 153 | useCodeCache: false, // We do cross-compiling so disable this 154 | }; 155 | if (flags.assetManifest) { 156 | const manifest = JSON.parse( 157 | await fs.readFile(flags.assetManifest, "utf-8") 158 | ) as Record< 159 | string, 160 | { file: string; isEntry?: boolean; name: string; src: string } 161 | >; 162 | const assetsDir = path.dirname(flags.assetManifest); 163 | seaConfig.assets = { 164 | [path.basename(flags.assetManifest)]: flags.assetManifest, 165 | ...Object.fromEntries( 166 | Object.values(manifest).map((entry) => [ 167 | entry.file, 168 | path.join(assetsDir, entry.file), 169 | ]) 170 | ), 171 | }; 172 | const entryPointName = Object.entries(manifest).find( 173 | ([_, value]) => value.isEntry 174 | )?.[0]; 175 | if (entryPointName) { 176 | seaConfig.assets[entryPointName] = path.join(assetsDir, entryPointName); 177 | } 178 | } 179 | 180 | if (flags.assets) { 181 | seaConfig.assets = seaConfig.assets || {}; 182 | for (const asset of flags.assets) { 183 | const assetPath = path.resolve(asset); 184 | seaConfig.assets[asset] = assetPath; 185 | } 186 | } 187 | 188 | await fs.writeFile(seaConfigPath, JSON.stringify(seaConfig)); 189 | const targetNodeBinary = await getNodeBinary( 190 | flags.nodeVersion, 191 | currentPlatform, 192 | flags.cacheDir 193 | ); 194 | await run(targetNodeBinary, "--experimental-sea-config", seaConfigPath); 195 | const createBinaryForPlatform = async (platform: string): Promise => { 196 | const outputPath = path.join(flags.outDir, outputName); 197 | console.log(`Creating binary for ${platform} (${outputPath})...`); 198 | const fossilizedBinary = await getNodeBinary( 199 | flags.nodeVersion, 200 | platform, 201 | flags.noCache ? null : flags.cacheDir, 202 | path.join(flags.outDir, outputName) 203 | ); 204 | console.log(`Injecting blob into node executable: ${fossilizedBinary}`); 205 | await inject( 206 | fossilizedBinary, 207 | "NODE_SEA_BLOB", 208 | await fs.readFile(blobPath), 209 | { 210 | // NOTE: Split the string into 2 as `postject` naively looks for that exact string 211 | // for the fuse and gets confused when we try to bundle fossilize. 212 | sentinelFuse: `NODE_SEA_FUSE_${NODE_SEA_FUSE}`, 213 | machoSegmentName: platform.startsWith("darwin") 214 | ? "NODE_SEA" 215 | : undefined, 216 | } 217 | ); 218 | console.log("Created executable", fossilizedBinary); 219 | fs.chmod(fossilizedBinary, 0o755); 220 | if (!flags.sign) { 221 | console.log("Skipping signing, add `--sign` to sign the binary"); 222 | if (platform.startsWith("darwin")) { 223 | console.warn( 224 | `macOS binaries must be signed to run. You can run \`spctl --add ${fossilizedBinary}\` to add the binary to your system's trusted binaries for testing.` 225 | ); 226 | } 227 | return; 228 | } 229 | 230 | if (platform.startsWith("win")) { 231 | console.warn( 232 | "Signing is not supported on Windows, you will need to sign the binary yourself." 233 | ); 234 | return; 235 | } 236 | 237 | if (platform.startsWith("darwin")) { 238 | const { 239 | APPLE_TEAM_ID, 240 | APPLE_CERT_PATH, 241 | APPLE_CERT_PASSWORD, 242 | APPLE_API_KEY_PATH, 243 | } = process.env; 244 | if (!APPLE_TEAM_ID || !APPLE_CERT_PATH || !APPLE_CERT_PASSWORD) { 245 | throw new Error( 246 | "Missing required environment variables for macOS signing (at least one of APPLE_TEAM_ID, APPLE_CERT_PATH, APPLE_CERT_PASSWORD)" 247 | ); 248 | } 249 | console.log(`Signing ${fossilizedBinary}...`); 250 | await run( 251 | "rcodesign", 252 | "sign", 253 | "--team-name", 254 | APPLE_TEAM_ID, 255 | "--p12-file", 256 | APPLE_CERT_PATH, 257 | "--p12-password", 258 | APPLE_CERT_PASSWORD, 259 | "--for-notarization", 260 | "-e", 261 | fileURLToPath(import.meta.resolve("../entitlements.plist")), 262 | fossilizedBinary 263 | ); 264 | if (!APPLE_API_KEY_PATH) { 265 | console.warn( 266 | "Missing required environment variable for macOS notarization, you won't be able to notarize this binary which will annoy people trying to run it." 267 | ); 268 | return; 269 | } 270 | // TODO: Use JS-based zip instead of shelling out 271 | const zipFile = `${fossilizedBinary}.zip`; 272 | await run("zip", zipFile, fossilizedBinary); 273 | await run( 274 | "rcodesign", 275 | "notary-submit", 276 | "--api-key-file", 277 | APPLE_API_KEY_PATH, 278 | "--wait", 279 | zipFile 280 | ); 281 | await fs.rm(zipFile); 282 | } 283 | }; 284 | const limit = pLimit(flags.concurrencyLimit); 285 | await Promise.all( 286 | platforms.map(async (platform) => 287 | limit(() => createBinaryForPlatform(platform)) 288 | ) 289 | ); 290 | await Promise.all([fs.rm(seaConfigPath), fs.rm(blobPath)]); 291 | } 292 | -------------------------------------------------------------------------------- /src/node-util.ts: -------------------------------------------------------------------------------- 1 | import { createWriteStream, openSync } from "node:fs"; 2 | import * as fs from "node:fs/promises"; 3 | import { tmpdir } from "node:os"; 4 | import path from "node:path"; 5 | import { Readable } from "node:stream"; 6 | import { finished } from "node:stream/promises"; 7 | import { unsign } from "macho-unsign"; 8 | import { signatureSet } from "portable-executable-signature"; 9 | import { untar, unzip } from "./archive-util"; 10 | 11 | type ErrorWithCode = Error & { code: string }; 12 | type NodeJSVersionInfo = { 13 | version: string; 14 | date: string; 15 | files: string[]; 16 | npm: string; 17 | v8: string; 18 | uv: string; 19 | zlib: string; 20 | openssl: string; 21 | modules: string; 22 | lts: boolean; 23 | security: boolean; 24 | }; 25 | 26 | function getNodeBinaryCacheName( 27 | version: string, 28 | platform: string 29 | ): { name: string; ext: string } { 30 | const ext = platform.startsWith("win") ? ".exe" : ""; 31 | return { name: `node-v${version}-${platform}${ext}`, ext }; 32 | } 33 | 34 | 35 | async function getNodeBinaryFromCache( 36 | cacheDir: string, 37 | version: string, 38 | platform: string, 39 | targetPath?: string 40 | ): Promise { 41 | const { name, ext } = getNodeBinaryCacheName(version, platform); 42 | const cacheSourceFile = path.join(cacheDir, name); 43 | if (!targetPath) { 44 | await fs.access(cacheSourceFile, fs.constants.R_OK); 45 | return cacheSourceFile; 46 | } 47 | const targetFile = `${targetPath}-${platform}${ext}`; 48 | if (platform.startsWith("darwin") || platform.startsWith("win")) { 49 | const nodeBuffer = await fs.readFile(cacheSourceFile); 50 | let unsigned: ArrayBufferLike | null = null; 51 | if (platform.startsWith("win")) { 52 | unsigned = signatureSet(nodeBuffer, null); 53 | } else if (platform.startsWith("darwin")) { 54 | unsigned = unsign(nodeBuffer.buffer); 55 | } 56 | if (!unsigned) { 57 | throw new Error(`Failed to unsign binary: ${cacheSourceFile}`); 58 | } 59 | await fs.writeFile(targetFile, Buffer.from(unsigned)); 60 | } else { 61 | await fs.copyFile(cacheSourceFile, targetFile); 62 | } 63 | return targetFile; 64 | } 65 | 66 | const NODE_VERSIONS_INDEX_URL = 67 | "https://nodejs.org/download/release/index.json"; 68 | const NODE_VERSION_REGEX = /^v?(\d+)(?:\.(\d+))?(?:\.(\d+))?$/i; 69 | export async function _resolveNodeVersion(version: string): Promise { 70 | let resolvedVersion: string | undefined = version; 71 | if (version === "local") { 72 | resolvedVersion = process.version.slice(1); 73 | } 74 | // TODO: expand `version` to a full version string 75 | // Use https://nodejs.org/download/release/index.json 76 | const versionBits = version 77 | .match(NODE_VERSION_REGEX) 78 | ?.slice(1) 79 | .filter(Boolean); 80 | if (!versionBits || versionBits.length < 3) { 81 | // TODO: try to match latest, lts 82 | const response = await fetch(NODE_VERSIONS_INDEX_URL); 83 | const availableVersions = (await response.json()) as NodeJSVersionInfo[]; 84 | if (!availableVersions || availableVersions.length === 0) { 85 | throw new Error( 86 | `No available Node.js versions found from: ${NODE_VERSIONS_INDEX_URL}` 87 | ); 88 | } 89 | if (version === "latest") { 90 | resolvedVersion = availableVersions[0]!.version.slice(1); 91 | } else if (version === "lts") { 92 | resolvedVersion = availableVersions.find((v) => v.lts)?.version.slice(1); 93 | } else if (versionBits) { 94 | const prefix = `v${versionBits.join(".")}.`; 95 | resolvedVersion = availableVersions 96 | .find((v) => v.version.startsWith(prefix)) 97 | ?.version.slice(1); 98 | } 99 | if (!resolvedVersion) { 100 | throw new Error( 101 | `No matching Node.js version found for: ${version} from: ${NODE_VERSIONS_INDEX_URL}` 102 | ); 103 | } 104 | } else { 105 | resolvedVersion = versionBits.join("."); 106 | } 107 | console.log(`Resolved Node.js version '${version}' to ${resolvedVersion}`); 108 | const [nodeVersionMajor, _nodeVersionMinor] = resolvedVersion 109 | .match(NODE_VERSION_REGEX)! 110 | .slice(1, 3) 111 | .map(Number) as [number, number]; 112 | if (nodeVersionMajor < 20) { 113 | throw new Error( 114 | `Node.js version ${resolvedVersion} does not support SEA.\nSee https://nodejs.org/api/single-executable-applications.html#single-executable-applications` 115 | ); 116 | } 117 | return resolvedVersion; 118 | } 119 | const _VERSION_CACHE: Map> = new Map(); 120 | export function resolveNodeVersion(version: string): Promise { 121 | if (!_VERSION_CACHE.has(version)) { 122 | _VERSION_CACHE.set(version, _resolveNodeVersion(version)); 123 | } 124 | return _VERSION_CACHE.get(version)!; 125 | } 126 | 127 | export async function getNodeBinary( 128 | version: string, 129 | platform: string, 130 | cacheDir: string | null, 131 | targetPath?: string 132 | ): Promise { 133 | if (!cacheDir) { 134 | // this means don't use cache 135 | // we still need a temp directory to download the node binary 136 | cacheDir = tmpdir(); 137 | } 138 | 139 | const resolvedVersion = await resolveNodeVersion(version); 140 | 141 | try { 142 | return await getNodeBinaryFromCache( 143 | cacheDir, 144 | resolvedVersion, 145 | platform, 146 | targetPath 147 | ); 148 | } catch (err) { 149 | if ((err as ErrorWithCode).code !== "ENOENT") { 150 | throw err; 151 | } 152 | } 153 | 154 | // Note for the future: There are about ~50% smaller windows 155 | // archives available with the 7z format but decompressing 7z 156 | // without any native code only seems to be available through 157 | // a WASM port, which is about 1.5MB. Not sure worth it. 158 | const remoteArchiveName = `node-v${resolvedVersion}-${platform}.${ 159 | platform.startsWith("win") ? "zip" : "tar.xz" 160 | }`; 161 | await fs.mkdir(cacheDir, { recursive: true }); 162 | const nodeDir = await fs.mkdtemp(path.join(cacheDir, remoteArchiveName)); 163 | const url = `https://nodejs.org/dist/v${resolvedVersion}/${remoteArchiveName}`; 164 | const resp = await fetch(url); 165 | if (!resp.ok) 166 | throw new Error( 167 | `Failed to fetch ${url}: ${resp.status} ${resp.statusText}` 168 | ); 169 | if (!resp.body) 170 | throw new Error( 171 | `Response body is null for ${url}: ${resp.status} ${resp.statusText}` 172 | ); 173 | 174 | const cacheTargetFile = path.join( 175 | cacheDir, 176 | getNodeBinaryCacheName(resolvedVersion, platform).name 177 | ); 178 | 179 | // There's a slight chance of a race condition regarding all write operations 180 | // for the `cacheTargetFile` below (fs.write() and fs.copy()) when concurrent 181 | // fossilize instances try to write to the same file. We may add a try-catch 182 | // block here to recover but we'll cross that bridge when we get there. 183 | if (platform.startsWith("win")) { 184 | const stream = createWriteStream(path.join(nodeDir, remoteArchiveName)); 185 | await finished(Readable.fromWeb(resp.body).pipe(stream)); 186 | const data = await unzip( 187 | stream.path as string, 188 | // Need `/` as path separator, even on Windows as that's how `unzip` works 189 | `node-v${resolvedVersion}-${platform}/node.exe` 190 | ); 191 | await fs.writeFile(cacheTargetFile, data); 192 | } else { 193 | await fs.writeFile( 194 | cacheTargetFile, 195 | await untar(resp.body, `node-v${resolvedVersion}-${platform}/bin/node`) 196 | ); 197 | } 198 | await fs.chmod(cacheTargetFile, 0o755); 199 | 200 | try { 201 | await fs.rm(nodeDir, { recursive: true }); 202 | } catch (err) { 203 | console.error(`Failed to remove ${nodeDir}: ${err}`); 204 | } 205 | return await getNodeBinaryFromCache( 206 | cacheDir, 207 | resolvedVersion, 208 | platform, 209 | targetPath 210 | ); 211 | } 212 | -------------------------------------------------------------------------------- /src/postject.d.ts: -------------------------------------------------------------------------------- 1 | declare module "postject"; 2 | 3 | function inject( 4 | binPath: string, 5 | blobName: string, 6 | blobData: Buffer, 7 | options: { sentinelFuse: string; machoSegmentName?: string } 8 | ): Promise; 9 | -------------------------------------------------------------------------------- /src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["ES2022"], 4 | "module": "preserve", 5 | "target": "ES2022", 6 | "noEmit": true, 7 | "rootDir": "..", 8 | "types": ["node"], 9 | "resolveJsonModule": true, 10 | "moduleResolution": "bundler", 11 | "skipLibCheck": true, 12 | "strict": true, 13 | "isolatedModules": true, 14 | "forceConsistentCasingInFileNames": true, 15 | "noImplicitOverride": true, 16 | "noPropertyAccessFromIndexSignature": true, 17 | "noUncheckedIndexedAccess": true, 18 | "verbatimModuleSyntax": true 19 | }, 20 | "include": ["**/*"], 21 | "exclude": [] 22 | } 23 | -------------------------------------------------------------------------------- /test/asset.txt: -------------------------------------------------------------------------------- 1 | Hello world! 2 | -------------------------------------------------------------------------------- /test/sample.cjs: -------------------------------------------------------------------------------- 1 | const sea = require('node:sea'); 2 | console.log(new TextDecoder().decode(sea.getRawAsset('asset.txt'))); 3 | --------------------------------------------------------------------------------