bun-types 1.3.2-canary.20251104T140728 → 1.3.2-canary.20251106T140813

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 (312) hide show
  1. package/bun.d.ts +4 -4
  2. package/docs/README.md +28 -0
  3. package/globals.d.ts +0 -1
  4. package/overrides.d.ts +45 -15
  5. package/package.json +1 -1
  6. package/test.d.ts +1 -1
  7. package/docs/api/binary-data.md +0 -1038
  8. package/docs/api/cc.md +0 -197
  9. package/docs/api/color.md +0 -262
  10. package/docs/api/console.md +0 -57
  11. package/docs/api/cookie.md +0 -449
  12. package/docs/api/dns.md +0 -110
  13. package/docs/api/fetch.md +0 -463
  14. package/docs/api/ffi.md +0 -557
  15. package/docs/api/file-io.md +0 -366
  16. package/docs/api/file-system-router.md +0 -112
  17. package/docs/api/file.md +0 -19
  18. package/docs/api/glob.md +0 -178
  19. package/docs/api/globals.md +0 -387
  20. package/docs/api/hashing.md +0 -319
  21. package/docs/api/html-rewriter.md +0 -334
  22. package/docs/api/http.md +0 -1408
  23. package/docs/api/import-meta.md +0 -69
  24. package/docs/api/node-api.md +0 -14
  25. package/docs/api/redis.md +0 -597
  26. package/docs/api/s3.md +0 -850
  27. package/docs/api/secrets.md +0 -319
  28. package/docs/api/semver.md +0 -52
  29. package/docs/api/spawn.md +0 -582
  30. package/docs/api/sql.md +0 -1374
  31. package/docs/api/sqlite.md +0 -694
  32. package/docs/api/streams.md +0 -230
  33. package/docs/api/tcp.md +0 -221
  34. package/docs/api/transpiler.md +0 -276
  35. package/docs/api/udp.md +0 -123
  36. package/docs/api/utils.md +0 -891
  37. package/docs/api/websockets.md +0 -573
  38. package/docs/api/workers.md +0 -322
  39. package/docs/api/yaml.md +0 -668
  40. package/docs/benchmarks.md +0 -120
  41. package/docs/bun-flavored-toml.md +0 -42
  42. package/docs/bundler/css.md +0 -1028
  43. package/docs/bundler/css_modules.md +0 -145
  44. package/docs/bundler/executables.md +0 -626
  45. package/docs/bundler/fullstack.md +0 -418
  46. package/docs/bundler/hmr.md +0 -234
  47. package/docs/bundler/html.md +0 -349
  48. package/docs/bundler/index.md +0 -1735
  49. package/docs/bundler/intro.md +0 -75
  50. package/docs/bundler/loaders.md +0 -410
  51. package/docs/bundler/macros.md +0 -329
  52. package/docs/bundler/plugins.md +0 -449
  53. package/docs/bundler/vs-esbuild.md +0 -1127
  54. package/docs/cli/add.md +0 -173
  55. package/docs/cli/bun-completions.md +0 -3
  56. package/docs/cli/bun-create.md +0 -338
  57. package/docs/cli/bun-install.md +0 -349
  58. package/docs/cli/bun-upgrade.md +0 -39
  59. package/docs/cli/bunx.md +0 -89
  60. package/docs/cli/filter.md +0 -90
  61. package/docs/cli/info.md +0 -65
  62. package/docs/cli/init.md +0 -85
  63. package/docs/cli/install.md +0 -344
  64. package/docs/cli/link.md +0 -40
  65. package/docs/cli/outdated.md +0 -90
  66. package/docs/cli/patch-commit.md +0 -11
  67. package/docs/cli/pm.md +0 -285
  68. package/docs/cli/publish.md +0 -120
  69. package/docs/cli/remove.md +0 -7
  70. package/docs/cli/run.md +0 -261
  71. package/docs/cli/test.md +0 -397
  72. package/docs/cli/unlink.md +0 -9
  73. package/docs/cli/update.md +0 -129
  74. package/docs/cli/why.md +0 -67
  75. package/docs/contributing/upgrading-webkit.md +0 -57
  76. package/docs/ecosystem/elysia.md +0 -24
  77. package/docs/ecosystem/express.md +0 -37
  78. package/docs/ecosystem/hono.md +0 -18
  79. package/docs/ecosystem/react.md +0 -65
  80. package/docs/ecosystem/stric.md +0 -38
  81. package/docs/guides/binary/arraybuffer-to-array.md +0 -27
  82. package/docs/guides/binary/arraybuffer-to-blob.md +0 -24
  83. package/docs/guides/binary/arraybuffer-to-buffer.md +0 -25
  84. package/docs/guides/binary/arraybuffer-to-string.md +0 -15
  85. package/docs/guides/binary/arraybuffer-to-typedarray.md +0 -39
  86. package/docs/guides/binary/blob-to-arraybuffer.md +0 -14
  87. package/docs/guides/binary/blob-to-dataview.md +0 -14
  88. package/docs/guides/binary/blob-to-stream.md +0 -14
  89. package/docs/guides/binary/blob-to-string.md +0 -15
  90. package/docs/guides/binary/blob-to-typedarray.md +0 -14
  91. package/docs/guides/binary/buffer-to-arraybuffer.md +0 -14
  92. package/docs/guides/binary/buffer-to-blob.md +0 -14
  93. package/docs/guides/binary/buffer-to-readablestream.md +0 -41
  94. package/docs/guides/binary/buffer-to-string.md +0 -25
  95. package/docs/guides/binary/buffer-to-typedarray.md +0 -14
  96. package/docs/guides/binary/dataview-to-string.md +0 -15
  97. package/docs/guides/binary/typedarray-to-arraybuffer.md +0 -25
  98. package/docs/guides/binary/typedarray-to-blob.md +0 -16
  99. package/docs/guides/binary/typedarray-to-buffer.md +0 -14
  100. package/docs/guides/binary/typedarray-to-dataview.md +0 -14
  101. package/docs/guides/binary/typedarray-to-readablestream.md +0 -41
  102. package/docs/guides/binary/typedarray-to-string.md +0 -16
  103. package/docs/guides/deployment/railway.md +0 -157
  104. package/docs/guides/ecosystem/astro.md +0 -72
  105. package/docs/guides/ecosystem/discordjs.md +0 -77
  106. package/docs/guides/ecosystem/docker.md +0 -140
  107. package/docs/guides/ecosystem/drizzle.md +0 -185
  108. package/docs/guides/ecosystem/edgedb.md +0 -228
  109. package/docs/guides/ecosystem/elysia.md +0 -31
  110. package/docs/guides/ecosystem/express.md +0 -40
  111. package/docs/guides/ecosystem/hono.md +0 -39
  112. package/docs/guides/ecosystem/mongoose.md +0 -87
  113. package/docs/guides/ecosystem/neon-drizzle.md +0 -220
  114. package/docs/guides/ecosystem/neon-serverless-postgres.md +0 -55
  115. package/docs/guides/ecosystem/nextjs.md +0 -49
  116. package/docs/guides/ecosystem/nuxt.md +0 -56
  117. package/docs/guides/ecosystem/pm2.md +0 -57
  118. package/docs/guides/ecosystem/prisma.md +0 -141
  119. package/docs/guides/ecosystem/qwik.md +0 -107
  120. package/docs/guides/ecosystem/react.md +0 -50
  121. package/docs/guides/ecosystem/remix.md +0 -78
  122. package/docs/guides/ecosystem/render.md +0 -79
  123. package/docs/guides/ecosystem/sentry.md +0 -52
  124. package/docs/guides/ecosystem/solidstart.md +0 -58
  125. package/docs/guides/ecosystem/ssr-react.md +0 -51
  126. package/docs/guides/ecosystem/stric.md +0 -55
  127. package/docs/guides/ecosystem/sveltekit.md +0 -125
  128. package/docs/guides/ecosystem/systemd.md +0 -113
  129. package/docs/guides/ecosystem/vite.md +0 -71
  130. package/docs/guides/html-rewriter/extract-links.md +0 -68
  131. package/docs/guides/html-rewriter/extract-social-meta.md +0 -93
  132. package/docs/guides/http/cluster.md +0 -66
  133. package/docs/guides/http/fetch-unix.md +0 -33
  134. package/docs/guides/http/fetch.md +0 -24
  135. package/docs/guides/http/file-uploads.md +0 -94
  136. package/docs/guides/http/hot.md +0 -26
  137. package/docs/guides/http/proxy.md +0 -24
  138. package/docs/guides/http/server.md +0 -46
  139. package/docs/guides/http/simple.md +0 -18
  140. package/docs/guides/http/stream-file.md +0 -48
  141. package/docs/guides/http/stream-iterator.md +0 -47
  142. package/docs/guides/http/stream-node-streams-in-bun.md +0 -20
  143. package/docs/guides/http/tls.md +0 -30
  144. package/docs/guides/install/add-dev.md +0 -26
  145. package/docs/guides/install/add-git.md +0 -36
  146. package/docs/guides/install/add-optional.md +0 -25
  147. package/docs/guides/install/add-peer.md +0 -43
  148. package/docs/guides/install/add-tarball.md +0 -33
  149. package/docs/guides/install/add.md +0 -42
  150. package/docs/guides/install/azure-artifacts.md +0 -73
  151. package/docs/guides/install/cicd.md +0 -41
  152. package/docs/guides/install/custom-registry.md +0 -30
  153. package/docs/guides/install/from-npm-install-to-bun-install.md +0 -214
  154. package/docs/guides/install/git-diff-bun-lockfile.md +0 -44
  155. package/docs/guides/install/jfrog-artifactory.md +0 -28
  156. package/docs/guides/install/npm-alias.md +0 -23
  157. package/docs/guides/install/registry-scope.md +0 -38
  158. package/docs/guides/install/trusted.md +0 -46
  159. package/docs/guides/install/workspaces.md +0 -70
  160. package/docs/guides/install/yarnlock.md +0 -44
  161. package/docs/guides/process/argv.md +0 -58
  162. package/docs/guides/process/ctrl-c.md +0 -16
  163. package/docs/guides/process/ipc.md +0 -66
  164. package/docs/guides/process/nanoseconds.md +0 -13
  165. package/docs/guides/process/os-signals.md +0 -39
  166. package/docs/guides/process/spawn-stderr.md +0 -31
  167. package/docs/guides/process/spawn-stdout.md +0 -26
  168. package/docs/guides/process/spawn.md +0 -41
  169. package/docs/guides/process/stdin.md +0 -54
  170. package/docs/guides/read-file/arraybuffer.md +0 -28
  171. package/docs/guides/read-file/buffer.md +0 -19
  172. package/docs/guides/read-file/exists.md +0 -16
  173. package/docs/guides/read-file/json.md +0 -17
  174. package/docs/guides/read-file/mime.md +0 -20
  175. package/docs/guides/read-file/stream.md +0 -26
  176. package/docs/guides/read-file/string.md +0 -22
  177. package/docs/guides/read-file/uint8array.md +0 -21
  178. package/docs/guides/read-file/watch.md +0 -68
  179. package/docs/guides/runtime/build-time-constants.md +0 -293
  180. package/docs/guides/runtime/cicd.md +0 -43
  181. package/docs/guides/runtime/codesign-macos-executable.md +0 -56
  182. package/docs/guides/runtime/define-constant.md +0 -145
  183. package/docs/guides/runtime/delete-directory.md +0 -37
  184. package/docs/guides/runtime/delete-file.md +0 -19
  185. package/docs/guides/runtime/heap-snapshot.md +0 -26
  186. package/docs/guides/runtime/import-html.md +0 -15
  187. package/docs/guides/runtime/import-json.md +0 -44
  188. package/docs/guides/runtime/import-toml.md +0 -30
  189. package/docs/guides/runtime/import-yaml.md +0 -102
  190. package/docs/guides/runtime/read-env.md +0 -32
  191. package/docs/guides/runtime/set-env.md +0 -47
  192. package/docs/guides/runtime/shell.md +0 -40
  193. package/docs/guides/runtime/timezone.md +0 -35
  194. package/docs/guides/runtime/tsconfig-paths.md +0 -29
  195. package/docs/guides/runtime/typescript.md +0 -49
  196. package/docs/guides/runtime/vscode-debugger.md +0 -47
  197. package/docs/guides/runtime/web-debugger.md +0 -82
  198. package/docs/guides/streams/node-readable-to-arraybuffer.md +0 -11
  199. package/docs/guides/streams/node-readable-to-blob.md +0 -11
  200. package/docs/guides/streams/node-readable-to-json.md +0 -12
  201. package/docs/guides/streams/node-readable-to-string.md +0 -12
  202. package/docs/guides/streams/node-readable-to-uint8array.md +0 -11
  203. package/docs/guides/streams/to-array.md +0 -14
  204. package/docs/guides/streams/to-arraybuffer.md +0 -14
  205. package/docs/guides/streams/to-blob.md +0 -14
  206. package/docs/guides/streams/to-buffer.md +0 -15
  207. package/docs/guides/streams/to-json.md +0 -14
  208. package/docs/guides/streams/to-string.md +0 -14
  209. package/docs/guides/streams/to-typedarray.md +0 -22
  210. package/docs/guides/test/bail.md +0 -22
  211. package/docs/guides/test/coverage-threshold.md +0 -60
  212. package/docs/guides/test/coverage.md +0 -44
  213. package/docs/guides/test/happy-dom.md +0 -68
  214. package/docs/guides/test/migrate-from-jest.md +0 -143
  215. package/docs/guides/test/mock-clock.md +0 -48
  216. package/docs/guides/test/mock-functions.md +0 -68
  217. package/docs/guides/test/rerun-each.md +0 -14
  218. package/docs/guides/test/run-tests.md +0 -111
  219. package/docs/guides/test/skip-tests.md +0 -39
  220. package/docs/guides/test/snapshot.md +0 -95
  221. package/docs/guides/test/spy-on.md +0 -46
  222. package/docs/guides/test/svelte-test.md +0 -120
  223. package/docs/guides/test/testing-library.md +0 -92
  224. package/docs/guides/test/timeout.md +0 -15
  225. package/docs/guides/test/todo-tests.md +0 -67
  226. package/docs/guides/test/update-snapshots.md +0 -46
  227. package/docs/guides/test/watch-mode.md +0 -19
  228. package/docs/guides/util/base64.md +0 -15
  229. package/docs/guides/util/deep-equals.md +0 -39
  230. package/docs/guides/util/deflate.md +0 -18
  231. package/docs/guides/util/detect-bun.md +0 -23
  232. package/docs/guides/util/entrypoint.md +0 -17
  233. package/docs/guides/util/escape-html.md +0 -22
  234. package/docs/guides/util/file-url-to-path.md +0 -14
  235. package/docs/guides/util/gzip.md +0 -18
  236. package/docs/guides/util/hash-a-password.md +0 -54
  237. package/docs/guides/util/import-meta-dir.md +0 -13
  238. package/docs/guides/util/import-meta-file.md +0 -13
  239. package/docs/guides/util/import-meta-path.md +0 -13
  240. package/docs/guides/util/javascript-uuid.md +0 -23
  241. package/docs/guides/util/main.md +0 -32
  242. package/docs/guides/util/path-to-file-url.md +0 -14
  243. package/docs/guides/util/sleep.md +0 -22
  244. package/docs/guides/util/version.md +0 -21
  245. package/docs/guides/util/which-path-to-executable-bin.md +0 -15
  246. package/docs/guides/websocket/compression.md +0 -31
  247. package/docs/guides/websocket/context.md +0 -77
  248. package/docs/guides/websocket/pubsub.md +0 -41
  249. package/docs/guides/websocket/simple.md +0 -33
  250. package/docs/guides/write-file/append.md +0 -52
  251. package/docs/guides/write-file/basic.md +0 -44
  252. package/docs/guides/write-file/blob.md +0 -28
  253. package/docs/guides/write-file/cat.md +0 -17
  254. package/docs/guides/write-file/file-cp.md +0 -16
  255. package/docs/guides/write-file/filesink.md +0 -52
  256. package/docs/guides/write-file/response.md +0 -17
  257. package/docs/guides/write-file/stdout.md +0 -21
  258. package/docs/guides/write-file/stream.md +0 -17
  259. package/docs/guides/write-file/unlink.md +0 -16
  260. package/docs/index.md +0 -77
  261. package/docs/install/audit.md +0 -57
  262. package/docs/install/cache.md +0 -59
  263. package/docs/install/catalogs.md +0 -298
  264. package/docs/install/index.md +0 -248
  265. package/docs/install/isolated.md +0 -197
  266. package/docs/install/lifecycle.md +0 -46
  267. package/docs/install/lockfile.md +0 -58
  268. package/docs/install/npmrc.md +0 -105
  269. package/docs/install/overrides.md +0 -73
  270. package/docs/install/patch.md +0 -59
  271. package/docs/install/registries.md +0 -30
  272. package/docs/install/security-scanner-api.md +0 -81
  273. package/docs/install/workspaces.md +0 -114
  274. package/docs/installation.md +0 -327
  275. package/docs/project/asan.md +0 -124
  276. package/docs/project/benchmarking.md +0 -203
  277. package/docs/project/bindgen.md +0 -225
  278. package/docs/project/building-windows.md +0 -162
  279. package/docs/project/contributing.md +0 -347
  280. package/docs/project/internals/build-process-for-ci.md +0 -75
  281. package/docs/project/licensing.md +0 -73
  282. package/docs/project/roadmap.md +0 -87
  283. package/docs/quickstart.md +0 -157
  284. package/docs/runtime/autoimport.md +0 -94
  285. package/docs/runtime/bun-apis.md +0 -207
  286. package/docs/runtime/bunfig.md +0 -772
  287. package/docs/runtime/debugger.md +0 -325
  288. package/docs/runtime/env.md +0 -253
  289. package/docs/runtime/hot.md +0 -145
  290. package/docs/runtime/index.md +0 -312
  291. package/docs/runtime/jsx.md +0 -385
  292. package/docs/runtime/loaders.md +0 -130
  293. package/docs/runtime/modules.md +0 -320
  294. package/docs/runtime/nodejs-apis.md +0 -463
  295. package/docs/runtime/plugins.md +0 -561
  296. package/docs/runtime/shell.md +0 -605
  297. package/docs/runtime/typescript.md +0 -139
  298. package/docs/runtime/web-apis.md +0 -128
  299. package/docs/test/configuration.md +0 -154
  300. package/docs/test/coverage.md +0 -142
  301. package/docs/test/discovery.md +0 -85
  302. package/docs/test/dom.md +0 -75
  303. package/docs/test/examples/concurrent-test-glob.md +0 -132
  304. package/docs/test/hot.md +0 -15
  305. package/docs/test/lifecycle.md +0 -81
  306. package/docs/test/mocks.md +0 -313
  307. package/docs/test/reporters.md +0 -117
  308. package/docs/test/runtime-behavior.md +0 -95
  309. package/docs/test/snapshots.md +0 -68
  310. package/docs/test/time.md +0 -126
  311. package/docs/test/writing.md +0 -825
  312. package/docs/typescript.md +0 -53
