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.
Files changed (272) hide show
  1. package/docs/api/binary-data.md +1028 -0
  2. package/docs/api/cc.md +197 -0
  3. package/docs/api/color.md +262 -0
  4. package/docs/api/console.md +38 -0
  5. package/docs/api/dns.md +113 -0
  6. package/docs/api/fetch.md +308 -0
  7. package/docs/api/ffi.md +536 -0
  8. package/docs/api/file-io.md +358 -0
  9. package/docs/api/file-system-router.md +112 -0
  10. package/docs/api/file.md +19 -0
  11. package/docs/api/glob.md +157 -0
  12. package/docs/api/globals.md +387 -0
  13. package/docs/api/hashing.md +314 -0
  14. package/docs/api/html-rewriter.md +31 -0
  15. package/docs/api/http.md +661 -0
  16. package/docs/api/import-meta.md +69 -0
  17. package/docs/api/node-api.md +16 -0
  18. package/docs/api/semver.md +52 -0
  19. package/docs/api/spawn.md +441 -0
  20. package/docs/api/sqlite.md +692 -0
  21. package/docs/api/streams.md +214 -0
  22. package/docs/api/tcp.md +221 -0
  23. package/docs/api/test.md +1 -0
  24. package/docs/api/transpiler.md +274 -0
  25. package/docs/api/udp.md +125 -0
  26. package/docs/api/utils.md +773 -0
  27. package/docs/api/websockets.md +547 -0
  28. package/docs/api/workers.md +230 -0
  29. package/docs/benchmarks.md +120 -0
  30. package/docs/bun-flavored-toml.md +42 -0
  31. package/docs/bundler/executables.md +291 -0
  32. package/docs/bundler/index.md +1543 -0
  33. package/docs/bundler/intro.md +75 -0
  34. package/docs/bundler/loaders.md +288 -0
  35. package/docs/bundler/macros.md +327 -0
  36. package/docs/bundler/plugins.md +30 -0
  37. package/docs/bundler/vs-esbuild.md +1127 -0
  38. package/docs/cli/add.md +163 -0
  39. package/docs/cli/bun-completions.md +3 -0
  40. package/docs/cli/bun-create.md +254 -0
  41. package/docs/cli/bun-dev.md +21 -0
  42. package/docs/cli/bun-install.md +255 -0
  43. package/docs/cli/bun-upgrade.md +39 -0
  44. package/docs/cli/bunx.md +80 -0
  45. package/docs/cli/filter.md +57 -0
  46. package/docs/cli/init.md +40 -0
  47. package/docs/cli/install.md +205 -0
  48. package/docs/cli/link.md +38 -0
  49. package/docs/cli/outdated.md +61 -0
  50. package/docs/cli/patch-commit.md +9 -0
  51. package/docs/cli/pm.md +150 -0
  52. package/docs/cli/publish.md +107 -0
  53. package/docs/cli/remove.md +5 -0
  54. package/docs/cli/run.md +196 -0
  55. package/docs/cli/test.md +247 -0
  56. package/docs/cli/unlink.md +7 -0
  57. package/docs/cli/update.md +34 -0
  58. package/docs/contributing/upgrading-webkit.md +57 -0
  59. package/docs/ecosystem/elysia.md +24 -0
  60. package/docs/ecosystem/express.md +37 -0
  61. package/docs/ecosystem/hono.md +18 -0
  62. package/docs/ecosystem/react.md +65 -0
  63. package/docs/ecosystem/stric.md +37 -0
  64. package/docs/guides/binary/arraybuffer-to-array.md +27 -0
  65. package/docs/guides/binary/arraybuffer-to-blob.md +24 -0
  66. package/docs/guides/binary/arraybuffer-to-buffer.md +25 -0
  67. package/docs/guides/binary/arraybuffer-to-string.md +15 -0
  68. package/docs/guides/binary/arraybuffer-to-typedarray.md +39 -0
  69. package/docs/guides/binary/blob-to-arraybuffer.md +14 -0
  70. package/docs/guides/binary/blob-to-dataview.md +14 -0
  71. package/docs/guides/binary/blob-to-stream.md +14 -0
  72. package/docs/guides/binary/blob-to-string.md +15 -0
  73. package/docs/guides/binary/blob-to-typedarray.md +14 -0
  74. package/docs/guides/binary/buffer-to-arraybuffer.md +14 -0
  75. package/docs/guides/binary/buffer-to-blob.md +14 -0
  76. package/docs/guides/binary/buffer-to-readablestream.md +41 -0
  77. package/docs/guides/binary/buffer-to-string.md +25 -0
  78. package/docs/guides/binary/buffer-to-typedarray.md +14 -0
  79. package/docs/guides/binary/dataview-to-string.md +15 -0
  80. package/docs/guides/binary/typedarray-to-arraybuffer.md +25 -0
  81. package/docs/guides/binary/typedarray-to-blob.md +16 -0
  82. package/docs/guides/binary/typedarray-to-buffer.md +14 -0
  83. package/docs/guides/binary/typedarray-to-dataview.md +14 -0
  84. package/docs/guides/binary/typedarray-to-readablestream.md +41 -0
  85. package/docs/guides/binary/typedarray-to-string.md +16 -0
  86. package/docs/guides/ecosystem/astro.md +72 -0
  87. package/docs/guides/ecosystem/discordjs.md +77 -0
  88. package/docs/guides/ecosystem/docker.md +140 -0
  89. package/docs/guides/ecosystem/drizzle.md +185 -0
  90. package/docs/guides/ecosystem/edgedb.md +228 -0
  91. package/docs/guides/ecosystem/elysia.md +31 -0
  92. package/docs/guides/ecosystem/express.md +40 -0
  93. package/docs/guides/ecosystem/hono.md +39 -0
  94. package/docs/guides/ecosystem/mongoose.md +87 -0
  95. package/docs/guides/ecosystem/neon-drizzle.md +220 -0
  96. package/docs/guides/ecosystem/neon-serverless-postgres.md +55 -0
  97. package/docs/guides/ecosystem/nextjs.md +38 -0
  98. package/docs/guides/ecosystem/nuxt.md +56 -0
  99. package/docs/guides/ecosystem/pm2.md +57 -0
  100. package/docs/guides/ecosystem/prisma.md +140 -0
  101. package/docs/guides/ecosystem/qwik.md +107 -0
  102. package/docs/guides/ecosystem/react.md +49 -0
  103. package/docs/guides/ecosystem/remix.md +78 -0
  104. package/docs/guides/ecosystem/render.md +79 -0
  105. package/docs/guides/ecosystem/sentry.md +52 -0
  106. package/docs/guides/ecosystem/solidstart.md +58 -0
  107. package/docs/guides/ecosystem/ssr-react.md +51 -0
  108. package/docs/guides/ecosystem/stric.md +55 -0
  109. package/docs/guides/ecosystem/sveltekit.md +125 -0
  110. package/docs/guides/ecosystem/systemd.md +113 -0
  111. package/docs/guides/ecosystem/vite.md +70 -0
  112. package/docs/guides/http/cluster.md +66 -0
  113. package/docs/guides/http/fetch-unix.md +33 -0
  114. package/docs/guides/http/fetch.md +24 -0
  115. package/docs/guides/http/file-uploads.md +94 -0
  116. package/docs/guides/http/hot.md +22 -0
  117. package/docs/guides/http/proxy.md +24 -0
  118. package/docs/guides/http/server.md +46 -0
  119. package/docs/guides/http/simple.md +18 -0
  120. package/docs/guides/http/stream-file.md +48 -0
  121. package/docs/guides/http/stream-iterator.md +47 -0
  122. package/docs/guides/http/stream-node-streams-in-bun.md +20 -0
  123. package/docs/guides/http/tls.md +30 -0
  124. package/docs/guides/install/add-dev.md +26 -0
  125. package/docs/guides/install/add-git.md +36 -0
  126. package/docs/guides/install/add-optional.md +25 -0
  127. package/docs/guides/install/add-peer.md +17 -0
  128. package/docs/guides/install/add-tarball.md +33 -0
  129. package/docs/guides/install/add.md +42 -0
  130. package/docs/guides/install/azure-artifacts.md +73 -0
  131. package/docs/guides/install/cicd.md +41 -0
  132. package/docs/guides/install/custom-registry.md +30 -0
  133. package/docs/guides/install/from-npm-install-to-bun-install.md +214 -0
  134. package/docs/guides/install/git-diff-bun-lockfile.md +38 -0
  135. package/docs/guides/install/jfrog-artifactory.md +28 -0
  136. package/docs/guides/install/npm-alias.md +23 -0
  137. package/docs/guides/install/registry-scope.md +36 -0
  138. package/docs/guides/install/trusted.md +48 -0
  139. package/docs/guides/install/workspaces.md +70 -0
  140. package/docs/guides/install/yarnlock.md +42 -0
  141. package/docs/guides/process/argv.md +57 -0
  142. package/docs/guides/process/ctrl-c.md +16 -0
  143. package/docs/guides/process/ipc.md +66 -0
  144. package/docs/guides/process/nanoseconds.md +13 -0
  145. package/docs/guides/process/os-signals.md +39 -0
  146. package/docs/guides/process/spawn-stderr.md +31 -0
  147. package/docs/guides/process/spawn-stdout.md +26 -0
  148. package/docs/guides/process/spawn.md +41 -0
  149. package/docs/guides/process/stdin.md +54 -0
  150. package/docs/guides/read-file/arraybuffer.md +28 -0
  151. package/docs/guides/read-file/buffer.md +19 -0
  152. package/docs/guides/read-file/exists.md +16 -0
  153. package/docs/guides/read-file/json.md +17 -0
  154. package/docs/guides/read-file/mime.md +20 -0
  155. package/docs/guides/read-file/stream.md +26 -0
  156. package/docs/guides/read-file/string.md +22 -0
  157. package/docs/guides/read-file/uint8array.md +21 -0
  158. package/docs/guides/read-file/watch.md +68 -0
  159. package/docs/guides/runtime/cicd.md +43 -0
  160. package/docs/guides/runtime/define-constant.md +145 -0
  161. package/docs/guides/runtime/import-html.md +15 -0
  162. package/docs/guides/runtime/import-json.md +44 -0
  163. package/docs/guides/runtime/import-toml.md +30 -0
  164. package/docs/guides/runtime/read-env.md +32 -0
  165. package/docs/guides/runtime/set-env.md +37 -0
  166. package/docs/guides/runtime/shell.md +40 -0
  167. package/docs/guides/runtime/timezone.md +35 -0
  168. package/docs/guides/runtime/tsconfig-paths.md +29 -0
  169. package/docs/guides/runtime/typescript.md +47 -0
  170. package/docs/guides/runtime/vscode-debugger.md +47 -0
  171. package/docs/guides/runtime/web-debugger.md +82 -0
  172. package/docs/guides/streams/node-readable-to-arraybuffer.md +11 -0
  173. package/docs/guides/streams/node-readable-to-blob.md +11 -0
  174. package/docs/guides/streams/node-readable-to-json.md +12 -0
  175. package/docs/guides/streams/node-readable-to-string.md +12 -0
  176. package/docs/guides/streams/node-readable-to-uint8array.md +11 -0
  177. package/docs/guides/streams/to-array.md +14 -0
  178. package/docs/guides/streams/to-arraybuffer.md +14 -0
  179. package/docs/guides/streams/to-blob.md +14 -0
  180. package/docs/guides/streams/to-buffer.md +15 -0
  181. package/docs/guides/streams/to-json.md +14 -0
  182. package/docs/guides/streams/to-string.md +14 -0
  183. package/docs/guides/streams/to-typedarray.md +22 -0
  184. package/docs/guides/test/bail.md +22 -0
  185. package/docs/guides/test/coverage-threshold.md +60 -0
  186. package/docs/guides/test/coverage.md +44 -0
  187. package/docs/guides/test/happy-dom.md +68 -0
  188. package/docs/guides/test/migrate-from-jest.md +110 -0
  189. package/docs/guides/test/mock-clock.md +48 -0
  190. package/docs/guides/test/mock-functions.md +68 -0
  191. package/docs/guides/test/rerun-each.md +14 -0
  192. package/docs/guides/test/run-tests.md +111 -0
  193. package/docs/guides/test/skip-tests.md +39 -0
  194. package/docs/guides/test/snapshot.md +99 -0
  195. package/docs/guides/test/spy-on.md +46 -0
  196. package/docs/guides/test/testing-library.md +87 -0
  197. package/docs/guides/test/timeout.md +15 -0
  198. package/docs/guides/test/todo-tests.md +67 -0
  199. package/docs/guides/test/update-snapshots.md +50 -0
  200. package/docs/guides/test/watch-mode.md +19 -0
  201. package/docs/guides/util/base64.md +15 -0
  202. package/docs/guides/util/deep-equals.md +39 -0
  203. package/docs/guides/util/deflate.md +18 -0
  204. package/docs/guides/util/detect-bun.md +23 -0
  205. package/docs/guides/util/entrypoint.md +17 -0
  206. package/docs/guides/util/escape-html.md +22 -0
  207. package/docs/guides/util/file-url-to-path.md +14 -0
  208. package/docs/guides/util/gzip.md +18 -0
  209. package/docs/guides/util/hash-a-password.md +54 -0
  210. package/docs/guides/util/import-meta-dir.md +13 -0
  211. package/docs/guides/util/import-meta-file.md +13 -0
  212. package/docs/guides/util/import-meta-path.md +13 -0
  213. package/docs/guides/util/main.md +32 -0
  214. package/docs/guides/util/path-to-file-url.md +14 -0
  215. package/docs/guides/util/sleep.md +22 -0
  216. package/docs/guides/util/version.md +21 -0
  217. package/docs/guides/util/which-path-to-executable-bin.md +15 -0
  218. package/docs/guides/websocket/compression.md +31 -0
  219. package/docs/guides/websocket/context.md +72 -0
  220. package/docs/guides/websocket/pubsub.md +38 -0
  221. package/docs/guides/websocket/simple.md +33 -0
  222. package/docs/guides/write-file/append.md +52 -0
  223. package/docs/guides/write-file/basic.md +44 -0
  224. package/docs/guides/write-file/blob.md +28 -0
  225. package/docs/guides/write-file/cat.md +17 -0
  226. package/docs/guides/write-file/file-cp.md +16 -0
  227. package/docs/guides/write-file/filesink.md +52 -0
  228. package/docs/guides/write-file/response.md +17 -0
  229. package/docs/guides/write-file/stdout.md +21 -0
  230. package/docs/guides/write-file/stream.md +17 -0
  231. package/docs/guides/write-file/unlink.md +23 -0
  232. package/docs/index.md +77 -0
  233. package/docs/install/cache.md +57 -0
  234. package/docs/install/index.md +202 -0
  235. package/docs/install/lifecycle.md +46 -0
  236. package/docs/install/lockfile.md +90 -0
  237. package/docs/install/npmrc.md +75 -0
  238. package/docs/install/overrides.md +73 -0
  239. package/docs/install/patch.md +57 -0
  240. package/docs/install/registries.md +30 -0
  241. package/docs/install/workspaces.md +70 -0
  242. package/docs/installation.md +289 -0
  243. package/docs/project/benchmarking.md +203 -0
  244. package/docs/project/building-windows.md +162 -0
  245. package/docs/project/internals/build-process-for-ci.md +75 -0
  246. package/docs/project/roadmap.md +87 -0
  247. package/docs/quickstart.md +144 -0
  248. package/docs/runtime/autoimport.md +94 -0
  249. package/docs/runtime/bun-apis.md +129 -0
  250. package/docs/runtime/bunfig.md +532 -0
  251. package/docs/runtime/debugger.md +325 -0
  252. package/docs/runtime/env.md +214 -0
  253. package/docs/runtime/hot.md +139 -0
  254. package/docs/runtime/index.md +309 -0
  255. package/docs/runtime/jsx.md +326 -0
  256. package/docs/runtime/loaders.md +127 -0
  257. package/docs/runtime/modules.md +298 -0
  258. package/docs/runtime/nodejs-apis.md +456 -0
  259. package/docs/runtime/plugins.md +605 -0
  260. package/docs/runtime/shell.md +537 -0
  261. package/docs/runtime/typescript.md +60 -0
  262. package/docs/runtime/web-apis.md +128 -0
  263. package/docs/test/coverage.md +91 -0
  264. package/docs/test/dom.md +75 -0
  265. package/docs/test/hot.md +15 -0
  266. package/docs/test/lifecycle.md +81 -0
  267. package/docs/test/mocks.md +236 -0
  268. package/docs/test/snapshots.md +15 -0
  269. package/docs/test/time.md +106 -0
  270. package/docs/test/writing.md +547 -0
  271. package/docs/typescript.md +51 -0
  272. 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
+ ![Benchmark](https://github.com/oven-sh/bun/assets/709451/94746adc-8aba-4baf-a143-3c355f8e0f78)
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
+ ```