bun-types 1.1.37-canary.20241124T140524 → 1.1.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/api/binary-data.md +1028 -0
- package/docs/api/cc.md +197 -0
- package/docs/api/color.md +262 -0
- package/docs/api/console.md +38 -0
- package/docs/api/dns.md +113 -0
- package/docs/api/fetch.md +308 -0
- package/docs/api/ffi.md +536 -0
- package/docs/api/file-io.md +358 -0
- package/docs/api/file-system-router.md +112 -0
- package/docs/api/file.md +19 -0
- package/docs/api/glob.md +157 -0
- package/docs/api/globals.md +387 -0
- package/docs/api/hashing.md +314 -0
- package/docs/api/html-rewriter.md +31 -0
- package/docs/api/http.md +661 -0
- package/docs/api/import-meta.md +69 -0
- package/docs/api/node-api.md +16 -0
- package/docs/api/semver.md +52 -0
- package/docs/api/spawn.md +441 -0
- package/docs/api/sqlite.md +692 -0
- package/docs/api/streams.md +214 -0
- package/docs/api/tcp.md +221 -0
- package/docs/api/test.md +1 -0
- package/docs/api/transpiler.md +274 -0
- package/docs/api/udp.md +125 -0
- package/docs/api/utils.md +773 -0
- package/docs/api/websockets.md +547 -0
- package/docs/api/workers.md +230 -0
- package/docs/benchmarks.md +120 -0
- package/docs/bun-flavored-toml.md +42 -0
- package/docs/bundler/executables.md +291 -0
- package/docs/bundler/index.md +1543 -0
- package/docs/bundler/intro.md +75 -0
- package/docs/bundler/loaders.md +288 -0
- package/docs/bundler/macros.md +327 -0
- package/docs/bundler/plugins.md +30 -0
- package/docs/bundler/vs-esbuild.md +1127 -0
- package/docs/cli/add.md +163 -0
- package/docs/cli/bun-completions.md +3 -0
- package/docs/cli/bun-create.md +254 -0
- package/docs/cli/bun-dev.md +21 -0
- package/docs/cli/bun-install.md +255 -0
- package/docs/cli/bun-upgrade.md +39 -0
- package/docs/cli/bunx.md +80 -0
- package/docs/cli/filter.md +57 -0
- package/docs/cli/init.md +40 -0
- package/docs/cli/install.md +205 -0
- package/docs/cli/link.md +38 -0
- package/docs/cli/outdated.md +61 -0
- package/docs/cli/patch-commit.md +9 -0
- package/docs/cli/pm.md +150 -0
- package/docs/cli/publish.md +107 -0
- package/docs/cli/remove.md +5 -0
- package/docs/cli/run.md +196 -0
- package/docs/cli/test.md +247 -0
- package/docs/cli/unlink.md +7 -0
- package/docs/cli/update.md +34 -0
- package/docs/contributing/upgrading-webkit.md +57 -0
- package/docs/ecosystem/elysia.md +24 -0
- package/docs/ecosystem/express.md +37 -0
- package/docs/ecosystem/hono.md +18 -0
- package/docs/ecosystem/react.md +65 -0
- package/docs/ecosystem/stric.md +37 -0
- package/docs/guides/binary/arraybuffer-to-array.md +27 -0
- package/docs/guides/binary/arraybuffer-to-blob.md +24 -0
- package/docs/guides/binary/arraybuffer-to-buffer.md +25 -0
- package/docs/guides/binary/arraybuffer-to-string.md +15 -0
- package/docs/guides/binary/arraybuffer-to-typedarray.md +39 -0
- package/docs/guides/binary/blob-to-arraybuffer.md +14 -0
- package/docs/guides/binary/blob-to-dataview.md +14 -0
- package/docs/guides/binary/blob-to-stream.md +14 -0
- package/docs/guides/binary/blob-to-string.md +15 -0
- package/docs/guides/binary/blob-to-typedarray.md +14 -0
- package/docs/guides/binary/buffer-to-arraybuffer.md +14 -0
- package/docs/guides/binary/buffer-to-blob.md +14 -0
- package/docs/guides/binary/buffer-to-readablestream.md +41 -0
- package/docs/guides/binary/buffer-to-string.md +25 -0
- package/docs/guides/binary/buffer-to-typedarray.md +14 -0
- package/docs/guides/binary/dataview-to-string.md +15 -0
- package/docs/guides/binary/typedarray-to-arraybuffer.md +25 -0
- package/docs/guides/binary/typedarray-to-blob.md +16 -0
- package/docs/guides/binary/typedarray-to-buffer.md +14 -0
- package/docs/guides/binary/typedarray-to-dataview.md +14 -0
- package/docs/guides/binary/typedarray-to-readablestream.md +41 -0
- package/docs/guides/binary/typedarray-to-string.md +16 -0
- package/docs/guides/ecosystem/astro.md +72 -0
- package/docs/guides/ecosystem/discordjs.md +77 -0
- package/docs/guides/ecosystem/docker.md +140 -0
- package/docs/guides/ecosystem/drizzle.md +185 -0
- package/docs/guides/ecosystem/edgedb.md +228 -0
- package/docs/guides/ecosystem/elysia.md +31 -0
- package/docs/guides/ecosystem/express.md +40 -0
- package/docs/guides/ecosystem/hono.md +39 -0
- package/docs/guides/ecosystem/mongoose.md +87 -0
- package/docs/guides/ecosystem/neon-drizzle.md +220 -0
- package/docs/guides/ecosystem/neon-serverless-postgres.md +55 -0
- package/docs/guides/ecosystem/nextjs.md +38 -0
- package/docs/guides/ecosystem/nuxt.md +56 -0
- package/docs/guides/ecosystem/pm2.md +57 -0
- package/docs/guides/ecosystem/prisma.md +140 -0
- package/docs/guides/ecosystem/qwik.md +107 -0
- package/docs/guides/ecosystem/react.md +49 -0
- package/docs/guides/ecosystem/remix.md +78 -0
- package/docs/guides/ecosystem/render.md +79 -0
- package/docs/guides/ecosystem/sentry.md +52 -0
- package/docs/guides/ecosystem/solidstart.md +58 -0
- package/docs/guides/ecosystem/ssr-react.md +51 -0
- package/docs/guides/ecosystem/stric.md +55 -0
- package/docs/guides/ecosystem/sveltekit.md +125 -0
- package/docs/guides/ecosystem/systemd.md +113 -0
- package/docs/guides/ecosystem/vite.md +70 -0
- package/docs/guides/http/cluster.md +66 -0
- package/docs/guides/http/fetch-unix.md +33 -0
- package/docs/guides/http/fetch.md +24 -0
- package/docs/guides/http/file-uploads.md +94 -0
- package/docs/guides/http/hot.md +22 -0
- package/docs/guides/http/proxy.md +24 -0
- package/docs/guides/http/server.md +46 -0
- package/docs/guides/http/simple.md +18 -0
- package/docs/guides/http/stream-file.md +48 -0
- package/docs/guides/http/stream-iterator.md +47 -0
- package/docs/guides/http/stream-node-streams-in-bun.md +20 -0
- package/docs/guides/http/tls.md +30 -0
- package/docs/guides/install/add-dev.md +26 -0
- package/docs/guides/install/add-git.md +36 -0
- package/docs/guides/install/add-optional.md +25 -0
- package/docs/guides/install/add-peer.md +17 -0
- package/docs/guides/install/add-tarball.md +33 -0
- package/docs/guides/install/add.md +42 -0
- package/docs/guides/install/azure-artifacts.md +73 -0
- package/docs/guides/install/cicd.md +41 -0
- package/docs/guides/install/custom-registry.md +30 -0
- package/docs/guides/install/from-npm-install-to-bun-install.md +214 -0
- package/docs/guides/install/git-diff-bun-lockfile.md +38 -0
- package/docs/guides/install/jfrog-artifactory.md +28 -0
- package/docs/guides/install/npm-alias.md +23 -0
- package/docs/guides/install/registry-scope.md +36 -0
- package/docs/guides/install/trusted.md +48 -0
- package/docs/guides/install/workspaces.md +70 -0
- package/docs/guides/install/yarnlock.md +42 -0
- package/docs/guides/process/argv.md +57 -0
- package/docs/guides/process/ctrl-c.md +16 -0
- package/docs/guides/process/ipc.md +66 -0
- package/docs/guides/process/nanoseconds.md +13 -0
- package/docs/guides/process/os-signals.md +39 -0
- package/docs/guides/process/spawn-stderr.md +31 -0
- package/docs/guides/process/spawn-stdout.md +26 -0
- package/docs/guides/process/spawn.md +41 -0
- package/docs/guides/process/stdin.md +54 -0
- package/docs/guides/read-file/arraybuffer.md +28 -0
- package/docs/guides/read-file/buffer.md +19 -0
- package/docs/guides/read-file/exists.md +16 -0
- package/docs/guides/read-file/json.md +17 -0
- package/docs/guides/read-file/mime.md +20 -0
- package/docs/guides/read-file/stream.md +26 -0
- package/docs/guides/read-file/string.md +22 -0
- package/docs/guides/read-file/uint8array.md +21 -0
- package/docs/guides/read-file/watch.md +68 -0
- package/docs/guides/runtime/cicd.md +43 -0
- package/docs/guides/runtime/define-constant.md +145 -0
- package/docs/guides/runtime/import-html.md +15 -0
- package/docs/guides/runtime/import-json.md +44 -0
- package/docs/guides/runtime/import-toml.md +30 -0
- package/docs/guides/runtime/read-env.md +32 -0
- package/docs/guides/runtime/set-env.md +37 -0
- package/docs/guides/runtime/shell.md +40 -0
- package/docs/guides/runtime/timezone.md +35 -0
- package/docs/guides/runtime/tsconfig-paths.md +29 -0
- package/docs/guides/runtime/typescript.md +47 -0
- package/docs/guides/runtime/vscode-debugger.md +47 -0
- package/docs/guides/runtime/web-debugger.md +82 -0
- package/docs/guides/streams/node-readable-to-arraybuffer.md +11 -0
- package/docs/guides/streams/node-readable-to-blob.md +11 -0
- package/docs/guides/streams/node-readable-to-json.md +12 -0
- package/docs/guides/streams/node-readable-to-string.md +12 -0
- package/docs/guides/streams/node-readable-to-uint8array.md +11 -0
- package/docs/guides/streams/to-array.md +14 -0
- package/docs/guides/streams/to-arraybuffer.md +14 -0
- package/docs/guides/streams/to-blob.md +14 -0
- package/docs/guides/streams/to-buffer.md +15 -0
- package/docs/guides/streams/to-json.md +14 -0
- package/docs/guides/streams/to-string.md +14 -0
- package/docs/guides/streams/to-typedarray.md +22 -0
- package/docs/guides/test/bail.md +22 -0
- package/docs/guides/test/coverage-threshold.md +60 -0
- package/docs/guides/test/coverage.md +44 -0
- package/docs/guides/test/happy-dom.md +68 -0
- package/docs/guides/test/migrate-from-jest.md +110 -0
- package/docs/guides/test/mock-clock.md +48 -0
- package/docs/guides/test/mock-functions.md +68 -0
- package/docs/guides/test/rerun-each.md +14 -0
- package/docs/guides/test/run-tests.md +111 -0
- package/docs/guides/test/skip-tests.md +39 -0
- package/docs/guides/test/snapshot.md +99 -0
- package/docs/guides/test/spy-on.md +46 -0
- package/docs/guides/test/testing-library.md +87 -0
- package/docs/guides/test/timeout.md +15 -0
- package/docs/guides/test/todo-tests.md +67 -0
- package/docs/guides/test/update-snapshots.md +50 -0
- package/docs/guides/test/watch-mode.md +19 -0
- package/docs/guides/util/base64.md +15 -0
- package/docs/guides/util/deep-equals.md +39 -0
- package/docs/guides/util/deflate.md +18 -0
- package/docs/guides/util/detect-bun.md +23 -0
- package/docs/guides/util/entrypoint.md +17 -0
- package/docs/guides/util/escape-html.md +22 -0
- package/docs/guides/util/file-url-to-path.md +14 -0
- package/docs/guides/util/gzip.md +18 -0
- package/docs/guides/util/hash-a-password.md +54 -0
- package/docs/guides/util/import-meta-dir.md +13 -0
- package/docs/guides/util/import-meta-file.md +13 -0
- package/docs/guides/util/import-meta-path.md +13 -0
- package/docs/guides/util/main.md +32 -0
- package/docs/guides/util/path-to-file-url.md +14 -0
- package/docs/guides/util/sleep.md +22 -0
- package/docs/guides/util/version.md +21 -0
- package/docs/guides/util/which-path-to-executable-bin.md +15 -0
- package/docs/guides/websocket/compression.md +31 -0
- package/docs/guides/websocket/context.md +72 -0
- package/docs/guides/websocket/pubsub.md +38 -0
- package/docs/guides/websocket/simple.md +33 -0
- package/docs/guides/write-file/append.md +52 -0
- package/docs/guides/write-file/basic.md +44 -0
- package/docs/guides/write-file/blob.md +28 -0
- package/docs/guides/write-file/cat.md +17 -0
- package/docs/guides/write-file/file-cp.md +16 -0
- package/docs/guides/write-file/filesink.md +52 -0
- package/docs/guides/write-file/response.md +17 -0
- package/docs/guides/write-file/stdout.md +21 -0
- package/docs/guides/write-file/stream.md +17 -0
- package/docs/guides/write-file/unlink.md +23 -0
- package/docs/index.md +77 -0
- package/docs/install/cache.md +57 -0
- package/docs/install/index.md +202 -0
- package/docs/install/lifecycle.md +46 -0
- package/docs/install/lockfile.md +90 -0
- package/docs/install/npmrc.md +75 -0
- package/docs/install/overrides.md +73 -0
- package/docs/install/patch.md +57 -0
- package/docs/install/registries.md +30 -0
- package/docs/install/workspaces.md +70 -0
- package/docs/installation.md +289 -0
- package/docs/project/benchmarking.md +203 -0
- package/docs/project/building-windows.md +162 -0
- package/docs/project/internals/build-process-for-ci.md +75 -0
- package/docs/project/roadmap.md +87 -0
- package/docs/quickstart.md +144 -0
- package/docs/runtime/autoimport.md +94 -0
- package/docs/runtime/bun-apis.md +129 -0
- package/docs/runtime/bunfig.md +532 -0
- package/docs/runtime/debugger.md +325 -0
- package/docs/runtime/env.md +214 -0
- package/docs/runtime/hot.md +139 -0
- package/docs/runtime/index.md +309 -0
- package/docs/runtime/jsx.md +326 -0
- package/docs/runtime/loaders.md +127 -0
- package/docs/runtime/modules.md +298 -0
- package/docs/runtime/nodejs-apis.md +456 -0
- package/docs/runtime/plugins.md +605 -0
- package/docs/runtime/shell.md +537 -0
- package/docs/runtime/typescript.md +60 -0
- package/docs/runtime/web-apis.md +128 -0
- package/docs/test/coverage.md +91 -0
- package/docs/test/dom.md +75 -0
- package/docs/test/hot.md +15 -0
- package/docs/test/lifecycle.md +81 -0
- package/docs/test/mocks.md +236 -0
- package/docs/test/snapshots.md +15 -0
- package/docs/test/time.md +106 -0
- package/docs/test/writing.md +547 -0
- package/docs/typescript.md +51 -0
- package/package.json +5 -4
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
The `import.meta` object is a way for a module to access information about itself. It's part of the JavaScript language, but its contents are not standardized. Each "host" (browser, runtime, etc) is free to implement any properties it wishes on the `import.meta` object.
|
|
2
|
+
|
|
3
|
+
Bun implements the following properties.
|
|
4
|
+
|
|
5
|
+
```ts#/path/to/project/file.ts
|
|
6
|
+
import.meta.dir; // => "/path/to/project"
|
|
7
|
+
import.meta.file; // => "file.ts"
|
|
8
|
+
import.meta.path; // => "/path/to/project/file.ts"
|
|
9
|
+
import.meta.url; // => "file:///path/to/project/file.ts"
|
|
10
|
+
|
|
11
|
+
import.meta.main; // `true` if this file is directly executed by `bun run`
|
|
12
|
+
// `false` otherwise
|
|
13
|
+
|
|
14
|
+
import.meta.resolve("zod"); // => "file:///path/to/project/node_modules/zod/index.js"
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
{% table %}
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
- `import.meta.dir`
|
|
22
|
+
- Absolute path to the directory containing the current file, e.g. `/path/to/project`. Equivalent to `__dirname` in CommonJS modules (and Node.js)
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
- `import.meta.dirname`
|
|
27
|
+
- An alias to `import.meta.dir`, for Node.js compatibility
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
- `import.meta.env`
|
|
32
|
+
- An alias to `process.env`.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
- `import.meta.file`
|
|
37
|
+
- The name of the current file, e.g. `index.tsx`
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
- `import.meta.path`
|
|
42
|
+
- Absolute path to the current file, e.g. `/path/to/project/index.ts`. Equivalent to `__filename` in CommonJS modules (and Node.js)
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
- `import.meta.filename`
|
|
47
|
+
- An alias to `import.meta.path`, for Node.js compatibility
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
- `import.meta.main`
|
|
52
|
+
- Indicates whether the current file is the entrypoint to the current `bun` process. Is the file being directly executed by `bun run` or is it being imported?
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
- `import.meta.resolve`
|
|
57
|
+
- Resolve a module specifier (e.g. `"zod"` or `"./file.tsx"`) to a url. Equivalent to [`import.meta.resolve` in browsers](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/import.meta#resolve)
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
import.meta.resolve("zod");
|
|
61
|
+
// => "file:///path/to/project/node_modules/zod/index.ts"
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
- `import.meta.url`
|
|
67
|
+
- A `string` url to the current file, e.g. `file:///path/to/project/index.ts`. Equivalent to [`import.meta.url` in browsers](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/import.meta#url)
|
|
68
|
+
|
|
69
|
+
{% /table %}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
Node-API is an interface for building native add-ons to Node.js. Bun implements 95% of this interface from scratch, so most existing Node-API extensions will work with Bun out of the box. Track the completion status of it in [this issue](https://github.com/oven-sh/bun/issues/158).
|
|
2
|
+
|
|
3
|
+
As in Node.js, `.node` files (Node-API modules) can be required directly in Bun.
|
|
4
|
+
|
|
5
|
+
```js
|
|
6
|
+
const napi = require("./my-node-module.node");
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Alternatively, use `process.dlopen`:
|
|
10
|
+
|
|
11
|
+
```js
|
|
12
|
+
let mod = { exports: {} };
|
|
13
|
+
process.dlopen(mod, "./my-node-module.node");
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Bun polyfills the [`detect-libc`](https://npmjs.com/package/detect-libc) package, which is used by many Node-API modules to detect which `.node` binding to `require`.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
Bun implements a semantic versioning API which can be used to compare versions and determine if a version is compatible with another range of versions. The versions and ranges are designed to be compatible with `node-semver`, which is used by npm clients.
|
|
2
|
+
|
|
3
|
+
It's about 20x faster than `node-semver`.
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
Currently, this API provides two functions :
|
|
8
|
+
|
|
9
|
+
#### `Bun.semver.satisfies(version: string, range: string): boolean`
|
|
10
|
+
|
|
11
|
+
Returns `true` if `version` satisfies `range`, otherwise `false`.
|
|
12
|
+
|
|
13
|
+
Example:
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
import { semver } from "bun";
|
|
17
|
+
|
|
18
|
+
semver.satisfies("1.0.0", "^1.0.0"); // true
|
|
19
|
+
semver.satisfies("1.0.0", "^1.0.1"); // false
|
|
20
|
+
semver.satisfies("1.0.0", "~1.0.0"); // true
|
|
21
|
+
semver.satisfies("1.0.0", "~1.0.1"); // false
|
|
22
|
+
semver.satisfies("1.0.0", "1.0.0"); // true
|
|
23
|
+
semver.satisfies("1.0.0", "1.0.1"); // false
|
|
24
|
+
semver.satisfies("1.0.1", "1.0.0"); // false
|
|
25
|
+
semver.satisfies("1.0.0", "1.0.x"); // true
|
|
26
|
+
semver.satisfies("1.0.0", "1.x.x"); // true
|
|
27
|
+
semver.satisfies("1.0.0", "x.x.x"); // true
|
|
28
|
+
semver.satisfies("1.0.0", "1.0.0 - 2.0.0"); // true
|
|
29
|
+
semver.satisfies("1.0.0", "1.0.0 - 1.0.1"); // true
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
If `range` is invalid, it returns false. If `version` is invalid, it returns false.
|
|
33
|
+
|
|
34
|
+
#### `Bun.semver.order(versionA: string, versionB: string): 0 | 1 | -1`
|
|
35
|
+
|
|
36
|
+
Returns `0` if `versionA` and `versionB` are equal, `1` if `versionA` is greater than `versionB`, and `-1` if `versionA` is less than `versionB`.
|
|
37
|
+
|
|
38
|
+
Example:
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
import { semver } from "bun";
|
|
42
|
+
|
|
43
|
+
semver.order("1.0.0", "1.0.0"); // 0
|
|
44
|
+
semver.order("1.0.0", "1.0.1"); // -1
|
|
45
|
+
semver.order("1.0.1", "1.0.0"); // 1
|
|
46
|
+
|
|
47
|
+
const unsorted = ["1.0.0", "1.0.1", "1.0.0-alpha", "1.0.0-beta", "1.0.0-rc"];
|
|
48
|
+
unsorted.sort(semver.order); // ["1.0.0-alpha", "1.0.0-beta", "1.0.0-rc", "1.0.0", "1.0.1"]
|
|
49
|
+
console.log(unsorted);
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
If you need other semver functions, feel free to open an issue or pull request.
|
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
Spawn child processes with `Bun.spawn` or `Bun.spawnSync`.
|
|
2
|
+
|
|
3
|
+
## Spawn a process (`Bun.spawn()`)
|
|
4
|
+
|
|
5
|
+
Provide a command as an array of strings. The result of `Bun.spawn()` is a `Bun.Subprocess` object.
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
const proc = Bun.spawn(["bun", "--version"]);
|
|
9
|
+
console.log(await proc.exited); // 0
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
The second argument to `Bun.spawn` is a parameters object that can be used to configure the subprocess.
|
|
13
|
+
|
|
14
|
+
```ts
|
|
15
|
+
const proc = Bun.spawn(["bun", "--version"], {
|
|
16
|
+
cwd: "./path/to/subdir", // specify a working directory
|
|
17
|
+
env: { ...process.env, FOO: "bar" }, // specify environment variables
|
|
18
|
+
onExit(proc, exitCode, signalCode, error) {
|
|
19
|
+
// exit handler
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
proc.pid; // process ID of subprocess
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Input stream
|
|
27
|
+
|
|
28
|
+
By default, the input stream of the subprocess is undefined; it can be configured with the `stdin` parameter.
|
|
29
|
+
|
|
30
|
+
```ts
|
|
31
|
+
const proc = Bun.spawn(["cat"], {
|
|
32
|
+
stdin: await fetch(
|
|
33
|
+
"https://raw.githubusercontent.com/oven-sh/bun/main/examples/hashing.js",
|
|
34
|
+
),
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
const text = await new Response(proc.stdout).text();
|
|
38
|
+
console.log(text); // "const input = "hello world".repeat(400); ..."
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
{% table %}
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
- `null`
|
|
46
|
+
- **Default.** Provide no input to the subprocess
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
- `"pipe"`
|
|
51
|
+
- Return a `FileSink` for fast incremental writing
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
- `"inherit"`
|
|
56
|
+
- Inherit the `stdin` of the parent process
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
- `Bun.file()`
|
|
61
|
+
- Read from the specified file.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
- `TypedArray | DataView`
|
|
66
|
+
- Use a binary buffer as input.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
- `Response`
|
|
71
|
+
- Use the response `body` as input.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
- `Request`
|
|
76
|
+
- Use the request `body` as input.
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
- `number`
|
|
81
|
+
- Read from the file with a given file descriptor.
|
|
82
|
+
|
|
83
|
+
{% /table %}
|
|
84
|
+
|
|
85
|
+
The `"pipe"` option lets incrementally write to the subprocess's input stream from the parent process.
|
|
86
|
+
|
|
87
|
+
```ts
|
|
88
|
+
const proc = Bun.spawn(["cat"], {
|
|
89
|
+
stdin: "pipe", // return a FileSink for writing
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
// enqueue string data
|
|
93
|
+
proc.stdin.write("hello");
|
|
94
|
+
|
|
95
|
+
// enqueue binary data
|
|
96
|
+
const enc = new TextEncoder();
|
|
97
|
+
proc.stdin.write(enc.encode(" world!"));
|
|
98
|
+
|
|
99
|
+
// send buffered data
|
|
100
|
+
proc.stdin.flush();
|
|
101
|
+
|
|
102
|
+
// close the input stream
|
|
103
|
+
proc.stdin.end();
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Output streams
|
|
107
|
+
|
|
108
|
+
You can read results from the subprocess via the `stdout` and `stderr` properties. By default these are instances of `ReadableStream`.
|
|
109
|
+
|
|
110
|
+
```ts
|
|
111
|
+
const proc = Bun.spawn(["bun", "--version"]);
|
|
112
|
+
const text = await new Response(proc.stdout).text();
|
|
113
|
+
console.log(text); // => "1.1.7"
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Configure the output stream by passing one of the following values to `stdout/stderr`:
|
|
117
|
+
|
|
118
|
+
{% table %}
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
- `"pipe"`
|
|
123
|
+
- **Default for `stdout`.** Pipe the output to a `ReadableStream` on the returned `Subprocess` object.
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
- `"inherit"`
|
|
128
|
+
- **Default for `stderr`.** Inherit from the parent process.
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
- `Bun.file()`
|
|
133
|
+
- Write to the specified file.
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
- `null`
|
|
138
|
+
- Write to `/dev/null`.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
- `number`
|
|
143
|
+
- Write to the file with the given file descriptor.
|
|
144
|
+
|
|
145
|
+
{% /table %}
|
|
146
|
+
|
|
147
|
+
## Exit handling
|
|
148
|
+
|
|
149
|
+
Use the `onExit` callback to listen for the process exiting or being killed.
|
|
150
|
+
|
|
151
|
+
```ts
|
|
152
|
+
const proc = Bun.spawn(["bun", "--version"], {
|
|
153
|
+
onExit(proc, exitCode, signalCode, error) {
|
|
154
|
+
// exit handler
|
|
155
|
+
},
|
|
156
|
+
});
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
For convenience, the `exited` property is a `Promise` that resolves when the process exits.
|
|
160
|
+
|
|
161
|
+
```ts
|
|
162
|
+
const proc = Bun.spawn(["bun", "--version"]);
|
|
163
|
+
|
|
164
|
+
await proc.exited; // resolves when process exit
|
|
165
|
+
proc.killed; // boolean — was the process killed?
|
|
166
|
+
proc.exitCode; // null | number
|
|
167
|
+
proc.signalCode; // null | "SIGABRT" | "SIGALRM" | ...
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
To kill a process:
|
|
171
|
+
|
|
172
|
+
```ts
|
|
173
|
+
const proc = Bun.spawn(["bun", "--version"]);
|
|
174
|
+
proc.kill();
|
|
175
|
+
proc.killed; // true
|
|
176
|
+
|
|
177
|
+
proc.kill(); // specify an exit code
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
The parent `bun` process will not terminate until all child processes have exited. Use `proc.unref()` to detach the child process from the parent.
|
|
181
|
+
|
|
182
|
+
```ts
|
|
183
|
+
const proc = Bun.spawn(["bun", "--version"]);
|
|
184
|
+
proc.unref();
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## Inter-process communication (IPC)
|
|
188
|
+
|
|
189
|
+
Bun supports direct inter-process communication channel between two `bun` processes. To receive messages from a spawned Bun subprocess, specify an `ipc` handler.
|
|
190
|
+
|
|
191
|
+
```ts#parent.ts
|
|
192
|
+
const child = Bun.spawn(["bun", "child.ts"], {
|
|
193
|
+
ipc(message) {
|
|
194
|
+
/**
|
|
195
|
+
* The message received from the sub process
|
|
196
|
+
**/
|
|
197
|
+
},
|
|
198
|
+
});
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
The parent process can send messages to the subprocess using the `.send()` method on the returned `Subprocess` instance. A reference to the sending subprocess is also available as the second argument in the `ipc` handler.
|
|
202
|
+
|
|
203
|
+
```ts#parent.ts
|
|
204
|
+
const childProc = Bun.spawn(["bun", "child.ts"], {
|
|
205
|
+
ipc(message, childProc) {
|
|
206
|
+
/**
|
|
207
|
+
* The message received from the sub process
|
|
208
|
+
**/
|
|
209
|
+
childProc.send("Respond to child")
|
|
210
|
+
},
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
childProc.send("I am your father"); // The parent can send messages to the child as well
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
Meanwhile the child process can send messages to its parent using with `process.send()` and receive messages with `process.on("message")`. This is the same API used for `child_process.fork()` in Node.js.
|
|
217
|
+
|
|
218
|
+
```ts#child.ts
|
|
219
|
+
process.send("Hello from child as string");
|
|
220
|
+
process.send({ message: "Hello from child as object" });
|
|
221
|
+
|
|
222
|
+
process.on("message", (message) => {
|
|
223
|
+
// print message from parent
|
|
224
|
+
console.log(message);
|
|
225
|
+
});
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
```ts#child.ts
|
|
229
|
+
// send a string
|
|
230
|
+
process.send("Hello from child as string");
|
|
231
|
+
|
|
232
|
+
// send an object
|
|
233
|
+
process.send({ message: "Hello from child as object" });
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
The `ipcMode` option controls the underlying communication format between the two processes:
|
|
237
|
+
|
|
238
|
+
- `advanced`: (default) Messages are serialized using the JSC `serialize` API, which supports cloning [everything `structuredClone` supports](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm). This does not support transferring ownership of objects.
|
|
239
|
+
- `json`: Messages are serialized using `JSON.stringify` and `JSON.parse`, which does not support as many object types as `advanced` does.
|
|
240
|
+
|
|
241
|
+
### IPC between Bun & Node.js
|
|
242
|
+
|
|
243
|
+
To use IPC between a `bun` process and a Node.js process, set `serialization: "json"` in `Bun.spawn`. This is because Node.js and Bun use different JavaScript engines with different object serialization formats.
|
|
244
|
+
|
|
245
|
+
```js#bun-node-ipc.js
|
|
246
|
+
if (typeof Bun !== "undefined") {
|
|
247
|
+
const prefix = `[bun ${process.versions.bun} 🐇]`;
|
|
248
|
+
const node = Bun.spawn({
|
|
249
|
+
cmd: ["node", __filename],
|
|
250
|
+
ipc({ message }) {
|
|
251
|
+
console.log(message);
|
|
252
|
+
node.send({ message: `${prefix} 👋 hey node` });
|
|
253
|
+
node.kill();
|
|
254
|
+
},
|
|
255
|
+
stdio: ["inherit", "inherit", "inherit"],
|
|
256
|
+
serialization: "json",
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
node.send({ message: `${prefix} 👋 hey node` });
|
|
260
|
+
} else {
|
|
261
|
+
const prefix = `[node ${process.version}]`;
|
|
262
|
+
process.on("message", ({ message }) => {
|
|
263
|
+
console.log(message);
|
|
264
|
+
process.send({ message: `${prefix} 👋 hey bun` });
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
## Blocking API (`Bun.spawnSync()`)
|
|
270
|
+
|
|
271
|
+
Bun provides a synchronous equivalent of `Bun.spawn` called `Bun.spawnSync`. This is a blocking API that supports the same inputs and parameters as `Bun.spawn`. It returns a `SyncSubprocess` object, which differs from `Subprocess` in a few ways.
|
|
272
|
+
|
|
273
|
+
1. It contains a `success` property that indicates whether the process exited with a zero exit code.
|
|
274
|
+
2. The `stdout` and `stderr` properties are instances of `Buffer` instead of `ReadableStream`.
|
|
275
|
+
3. There is no `stdin` property. Use `Bun.spawn` to incrementally write to the subprocess's input stream.
|
|
276
|
+
|
|
277
|
+
```ts
|
|
278
|
+
const proc = Bun.spawnSync(["echo", "hello"]);
|
|
279
|
+
|
|
280
|
+
console.log(proc.stdout.toString());
|
|
281
|
+
// => "hello\n"
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
As a rule of thumb, the asynchronous `Bun.spawn` API is better for HTTP servers and apps, and `Bun.spawnSync` is better for building command-line tools.
|
|
285
|
+
|
|
286
|
+
## Benchmarks
|
|
287
|
+
|
|
288
|
+
{%callout%}
|
|
289
|
+
⚡️ Under the hood, `Bun.spawn` and `Bun.spawnSync` use [`posix_spawn(3)`](https://man7.org/linux/man-pages/man3/posix_spawn.3.html).
|
|
290
|
+
{%/callout%}
|
|
291
|
+
|
|
292
|
+
Bun's `spawnSync` spawns processes 60% faster than the Node.js `child_process` module.
|
|
293
|
+
|
|
294
|
+
```bash
|
|
295
|
+
$ bun spawn.mjs
|
|
296
|
+
cpu: Apple M1 Max
|
|
297
|
+
runtime: bun 1.x (arm64-darwin)
|
|
298
|
+
|
|
299
|
+
benchmark time (avg) (min … max) p75 p99 p995
|
|
300
|
+
--------------------------------------------------------- -----------------------------
|
|
301
|
+
spawnSync echo hi 888.14 µs/iter (821.83 µs … 1.2 ms) 905.92 µs 1 ms 1.03 ms
|
|
302
|
+
$ node spawn.node.mjs
|
|
303
|
+
cpu: Apple M1 Max
|
|
304
|
+
runtime: node v18.9.1 (arm64-darwin)
|
|
305
|
+
|
|
306
|
+
benchmark time (avg) (min … max) p75 p99 p995
|
|
307
|
+
--------------------------------------------------------- -----------------------------
|
|
308
|
+
spawnSync echo hi 1.47 ms/iter (1.14 ms … 2.64 ms) 1.57 ms 2.37 ms 2.52 ms
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
## Reference
|
|
312
|
+
|
|
313
|
+
A simple reference of the Spawn API and types are shown below. The real types have complex generics to strongly type the `Subprocess` streams with the options passed to `Bun.spawn` and `Bun.spawnSync`. For full details, find these types as defined [bun.d.ts](https://github.com/oven-sh/bun/blob/main/packages/bun-types/bun.d.ts).
|
|
314
|
+
|
|
315
|
+
```ts
|
|
316
|
+
interface Bun {
|
|
317
|
+
spawn(command: string[], options?: SpawnOptions.OptionsObject): Subprocess;
|
|
318
|
+
spawnSync(
|
|
319
|
+
command: string[],
|
|
320
|
+
options?: SpawnOptions.OptionsObject,
|
|
321
|
+
): SyncSubprocess;
|
|
322
|
+
|
|
323
|
+
spawn(options: { cmd: string[] } & SpawnOptions.OptionsObject): Subprocess;
|
|
324
|
+
spawnSync(
|
|
325
|
+
options: { cmd: string[] } & SpawnOptions.OptionsObject,
|
|
326
|
+
): SyncSubprocess;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
namespace SpawnOptions {
|
|
330
|
+
interface OptionsObject {
|
|
331
|
+
cwd?: string;
|
|
332
|
+
env?: Record<string, string>;
|
|
333
|
+
stdin?: SpawnOptions.Readable;
|
|
334
|
+
stdout?: SpawnOptions.Writable;
|
|
335
|
+
stderr?: SpawnOptions.Writable;
|
|
336
|
+
onExit?: (
|
|
337
|
+
proc: Subprocess,
|
|
338
|
+
exitCode: number | null,
|
|
339
|
+
signalCode: string | null,
|
|
340
|
+
error: Error | null,
|
|
341
|
+
) => void;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
type Readable =
|
|
345
|
+
| "pipe"
|
|
346
|
+
| "inherit"
|
|
347
|
+
| "ignore"
|
|
348
|
+
| null // equivalent to "ignore"
|
|
349
|
+
| undefined // to use default
|
|
350
|
+
| BunFile
|
|
351
|
+
| ArrayBufferView
|
|
352
|
+
| number;
|
|
353
|
+
|
|
354
|
+
type Writable =
|
|
355
|
+
| "pipe"
|
|
356
|
+
| "inherit"
|
|
357
|
+
| "ignore"
|
|
358
|
+
| null // equivalent to "ignore"
|
|
359
|
+
| undefined // to use default
|
|
360
|
+
| BunFile
|
|
361
|
+
| ArrayBufferView
|
|
362
|
+
| number
|
|
363
|
+
| ReadableStream
|
|
364
|
+
| Blob
|
|
365
|
+
| Response
|
|
366
|
+
| Request;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
interface Subprocess<Stdin, Stdout, Stderr> {
|
|
370
|
+
readonly pid: number;
|
|
371
|
+
// the exact stream types here are derived from the generic parameters
|
|
372
|
+
readonly stdin: number | ReadableStream | FileSink | undefined;
|
|
373
|
+
readonly stdout: number | ReadableStream | undefined;
|
|
374
|
+
readonly stderr: number | ReadableStream | undefined;
|
|
375
|
+
|
|
376
|
+
readonly exited: Promise<number>;
|
|
377
|
+
|
|
378
|
+
readonly exitCode: number | undefined;
|
|
379
|
+
readonly signalCode: Signal | null;
|
|
380
|
+
readonly killed: boolean;
|
|
381
|
+
|
|
382
|
+
ref(): void;
|
|
383
|
+
unref(): void;
|
|
384
|
+
kill(code?: number): void;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
interface SyncSubprocess<Stdout, Stderr> {
|
|
388
|
+
readonly pid: number;
|
|
389
|
+
readonly success: boolean;
|
|
390
|
+
// the exact buffer types here are derived from the generic parameters
|
|
391
|
+
readonly stdout: Buffer | undefined;
|
|
392
|
+
readonly stderr: Buffer | undefined;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
type ReadableSubprocess = Subprocess<any, "pipe", "pipe">;
|
|
396
|
+
type WritableSubprocess = Subprocess<"pipe", any, any>;
|
|
397
|
+
type PipedSubprocess = Subprocess<"pipe", "pipe", "pipe">;
|
|
398
|
+
type NullSubprocess = Subprocess<null, null, null>;
|
|
399
|
+
|
|
400
|
+
type ReadableSyncSubprocess = SyncSubprocess<"pipe", "pipe">;
|
|
401
|
+
type NullSyncSubprocess = SyncSubprocess<null, null>;
|
|
402
|
+
|
|
403
|
+
type Signal =
|
|
404
|
+
| "SIGABRT"
|
|
405
|
+
| "SIGALRM"
|
|
406
|
+
| "SIGBUS"
|
|
407
|
+
| "SIGCHLD"
|
|
408
|
+
| "SIGCONT"
|
|
409
|
+
| "SIGFPE"
|
|
410
|
+
| "SIGHUP"
|
|
411
|
+
| "SIGILL"
|
|
412
|
+
| "SIGINT"
|
|
413
|
+
| "SIGIO"
|
|
414
|
+
| "SIGIOT"
|
|
415
|
+
| "SIGKILL"
|
|
416
|
+
| "SIGPIPE"
|
|
417
|
+
| "SIGPOLL"
|
|
418
|
+
| "SIGPROF"
|
|
419
|
+
| "SIGPWR"
|
|
420
|
+
| "SIGQUIT"
|
|
421
|
+
| "SIGSEGV"
|
|
422
|
+
| "SIGSTKFLT"
|
|
423
|
+
| "SIGSTOP"
|
|
424
|
+
| "SIGSYS"
|
|
425
|
+
| "SIGTERM"
|
|
426
|
+
| "SIGTRAP"
|
|
427
|
+
| "SIGTSTP"
|
|
428
|
+
| "SIGTTIN"
|
|
429
|
+
| "SIGTTOU"
|
|
430
|
+
| "SIGUNUSED"
|
|
431
|
+
| "SIGURG"
|
|
432
|
+
| "SIGUSR1"
|
|
433
|
+
| "SIGUSR2"
|
|
434
|
+
| "SIGVTALRM"
|
|
435
|
+
| "SIGWINCH"
|
|
436
|
+
| "SIGXCPU"
|
|
437
|
+
| "SIGXFSZ"
|
|
438
|
+
| "SIGBREAK"
|
|
439
|
+
| "SIGLOST"
|
|
440
|
+
| "SIGINFO";
|
|
441
|
+
```
|