@@ -1,449 +0,0 @@
1
- Bun provides a universal plugin API that can be used to extend both the _runtime_ and _bundler_.
2
-
3
- Plugins intercept imports and perform custom loading logic: reading files, transpiling code, etc. They can be used to add support for additional file types, like `.scss` or `.yaml`. In the context of Bun's bundler, plugins can be used to implement framework-level features like CSS extraction, macros, and client-server code co-location.
4
-
5
- ## Lifecycle hooks
6
-
7
- Plugins can register callbacks to be run at various points in the lifecycle of a bundle:
8
-
9
- - [`onStart()`](#onstart): Run once the bundler has started a bundle
10
- - [`onResolve()`](#onresolve): Run before a module is resolved
11
- - [`onLoad()`](#onload): Run before a module is loaded.
12
- - [`onEnd()`](#onend): Run after the bundle has completed
13
- - [`onBeforeParse()`](#onbeforeparse): Run zero-copy native addons in the parser thread before a file is parsed.
14
-
15
- ### Reference
16
-
17
- A rough overview of the types (please refer to Bun's `bun.d.ts` for the full type definitions):
18
-
19
- ```ts
20
- type PluginBuilder = {
21
- onStart(callback: () => void): void;
22
- onEnd(callback: (result: BuildOutput) => void | Promise<void>): void;
23
- onResolve: (
24
- args: { filter: RegExp; namespace?: string },
25
- callback: (args: { path: string; importer: string }) => {
26
- path: string;
27
- namespace?: string;
28
- } | void,
29
- ) => void;
30
- onLoad: (
31
- args: { filter: RegExp; namespace?: string },
32
- defer: () => Promise<void>,
33
- callback: (args: { path: string }) => {
34
- loader?: Loader;
35
- contents?: string;
36
- exports?: Record<string, any>;
37
- },
38
- ) => void;
39
- config: BuildConfig;
40
- };
41
-
42
- type Loader = "js" | "jsx" | "ts" | "tsx" | "css" | "json" | "toml";
43
- ```
44
-
45
- ## Usage
46
-
47
- A plugin is defined as simple JavaScript object containing a `name` property and a `setup` function.
48
-
49
- ```tsx#myPlugin.ts
50
- import type { BunPlugin } from "bun";
51
-
52
- const myPlugin: BunPlugin = {
53
- name: "Custom loader",
54
- setup(build) {
55
- // implementation
56
- },
57
- };
58
- ```
59
-
60
- This plugin can be passed into the `plugins` array when calling `Bun.build`.
61
-
62
- ```ts
63
- await Bun.build({
64
- entrypoints: ["./app.ts"],
65
- outdir: "./out",
66
- plugins: [myPlugin],
67
- });
68
- ```
69
-
70
- ## Plugin lifecycle
71
-
72
- ### Namespaces
73
-
74
- `onLoad` and `onResolve` accept an optional `namespace` string. What is a namespace?
75
-
76
- Every module has a namespace. Namespaces are used to prefix the import in transpiled code; for instance, a loader with a `filter: /\.yaml$/` and `namespace: "yaml:"` will transform an import from `./myfile.yaml` into `yaml:./myfile.yaml`.
77
-
78
- The default namespace is `"file"` and it is not necessary to specify it, for instance: `import myModule from "./my-module.ts"` is the same as `import myModule from "file:./my-module.ts"`.
79
-
80
- Other common namespaces are:
81
-
82
- - `"bun"`: for Bun-specific modules (e.g. `"bun:test"`, `"bun:sqlite"`)
83
- - `"node"`: for Node.js modules (e.g. `"node:fs"`, `"node:path"`)
84
-
85
- ### `onStart`
86
-
87
- ```ts
88
- onStart(callback: () => void): Promise<void> | void;
89
- ```
90
-
91
- Registers a callback to be run when the bundler starts a new bundle.
92
-
93
- ```ts
94
- import { plugin } from "bun";
95
-
96
- plugin({
97
- name: "onStart example",
98
-
99
- setup(build) {
100
- build.onStart(() => {
101
- console.log("Bundle started!");
102
- });
103
- },
104
- });
105
- ```
106
-
107
- The callback can return a `Promise`. After the bundle process has initialized, the bundler waits until all `onStart()` callbacks have completed before continuing.
108
-
109
- For example:
110
-
111
- ```ts
112
- const result = await Bun.build({
113
- entrypoints: ["./app.ts"],
114
- outdir: "./dist",
115
- sourcemap: "external",
116
- plugins: [
117
- {
118
- name: "Sleep for 10 seconds",
119
- setup(build) {
120
- build.onStart(async () => {
121
- await Bunlog.sleep(10_000);
122
- });
123
- },
124
- },
125
- {
126
- name: "Log bundle time to a file",
127
- setup(build) {
128
- build.onStart(async () => {
129
- const now = Date.now();
130
- await Bun.$`echo ${now} > bundle-time.txt`;
131
- });
132
- },
133
- },
134
- ],
135
- });
136
- ```
137
-
138
- In the above example, Bun will wait until the first `onStart()` (sleeping for 10 seconds) has completed, _as well as_ the second `onStart()` (writing the bundle time to a file).
139
-
140
- Note that `onStart()` callbacks (like every other lifecycle callback) do not have the ability to modify the `build.config` object. If you want to mutate `build.config`, you must do so directly in the `setup()` function.
141
-
142
- ### `onResolve`
143
-
144
- ```ts
145
- onResolve(
146
- args: { filter: RegExp; namespace?: string },
147
- callback: (args: { path: string; importer: string }) => {
148
- path: string;
149
- namespace?: string;
150
- } | void,
151
- ): void;
152
- ```
153
-
154
- To bundle your project, Bun walks down the dependency tree of all modules in your project. For each imported module, Bun actually has to find and read that module. The "finding" part is known as "resolving" a module.
155
-
156
- The `onResolve()` plugin lifecycle callback allows you to configure how a module is resolved.
157
-
158
- The first argument to `onResolve()` is an object with a `filter` and [`namespace`](#what-is-a-namespace) property. The filter is a regular expression which is run on the import string. Effectively, these allow you to filter which modules your custom resolution logic will apply to.
159
-
160
- The second argument to `onResolve()` is a callback which is run for each module import Bun finds that matches the `filter` and `namespace` defined in the first argument.
161
-
162
- The callback receives as input the _path_ to the matching module. The callback can return a _new path_ for the module. Bun will read the contents of the _new path_ and parse it as a module.
163
-
164
- For example, redirecting all imports to `images/` to `./public/images/`:
165
-
166
- ```ts
167
- import { plugin } from "bun";
168
-
169
- plugin({
170
- name: "onResolve example",
171
- setup(build) {
172
- build.onResolve({ filter: /.*/, namespace: "file" }, args => {
173
- if (args.path.startsWith("images/")) {
174
- return {
175
- path: args.path.replace("images/", "./public/images/"),
176
- };
177
- }
178
- });
179
- },
180
- });
181
- ```
182
-
183
- ### `onLoad`
184
-
185
- ```ts
186
- onLoad(
187
- args: { filter: RegExp; namespace?: string },
188
- defer: () => Promise<void>,
189
- callback: (args: { path: string, importer: string, namespace: string, kind: ImportKind }) => {
190
- loader?: Loader;
191
- contents?: string;
192
- exports?: Record<string, any>;
193
- },
194
- ): void;
195
- ```
196
-
197
- After Bun's bundler has resolved a module, it needs to read the contents of the module and parse it.
198
-
199
- The `onLoad()` plugin lifecycle callback allows you to modify the _contents_ of a module before it is read and parsed by Bun.
200
-
201
- Like `onResolve()`, the first argument to `onLoad()` allows you to filter which modules this invocation of `onLoad()` will apply to.
202
-
203
- The second argument to `onLoad()` is a callback which is run for each matching module _before_ Bun loads the contents of the module into memory.
204
-
205
- This callback receives as input the _path_ to the matching module, the _importer_ of the module (the module that imported the module), the _namespace_ of the module, and the _kind_ of the module.
206
-
207
- The callback can return a new `contents` string for the module as well as a new `loader`.
208
-
209
- For example:
210
-
211
- ```ts
212
- import { plugin } from "bun";
213
-
214
- const envPlugin: BunPlugin = {
215
- name: "env plugin",
216
- setup(build) {
217
- build.onLoad({ filter: /env/, namespace: "file" }, args => {
218
- return {
219
- contents: `export default ${JSON.stringify(process.env)}`,
220
- loader: "js",
221
- };
222
- });
223
- },
224
- });
225
-
226
- Bun.build({
227
- entrypoints: ["./app.ts"],
228
- outdir: "./dist",
229
- plugins: [envPlugin],
230
- });
231
-
232
- // import env from "env"
233
- // env.FOO === "bar"
234
- ```
235
-
236
- This plugin will transform all imports of the form `import env from "env"` into a JavaScript module that exports the current environment variables.
237
-
238
- #### `.defer()`
239
-
240
- One of the arguments passed to the `onLoad` callback is a `defer` function. This function returns a `Promise` that is resolved when all _other_ modules have been loaded.
241
-
242
- This allows you to delay execution of the `onLoad` callback until all other modules have been loaded.
243
-
244
- This is useful for returning contents of a module that depends on other modules.
245
-
246
- ##### Example: tracking and reporting unused exports
247
-
248
- ```ts
249
- import { plugin } from "bun";
250
-
251
- plugin({
252
- name: "track imports",
253
- setup(build) {
254
- const transpiler = new Bun.Transpiler();
255
-
256
- let trackedImports: Record<string, number> = {};
257
-
258
- // Each module that goes through this onLoad callback
259
- // will record its imports in `trackedImports`
260
- build.onLoad({ filter: /\.ts/ }, async ({ path }) => {
261
- const contents = await Bun.file(path).arrayBuffer();
262
-
263
- const imports = transpiler.scanImports(contents);
264
-
265
- for (const i of imports) {
266
- trackedImports[i.path] = (trackedImports[i.path] || 0) + 1;
267
- }
268
-
269
- return undefined;
270
- });
271
-
272
- build.onLoad({ filter: /stats\.json/ }, async ({ defer }) => {
273
- // Wait for all files to be loaded, ensuring
274
- // that every file goes through the above `onLoad()` function
275
- // and their imports tracked
276
- await defer();
277
-
278
- // Emit JSON containing the stats of each import
279
- return {
280
- contents: `export default ${JSON.stringify(trackedImports)}`,
281
- loader: "json",
282
- };
283
- });
284
- },
285
- });
286
- ```
287
-
288
- Note that the `.defer()` function currently has the limitation that it can only be called once per `onLoad` callback.
289
-
290
- ### `onEnd`
291
-
292
- ```ts
293
- onEnd(callback: (result: BuildOutput) => void | Promise<void>): void;
294
- ```
295
-
296
- Registers a callback to be run when the bundler completes a bundle (whether successful or not).
297
-
298
- The callback receives the `BuildOutput` object containing:
299
-
300
- - `success`: boolean indicating if the build succeeded
301
- - `outputs`: array of generated build artifacts
302
- - `logs`: array of build messages (warnings, errors, etc.)
303
-
304
- This is useful for post-processing, cleanup, notifications, or custom error handling.
305
-
306
- ```ts
307
- await Bun.build({
308
- entrypoints: ["./index.ts"],
309
- outdir: "./out",
310
- plugins: [
311
- {
312
- name: "onEnd example",
313
- setup(build) {
314
- build.onEnd(result => {
315
- if (result.success) {
316
- console.log(
317
- `✅ Build succeeded with ${result.outputs.length} outputs`,
318
- );
319
- } else {
320
- console.error(`❌ Build failed with ${result.logs.length} errors`);
321
- }
322
- });
323
- },
324
- },
325
- ],
326
- });
327
- ```
328
-
329
- The `onEnd` callbacks are called:
330
-
331
- - **Before** the build promise resolves or rejects
332
- - **After** all bundling is complete
333
- - **In the order** they were registered
334
-
335
- Multiple plugins can register `onEnd` callbacks, and they will all be called sequentially. If an `onEnd` callback returns a promise, the build will wait for it to resolve before continuing.
336
-
337
- ## Native plugins
338
-
339
- One of the reasons why Bun's bundler is so fast is that it is written in native code and leverages multi-threading to load and parse modules in parallel.
340
-
341
- However, one limitation of plugins written in JavaScript is that JavaScript itself is single-threaded.
342
-
343
- Native plugins are written as [NAPI](https://bun.com/docs/api/node-api) modules and can be run on multiple threads. This allows native plugins to run much faster than JavaScript plugins.
344
-
345
- In addition, native plugins can skip unnecessary work such as the UTF-8 -> UTF-16 conversion needed to pass strings to JavaScript.
346
-
347
- These are the following lifecycle hooks which are available to native plugins:
348
-
349
- - [`onBeforeParse()`](#onbeforeparse): Called on any thread before a file is parsed by Bun's bundler.
350
-
351
- Native plugins are NAPI modules which expose lifecycle hooks as C ABI functions.
352
-
353
- To create a native plugin, you must export a C ABI function which matches the signature of the native lifecycle hook you want to implement.
354
-
355
- ### Creating a native plugin in Rust
356
-
357
- Native plugins are NAPI modules which expose lifecycle hooks as C ABI functions.
358
-
359
- To create a native plugin, you must export a C ABI function which matches the signature of the native lifecycle hook you want to implement.
360
-
361
- ```bash
362
- bun add -g @napi-rs/cli
363
- napi new
364
- ```
365
-
366
- Then install this crate:
367
-
368
- ```bash
369
- cargo add bun-native-plugin
370
- ```
371
-
372
- Now, inside the `lib.rs` file, we'll use the `bun_native_plugin::bun` proc macro to define a function which
373
- will implement our native plugin.
374
-
375
- Here's an example implementing the `onBeforeParse` hook:
376
-
377
- ```rs
378
- use bun_native_plugin::{define_bun_plugin, OnBeforeParse, bun, Result, anyhow, BunLoader};
379
- use napi_derive::napi;
380
-
381
- /// Define the plugin and its name
382
- define_bun_plugin!("replace-foo-with-bar");
383
-
384
- /// Here we'll implement `onBeforeParse` with code that replaces all occurrences of
385
- /// `foo` with `bar`.
386
- ///
387
- /// We use the #[bun] macro to generate some of the boilerplate code.
388
- ///
389
- /// The argument of the function (`handle: &mut OnBeforeParse`) tells
390
- /// the macro that this function implements the `onBeforeParse` hook.
391
- #[bun]
392
- pub fn replace_foo_with_bar(handle: &mut OnBeforeParse) -> Result<()> {
393
- // Fetch the input source code.
394
- let input_source_code = handle.input_source_code()?;
395
-
396
- // Get the Loader for the file
397
- let loader = handle.output_loader();
398
-
399
-
400
- let output_source_code = input_source_code.replace("foo", "bar");
401
-
402
- handle.set_output_source_code(output_source_code, BunLoader::BUN_LOADER_JSX);
403
-
404
- Ok(())
405
- }
406
- ```
407
-
408
- And to use it in Bun.build():
409
-
410
- ```typescript
411
- import myNativeAddon from "./my-native-addon";
412
- Bun.build({
413
- entrypoints: ["./app.tsx"],
414
- plugins: [
415
- {
416
- name: "my-plugin",
417
-
418
- setup(build) {
419
- build.onBeforeParse(
420
- {
421
- namespace: "file",
422
- filter: "**/*.tsx",
423
- },
424
- {
425
- napiModule: myNativeAddon,
426
- symbol: "replace_foo_with_bar",
427
- // external: myNativeAddon.getSharedState()
428
- },
429
- );
430
- },
431
- },
432
- ],
433
- });
434
- ```
435
-
436
- ### `onBeforeParse`
437
-
438
- ```ts
439
- onBeforeParse(
440
- args: { filter: RegExp; namespace?: string },
441
- callback: { napiModule: NapiModule; symbol: string; external?: unknown },
442
- ): void;
443
- ```
444
-
445
- This lifecycle callback is run immediately before a file is parsed by Bun's bundler.
446
-
447
- As input, it receives the file's contents and can optionally return new source code.
448
-
449
- This callback can be called from any thread and so the napi module implementation must be thread-safe.