├── .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 |
--------------------------------------------------------------------------------