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,132 +0,0 @@
|
|
|
1
|
-
# Concurrent Test Glob Example
|
|
2
|
-
|
|
3
|
-
This example demonstrates how to use the `concurrentTestGlob` option to selectively run tests concurrently based on file naming patterns.
|
|
4
|
-
|
|
5
|
-
## Project Structure
|
|
6
|
-
|
|
7
|
-
```text
|
|
8
|
-
my-project/
|
|
9
|
-
├── bunfig.toml
|
|
10
|
-
├── tests/
|
|
11
|
-
│ ├── unit/
|
|
12
|
-
│ │ ├── math.test.ts # Sequential
|
|
13
|
-
│ │ └── utils.test.ts # Sequential
|
|
14
|
-
│ └── integration/
|
|
15
|
-
│ ├── concurrent-api.test.ts # Concurrent
|
|
16
|
-
│ └── concurrent-database.test.ts # Concurrent
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
## Configuration
|
|
20
|
-
|
|
21
|
-
### bunfig.toml
|
|
22
|
-
|
|
23
|
-
```toml
|
|
24
|
-
[test]
|
|
25
|
-
# Run all test files with "concurrent-" prefix concurrently
|
|
26
|
-
concurrentTestGlob = "**/concurrent-*.test.ts"
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
## Test Files
|
|
30
|
-
|
|
31
|
-
### Unit Test (Sequential)
|
|
32
|
-
|
|
33
|
-
`tests/unit/math.test.ts`
|
|
34
|
-
|
|
35
|
-
```typescript
|
|
36
|
-
import { test, expect } from "bun:test";
|
|
37
|
-
|
|
38
|
-
// These tests run sequentially by default
|
|
39
|
-
// Good for tests that share state or have specific ordering requirements
|
|
40
|
-
let sharedState = 0;
|
|
41
|
-
|
|
42
|
-
test("addition", () => {
|
|
43
|
-
sharedState = 5 + 3;
|
|
44
|
-
expect(sharedState).toBe(8);
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
test("uses previous state", () => {
|
|
48
|
-
// This test depends on the previous test's state
|
|
49
|
-
expect(sharedState).toBe(8);
|
|
50
|
-
});
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
### Integration Test (Concurrent)
|
|
54
|
-
|
|
55
|
-
`tests/integration/concurrent-api.test.ts`
|
|
56
|
-
|
|
57
|
-
```typescript
|
|
58
|
-
import { test, expect } from "bun:test";
|
|
59
|
-
|
|
60
|
-
// These tests automatically run concurrently due to filename matching the glob pattern.
|
|
61
|
-
// Using test() is equivalent to test.concurrent() when the file matches concurrentTestGlob.
|
|
62
|
-
// Each test is independent and can run in parallel.
|
|
63
|
-
|
|
64
|
-
test("fetch user data", async () => {
|
|
65
|
-
const response = await fetch("/api/user/1");
|
|
66
|
-
expect(response.ok).toBe(true);
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
test("fetch posts", async () => {
|
|
70
|
-
const response = await fetch("/api/posts");
|
|
71
|
-
expect(response.ok).toBe(true);
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
test("fetch comments", async () => {
|
|
75
|
-
const response = await fetch("/api/comments");
|
|
76
|
-
expect(response.ok).toBe(true);
|
|
77
|
-
});
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
## Running Tests
|
|
81
|
-
|
|
82
|
-
```bash
|
|
83
|
-
# Run all tests - concurrent-*.test.ts files will run concurrently
|
|
84
|
-
bun test
|
|
85
|
-
|
|
86
|
-
# Override: Force ALL tests to run concurrently
|
|
87
|
-
# Note: This overrides bunfig.toml and runs all tests concurrently, regardless of glob
|
|
88
|
-
bun test --concurrent
|
|
89
|
-
|
|
90
|
-
# Run only unit tests (sequential)
|
|
91
|
-
bun test tests/unit
|
|
92
|
-
|
|
93
|
-
# Run only integration tests (concurrent due to glob pattern)
|
|
94
|
-
bun test tests/integration
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
## Benefits
|
|
98
|
-
|
|
99
|
-
1. **Gradual Migration**: Migrate to concurrent tests file by file by renaming them
|
|
100
|
-
2. **Clear Organization**: File naming convention indicates execution mode
|
|
101
|
-
3. **Performance**: Integration tests run faster in parallel
|
|
102
|
-
4. **Safety**: Unit tests remain sequential where needed
|
|
103
|
-
5. **Flexibility**: Easy to change execution mode by renaming files
|
|
104
|
-
|
|
105
|
-
## Migration Strategy
|
|
106
|
-
|
|
107
|
-
To migrate existing tests to concurrent execution:
|
|
108
|
-
|
|
109
|
-
1. Start with independent integration tests
|
|
110
|
-
2. Rename files to match the glob pattern: `mv api.test.ts concurrent-api.test.ts`
|
|
111
|
-
3. Verify tests still pass
|
|
112
|
-
4. Monitor for race conditions or shared state issues
|
|
113
|
-
5. Continue migrating stable tests incrementally
|
|
114
|
-
|
|
115
|
-
## Tips
|
|
116
|
-
|
|
117
|
-
- Use descriptive prefixes: `concurrent-`, `parallel-`, `async-`
|
|
118
|
-
- Keep related sequential tests together
|
|
119
|
-
- Document why certain tests must remain sequential
|
|
120
|
-
- Use `test.concurrent()` for fine-grained control in sequential files
|
|
121
|
-
(In files matched by `concurrentTestGlob`, plain `test()` already runs concurrently)
|
|
122
|
-
- Consider separate globs for different test types:
|
|
123
|
-
|
|
124
|
-
```toml
|
|
125
|
-
[test]
|
|
126
|
-
# Multiple patterns for different test categories
|
|
127
|
-
concurrentTestGlob = [
|
|
128
|
-
"**/integration/*.test.ts",
|
|
129
|
-
"**/e2e/*.test.ts",
|
|
130
|
-
"**/concurrent-*.test.ts"
|
|
131
|
-
]
|
|
132
|
-
```
|
package/docs/test/hot.md
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
To automatically re-run tests when files change, use the `--watch` flag:
|
|
2
|
-
|
|
3
|
-
```sh
|
|
4
|
-
$ bun test --watch
|
|
5
|
-
```
|
|
6
|
-
|
|
7
|
-
Bun will watch for changes to any files imported in a test file, and re-run tests when a change is detected.
|
|
8
|
-
|
|
9
|
-
It's fast.
|
|
10
|
-
|
|
11
|
-
{% raw %}
|
|
12
|
-
|
|
13
|
-
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">"bun test --watch url" in a large folder with multiple files that start with "url" <a href="https://t.co/aZV9BP4eFu">pic.twitter.com/aZV9BP4eFu</a></p>— Jarred Sumner (@jarredsumner) <a href="https://twitter.com/jarredsumner/status/1640890850535436288?ref_src=twsrc%5Etfw">March 29, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
|
|
14
|
-
|
|
15
|
-
{% /raw %}
|
package/docs/test/lifecycle.md
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
The test runner supports the following lifecycle hooks. This is useful for loading test fixtures, mocking data, and configuring the test environment.
|
|
2
|
-
|
|
3
|
-
| Hook | Description |
|
|
4
|
-
| ------------ | --------------------------- |
|
|
5
|
-
| `beforeAll` | Runs once before all tests. |
|
|
6
|
-
| `beforeEach` | Runs before each test. |
|
|
7
|
-
| `afterEach` | Runs after each test. |
|
|
8
|
-
| `afterAll` | Runs once after all tests. |
|
|
9
|
-
|
|
10
|
-
Perform per-test setup and teardown logic with `beforeEach` and `afterEach`.
|
|
11
|
-
|
|
12
|
-
```ts
|
|
13
|
-
import { beforeEach, afterEach } from "bun:test";
|
|
14
|
-
|
|
15
|
-
beforeEach(() => {
|
|
16
|
-
console.log("running test.");
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
afterEach(() => {
|
|
20
|
-
console.log("done with test.");
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
// tests...
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
Perform per-scope setup and teardown logic with `beforeAll` and `afterAll`. The _scope_ is determined by where the hook is defined.
|
|
27
|
-
|
|
28
|
-
To scope the hooks to a particular `describe` block:
|
|
29
|
-
|
|
30
|
-
```ts
|
|
31
|
-
import { describe, beforeAll } from "bun:test";
|
|
32
|
-
|
|
33
|
-
describe("test group", () => {
|
|
34
|
-
beforeAll(() => {
|
|
35
|
-
// setup
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
// tests...
|
|
39
|
-
});
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
To scope the hooks to a test file:
|
|
43
|
-
|
|
44
|
-
```ts
|
|
45
|
-
import { describe, beforeAll } from "bun:test";
|
|
46
|
-
|
|
47
|
-
beforeAll(() => {
|
|
48
|
-
// setup
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
describe("test group", () => {
|
|
52
|
-
// tests...
|
|
53
|
-
});
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
To scope the hooks to an entire multi-file test run, define the hooks in a separate file.
|
|
57
|
-
|
|
58
|
-
```ts#setup.ts
|
|
59
|
-
import { beforeAll, afterAll } from "bun:test";
|
|
60
|
-
|
|
61
|
-
beforeAll(() => {
|
|
62
|
-
// global setup
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
afterAll(() => {
|
|
66
|
-
// global teardown
|
|
67
|
-
});
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
Then use `--preload` to run the setup script before any test files.
|
|
71
|
-
|
|
72
|
-
```ts
|
|
73
|
-
$ bun test --preload ./setup.ts
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
To avoid typing `--preload` every time you run tests, it can be added to your `bunfig.toml`:
|
|
77
|
-
|
|
78
|
-
```toml
|
|
79
|
-
[test]
|
|
80
|
-
preload = ["./setup.ts"]
|
|
81
|
-
```
|
package/docs/test/mocks.md
DELETED
|
@@ -1,313 +0,0 @@
|
|
|
1
|
-
Create mocks with the `mock` function.
|
|
2
|
-
|
|
3
|
-
```ts
|
|
4
|
-
import { test, expect, mock } from "bun:test";
|
|
5
|
-
const random = mock(() => Math.random());
|
|
6
|
-
|
|
7
|
-
test("random", async () => {
|
|
8
|
-
const val = random();
|
|
9
|
-
expect(val).toBeGreaterThan(0);
|
|
10
|
-
expect(random).toHaveBeenCalled();
|
|
11
|
-
expect(random).toHaveBeenCalledTimes(1);
|
|
12
|
-
});
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
{% callout %}
|
|
16
|
-
Alternatively, you can use the `jest.fn()` function, as in Jest. It behaves identically.
|
|
17
|
-
|
|
18
|
-
```ts
|
|
19
|
-
import { test, expect, jest } from "bun:test";
|
|
20
|
-
const random = jest.fn(() => Math.random());
|
|
21
|
-
|
|
22
|
-
test("random", async () => {
|
|
23
|
-
const val = random();
|
|
24
|
-
expect(val).toBeGreaterThan(0);
|
|
25
|
-
expect(random).toHaveBeenCalled();
|
|
26
|
-
expect(random).toHaveBeenCalledTimes(1);
|
|
27
|
-
});
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
{% /callout %}
|
|
31
|
-
|
|
32
|
-
The result of `mock()` is a new function that's been decorated with some additional properties.
|
|
33
|
-
|
|
34
|
-
```ts
|
|
35
|
-
import { mock } from "bun:test";
|
|
36
|
-
const random = mock((multiplier: number) => multiplier * Math.random());
|
|
37
|
-
|
|
38
|
-
random(2);
|
|
39
|
-
random(10);
|
|
40
|
-
|
|
41
|
-
random.mock.calls;
|
|
42
|
-
// [[ 2 ], [ 10 ]]
|
|
43
|
-
|
|
44
|
-
random.mock.results;
|
|
45
|
-
// [
|
|
46
|
-
// { type: "return", value: 0.6533907460954099 },
|
|
47
|
-
// { type: "return", value: 0.6452713933037312 }
|
|
48
|
-
// ]
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
The following properties and methods are implemented on mock functions.
|
|
52
|
-
|
|
53
|
-
- [x] [mockFn.getMockName()](https://jestjs.io/docs/mock-function-api#mockfngetmockname)
|
|
54
|
-
- [x] [mockFn.mock.calls](https://jestjs.io/docs/mock-function-api#mockfnmockcalls)
|
|
55
|
-
- [x] [mockFn.mock.results](https://jestjs.io/docs/mock-function-api#mockfnmockresults)
|
|
56
|
-
- [x] [mockFn.mock.instances](https://jestjs.io/docs/mock-function-api#mockfnmockinstances)
|
|
57
|
-
- [x] [mockFn.mock.contexts](https://jestjs.io/docs/mock-function-api#mockfnmockcontexts)
|
|
58
|
-
- [x] [mockFn.mock.lastCall](https://jestjs.io/docs/mock-function-api#mockfnmocklastcall)
|
|
59
|
-
- [x] [mockFn.mockClear()](https://jestjs.io/docs/mock-function-api#mockfnmockclear) - Clears call history
|
|
60
|
-
- [x] [mockFn.mockReset()](https://jestjs.io/docs/mock-function-api#mockfnmockreset) - Clears call history and removes implementation
|
|
61
|
-
- [x] [mockFn.mockRestore()](https://jestjs.io/docs/mock-function-api#mockfnmockrestore) - Restores original implementation
|
|
62
|
-
- [x] [mockFn.mockImplementation(fn)](https://jestjs.io/docs/mock-function-api#mockfnmockimplementationfn)
|
|
63
|
-
- [x] [mockFn.mockImplementationOnce(fn)](https://jestjs.io/docs/mock-function-api#mockfnmockimplementationoncefn)
|
|
64
|
-
- [x] [mockFn.mockName(name)](https://jestjs.io/docs/mock-function-api#mockfnmocknamename)
|
|
65
|
-
- [x] [mockFn.mockReturnThis()](https://jestjs.io/docs/mock-function-api#mockfnmockreturnthis)
|
|
66
|
-
- [x] [mockFn.mockReturnValue(value)](https://jestjs.io/docs/mock-function-api#mockfnmockreturnvaluevalue)
|
|
67
|
-
- [x] [mockFn.mockReturnValueOnce(value)](https://jestjs.io/docs/mock-function-api#mockfnmockreturnvalueoncevalue)
|
|
68
|
-
- [x] [mockFn.mockResolvedValue(value)](https://jestjs.io/docs/mock-function-api#mockfnmockresolvedvaluevalue)
|
|
69
|
-
- [x] [mockFn.mockResolvedValueOnce(value)](https://jestjs.io/docs/mock-function-api#mockfnmockresolvedvalueoncevalue)
|
|
70
|
-
- [x] [mockFn.mockRejectedValue(value)](https://jestjs.io/docs/mock-function-api#mockfnmockrejectedvaluevalue)
|
|
71
|
-
- [x] [mockFn.mockRejectedValueOnce(value)](https://jestjs.io/docs/mock-function-api#mockfnmockrejectedvalueoncevalue)
|
|
72
|
-
- [x] [mockFn.withImplementation(fn, callback)](https://jestjs.io/docs/mock-function-api#mockfnwithimplementationfn-callback)
|
|
73
|
-
|
|
74
|
-
## `.spyOn()`
|
|
75
|
-
|
|
76
|
-
It's possible to track calls to a function without replacing it with a mock. Use `spyOn()` to create a spy; these spies can be passed to `.toHaveBeenCalled()` and `.toHaveBeenCalledTimes()`.
|
|
77
|
-
|
|
78
|
-
```ts
|
|
79
|
-
import { test, expect, spyOn } from "bun:test";
|
|
80
|
-
|
|
81
|
-
const ringo = {
|
|
82
|
-
name: "Ringo",
|
|
83
|
-
sayHi() {
|
|
84
|
-
console.log(`Hello I'm ${this.name}`);
|
|
85
|
-
},
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
const spy = spyOn(ringo, "sayHi");
|
|
89
|
-
|
|
90
|
-
test("spyon", () => {
|
|
91
|
-
expect(spy).toHaveBeenCalledTimes(0);
|
|
92
|
-
ringo.sayHi();
|
|
93
|
-
expect(spy).toHaveBeenCalledTimes(1);
|
|
94
|
-
});
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
## Module mocks with `mock.module()`
|
|
98
|
-
|
|
99
|
-
Module mocking lets you override the behavior of a module. Use `mock.module(path: string, callback: () => Object)` to mock a module.
|
|
100
|
-
|
|
101
|
-
```ts
|
|
102
|
-
import { test, expect, mock } from "bun:test";
|
|
103
|
-
|
|
104
|
-
mock.module("./module", () => {
|
|
105
|
-
return {
|
|
106
|
-
foo: "bar",
|
|
107
|
-
};
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
test("mock.module", async () => {
|
|
111
|
-
const esm = await import("./module");
|
|
112
|
-
expect(esm.foo).toBe("bar");
|
|
113
|
-
|
|
114
|
-
const cjs = require("./module");
|
|
115
|
-
expect(cjs.foo).toBe("bar");
|
|
116
|
-
});
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
Like the rest of Bun, module mocks support both `import` and `require`.
|
|
120
|
-
|
|
121
|
-
### Overriding already imported modules
|
|
122
|
-
|
|
123
|
-
If you need to override a module that's already been imported, there's nothing special you need to do. Just call `mock.module()` and the module will be overridden.
|
|
124
|
-
|
|
125
|
-
```ts
|
|
126
|
-
import { test, expect, mock } from "bun:test";
|
|
127
|
-
|
|
128
|
-
// The module we're going to mock is here:
|
|
129
|
-
import { foo } from "./module";
|
|
130
|
-
|
|
131
|
-
test("mock.module", async () => {
|
|
132
|
-
const cjs = require("./module");
|
|
133
|
-
expect(foo).toBe("bar");
|
|
134
|
-
expect(cjs.foo).toBe("bar");
|
|
135
|
-
|
|
136
|
-
// We update it here:
|
|
137
|
-
mock.module("./module", () => {
|
|
138
|
-
return {
|
|
139
|
-
foo: "baz",
|
|
140
|
-
};
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
// And the live bindings are updated.
|
|
144
|
-
expect(foo).toBe("baz");
|
|
145
|
-
|
|
146
|
-
// The module is also updated for CJS.
|
|
147
|
-
expect(cjs.foo).toBe("baz");
|
|
148
|
-
});
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
### Hoisting & preloading
|
|
152
|
-
|
|
153
|
-
If you need to ensure a module is mocked before it's imported, you should use `--preload` to load your mocks before your tests run.
|
|
154
|
-
|
|
155
|
-
```ts
|
|
156
|
-
// my-preload.ts
|
|
157
|
-
import { mock } from "bun:test";
|
|
158
|
-
|
|
159
|
-
mock.module("./module", () => {
|
|
160
|
-
return {
|
|
161
|
-
foo: "bar",
|
|
162
|
-
};
|
|
163
|
-
});
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
```sh
|
|
167
|
-
bun test --preload ./my-preload
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
To make your life easier, you can put `preload` in your `bunfig.toml`:
|
|
171
|
-
|
|
172
|
-
```toml
|
|
173
|
-
|
|
174
|
-
[test]
|
|
175
|
-
# Load these modules before running tests.
|
|
176
|
-
preload = ["./my-preload"]
|
|
177
|
-
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
#### What happens if I mock a module that's already been imported?
|
|
181
|
-
|
|
182
|
-
If you mock a module that's already been imported, the module will be updated in the module cache. This means that any modules that import the module will get the mocked version, BUT the original module will still have been evaluated. That means that any side effects from the original module will still have happened.
|
|
183
|
-
|
|
184
|
-
If you want to prevent the original module from being evaluated, you should use `--preload` to load your mocks before your tests run.
|
|
185
|
-
|
|
186
|
-
### `__mocks__` directory and auto-mocking
|
|
187
|
-
|
|
188
|
-
Auto-mocking is not supported yet. If this is blocking you from switching to Bun, please file an issue.
|
|
189
|
-
|
|
190
|
-
### Implementation details
|
|
191
|
-
|
|
192
|
-
Module mocks have different implementations for ESM and CommonJS modules. For ES Modules, we've added patches to JavaScriptCore that allow Bun to override export values at runtime and update live bindings recursively.
|
|
193
|
-
|
|
194
|
-
As of Bun v1.0.19, Bun automatically resolves the `specifier` argument to `mock.module()` as though you did an `import`. If it successfully resolves, then the resolved specifier string is used as the key in the module cache. This means that you can use relative paths, absolute paths, and even module names. If the `specifier` doesn't resolve, then the original `specifier` is used as the key in the module cache.
|
|
195
|
-
|
|
196
|
-
After resolution, the mocked module is stored in the ES Module registry **and** the CommonJS require cache. This means that you can use `import` and `require` interchangeably for mocked modules.
|
|
197
|
-
|
|
198
|
-
The callback function is called lazily, only if the module is imported or required. This means that you can use `mock.module()` to mock modules that don't exist yet, and it means that you can use `mock.module()` to mock modules that are imported by other modules.
|
|
199
|
-
|
|
200
|
-
### Module Mock Implementation Details
|
|
201
|
-
|
|
202
|
-
Understanding how `mock.module()` works helps you use it more effectively:
|
|
203
|
-
|
|
204
|
-
1. **Cache Interaction**: Module mocks interacts with both ESM and CommonJS module caches.
|
|
205
|
-
|
|
206
|
-
2. **Lazy Evaluation**: The mock factory callback is only evaluated when the module is actually imported or required.
|
|
207
|
-
|
|
208
|
-
3. **Path Resolution**: Bun automatically resolves the module specifier as though you were doing an import, supporting:
|
|
209
|
-
- Relative paths (`'./module'`)
|
|
210
|
-
- Absolute paths (`'/path/to/module'`)
|
|
211
|
-
- Package names (`'lodash'`)
|
|
212
|
-
|
|
213
|
-
4. **Import Timing Effects**:
|
|
214
|
-
- When mocking before first import: No side effects from the original module occur
|
|
215
|
-
- When mocking after import: The original module's side effects have already happened
|
|
216
|
-
- For this reason, using `--preload` is recommended for mocks that need to prevent side effects
|
|
217
|
-
|
|
218
|
-
5. **Live Bindings**: Mocked ESM modules maintain live bindings, so changing the mock will update all existing imports
|
|
219
|
-
|
|
220
|
-
## Global Mock Functions
|
|
221
|
-
|
|
222
|
-
### Clear all mocks with `mock.clearAllMocks()`
|
|
223
|
-
|
|
224
|
-
Reset all mock function state (calls, results, etc.) without restoring their original implementation:
|
|
225
|
-
|
|
226
|
-
```ts
|
|
227
|
-
import { expect, mock, test } from "bun:test";
|
|
228
|
-
|
|
229
|
-
const random1 = mock(() => Math.random());
|
|
230
|
-
const random2 = mock(() => Math.random());
|
|
231
|
-
|
|
232
|
-
test("clearing all mocks", () => {
|
|
233
|
-
random1();
|
|
234
|
-
random2();
|
|
235
|
-
|
|
236
|
-
expect(random1).toHaveBeenCalledTimes(1);
|
|
237
|
-
expect(random2).toHaveBeenCalledTimes(1);
|
|
238
|
-
|
|
239
|
-
mock.clearAllMocks();
|
|
240
|
-
|
|
241
|
-
expect(random1).toHaveBeenCalledTimes(0);
|
|
242
|
-
expect(random2).toHaveBeenCalledTimes(0);
|
|
243
|
-
|
|
244
|
-
// Note: implementations are preserved
|
|
245
|
-
expect(typeof random1()).toBe("number");
|
|
246
|
-
expect(typeof random2()).toBe("number");
|
|
247
|
-
});
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
This resets the `.mock.calls`, `.mock.instances`, `.mock.contexts`, and `.mock.results` properties of all mocks, but unlike `mock.restore()`, it does not restore the original implementation.
|
|
251
|
-
|
|
252
|
-
### Restore all function mocks with `mock.restore()`
|
|
253
|
-
|
|
254
|
-
Instead of manually restoring each mock individually with `mockFn.mockRestore()`, restore all mocks with one command by calling `mock.restore()`. Doing so does not reset the value of modules overridden with `mock.module()`.
|
|
255
|
-
|
|
256
|
-
Using `mock.restore()` can reduce the amount of code in your tests by adding it to `afterEach` blocks in each test file or even in your [test preload code](https://bun.sh/docs/runtime/bunfig#test-preload).
|
|
257
|
-
|
|
258
|
-
```ts
|
|
259
|
-
import { expect, mock, spyOn, test } from "bun:test";
|
|
260
|
-
|
|
261
|
-
import * as fooModule from "./foo.ts";
|
|
262
|
-
import * as barModule from "./bar.ts";
|
|
263
|
-
import * as bazModule from "./baz.ts";
|
|
264
|
-
|
|
265
|
-
test("foo, bar, baz", () => {
|
|
266
|
-
const fooSpy = spyOn(fooModule, "foo");
|
|
267
|
-
const barSpy = spyOn(barModule, "bar");
|
|
268
|
-
const bazSpy = spyOn(bazModule, "baz");
|
|
269
|
-
|
|
270
|
-
expect(fooSpy).toBe("foo");
|
|
271
|
-
expect(barSpy).toBe("bar");
|
|
272
|
-
expect(bazSpy).toBe("baz");
|
|
273
|
-
|
|
274
|
-
fooSpy.mockImplementation(() => 42);
|
|
275
|
-
barSpy.mockImplementation(() => 43);
|
|
276
|
-
bazSpy.mockImplementation(() => 44);
|
|
277
|
-
|
|
278
|
-
expect(fooSpy).toBe(42);
|
|
279
|
-
expect(barSpy).toBe(43);
|
|
280
|
-
expect(bazSpy).toBe(44);
|
|
281
|
-
|
|
282
|
-
mock.restore();
|
|
283
|
-
|
|
284
|
-
expect(fooSpy).toBe("foo");
|
|
285
|
-
expect(barSpy).toBe("bar");
|
|
286
|
-
expect(bazSpy).toBe("baz");
|
|
287
|
-
});
|
|
288
|
-
```
|
|
289
|
-
|
|
290
|
-
## Vitest Compatibility
|
|
291
|
-
|
|
292
|
-
For added compatibility with tests written for [Vitest](https://vitest.dev/), Bun provides the `vi` global object as an alias for parts of the Jest mocking API:
|
|
293
|
-
|
|
294
|
-
```ts
|
|
295
|
-
import { test, expect } from "bun:test";
|
|
296
|
-
|
|
297
|
-
// Using the 'vi' alias similar to Vitest
|
|
298
|
-
test("vitest compatibility", () => {
|
|
299
|
-
const mockFn = vi.fn(() => 42);
|
|
300
|
-
|
|
301
|
-
mockFn();
|
|
302
|
-
expect(mockFn).toHaveBeenCalled();
|
|
303
|
-
|
|
304
|
-
// The following functions are available on the vi object:
|
|
305
|
-
// vi.fn
|
|
306
|
-
// vi.spyOn
|
|
307
|
-
// vi.mock
|
|
308
|
-
// vi.restoreAllMocks
|
|
309
|
-
// vi.clearAllMocks
|
|
310
|
-
});
|
|
311
|
-
```
|
|
312
|
-
|
|
313
|
-
This makes it easier to port tests from Vitest to Bun without having to rewrite all your mocks.
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
`bun test` is deeply integrated with Bun's runtime. This is part of what makes `bun test` fast and simple to use.
|
|
2
|
-
|
|
3
|
-
#### `$NODE_ENV` environment variable
|
|
4
|
-
|
|
5
|
-
`bun test` automatically sets `$NODE_ENV` to `"test"` unless it's already set in the environment or via .env files. This is standard behavior for most test runners and helps ensure consistent test behavior.
|
|
6
|
-
|
|
7
|
-
```ts
|
|
8
|
-
import { test, expect } from "bun:test";
|
|
9
|
-
|
|
10
|
-
test("NODE_ENV is set to test", () => {
|
|
11
|
-
expect(process.env.NODE_ENV).toBe("test");
|
|
12
|
-
});
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
When `NODE_ENV` is set to `"test"`, Bun will not load `.env.local` files. This ensures consistent test environments across different executions by preventing local overrides during testing. Instead, use `.env.test` for test-specific environment variables, which should be committed to your repository for consistency across all developers and CI environments.
|
|
16
|
-
|
|
17
|
-
#### `$TZ` environment variable
|
|
18
|
-
|
|
19
|
-
By default, all `bun test` runs use UTC (`Etc/UTC`) as the time zone unless overridden by the `TZ` environment variable. This ensures consistent date and time behavior across different development environments.
|
|
20
|
-
|
|
21
|
-
#### Test Timeouts
|
|
22
|
-
|
|
23
|
-
Each test has a default timeout of 5000ms (5 seconds) if not explicitly overridden. Tests that exceed this timeout will fail. This can be changed globally with the `--timeout` flag or per-test as the third parameter to the test function.
|
|
24
|
-
|
|
25
|
-
## Error Handling
|
|
26
|
-
|
|
27
|
-
### Unhandled Errors
|
|
28
|
-
|
|
29
|
-
`bun test` tracks unhandled promise rejections and errors that occur between tests. If such errors occur, the final exit code will be non-zero (specifically, the count of such errors), even if all tests pass.
|
|
30
|
-
|
|
31
|
-
This helps catch errors in asynchronous code that might otherwise go unnoticed:
|
|
32
|
-
|
|
33
|
-
```ts
|
|
34
|
-
import { test } from "bun:test";
|
|
35
|
-
|
|
36
|
-
test("test 1", () => {
|
|
37
|
-
// This test passes
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
// This error happens outside any test
|
|
41
|
-
setTimeout(() => {
|
|
42
|
-
throw new Error("Unhandled error");
|
|
43
|
-
}, 0);
|
|
44
|
-
|
|
45
|
-
test("test 2", () => {
|
|
46
|
-
// This test also passes
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
// The test run will still fail with a non-zero exit code
|
|
50
|
-
// because of the unhandled error
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
Internally, this occurs with a higher precedence than `process.on("unhandledRejection")` or `process.on("uncaughtException")`, which makes it simpler to integrate with existing code.
|
|
54
|
-
|
|
55
|
-
## Using General CLI Flags with Tests
|
|
56
|
-
|
|
57
|
-
Several Bun CLI flags can be used with `bun test` to modify its behavior:
|
|
58
|
-
|
|
59
|
-
### Memory Usage
|
|
60
|
-
|
|
61
|
-
- `--smol`: Reduces memory usage for the test runner VM
|
|
62
|
-
|
|
63
|
-
### Debugging
|
|
64
|
-
|
|
65
|
-
- `--inspect`, `--inspect-brk`: Attaches the debugger to the test runner process
|
|
66
|
-
|
|
67
|
-
### Module Loading
|
|
68
|
-
|
|
69
|
-
- `--preload`: Runs scripts before test files (useful for global setup/mocks)
|
|
70
|
-
- `--define`: Sets compile-time constants
|
|
71
|
-
- `--loader`: Configures custom loaders
|
|
72
|
-
- `--tsconfig-override`: Uses a different tsconfig
|
|
73
|
-
- `--conditions`: Sets package.json conditions for module resolution
|
|
74
|
-
- `--env-file`: Loads environment variables for tests
|
|
75
|
-
|
|
76
|
-
### Installation-related Flags
|
|
77
|
-
|
|
78
|
-
- `--prefer-offline`, `--frozen-lockfile`, etc.: Affect any network requests or auto-installs during test execution
|
|
79
|
-
|
|
80
|
-
## Watch and Hot Reloading
|
|
81
|
-
|
|
82
|
-
When running `bun test` with the `--watch` flag, the test runner will watch for file changes and re-run affected tests.
|
|
83
|
-
|
|
84
|
-
The `--hot` flag provides similar functionality but is more aggressive about trying to preserve state between runs. For most test scenarios, `--watch` is the recommended option.
|
|
85
|
-
|
|
86
|
-
## Global Variables
|
|
87
|
-
|
|
88
|
-
The following globals are automatically available in test files without importing (though they can be imported from `bun:test` if preferred):
|
|
89
|
-
|
|
90
|
-
- `test`, `it`: Define tests
|
|
91
|
-
- `describe`: Group tests
|
|
92
|
-
- `expect`: Make assertions
|
|
93
|
-
- `beforeAll`, `beforeEach`, `afterAll`, `afterEach`: Lifecycle hooks
|
|
94
|
-
- `jest`: Jest global object
|
|
95
|
-
- `vi`: Vitest compatibility alias for common jest methods
|