bun-types 1.3.2-canary.20251105T140650 → 1.3.2
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/bun.d.ts +102 -6
- package/docs/README.md +28 -0
- package/docs/bundler/bytecode.mdx +465 -0
- package/docs/bundler/{css.md → css.mdx} +97 -101
- package/docs/bundler/esbuild.mdx +253 -0
- package/docs/bundler/{executables.md → executables.mdx} +130 -221
- package/docs/bundler/fullstack.mdx +1064 -0
- package/docs/bundler/{hmr.md → hot-reloading.mdx} +74 -79
- package/docs/bundler/{html.md → html-static.mdx} +148 -111
- package/docs/bundler/index.mdx +1499 -0
- package/docs/bundler/loaders.mdx +356 -0
- package/docs/bundler/{macros.md → macros.mdx} +83 -84
- package/docs/bundler/minifier.mdx +1306 -0
- package/docs/bundler/plugins.mdx +411 -0
- package/docs/feedback.mdx +85 -0
- package/docs/guides/binary/{arraybuffer-to-array.md → arraybuffer-to-array.mdx} +3 -1
- package/docs/guides/binary/{arraybuffer-to-blob.md → arraybuffer-to-blob.mdx} +3 -1
- package/docs/guides/binary/{arraybuffer-to-buffer.md → arraybuffer-to-buffer.mdx} +3 -1
- package/docs/guides/binary/{arraybuffer-to-string.md → arraybuffer-to-string.mdx} +3 -1
- package/docs/guides/binary/{arraybuffer-to-typedarray.md → arraybuffer-to-typedarray.mdx} +3 -1
- package/docs/guides/binary/{blob-to-arraybuffer.md → blob-to-arraybuffer.mdx} +3 -1
- package/docs/guides/binary/{blob-to-dataview.md → blob-to-dataview.mdx} +3 -1
- package/docs/guides/binary/{blob-to-stream.md → blob-to-stream.mdx} +3 -1
- package/docs/guides/binary/{blob-to-string.md → blob-to-string.mdx} +3 -1
- package/docs/guides/binary/{blob-to-typedarray.md → blob-to-typedarray.mdx} +3 -1
- package/docs/guides/binary/{buffer-to-arraybuffer.md → buffer-to-arraybuffer.mdx} +3 -1
- package/docs/guides/binary/{buffer-to-blob.md → buffer-to-blob.mdx} +3 -1
- package/docs/guides/binary/{buffer-to-readablestream.md → buffer-to-readablestream.mdx} +3 -1
- package/docs/guides/binary/{buffer-to-string.md → buffer-to-string.mdx} +3 -1
- package/docs/guides/binary/{buffer-to-typedarray.md → buffer-to-typedarray.mdx} +3 -1
- package/docs/guides/binary/{dataview-to-string.md → dataview-to-string.mdx} +3 -1
- package/docs/guides/binary/{typedarray-to-arraybuffer.md → typedarray-to-arraybuffer.mdx} +3 -1
- package/docs/guides/binary/{typedarray-to-blob.md → typedarray-to-blob.mdx} +3 -1
- package/docs/guides/binary/{typedarray-to-buffer.md → typedarray-to-buffer.mdx} +3 -1
- package/docs/guides/binary/{typedarray-to-dataview.md → typedarray-to-dataview.mdx} +3 -1
- package/docs/guides/binary/{typedarray-to-readablestream.md → typedarray-to-readablestream.mdx} +3 -1
- package/docs/guides/binary/{typedarray-to-string.md → typedarray-to-string.mdx} +3 -1
- package/docs/guides/deployment/aws-lambda.mdx +204 -0
- package/docs/guides/deployment/digital-ocean.mdx +161 -0
- package/docs/guides/deployment/google-cloud-run.mdx +197 -0
- package/docs/guides/deployment/{railway.md → railway.mdx} +42 -54
- package/docs/guides/deployment/render.mdx +82 -0
- package/docs/guides/deployment/vercel.mdx +99 -0
- package/docs/guides/ecosystem/{astro.md → astro.mdx} +16 -6
- package/docs/guides/ecosystem/{discordjs.md → discordjs.mdx} +21 -18
- package/docs/guides/ecosystem/{docker.md → docker.mdx} +25 -14
- package/docs/guides/ecosystem/{drizzle.md → drizzle.mdx} +32 -22
- package/docs/guides/ecosystem/{edgedb.md → edgedb.mdx} +63 -34
- package/docs/guides/ecosystem/{elysia.md → elysia.mdx} +11 -11
- package/docs/guides/ecosystem/{express.md → express.mdx} +12 -9
- package/docs/guides/ecosystem/{hono.md → hono.mdx} +16 -8
- package/docs/guides/ecosystem/{mongoose.md → mongoose.mdx} +26 -21
- package/docs/guides/ecosystem/{neon-drizzle.md → neon-drizzle.mdx} +49 -35
- package/docs/guides/ecosystem/{neon-serverless-postgres.md → neon-serverless-postgres.mdx} +16 -11
- package/docs/guides/ecosystem/{nextjs.md → nextjs.mdx} +18 -10
- package/docs/guides/ecosystem/{nuxt.md → nuxt.mdx} +45 -11
- package/docs/guides/ecosystem/{pm2.md → pm2.mdx} +7 -9
- package/docs/guides/ecosystem/prisma-postgres.mdx +169 -0
- package/docs/guides/ecosystem/prisma.mdx +164 -0
- package/docs/guides/ecosystem/{qwik.md → qwik.mdx} +18 -11
- package/docs/guides/ecosystem/{react.md → react.mdx} +9 -7
- package/docs/guides/ecosystem/{remix.md → remix.mdx} +45 -26
- package/docs/guides/ecosystem/{sentry.md → sentry.mdx} +7 -5
- package/docs/guides/ecosystem/{solidstart.md → solidstart.mdx} +21 -13
- package/docs/guides/ecosystem/{ssr-react.md → ssr-react.mdx} +9 -11
- package/docs/guides/ecosystem/{stric.md → stric.mdx} +16 -17
- package/docs/guides/ecosystem/{sveltekit.md → sveltekit.mdx} +42 -29
- package/docs/guides/ecosystem/{systemd.md → systemd.mdx} +27 -26
- package/docs/guides/ecosystem/upstash.mdx +87 -0
- package/docs/guides/ecosystem/{vite.md → vite.mdx} +20 -14
- package/docs/guides/html-rewriter/{extract-links.md → extract-links.mdx} +11 -7
- package/docs/guides/html-rewriter/{extract-social-meta.md → extract-social-meta.mdx} +6 -2
- package/docs/guides/http/{cluster.md → cluster.mdx} +10 -7
- package/docs/guides/http/{fetch-unix.md → fetch-unix.mdx} +5 -3
- package/docs/guides/http/{fetch.md → fetch.mdx} +5 -3
- package/docs/guides/http/{file-uploads.md → file-uploads.mdx} +18 -15
- package/docs/guides/http/{hot.md → hot.mdx} +9 -7
- package/docs/guides/http/{proxy.md → proxy.mdx} +7 -5
- package/docs/guides/http/{server.md → server.mdx} +4 -2
- package/docs/guides/http/{simple.md → simple.mdx} +4 -2
- package/docs/guides/http/{stream-file.md → stream-file.mdx} +6 -4
- package/docs/guides/http/{stream-iterator.md → stream-iterator.mdx} +5 -3
- package/docs/guides/http/{stream-node-streams-in-bun.md → stream-node-streams-in-bun.mdx} +4 -2
- package/docs/guides/http/{tls.md → tls.mdx} +5 -3
- package/docs/guides/index.mdx +10 -0
- package/docs/guides/install/{add-dev.md → add-dev.mdx} +8 -6
- package/docs/guides/install/add-git.mdx +38 -0
- package/docs/guides/install/{add-optional.md → add-optional.mdx} +7 -5
- package/docs/guides/install/{add-peer.md → add-peer.mdx} +13 -11
- package/docs/guides/install/{add-tarball.md → add-tarball.mdx} +7 -5
- package/docs/guides/install/{add.md → add.mdx} +12 -10
- package/docs/guides/install/{azure-artifacts.md → azure-artifacts.mdx} +15 -12
- package/docs/guides/{runtime/cicd.md → install/cicd.mdx} +13 -13
- package/docs/guides/install/{custom-registry.md → custom-registry.mdx} +6 -4
- package/docs/guides/install/{from-npm-install-to-bun-install.md → from-npm-install-to-bun-install.mdx} +50 -34
- package/docs/guides/install/{git-diff-bun-lockfile.md → git-diff-bun-lockfile.mdx} +14 -11
- package/docs/guides/install/{jfrog-artifactory.md → jfrog-artifactory.mdx} +4 -4
- package/docs/guides/install/{npm-alias.md → npm-alias.mdx} +6 -4
- package/docs/guides/install/{registry-scope.md → registry-scope.mdx} +6 -4
- package/docs/guides/install/{trusted.md → trusted.mdx} +22 -18
- package/docs/guides/install/{workspaces.md → workspaces.mdx} +13 -13
- package/docs/guides/install/{yarnlock.md → yarnlock.mdx} +15 -9
- package/docs/guides/process/{argv.md → argv.mdx} +17 -9
- package/docs/guides/process/{ctrl-c.md → ctrl-c.mdx} +4 -2
- package/docs/guides/process/{ipc.md → ipc.mdx} +13 -10
- package/docs/guides/process/{nanoseconds.md → nanoseconds.mdx} +3 -1
- package/docs/guides/process/{os-signals.md → os-signals.mdx} +3 -1
- package/docs/guides/process/{spawn-stderr.md → spawn-stderr.mdx} +4 -1
- package/docs/guides/process/{spawn-stdout.md → spawn-stdout.mdx} +3 -1
- package/docs/guides/process/{spawn.md → spawn.mdx} +3 -1
- package/docs/guides/process/{stdin.md → stdin.mdx} +15 -7
- package/docs/guides/read-file/{arraybuffer.md → arraybuffer.mdx} +5 -3
- package/docs/guides/read-file/{buffer.md → buffer.mdx} +4 -2
- package/docs/guides/read-file/{exists.md → exists.mdx} +4 -2
- package/docs/guides/read-file/{json.md → json.mdx} +4 -2
- package/docs/guides/read-file/{mime.md → mime.mdx} +3 -1
- package/docs/guides/read-file/{stream.md → stream.mdx} +3 -1
- package/docs/guides/read-file/{string.md → string.mdx} +3 -1
- package/docs/guides/read-file/{uint8array.md → uint8array.mdx} +3 -1
- package/docs/guides/read-file/{watch.md → watch.mdx} +6 -8
- package/docs/guides/runtime/{build-time-constants.md → build-time-constants.mdx} +24 -22
- package/docs/guides/{install/cicd.md → runtime/cicd.mdx} +11 -7
- package/docs/guides/runtime/{codesign-macos-executable.md → codesign-macos-executable.mdx} +14 -9
- package/docs/guides/runtime/{define-constant.md → define-constant.mdx} +20 -16
- package/docs/guides/runtime/{delete-directory.md → delete-directory.mdx} +5 -3
- package/docs/guides/runtime/{delete-file.md → delete-file.mdx} +4 -2
- package/docs/guides/runtime/{heap-snapshot.md → heap-snapshot.mdx} +5 -3
- package/docs/guides/runtime/{import-html.md → import-html.mdx} +4 -2
- package/docs/guides/runtime/{import-json.md → import-json.mdx} +6 -4
- package/docs/guides/runtime/{import-toml.md → import-toml.mdx} +5 -3
- package/docs/guides/runtime/{import-yaml.md → import-yaml.mdx} +9 -7
- package/docs/guides/runtime/{read-env.md → read-env.mdx} +10 -5
- package/docs/guides/runtime/{set-env.md → set-env.mdx} +14 -10
- package/docs/guides/runtime/{shell.md → shell.mdx} +6 -4
- package/docs/guides/runtime/{timezone.md → timezone.mdx} +10 -7
- package/docs/guides/runtime/{tsconfig-paths.md → tsconfig-paths.mdx} +5 -3
- package/docs/guides/runtime/{typescript.md → typescript.mdx} +8 -6
- package/docs/guides/runtime/{vscode-debugger.md → vscode-debugger.mdx} +12 -11
- package/docs/guides/runtime/{web-debugger.md → web-debugger.mdx} +39 -18
- package/docs/guides/streams/{node-readable-to-arraybuffer.md → node-readable-to-arraybuffer.mdx} +3 -1
- package/docs/guides/streams/{node-readable-to-blob.md → node-readable-to-blob.mdx} +3 -1
- package/docs/guides/streams/{node-readable-to-json.md → node-readable-to-json.mdx} +3 -1
- package/docs/guides/streams/{node-readable-to-string.md → node-readable-to-string.mdx} +3 -1
- package/docs/guides/streams/{node-readable-to-uint8array.md → node-readable-to-uint8array.mdx} +3 -1
- package/docs/guides/streams/{to-array.md → to-array.mdx} +3 -1
- package/docs/guides/streams/{to-arraybuffer.md → to-arraybuffer.mdx} +3 -1
- package/docs/guides/streams/{to-blob.md → to-blob.mdx} +3 -1
- package/docs/guides/streams/{to-buffer.md → to-buffer.mdx} +3 -1
- package/docs/guides/streams/{to-json.md → to-json.mdx} +4 -2
- package/docs/guides/streams/{to-string.md → to-string.mdx} +3 -1
- package/docs/guides/streams/{to-typedarray.md → to-typedarray.mdx} +3 -1
- package/docs/guides/test/{bail.md → bail.mdx} +7 -5
- package/docs/guides/test/{coverage-threshold.md → coverage-threshold.mdx} +14 -7
- package/docs/guides/test/{coverage.md → coverage.mdx} +9 -4
- package/docs/guides/test/{happy-dom.md → happy-dom.mdx} +13 -8
- package/docs/guides/test/{migrate-from-jest.md → migrate-from-jest.mdx} +19 -37
- package/docs/guides/test/{mock-clock.md → mock-clock.mdx} +3 -1
- package/docs/guides/test/{mock-functions.md → mock-functions.mdx} +7 -5
- package/docs/guides/test/{rerun-each.md → rerun-each.mdx} +5 -3
- package/docs/guides/test/{run-tests.md → run-tests.mdx} +16 -11
- package/docs/guides/test/{skip-tests.md → skip-tests.mdx} +8 -4
- package/docs/guides/test/{snapshot.md → snapshot.mdx} +20 -13
- package/docs/guides/test/spy-on.mdx +49 -0
- package/docs/guides/test/{svelte-test.md → svelte-test.mdx} +16 -23
- package/docs/guides/test/{testing-library.md → testing-library.mdx} +18 -17
- package/docs/guides/test/{timeout.md → timeout.mdx} +5 -3
- package/docs/guides/test/{todo-tests.md → todo-tests.mdx} +13 -6
- package/docs/guides/test/{update-snapshots.md → update-snapshots.mdx} +9 -6
- package/docs/guides/test/{watch-mode.md → watch-mode.mdx} +9 -4
- package/docs/guides/util/{base64.md → base64.mdx} +3 -1
- package/docs/guides/util/{deep-equals.md → deep-equals.mdx} +5 -3
- package/docs/guides/util/{deflate.md → deflate.mdx} +3 -1
- package/docs/guides/util/{detect-bun.md → detect-bun.mdx} +3 -1
- package/docs/guides/util/{entrypoint.md → entrypoint.mdx} +4 -2
- package/docs/guides/util/{escape-html.md → escape-html.mdx} +3 -1
- package/docs/guides/util/{file-url-to-path.md → file-url-to-path.mdx} +3 -1
- package/docs/guides/util/{gzip.md → gzip.mdx} +3 -1
- package/docs/guides/util/{hash-a-password.md → hash-a-password.mdx} +3 -1
- package/docs/guides/util/{import-meta-dir.md → import-meta-dir.mdx} +4 -2
- package/docs/guides/util/{import-meta-file.md → import-meta-file.mdx} +4 -2
- package/docs/guides/util/{import-meta-path.md → import-meta-path.mdx} +4 -2
- package/docs/guides/util/{javascript-uuid.md → javascript-uuid.mdx} +3 -1
- package/docs/guides/util/{main.md → main.mdx} +19 -8
- package/docs/guides/util/{path-to-file-url.md → path-to-file-url.mdx} +3 -1
- package/docs/guides/util/{sleep.md → sleep.mdx} +3 -1
- package/docs/guides/util/{version.md → version.mdx} +6 -4
- package/docs/guides/util/{which-path-to-executable-bin.md → which-path-to-executable-bin.mdx} +4 -2
- package/docs/guides/websocket/{compression.md → compression.mdx} +5 -3
- package/docs/guides/websocket/{context.md → context.mdx} +9 -12
- package/docs/guides/websocket/{pubsub.md → pubsub.mdx} +5 -6
- package/docs/guides/websocket/{simple.md → simple.mdx} +5 -3
- package/docs/guides/write-file/{append.md → append.mdx} +3 -1
- package/docs/guides/write-file/{basic.md → basic.mdx} +3 -1
- package/docs/guides/write-file/{blob.md → blob.mdx} +3 -1
- package/docs/guides/write-file/{cat.md → cat.mdx} +4 -2
- package/docs/guides/write-file/{file-cp.md → file-cp.mdx} +3 -1
- package/docs/guides/write-file/{filesink.md → filesink.mdx} +3 -1
- package/docs/guides/write-file/{response.md → response.mdx} +3 -1
- package/docs/guides/write-file/{stdout.md → stdout.mdx} +3 -1
- package/docs/guides/write-file/{stream.md → stream.mdx} +3 -1
- package/docs/guides/write-file/{unlink.md → unlink.mdx} +3 -1
- package/docs/{index.md → index.mdx} +97 -41
- package/docs/installation.mdx +365 -0
- package/docs/{cli/bunx.md → pm/bunx.mdx} +25 -31
- package/docs/{install/catalogs.md → pm/catalogs.mdx} +18 -24
- package/docs/{cli/add.md → pm/cli/add.mdx} +61 -55
- package/docs/{install/audit.md → pm/cli/audit.mdx} +11 -8
- package/docs/{cli/install.md → pm/cli/install.mdx} +208 -81
- package/docs/{cli/link.md → pm/cli/link.mdx} +27 -19
- package/docs/{cli/outdated.md → pm/cli/outdated.mdx} +119 -12
- package/docs/{install/patch.md → pm/cli/patch.mdx} +25 -15
- package/docs/{cli/pm.md → pm/cli/pm.mdx} +96 -62
- package/docs/{cli/publish.md → pm/cli/publish.mdx} +38 -35
- package/docs/pm/cli/remove.mdx +16 -0
- package/docs/{cli/update.md → pm/cli/update.mdx} +26 -15
- package/docs/{cli/why.md → pm/cli/why.mdx} +27 -10
- package/docs/{cli/filter.md → pm/filter.mdx} +26 -14
- package/docs/{install/cache.md → pm/global-cache.mdx} +25 -12
- package/docs/{install/isolated.md → pm/isolated-installs.mdx} +32 -24
- package/docs/{install/lifecycle.md → pm/lifecycle.mdx} +20 -9
- package/docs/{install/lockfile.md → pm/lockfile.mdx} +18 -12
- package/docs/{install/npmrc.md → pm/npmrc.mdx} +30 -24
- package/docs/{install/overrides.md → pm/overrides.mdx} +47 -37
- package/docs/{install/registries.md → pm/scopes-registries.mdx} +8 -3
- package/docs/{install/security-scanner-api.md → pm/security-scanner-api.mdx} +22 -8
- package/docs/{install/workspaces.md → pm/workspaces.mdx} +17 -22
- package/docs/project/{benchmarking.md → benchmarking.mdx} +26 -11
- package/docs/project/{bindgen.md → bindgen.mdx} +12 -14
- package/docs/project/{building-windows.md → building-windows.mdx} +18 -47
- package/docs/project/{contributing.md → contributing.mdx} +56 -60
- package/docs/project/feedback.mdx +20 -0
- package/docs/project/license.mdx +78 -0
- package/docs/project/roadmap.mdx +8 -0
- package/docs/quickstart.mdx +240 -0
- package/docs/runtime/{autoimport.md → auto-install.mdx} +34 -31
- package/docs/{api/binary-data.md → runtime/binary-data.mdx} +77 -269
- package/docs/runtime/bun-apis.mdx +59 -0
- package/docs/runtime/{bunfig.md → bunfig.mdx} +95 -225
- package/docs/{api/cc.md → runtime/c-compiler.mdx} +16 -9
- package/docs/{api/spawn.md → runtime/child-process.mdx} +69 -119
- package/docs/{api/color.md → runtime/color.mdx} +6 -1
- package/docs/{api/console.md → runtime/console.mdx} +17 -7
- package/docs/{api/cookie.md → runtime/cookies.mdx} +24 -19
- package/docs/runtime/{debugger.md → debugger.mdx} +61 -51
- package/docs/runtime/environment-variables.mdx +214 -0
- package/docs/{api/ffi.md → runtime/ffi.mdx} +53 -45
- package/docs/{api/file-io.md → runtime/file-io.mdx} +41 -101
- package/docs/{api/file-system-router.md → runtime/file-system-router.mdx} +8 -2
- package/docs/{bundler/loaders.md → runtime/file-types.mdx} +56 -112
- package/docs/{api/glob.md → runtime/glob.mdx} +4 -1
- package/docs/runtime/globals.mdx +72 -0
- package/docs/{api/hashing.md → runtime/hashing.mdx} +18 -22
- package/docs/{api/html-rewriter.md → runtime/html-rewriter.mdx} +36 -30
- package/docs/runtime/http/cookies.mdx +79 -0
- package/docs/runtime/http/error-handling.mdx +40 -0
- package/docs/runtime/http/metrics.mdx +36 -0
- package/docs/runtime/http/routing.mdx +289 -0
- package/docs/runtime/http/server.mdx +647 -0
- package/docs/runtime/http/tls.mdx +101 -0
- package/docs/{api/websockets.md → runtime/http/websockets.mdx} +62 -231
- package/docs/{cli/run.md → runtime/index.mdx} +70 -108
- package/docs/runtime/jsx.mdx +115 -0
- package/docs/runtime/{modules.md → module-resolution.mdx} +83 -61
- package/docs/{api/dns.md → runtime/networking/dns.mdx} +23 -22
- package/docs/{api/fetch.md → runtime/networking/fetch.mdx} +10 -5
- package/docs/{api/tcp.md → runtime/networking/tcp.mdx} +59 -41
- package/docs/{api/udp.md → runtime/networking/udp.mdx} +14 -8
- package/docs/{api/node-api.md → runtime/node-api.mdx} +5 -0
- package/docs/runtime/{nodejs-apis.md → nodejs-compat.mdx} +9 -4
- package/docs/{bundler/plugins.md → runtime/plugins.mdx} +17 -61
- package/docs/{api/redis.md → runtime/redis.mdx} +65 -80
- package/docs/{api/s3.md → runtime/s3.mdx} +79 -66
- package/docs/{api/secrets.md → runtime/secrets.mdx} +27 -10
- package/docs/{api/semver.md → runtime/semver.mdx} +9 -4
- package/docs/runtime/{shell.md → shell.mdx} +52 -20
- package/docs/{api/sql.md → runtime/sql.mdx} +129 -99
- package/docs/{api/sqlite.md → runtime/sqlite.mdx} +162 -157
- package/docs/{api/streams.md → runtime/streams.mdx} +33 -31
- package/docs/{cli/bun-create.md → runtime/templating/create.mdx} +74 -143
- package/docs/{cli/init.md → runtime/templating/init.mdx} +24 -51
- package/docs/{api/transpiler.md → runtime/transpiler.mdx} +50 -38
- package/docs/{typescript.md → runtime/typescript.mdx} +7 -2
- package/docs/{api/utils.md → runtime/utils.mdx} +81 -50
- package/docs/runtime/{hot.md → watch-mode.mdx} +53 -37
- package/docs/runtime/web-apis.mdx +29 -0
- package/docs/{api/workers.md → runtime/workers.mdx} +28 -22
- package/docs/{api/yaml.md → runtime/yaml.mdx} +33 -232
- package/docs/snippets/cli/add.mdx +166 -0
- package/docs/snippets/cli/build.mdx +196 -0
- package/docs/snippets/cli/feedback.mdx +17 -0
- package/docs/snippets/cli/init.mdx +84 -0
- package/docs/snippets/cli/install.mdx +173 -0
- package/docs/snippets/cli/link.mdx +163 -0
- package/docs/snippets/cli/outdated.mdx +140 -0
- package/docs/snippets/cli/patch.mdx +171 -0
- package/docs/snippets/cli/publish.mdx +198 -0
- package/docs/snippets/cli/remove.mdx +146 -0
- package/docs/snippets/cli/run.mdx +293 -0
- package/docs/snippets/cli/test.mdx +100 -0
- package/docs/snippets/cli/update.mdx +144 -0
- package/docs/snippets/product-card.mdx +32 -0
- package/docs/snippets/product-tiles.mdx +94 -0
- package/docs/test/code-coverage.mdx +409 -0
- package/docs/test/configuration.mdx +467 -0
- package/docs/test/{time.md → dates-times.mdx} +23 -20
- package/docs/test/{discovery.md → discovery.mdx} +15 -10
- package/docs/test/dom.mdx +226 -0
- package/docs/{cli/test.md → test/index.mdx} +77 -94
- package/docs/test/lifecycle.mdx +348 -0
- package/docs/test/mocks.mdx +637 -0
- package/docs/test/{reporters.md → reporters.mdx} +15 -15
- package/docs/test/runtime-behavior.mdx +342 -0
- package/docs/test/snapshots.mdx +434 -0
- package/docs/test/writing-tests.mdx +635 -0
- package/docs/typescript.mdx +54 -0
- package/package.json +8 -6
- package/test.d.ts +2 -2
- package/docs/api/file.md +0 -19
- package/docs/api/globals.md +0 -387
- package/docs/api/http.md +0 -1408
- package/docs/api/import-meta.md +0 -69
- package/docs/benchmarks.md +0 -120
- package/docs/bun-flavored-toml.md +0 -42
- package/docs/bundler/css_modules.md +0 -145
- package/docs/bundler/fullstack.md +0 -418
- package/docs/bundler/index.md +0 -1735
- package/docs/bundler/intro.md +0 -75
- package/docs/bundler/vs-esbuild.md +0 -1127
- package/docs/cli/bun-completions.md +0 -3
- package/docs/cli/bun-install.md +0 -349
- package/docs/cli/bun-upgrade.md +0 -39
- package/docs/cli/info.md +0 -65
- package/docs/cli/patch-commit.md +0 -11
- package/docs/cli/remove.md +0 -7
- package/docs/cli/unlink.md +0 -9
- package/docs/contributing/upgrading-webkit.md +0 -57
- package/docs/ecosystem/elysia.md +0 -24
- package/docs/ecosystem/express.md +0 -37
- package/docs/ecosystem/hono.md +0 -18
- package/docs/ecosystem/react.md +0 -65
- package/docs/ecosystem/stric.md +0 -38
- package/docs/guides/ecosystem/prisma.md +0 -141
- package/docs/guides/ecosystem/render.md +0 -79
- package/docs/guides/install/add-git.md +0 -36
- package/docs/guides/test/spy-on.md +0 -46
- package/docs/install/index.md +0 -248
- package/docs/installation.md +0 -327
- package/docs/project/asan.md +0 -124
- package/docs/project/internals/build-process-for-ci.md +0 -75
- package/docs/project/licensing.md +0 -73
- package/docs/project/roadmap.md +0 -87
- package/docs/quickstart.md +0 -157
- package/docs/runtime/bun-apis.md +0 -207
- package/docs/runtime/env.md +0 -253
- package/docs/runtime/index.md +0 -312
- package/docs/runtime/jsx.md +0 -385
- package/docs/runtime/loaders.md +0 -130
- package/docs/runtime/plugins.md +0 -561
- package/docs/runtime/typescript.md +0 -139
- package/docs/runtime/web-apis.md +0 -128
- package/docs/test/configuration.md +0 -154
- package/docs/test/coverage.md +0 -142
- package/docs/test/dom.md +0 -75
- package/docs/test/examples/concurrent-test-glob.md +0 -132
- package/docs/test/hot.md +0 -15
- package/docs/test/lifecycle.md +0 -81
- package/docs/test/mocks.md +0 -313
- package/docs/test/runtime-behavior.md +0 -95
- package/docs/test/snapshots.md +0 -68
- package/docs/test/writing.md +0 -825
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Module Resolution"
|
|
3
|
+
description: "How Bun resolves modules and handles imports in JavaScript and TypeScript"
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
Module resolution in JavaScript is a complex topic.
|
|
2
7
|
|
|
3
8
|
The ecosystem is currently in the midst of a years-long transition from CommonJS modules to native ES modules. TypeScript enforces its own set of rules around import extensions that aren't compatible with ESM. Different build tools support path re-mapping via disparate non-compatible mechanisms.
|
|
@@ -8,26 +13,26 @@ Bun aims to provide a consistent and predictable module resolution system that j
|
|
|
8
13
|
|
|
9
14
|
Consider the following files.
|
|
10
15
|
|
|
11
|
-
|
|
16
|
+
<CodeGroup>
|
|
12
17
|
|
|
13
|
-
```ts
|
|
18
|
+
```ts index.ts icon="/icons/typescript.svg"
|
|
14
19
|
import { hello } from "./hello";
|
|
15
20
|
|
|
16
21
|
hello();
|
|
17
22
|
```
|
|
18
23
|
|
|
19
|
-
```ts
|
|
24
|
+
```ts hello.ts icon="/icons/typescript.svg"
|
|
20
25
|
export function hello() {
|
|
21
26
|
console.log("Hello world!");
|
|
22
27
|
}
|
|
23
28
|
```
|
|
24
29
|
|
|
25
|
-
|
|
30
|
+
</CodeGroup>
|
|
26
31
|
|
|
27
32
|
When we run `index.ts`, it prints "Hello world!".
|
|
28
33
|
|
|
29
|
-
```bash
|
|
30
|
-
|
|
34
|
+
```bash icon="terminal" terminal
|
|
35
|
+
bun index.ts
|
|
31
36
|
Hello world!
|
|
32
37
|
```
|
|
33
38
|
|
|
@@ -50,14 +55,14 @@ In this case, we are importing from `./hello`, a relative path with no extension
|
|
|
50
55
|
|
|
51
56
|
Import paths can optionally include extensions. If an extension is present, Bun will only check for a file with that exact extension.
|
|
52
57
|
|
|
53
|
-
```ts
|
|
58
|
+
```ts index.ts icon="/icons/typescript.svg"
|
|
54
59
|
import { hello } from "./hello";
|
|
55
60
|
import { hello } from "./hello.ts"; // this works
|
|
56
61
|
```
|
|
57
62
|
|
|
58
63
|
If you import `from "*.js{x}"`, Bun will additionally check for a matching `*.ts{x}` file, to be compatible with TypeScript's [ES module support](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-7.html#new-file-extensions).
|
|
59
64
|
|
|
60
|
-
```ts
|
|
65
|
+
```ts index.ts icon="/icons/typescript.svg"
|
|
61
66
|
import { hello } from "./hello";
|
|
62
67
|
import { hello } from "./hello.ts"; // this works
|
|
63
68
|
import { hello } from "./hello.js"; // this also works
|
|
@@ -65,15 +70,15 @@ import { hello } from "./hello.js"; // this also works
|
|
|
65
70
|
|
|
66
71
|
Bun supports both ES modules (`import`/`export` syntax) and CommonJS modules (`require()`/`module.exports`). The following CommonJS version would also work in Bun.
|
|
67
72
|
|
|
68
|
-
|
|
73
|
+
<CodeGroup>
|
|
69
74
|
|
|
70
|
-
```ts
|
|
75
|
+
```ts index.js icon="/icons/typescript.svg"
|
|
71
76
|
const { hello } = require("./hello");
|
|
72
77
|
|
|
73
78
|
hello();
|
|
74
79
|
```
|
|
75
80
|
|
|
76
|
-
```ts
|
|
81
|
+
```ts hello.js icon="/icons/typescript.svg"
|
|
77
82
|
function hello() {
|
|
78
83
|
console.log("Hello world!");
|
|
79
84
|
}
|
|
@@ -81,10 +86,12 @@ function hello() {
|
|
|
81
86
|
exports.hello = hello;
|
|
82
87
|
```
|
|
83
88
|
|
|
84
|
-
|
|
89
|
+
</CodeGroup>
|
|
85
90
|
|
|
86
91
|
That said, using CommonJS is discouraged in new projects.
|
|
87
92
|
|
|
93
|
+
---
|
|
94
|
+
|
|
88
95
|
## Module systems
|
|
89
96
|
|
|
90
97
|
Bun has native support for CommonJS and ES modules. ES Modules are the recommended module format for new projects, but CommonJS modules are still widely used in the Node.js ecosystem.
|
|
@@ -100,20 +107,19 @@ In Bun's JavaScript runtime, `require` can be used by both ES Modules and Common
|
|
|
100
107
|
|
|
101
108
|
You can `require()` any file or package, even `.ts` or `.mjs` files.
|
|
102
109
|
|
|
103
|
-
```ts
|
|
110
|
+
```ts title="index.ts" icon="/icons/typescript.svg"
|
|
104
111
|
const { foo } = require("./foo"); // extensions are optional
|
|
105
112
|
const { bar } = require("./bar.mjs");
|
|
106
113
|
const { baz } = require("./baz.tsx");
|
|
107
114
|
```
|
|
108
115
|
|
|
109
|
-
|
|
116
|
+
<Accordion title="What is a CommonJS module?">
|
|
110
117
|
|
|
111
118
|
In 2016, ECMAScript added support for [ES Modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules). ES Modules are the standard for JavaScript modules. However, millions of npm packages still use CommonJS modules.
|
|
112
119
|
|
|
113
120
|
CommonJS modules are modules that use `module.exports` to export values. Typically, `require` is used to import CommonJS modules.
|
|
114
121
|
|
|
115
|
-
```ts
|
|
116
|
-
// my-commonjs.cjs
|
|
122
|
+
```ts my-commonjs.cjs icon="/icons/javascript.svg"
|
|
117
123
|
const stuff = require("./stuff");
|
|
118
124
|
module.exports = { stuff };
|
|
119
125
|
```
|
|
@@ -136,13 +142,13 @@ The biggest difference between CommonJS and ES Modules is that CommonJS modules
|
|
|
136
142
|
- CommonJS modules and static ES Modules (`import` statements) work in a similar synchronous way, like reading a book from start to finish.
|
|
137
143
|
- ES Modules also offer the option to import modules asynchronously using the `import()` function. This is like looking up additional information in the middle of reading the book without stopping.
|
|
138
144
|
|
|
139
|
-
|
|
145
|
+
</Accordion>
|
|
140
146
|
|
|
141
147
|
### Using `import`
|
|
142
148
|
|
|
143
149
|
You can `import` any file or package, even `.cjs` files.
|
|
144
150
|
|
|
145
|
-
```ts
|
|
151
|
+
```ts title="index.ts" icon="/icons/typescript.svg"
|
|
146
152
|
import { foo } from "./foo"; // extensions are optional
|
|
147
153
|
import bar from "./bar.ts";
|
|
148
154
|
import { stuff } from "./my-commonjs.cjs";
|
|
@@ -152,9 +158,10 @@ import { stuff } from "./my-commonjs.cjs";
|
|
|
152
158
|
|
|
153
159
|
In Bun, you can use `import` or `require` in the same file—they both work, all the time.
|
|
154
160
|
|
|
155
|
-
```ts
|
|
161
|
+
```ts title="index.ts" icon="/icons/typescript.svg"
|
|
156
162
|
import { stuff } from "./my-commonjs.cjs";
|
|
157
163
|
import Stuff from "./my-commonjs.cjs";
|
|
164
|
+
|
|
158
165
|
const myStuff = require("./my-commonjs.cjs");
|
|
159
166
|
```
|
|
160
167
|
|
|
@@ -164,42 +171,21 @@ The only exception to this rule is top-level await. You can't `require()` a file
|
|
|
164
171
|
|
|
165
172
|
Fortunately, very few libraries use top-level await, so this is rarely a problem. But if you're using top-level await in your application code, make sure that file isn't being `require()` from elsewhere in your application. Instead, you should use `import` or [dynamic `import()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/import).
|
|
166
173
|
|
|
174
|
+
---
|
|
175
|
+
|
|
167
176
|
## Importing packages
|
|
168
177
|
|
|
169
178
|
Bun implements the Node.js module resolution algorithm, so you can import packages from `node_modules` with a bare specifier.
|
|
170
179
|
|
|
171
|
-
```ts
|
|
180
|
+
```ts title="index.ts" icon="/icons/typescript.svg"
|
|
172
181
|
import { stuff } from "foo";
|
|
173
182
|
```
|
|
174
183
|
|
|
175
184
|
The full specification of this algorithm are officially documented in the [Node.js documentation](https://nodejs.org/api/modules.html); we won't rehash it here. Briefly: if you import `from "foo"`, Bun scans up the file system for a `node_modules` directory containing the package `foo`.
|
|
176
185
|
|
|
177
|
-
### NODE_PATH
|
|
178
|
-
|
|
179
|
-
Bun supports `NODE_PATH` for additional module resolution directories:
|
|
180
|
-
|
|
181
|
-
```bash
|
|
182
|
-
NODE_PATH=./packages bun run src/index.js
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
```ts
|
|
186
|
-
// packages/foo/index.js
|
|
187
|
-
export const hello = "world";
|
|
188
|
-
|
|
189
|
-
// src/index.js
|
|
190
|
-
import { hello } from "foo";
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
Multiple paths use the platform's delimiter (`:` on Unix, `;` on Windows):
|
|
194
|
-
|
|
195
|
-
```bash
|
|
196
|
-
NODE_PATH=./packages:./lib bun run src/index.js # Unix/macOS
|
|
197
|
-
NODE_PATH=./packages;./lib bun run src/index.js # Windows
|
|
198
|
-
```
|
|
199
|
-
|
|
200
186
|
Once it finds the `foo` package, Bun reads the `package.json` to determine how the package should be imported. To determine the package's entrypoint, Bun first reads the `exports` field and checks for the following conditions.
|
|
201
187
|
|
|
202
|
-
```
|
|
188
|
+
```json package.json icon="file-json"
|
|
203
189
|
{
|
|
204
190
|
"name": "foo",
|
|
205
191
|
"exports": {
|
|
@@ -207,7 +193,7 @@ Once it finds the `foo` package, Bun reads the `package.json` to determine how t
|
|
|
207
193
|
"node": "./index.js",
|
|
208
194
|
"require": "./index.js", // if importer is CommonJS
|
|
209
195
|
"import": "./index.mjs", // if importer is ES module
|
|
210
|
-
"default": "./index.js"
|
|
196
|
+
"default": "./index.js"
|
|
211
197
|
}
|
|
212
198
|
}
|
|
213
199
|
```
|
|
@@ -216,7 +202,7 @@ Whichever one of these conditions occurs _first_ in the `package.json` is used t
|
|
|
216
202
|
|
|
217
203
|
Bun respects subpath [`"exports"`](https://nodejs.org/api/packages.html#subpath-exports) and [`"imports"`](https://nodejs.org/api/packages.html#imports).
|
|
218
204
|
|
|
219
|
-
```
|
|
205
|
+
```json package.json icon="file-json"
|
|
220
206
|
{
|
|
221
207
|
"name": "foo",
|
|
222
208
|
"exports": {
|
|
@@ -227,7 +213,7 @@ Bun respects subpath [`"exports"`](https://nodejs.org/api/packages.html#subpath-
|
|
|
227
213
|
|
|
228
214
|
Subpath imports and conditional imports work in conjunction with each other.
|
|
229
215
|
|
|
230
|
-
```json
|
|
216
|
+
```json package.json icon="file-json"
|
|
231
217
|
{
|
|
232
218
|
"name": "foo",
|
|
233
219
|
"exports": {
|
|
@@ -241,18 +227,20 @@ Subpath imports and conditional imports work in conjunction with each other.
|
|
|
241
227
|
|
|
242
228
|
As in Node.js, Specifying any subpath in the `"exports"` map will prevent other subpaths from being importable; you can only import files that are explicitly exported. Given the `package.json` above:
|
|
243
229
|
|
|
244
|
-
```ts
|
|
230
|
+
```ts index.ts icon="/icons/typescript.svg"
|
|
245
231
|
import stuff from "foo"; // this works
|
|
246
232
|
import stuff from "foo/index.mjs"; // this doesn't
|
|
247
233
|
```
|
|
248
234
|
|
|
249
|
-
|
|
250
|
-
**Shipping TypeScript** — Note that Bun supports the special `"bun"` export condition. If your library is written in
|
|
251
|
-
|
|
235
|
+
<Note>
|
|
236
|
+
**Shipping TypeScript** — Note that Bun supports the special `"bun"` export condition. If your library is written in
|
|
237
|
+
TypeScript, you can publish your (un-transpiled!) TypeScript files to `npm` directly. If you specify your package's
|
|
238
|
+
`*.ts` entrypoint in the `"bun"` condition, Bun will directly import and execute your TypeScript source files.
|
|
239
|
+
</Note>
|
|
252
240
|
|
|
253
241
|
If `exports` is not defined, Bun falls back to `"module"` (ESM imports only) then [`"main"`](https://nodejs.org/api/packages.html#main).
|
|
254
242
|
|
|
255
|
-
```json
|
|
243
|
+
```json package.json icon="file-json"
|
|
256
244
|
{
|
|
257
245
|
"name": "foo",
|
|
258
246
|
"module": "./index.js",
|
|
@@ -266,17 +254,17 @@ The `--conditions` flag allows you to specify a list of conditions to use when r
|
|
|
266
254
|
|
|
267
255
|
This flag is supported in both `bun build` and Bun's runtime.
|
|
268
256
|
|
|
269
|
-
```sh
|
|
257
|
+
```sh terminal icon="terminal"
|
|
270
258
|
# Use it with bun build:
|
|
271
|
-
|
|
259
|
+
bun build --conditions="react-server" --target=bun ./app/foo/route.js
|
|
272
260
|
|
|
273
261
|
# Use it with bun's runtime:
|
|
274
|
-
|
|
262
|
+
bun --conditions="react-server" ./app/foo/route.js
|
|
275
263
|
```
|
|
276
264
|
|
|
277
265
|
You can also use `conditions` programmatically with `Bun.build`:
|
|
278
266
|
|
|
279
|
-
```
|
|
267
|
+
```ts build.ts icon="/icons/typescript.svg"
|
|
280
268
|
await Bun.build({
|
|
281
269
|
conditions: ["react-server"],
|
|
282
270
|
target: "bun",
|
|
@@ -284,16 +272,18 @@ await Bun.build({
|
|
|
284
272
|
});
|
|
285
273
|
```
|
|
286
274
|
|
|
275
|
+
---
|
|
276
|
+
|
|
287
277
|
## Path re-mapping
|
|
288
278
|
|
|
289
279
|
In the spirit of treating TypeScript as a first-class citizen, the Bun runtime will re-map import paths according to the [`compilerOptions.paths`](https://www.typescriptlang.org/tsconfig#paths) field in `tsconfig.json`. This is a major divergence from Node.js, which doesn't support any form of import path re-mapping.
|
|
290
280
|
|
|
291
|
-
```
|
|
281
|
+
```json tsconfig.json icon="file-json"
|
|
292
282
|
{
|
|
293
283
|
"compilerOptions": {
|
|
294
284
|
"paths": {
|
|
295
|
-
"config": ["./config.ts"],
|
|
296
|
-
"components/*": ["components/*"]
|
|
285
|
+
"config": ["./config.ts"], // map specifier to file
|
|
286
|
+
"components/*": ["components/*"] // wildcard matching
|
|
297
287
|
}
|
|
298
288
|
}
|
|
299
289
|
}
|
|
@@ -301,7 +291,7 @@ In the spirit of treating TypeScript as a first-class citizen, the Bun runtime w
|
|
|
301
291
|
|
|
302
292
|
If you aren't a TypeScript user, you can create a [`jsconfig.json`](https://code.visualstudio.com/docs/languages/jsconfig) in your project root to achieve the same behavior.
|
|
303
293
|
|
|
304
|
-
|
|
294
|
+
<Accordion title="Low-level details of CommonJS interop in Bun">
|
|
305
295
|
|
|
306
296
|
Bun's JavaScript runtime has native support for CommonJS. When Bun's JavaScript transpiler detects usages of `module.exports`, it treats the file as CommonJS. The module loader will then wrap the transpiled module in a function shaped like this:
|
|
307
297
|
|
|
@@ -317,4 +307,36 @@ Once the CommonJS module is successfully evaluated, a Synthetic Module Record is
|
|
|
317
307
|
|
|
318
308
|
When using Bun's bundler, this works differently. The bundler will wrap the CommonJS module in a `require_${moduleName}` function which returns the `module.exports` object.
|
|
319
309
|
|
|
320
|
-
|
|
310
|
+
</Accordion>
|
|
311
|
+
|
|
312
|
+
---
|
|
313
|
+
|
|
314
|
+
## `import.meta`
|
|
315
|
+
|
|
316
|
+
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.
|
|
317
|
+
|
|
318
|
+
Bun implements the following properties.
|
|
319
|
+
|
|
320
|
+
```ts /path/to/project/file.ts
|
|
321
|
+
import.meta.dir; // => "/path/to/project"
|
|
322
|
+
import.meta.file; // => "file.ts"
|
|
323
|
+
import.meta.path; // => "/path/to/project/file.ts"
|
|
324
|
+
import.meta.url; // => "file:///path/to/project/file.ts"
|
|
325
|
+
|
|
326
|
+
import.meta.main; // `true` if this file is directly executed by `bun run`
|
|
327
|
+
// `false` otherwise
|
|
328
|
+
|
|
329
|
+
import.meta.resolve("zod"); // => "file:///path/to/project/node_modules/zod/index.js"
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
| Property | Description |
|
|
333
|
+
| ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
334
|
+
| `import.meta.dir` | Absolute path to the directory containing the current file, e.g. `/path/to/project`. Equivalent to `__dirname` in CommonJS modules (and Node.js) |
|
|
335
|
+
| `import.meta.dirname` | An alias to `import.meta.dir`, for Node.js compatibility |
|
|
336
|
+
| `import.meta.env` | An alias to `process.env`. |
|
|
337
|
+
| `import.meta.file` | The name of the current file, e.g. `index.tsx` |
|
|
338
|
+
| `import.meta.path` | Absolute path to the current file, e.g. `/path/to/project/index.ts`. Equivalent to `__filename` in CommonJS modules (and Node.js) |
|
|
339
|
+
| `import.meta.filename` | An alias to `import.meta.path`, for Node.js compatibility |
|
|
340
|
+
| `import.meta.main` | 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? |
|
|
341
|
+
| `import.meta.resolve` | 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). Example: `import.meta.resolve("zod")` returns `"file:///path/to/project/node_modules/zod/index.ts"` |
|
|
342
|
+
| `import.meta.url` | 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) |
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
---
|
|
2
|
+
title: DNS
|
|
3
|
+
description: Use Bun's DNS module to resolve DNS records
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Bun implements it's own `dns` module, and the `node:dns` module.
|
|
2
7
|
|
|
3
8
|
```ts
|
|
4
9
|
import * as dns from "node:dns";
|
|
@@ -8,6 +13,14 @@ console.log(addrs);
|
|
|
8
13
|
// => [{ address: "172.67.161.226", family: 4, ttl: 0 }, ...]
|
|
9
14
|
```
|
|
10
15
|
|
|
16
|
+
```ts
|
|
17
|
+
import { dns } from "bun";
|
|
18
|
+
|
|
19
|
+
dns.prefetch("bun.com", 443);
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
11
24
|
## DNS caching in Bun
|
|
12
25
|
|
|
13
26
|
In Bun v1.1.9, we added support for DNS caching. This cache makes repeated connections to the same hosts faster.
|
|
@@ -39,9 +52,7 @@ An example where you might want to use this is a database driver. When your appl
|
|
|
39
52
|
|
|
40
53
|
### `dns.prefetch`
|
|
41
54
|
|
|
42
|
-
|
|
43
|
-
**🚧** — This API is experimental and may change in the future.
|
|
44
|
-
{% /callout %}
|
|
55
|
+
<Warning>This API is experimental and may change in the future.</Warning>
|
|
45
56
|
|
|
46
57
|
To prefetch a DNS entry, you can use the `dns.prefetch` API. This API is useful when you know you'll need to connect to a host soon and want to avoid the initial DNS lookup.
|
|
47
58
|
|
|
@@ -62,28 +73,18 @@ await fetch("https://bun.com");
|
|
|
62
73
|
|
|
63
74
|
### `dns.getCacheStats()`
|
|
64
75
|
|
|
65
|
-
|
|
66
|
-
**🚧** — This API is experimental and may change in the future.
|
|
67
|
-
{% /callout %}
|
|
68
|
-
|
|
69
|
-
To get the current cache stats, you can use the `dns.getCacheStats` API.
|
|
76
|
+
<Warning>This API is experimental and may change in the future.</Warning>
|
|
70
77
|
|
|
71
|
-
This API returns an object with the following properties:
|
|
78
|
+
To get the current cache stats, you can use the `dns.getCacheStats` API. This API returns an object with the following properties:
|
|
72
79
|
|
|
73
80
|
```ts
|
|
74
81
|
{
|
|
75
|
-
// Cache hits
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
// Number of
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
// Number of times a connection failed
|
|
83
|
-
errors: number;
|
|
84
|
-
|
|
85
|
-
// Number of times a connection was requested at all (including cache hits and misses)
|
|
86
|
-
totalCount: number;
|
|
82
|
+
cacheHitsCompleted: number; // Cache hits completed
|
|
83
|
+
cacheHitsInflight: number; // Cache hits in flight
|
|
84
|
+
cacheMisses: number; // Cache misses
|
|
85
|
+
size: number; // Number of items in the DNS cache
|
|
86
|
+
errors: number; // Number of times a connection failed
|
|
87
|
+
totalCount: number; // Number of times a connection was requested at all (including cache hits and misses)
|
|
87
88
|
}
|
|
88
89
|
```
|
|
89
90
|
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Fetch
|
|
3
|
+
description: Send HTTP requests with Bun's fetch API
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
Bun implements the WHATWG `fetch` standard, with some extensions to meet the needs of server-side JavaScript.
|
|
2
7
|
|
|
3
8
|
Bun also implements `node:http`, but `fetch` is generally recommended instead.
|
|
@@ -268,7 +273,7 @@ const response = await fetch("s3://my-bucket/path/to/object", {
|
|
|
268
273
|
|
|
269
274
|
Note: Only PUT and POST methods support request bodies when using S3. For uploads, Bun automatically uses multipart upload for streaming bodies.
|
|
270
275
|
|
|
271
|
-
You can read more about Bun's S3 support in the [S3](
|
|
276
|
+
You can read more about Bun's S3 support in the [S3](/runtime/s3) documentation.
|
|
272
277
|
|
|
273
278
|
#### File URLs - `file://`
|
|
274
279
|
|
|
@@ -337,7 +342,7 @@ This will print the request and response headers to your terminal:
|
|
|
337
342
|
```sh
|
|
338
343
|
[fetch] > HTTP/1.1 GET http://example.com/
|
|
339
344
|
[fetch] > Connection: keep-alive
|
|
340
|
-
[fetch] > User-Agent: Bun/1.3.
|
|
345
|
+
[fetch] > User-Agent: Bun/1.3.1
|
|
341
346
|
[fetch] > Accept: */*
|
|
342
347
|
[fetch] > Host: example.com
|
|
343
348
|
[fetch] > Accept-Encoding: gzip, deflate, br, zstd
|
|
@@ -383,7 +388,7 @@ dns.prefetch("bun.com");
|
|
|
383
388
|
|
|
384
389
|
By default, Bun caches and deduplicates DNS queries in-memory for up to 30 seconds. You can see the cache stats by calling `dns.getCacheStats()`:
|
|
385
390
|
|
|
386
|
-
To learn more about DNS caching in Bun, see the [DNS caching](
|
|
391
|
+
To learn more about DNS caching in Bun, see the [DNS caching](/runtime/networking/dns) documentation.
|
|
387
392
|
|
|
388
393
|
### Preconnect to a host
|
|
389
394
|
|
|
@@ -402,7 +407,7 @@ Note: calling `fetch` immediately after `fetch.preconnect` will not make your re
|
|
|
402
407
|
To preconnect to a host at startup, you can pass `--fetch-preconnect`:
|
|
403
408
|
|
|
404
409
|
```sh
|
|
405
|
-
|
|
410
|
+
bun --fetch-preconnect https://bun.com ./my-script.ts
|
|
406
411
|
```
|
|
407
412
|
|
|
408
413
|
This is sort of like `<link rel="preconnect">` in HTML.
|
|
@@ -425,7 +430,7 @@ When the limit is exceeded, the requests are queued and sent as soon as the next
|
|
|
425
430
|
You can increase the maximum number of simultaneous connections via the `BUN_CONFIG_MAX_HTTP_REQUESTS` environment variable:
|
|
426
431
|
|
|
427
432
|
```sh
|
|
428
|
-
|
|
433
|
+
bun_CONFIG_MAX_HTTP_REQUESTS=512 bun ./my-script.ts
|
|
429
434
|
```
|
|
430
435
|
|
|
431
436
|
The max value for this limit is currently set to 65,336. The maximum port number is 65,535, so it's quite difficult for any one computer to exceed this limit.
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
---
|
|
2
|
+
title: TCP
|
|
3
|
+
description: Use Bun's native TCP API to implement performance sensitive systems like database clients, game servers, or anything that needs to communicate over TCP (instead of HTTP)
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
This is a low-level API intended for library authors and for advanced use cases.
|
|
2
7
|
|
|
3
8
|
## Start a server (`Bun.listen()`)
|
|
4
9
|
|
|
5
10
|
To start a TCP server with `Bun.listen`:
|
|
6
11
|
|
|
7
|
-
```ts
|
|
12
|
+
```ts server.ts icon="/icons/typescript.svg"
|
|
8
13
|
Bun.listen({
|
|
9
14
|
hostname: "localhost",
|
|
10
15
|
port: 8080,
|
|
@@ -18,11 +23,11 @@ Bun.listen({
|
|
|
18
23
|
});
|
|
19
24
|
```
|
|
20
25
|
|
|
21
|
-
|
|
26
|
+
<Accordion title="An API designed for speed">
|
|
22
27
|
|
|
23
28
|
In Bun, a set of handlers are declared once per server instead of assigning callbacks to each socket, as with Node.js `EventEmitters` or the web-standard `WebSocket` API.
|
|
24
29
|
|
|
25
|
-
```ts
|
|
30
|
+
```ts server.ts icon="/icons/typescript.svg"
|
|
26
31
|
Bun.listen({
|
|
27
32
|
hostname: "localhost",
|
|
28
33
|
port: 8080,
|
|
@@ -38,11 +43,11 @@ Bun.listen({
|
|
|
38
43
|
|
|
39
44
|
For performance-sensitive servers, assigning listeners to each socket can cause significant garbage collector pressure and increase memory usage. By contrast, Bun only allocates one handler function for each event and shares it among all sockets. This is a small optimization, but it adds up.
|
|
40
45
|
|
|
41
|
-
|
|
46
|
+
</Accordion>
|
|
42
47
|
|
|
43
48
|
Contextual data can be attached to a socket in the `open` handler.
|
|
44
49
|
|
|
45
|
-
```ts
|
|
50
|
+
```ts server.ts icon="/icons/typescript.svg"
|
|
46
51
|
type SocketData = { sessionId: string };
|
|
47
52
|
|
|
48
53
|
Bun.listen<SocketData>({
|
|
@@ -50,10 +55,10 @@ Bun.listen<SocketData>({
|
|
|
50
55
|
port: 8080,
|
|
51
56
|
socket: {
|
|
52
57
|
data(socket, data) {
|
|
53
|
-
socket.write(`${socket.data.sessionId}: ack`);
|
|
58
|
+
socket.write(`${socket.data.sessionId}: ack`); // [!code ++]
|
|
54
59
|
},
|
|
55
60
|
open(socket) {
|
|
56
|
-
socket.data = { sessionId: "abcd" };
|
|
61
|
+
socket.data = { sessionId: "abcd" }; // [!code ++]
|
|
57
62
|
},
|
|
58
63
|
},
|
|
59
64
|
});
|
|
@@ -61,7 +66,7 @@ Bun.listen<SocketData>({
|
|
|
61
66
|
|
|
62
67
|
To enable TLS, pass a `tls` object containing `key` and `cert` fields.
|
|
63
68
|
|
|
64
|
-
```ts
|
|
69
|
+
```ts server.ts icon="/icons/typescript.svg"
|
|
65
70
|
Bun.listen({
|
|
66
71
|
hostname: "localhost",
|
|
67
72
|
port: 8080,
|
|
@@ -70,33 +75,29 @@ Bun.listen({
|
|
|
70
75
|
},
|
|
71
76
|
tls: {
|
|
72
77
|
// can be string, BunFile, TypedArray, Buffer, or array thereof
|
|
73
|
-
key: Bun.file("./key.pem"),
|
|
74
|
-
cert: Bun.file("./cert.pem"),
|
|
78
|
+
key: Bun.file("./key.pem"), // [!code ++]
|
|
79
|
+
cert: Bun.file("./cert.pem"), // [!code ++]
|
|
75
80
|
},
|
|
76
81
|
});
|
|
77
82
|
```
|
|
78
83
|
|
|
79
84
|
The `key` and `cert` fields expect the _contents_ of your TLS key and certificate. This can be a string, `BunFile`, `TypedArray`, or `Buffer`.
|
|
80
85
|
|
|
81
|
-
```ts
|
|
86
|
+
```ts server.ts icon="/icons/typescript.svg"
|
|
82
87
|
Bun.listen({
|
|
83
88
|
// ...
|
|
84
89
|
tls: {
|
|
85
|
-
// BunFile
|
|
86
|
-
key:
|
|
87
|
-
//
|
|
88
|
-
key:
|
|
89
|
-
// string
|
|
90
|
-
key: fs.readFileSync("./key.pem", "utf8"),
|
|
91
|
-
// array of above
|
|
92
|
-
key: [Bun.file("./key1.pem"), Bun.file("./key2.pem")],
|
|
90
|
+
key: Bun.file("./key.pem"), // BunFile
|
|
91
|
+
key: fs.readFileSync("./key.pem"), // Buffer
|
|
92
|
+
key: fs.readFileSync("./key.pem", "utf8"), // string
|
|
93
|
+
key: [Bun.file("./key1.pem"), Bun.file("./key2.pem")], // array of above
|
|
93
94
|
},
|
|
94
95
|
});
|
|
95
96
|
```
|
|
96
97
|
|
|
97
98
|
The result of `Bun.listen` is a server that conforms to the `TCPSocket` interface.
|
|
98
99
|
|
|
99
|
-
```ts
|
|
100
|
+
```ts server.ts icon="/icons/typescript.svg"
|
|
100
101
|
const server = Bun.listen({
|
|
101
102
|
/* config*/
|
|
102
103
|
});
|
|
@@ -109,11 +110,13 @@ server.stop(true);
|
|
|
109
110
|
server.unref();
|
|
110
111
|
```
|
|
111
112
|
|
|
113
|
+
---
|
|
114
|
+
|
|
112
115
|
## Create a connection (`Bun.connect()`)
|
|
113
116
|
|
|
114
117
|
Use `Bun.connect` to connect to a TCP server. Specify the server to connect to with `hostname` and `port`. TCP clients can define the same set of handlers as `Bun.listen`, plus a couple client-specific handlers.
|
|
115
118
|
|
|
116
|
-
```ts
|
|
119
|
+
```ts server.ts icon="/icons/typescript.svg"
|
|
117
120
|
// The client
|
|
118
121
|
const socket = await Bun.connect({
|
|
119
122
|
hostname: "localhost",
|
|
@@ -140,39 +143,48 @@ To require TLS, specify `tls: true`.
|
|
|
140
143
|
// The client
|
|
141
144
|
const socket = await Bun.connect({
|
|
142
145
|
// ... config
|
|
143
|
-
tls: true,
|
|
146
|
+
tls: true, // [!code ++]
|
|
144
147
|
});
|
|
145
148
|
```
|
|
146
149
|
|
|
150
|
+
---
|
|
151
|
+
|
|
147
152
|
## Hot reloading
|
|
148
153
|
|
|
149
154
|
Both TCP servers and sockets can be hot reloaded with new handlers.
|
|
150
155
|
|
|
151
|
-
|
|
156
|
+
<CodeGroup>
|
|
152
157
|
|
|
153
|
-
```ts
|
|
154
|
-
const server = Bun.listen({
|
|
158
|
+
```ts server.ts icon="/icons/typescript.svg"
|
|
159
|
+
const server = Bun.listen({
|
|
160
|
+
/* config */
|
|
161
|
+
});
|
|
155
162
|
|
|
156
163
|
// reloads handlers for all active server-side sockets
|
|
157
164
|
server.reload({
|
|
158
165
|
socket: {
|
|
159
|
-
data(){
|
|
166
|
+
data() {
|
|
160
167
|
// new 'data' handler
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
})
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
});
|
|
164
171
|
```
|
|
165
172
|
|
|
166
|
-
```ts
|
|
167
|
-
const socket = await Bun.connect({
|
|
173
|
+
```ts client.ts icon="/icons/typescript.svg"
|
|
174
|
+
const socket = await Bun.connect({
|
|
175
|
+
/* config */
|
|
176
|
+
});
|
|
177
|
+
|
|
168
178
|
socket.reload({
|
|
169
|
-
data(){
|
|
179
|
+
data() {
|
|
170
180
|
// new 'data' handler
|
|
171
|
-
}
|
|
172
|
-
})
|
|
181
|
+
},
|
|
182
|
+
});
|
|
173
183
|
```
|
|
174
184
|
|
|
175
|
-
|
|
185
|
+
</CodeGroup>
|
|
186
|
+
|
|
187
|
+
---
|
|
176
188
|
|
|
177
189
|
## Buffering
|
|
178
190
|
|
|
@@ -194,11 +206,14 @@ socket.write("hello");
|
|
|
194
206
|
|
|
195
207
|
To simplify this for now, consider using Bun's `ArrayBufferSink` with the `{stream: true}` option:
|
|
196
208
|
|
|
197
|
-
```ts
|
|
209
|
+
```ts server.ts icon="/icons/typescript.svg"
|
|
198
210
|
import { ArrayBufferSink } from "bun";
|
|
199
211
|
|
|
200
212
|
const sink = new ArrayBufferSink();
|
|
201
|
-
sink.start({
|
|
213
|
+
sink.start({
|
|
214
|
+
stream: true, // [!code ++]
|
|
215
|
+
highWaterMark: 1024,
|
|
216
|
+
});
|
|
202
217
|
|
|
203
218
|
sink.write("h");
|
|
204
219
|
sink.write("e");
|
|
@@ -216,6 +231,9 @@ queueMicrotask(() => {
|
|
|
216
231
|
});
|
|
217
232
|
```
|
|
218
233
|
|
|
219
|
-
|
|
220
|
-
**Corking**
|
|
221
|
-
|
|
234
|
+
<Note>
|
|
235
|
+
**Corking**
|
|
236
|
+
|
|
237
|
+
Support for corking is planned, but in the meantime backpressure must be managed manually with the `drain` handler.
|
|
238
|
+
|
|
239
|
+
</Note>
|