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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (312) hide show
  1. package/bun.d.ts +4 -4
  2. package/docs/README.md +28 -0
  3. package/globals.d.ts +0 -1
  4. package/overrides.d.ts +45 -15
  5. package/package.json +1 -1
  6. package/test.d.ts +1 -1
  7. package/docs/api/binary-data.md +0 -1038
  8. package/docs/api/cc.md +0 -197
  9. package/docs/api/color.md +0 -262
  10. package/docs/api/console.md +0 -57
  11. package/docs/api/cookie.md +0 -449
  12. package/docs/api/dns.md +0 -110
  13. package/docs/api/fetch.md +0 -463
  14. package/docs/api/ffi.md +0 -557
  15. package/docs/api/file-io.md +0 -366
  16. package/docs/api/file-system-router.md +0 -112
  17. package/docs/api/file.md +0 -19
  18. package/docs/api/glob.md +0 -178
  19. package/docs/api/globals.md +0 -387
  20. package/docs/api/hashing.md +0 -319
  21. package/docs/api/html-rewriter.md +0 -334
  22. package/docs/api/http.md +0 -1408
  23. package/docs/api/import-meta.md +0 -69
  24. package/docs/api/node-api.md +0 -14
  25. package/docs/api/redis.md +0 -597
  26. package/docs/api/s3.md +0 -850
  27. package/docs/api/secrets.md +0 -319
  28. package/docs/api/semver.md +0 -52
  29. package/docs/api/spawn.md +0 -582
  30. package/docs/api/sql.md +0 -1374
  31. package/docs/api/sqlite.md +0 -694
  32. package/docs/api/streams.md +0 -230
  33. package/docs/api/tcp.md +0 -221
  34. package/docs/api/transpiler.md +0 -276
  35. package/docs/api/udp.md +0 -123
  36. package/docs/api/utils.md +0 -891
  37. package/docs/api/websockets.md +0 -573
  38. package/docs/api/workers.md +0 -322
  39. package/docs/api/yaml.md +0 -668
  40. package/docs/benchmarks.md +0 -120
  41. package/docs/bun-flavored-toml.md +0 -42
  42. package/docs/bundler/css.md +0 -1028
  43. package/docs/bundler/css_modules.md +0 -145
  44. package/docs/bundler/executables.md +0 -626
  45. package/docs/bundler/fullstack.md +0 -418
  46. package/docs/bundler/hmr.md +0 -234
  47. package/docs/bundler/html.md +0 -349
  48. package/docs/bundler/index.md +0 -1735
  49. package/docs/bundler/intro.md +0 -75
  50. package/docs/bundler/loaders.md +0 -410
  51. package/docs/bundler/macros.md +0 -329
  52. package/docs/bundler/plugins.md +0 -449
  53. package/docs/bundler/vs-esbuild.md +0 -1127
  54. package/docs/cli/add.md +0 -173
  55. package/docs/cli/bun-completions.md +0 -3
  56. package/docs/cli/bun-create.md +0 -338
  57. package/docs/cli/bun-install.md +0 -349
  58. package/docs/cli/bun-upgrade.md +0 -39
  59. package/docs/cli/bunx.md +0 -89
  60. package/docs/cli/filter.md +0 -90
  61. package/docs/cli/info.md +0 -65
  62. package/docs/cli/init.md +0 -85
  63. package/docs/cli/install.md +0 -344
  64. package/docs/cli/link.md +0 -40
  65. package/docs/cli/outdated.md +0 -90
  66. package/docs/cli/patch-commit.md +0 -11
  67. package/docs/cli/pm.md +0 -285
  68. package/docs/cli/publish.md +0 -120
  69. package/docs/cli/remove.md +0 -7
  70. package/docs/cli/run.md +0 -261
  71. package/docs/cli/test.md +0 -397
  72. package/docs/cli/unlink.md +0 -9
  73. package/docs/cli/update.md +0 -129
  74. package/docs/cli/why.md +0 -67
  75. package/docs/contributing/upgrading-webkit.md +0 -57
  76. package/docs/ecosystem/elysia.md +0 -24
  77. package/docs/ecosystem/express.md +0 -37
  78. package/docs/ecosystem/hono.md +0 -18
  79. package/docs/ecosystem/react.md +0 -65
  80. package/docs/ecosystem/stric.md +0 -38
  81. package/docs/guides/binary/arraybuffer-to-array.md +0 -27
  82. package/docs/guides/binary/arraybuffer-to-blob.md +0 -24
  83. package/docs/guides/binary/arraybuffer-to-buffer.md +0 -25
  84. package/docs/guides/binary/arraybuffer-to-string.md +0 -15
  85. package/docs/guides/binary/arraybuffer-to-typedarray.md +0 -39
  86. package/docs/guides/binary/blob-to-arraybuffer.md +0 -14
  87. package/docs/guides/binary/blob-to-dataview.md +0 -14
  88. package/docs/guides/binary/blob-to-stream.md +0 -14
  89. package/docs/guides/binary/blob-to-string.md +0 -15
  90. package/docs/guides/binary/blob-to-typedarray.md +0 -14
  91. package/docs/guides/binary/buffer-to-arraybuffer.md +0 -14
  92. package/docs/guides/binary/buffer-to-blob.md +0 -14
  93. package/docs/guides/binary/buffer-to-readablestream.md +0 -41
  94. package/docs/guides/binary/buffer-to-string.md +0 -25
  95. package/docs/guides/binary/buffer-to-typedarray.md +0 -14
  96. package/docs/guides/binary/dataview-to-string.md +0 -15
  97. package/docs/guides/binary/typedarray-to-arraybuffer.md +0 -25
  98. package/docs/guides/binary/typedarray-to-blob.md +0 -16
  99. package/docs/guides/binary/typedarray-to-buffer.md +0 -14
  100. package/docs/guides/binary/typedarray-to-dataview.md +0 -14
  101. package/docs/guides/binary/typedarray-to-readablestream.md +0 -41
  102. package/docs/guides/binary/typedarray-to-string.md +0 -16
  103. package/docs/guides/deployment/railway.md +0 -157
  104. package/docs/guides/ecosystem/astro.md +0 -72
  105. package/docs/guides/ecosystem/discordjs.md +0 -77
  106. package/docs/guides/ecosystem/docker.md +0 -140
  107. package/docs/guides/ecosystem/drizzle.md +0 -185
  108. package/docs/guides/ecosystem/edgedb.md +0 -228
  109. package/docs/guides/ecosystem/elysia.md +0 -31
  110. package/docs/guides/ecosystem/express.md +0 -40
  111. package/docs/guides/ecosystem/hono.md +0 -39
  112. package/docs/guides/ecosystem/mongoose.md +0 -87
  113. package/docs/guides/ecosystem/neon-drizzle.md +0 -220
  114. package/docs/guides/ecosystem/neon-serverless-postgres.md +0 -55
  115. package/docs/guides/ecosystem/nextjs.md +0 -49
  116. package/docs/guides/ecosystem/nuxt.md +0 -56
  117. package/docs/guides/ecosystem/pm2.md +0 -57
  118. package/docs/guides/ecosystem/prisma.md +0 -141
  119. package/docs/guides/ecosystem/qwik.md +0 -107
  120. package/docs/guides/ecosystem/react.md +0 -50
  121. package/docs/guides/ecosystem/remix.md +0 -78
  122. package/docs/guides/ecosystem/render.md +0 -79
  123. package/docs/guides/ecosystem/sentry.md +0 -52
  124. package/docs/guides/ecosystem/solidstart.md +0 -58
  125. package/docs/guides/ecosystem/ssr-react.md +0 -51
  126. package/docs/guides/ecosystem/stric.md +0 -55
  127. package/docs/guides/ecosystem/sveltekit.md +0 -125
  128. package/docs/guides/ecosystem/systemd.md +0 -113
  129. package/docs/guides/ecosystem/vite.md +0 -71
  130. package/docs/guides/html-rewriter/extract-links.md +0 -68
  131. package/docs/guides/html-rewriter/extract-social-meta.md +0 -93
  132. package/docs/guides/http/cluster.md +0 -66
  133. package/docs/guides/http/fetch-unix.md +0 -33
  134. package/docs/guides/http/fetch.md +0 -24
  135. package/docs/guides/http/file-uploads.md +0 -94
  136. package/docs/guides/http/hot.md +0 -26
  137. package/docs/guides/http/proxy.md +0 -24
  138. package/docs/guides/http/server.md +0 -46
  139. package/docs/guides/http/simple.md +0 -18
  140. package/docs/guides/http/stream-file.md +0 -48
  141. package/docs/guides/http/stream-iterator.md +0 -47
  142. package/docs/guides/http/stream-node-streams-in-bun.md +0 -20
  143. package/docs/guides/http/tls.md +0 -30
  144. package/docs/guides/install/add-dev.md +0 -26
  145. package/docs/guides/install/add-git.md +0 -36
  146. package/docs/guides/install/add-optional.md +0 -25
  147. package/docs/guides/install/add-peer.md +0 -43
  148. package/docs/guides/install/add-tarball.md +0 -33
  149. package/docs/guides/install/add.md +0 -42
  150. package/docs/guides/install/azure-artifacts.md +0 -73
  151. package/docs/guides/install/cicd.md +0 -41
  152. package/docs/guides/install/custom-registry.md +0 -30
  153. package/docs/guides/install/from-npm-install-to-bun-install.md +0 -214
  154. package/docs/guides/install/git-diff-bun-lockfile.md +0 -44
  155. package/docs/guides/install/jfrog-artifactory.md +0 -28
  156. package/docs/guides/install/npm-alias.md +0 -23
  157. package/docs/guides/install/registry-scope.md +0 -38
  158. package/docs/guides/install/trusted.md +0 -46
  159. package/docs/guides/install/workspaces.md +0 -70
  160. package/docs/guides/install/yarnlock.md +0 -44
  161. package/docs/guides/process/argv.md +0 -58
  162. package/docs/guides/process/ctrl-c.md +0 -16
  163. package/docs/guides/process/ipc.md +0 -66
  164. package/docs/guides/process/nanoseconds.md +0 -13
  165. package/docs/guides/process/os-signals.md +0 -39
  166. package/docs/guides/process/spawn-stderr.md +0 -31
  167. package/docs/guides/process/spawn-stdout.md +0 -26
  168. package/docs/guides/process/spawn.md +0 -41
  169. package/docs/guides/process/stdin.md +0 -54
  170. package/docs/guides/read-file/arraybuffer.md +0 -28
  171. package/docs/guides/read-file/buffer.md +0 -19
  172. package/docs/guides/read-file/exists.md +0 -16
  173. package/docs/guides/read-file/json.md +0 -17
  174. package/docs/guides/read-file/mime.md +0 -20
  175. package/docs/guides/read-file/stream.md +0 -26
  176. package/docs/guides/read-file/string.md +0 -22
  177. package/docs/guides/read-file/uint8array.md +0 -21
  178. package/docs/guides/read-file/watch.md +0 -68
  179. package/docs/guides/runtime/build-time-constants.md +0 -293
  180. package/docs/guides/runtime/cicd.md +0 -43
  181. package/docs/guides/runtime/codesign-macos-executable.md +0 -56
  182. package/docs/guides/runtime/define-constant.md +0 -145
  183. package/docs/guides/runtime/delete-directory.md +0 -37
  184. package/docs/guides/runtime/delete-file.md +0 -19
  185. package/docs/guides/runtime/heap-snapshot.md +0 -26
  186. package/docs/guides/runtime/import-html.md +0 -15
  187. package/docs/guides/runtime/import-json.md +0 -44
  188. package/docs/guides/runtime/import-toml.md +0 -30
  189. package/docs/guides/runtime/import-yaml.md +0 -102
  190. package/docs/guides/runtime/read-env.md +0 -32
  191. package/docs/guides/runtime/set-env.md +0 -47
  192. package/docs/guides/runtime/shell.md +0 -40
  193. package/docs/guides/runtime/timezone.md +0 -35
  194. package/docs/guides/runtime/tsconfig-paths.md +0 -29
  195. package/docs/guides/runtime/typescript.md +0 -49
  196. package/docs/guides/runtime/vscode-debugger.md +0 -47
  197. package/docs/guides/runtime/web-debugger.md +0 -82
  198. package/docs/guides/streams/node-readable-to-arraybuffer.md +0 -11
  199. package/docs/guides/streams/node-readable-to-blob.md +0 -11
  200. package/docs/guides/streams/node-readable-to-json.md +0 -12
  201. package/docs/guides/streams/node-readable-to-string.md +0 -12
  202. package/docs/guides/streams/node-readable-to-uint8array.md +0 -11
  203. package/docs/guides/streams/to-array.md +0 -14
  204. package/docs/guides/streams/to-arraybuffer.md +0 -14
  205. package/docs/guides/streams/to-blob.md +0 -14
  206. package/docs/guides/streams/to-buffer.md +0 -15
  207. package/docs/guides/streams/to-json.md +0 -14
  208. package/docs/guides/streams/to-string.md +0 -14
  209. package/docs/guides/streams/to-typedarray.md +0 -22
  210. package/docs/guides/test/bail.md +0 -22
  211. package/docs/guides/test/coverage-threshold.md +0 -60
  212. package/docs/guides/test/coverage.md +0 -44
  213. package/docs/guides/test/happy-dom.md +0 -68
  214. package/docs/guides/test/migrate-from-jest.md +0 -143
  215. package/docs/guides/test/mock-clock.md +0 -48
  216. package/docs/guides/test/mock-functions.md +0 -68
  217. package/docs/guides/test/rerun-each.md +0 -14
  218. package/docs/guides/test/run-tests.md +0 -111
  219. package/docs/guides/test/skip-tests.md +0 -39
  220. package/docs/guides/test/snapshot.md +0 -95
  221. package/docs/guides/test/spy-on.md +0 -46
  222. package/docs/guides/test/svelte-test.md +0 -120
  223. package/docs/guides/test/testing-library.md +0 -92
  224. package/docs/guides/test/timeout.md +0 -15
  225. package/docs/guides/test/todo-tests.md +0 -67
  226. package/docs/guides/test/update-snapshots.md +0 -46
  227. package/docs/guides/test/watch-mode.md +0 -19
  228. package/docs/guides/util/base64.md +0 -15
  229. package/docs/guides/util/deep-equals.md +0 -39
  230. package/docs/guides/util/deflate.md +0 -18
  231. package/docs/guides/util/detect-bun.md +0 -23
  232. package/docs/guides/util/entrypoint.md +0 -17
  233. package/docs/guides/util/escape-html.md +0 -22
  234. package/docs/guides/util/file-url-to-path.md +0 -14
  235. package/docs/guides/util/gzip.md +0 -18
  236. package/docs/guides/util/hash-a-password.md +0 -54
  237. package/docs/guides/util/import-meta-dir.md +0 -13
  238. package/docs/guides/util/import-meta-file.md +0 -13
  239. package/docs/guides/util/import-meta-path.md +0 -13
  240. package/docs/guides/util/javascript-uuid.md +0 -23
  241. package/docs/guides/util/main.md +0 -32
  242. package/docs/guides/util/path-to-file-url.md +0 -14
  243. package/docs/guides/util/sleep.md +0 -22
  244. package/docs/guides/util/version.md +0 -21
  245. package/docs/guides/util/which-path-to-executable-bin.md +0 -15
  246. package/docs/guides/websocket/compression.md +0 -31
  247. package/docs/guides/websocket/context.md +0 -77
  248. package/docs/guides/websocket/pubsub.md +0 -41
  249. package/docs/guides/websocket/simple.md +0 -33
  250. package/docs/guides/write-file/append.md +0 -52
  251. package/docs/guides/write-file/basic.md +0 -44
  252. package/docs/guides/write-file/blob.md +0 -28
  253. package/docs/guides/write-file/cat.md +0 -17
  254. package/docs/guides/write-file/file-cp.md +0 -16
  255. package/docs/guides/write-file/filesink.md +0 -52
  256. package/docs/guides/write-file/response.md +0 -17
  257. package/docs/guides/write-file/stdout.md +0 -21
  258. package/docs/guides/write-file/stream.md +0 -17
  259. package/docs/guides/write-file/unlink.md +0 -16
  260. package/docs/index.md +0 -77
  261. package/docs/install/audit.md +0 -57
  262. package/docs/install/cache.md +0 -59
  263. package/docs/install/catalogs.md +0 -298
  264. package/docs/install/index.md +0 -248
  265. package/docs/install/isolated.md +0 -197
  266. package/docs/install/lifecycle.md +0 -46
  267. package/docs/install/lockfile.md +0 -58
  268. package/docs/install/npmrc.md +0 -105
  269. package/docs/install/overrides.md +0 -73
  270. package/docs/install/patch.md +0 -59
  271. package/docs/install/registries.md +0 -30
  272. package/docs/install/security-scanner-api.md +0 -81
  273. package/docs/install/workspaces.md +0 -114
  274. package/docs/installation.md +0 -327
  275. package/docs/project/asan.md +0 -124
  276. package/docs/project/benchmarking.md +0 -203
  277. package/docs/project/bindgen.md +0 -225
  278. package/docs/project/building-windows.md +0 -162
  279. package/docs/project/contributing.md +0 -347
  280. package/docs/project/internals/build-process-for-ci.md +0 -75
  281. package/docs/project/licensing.md +0 -73
  282. package/docs/project/roadmap.md +0 -87
  283. package/docs/quickstart.md +0 -157
  284. package/docs/runtime/autoimport.md +0 -94
  285. package/docs/runtime/bun-apis.md +0 -207
  286. package/docs/runtime/bunfig.md +0 -772
  287. package/docs/runtime/debugger.md +0 -325
  288. package/docs/runtime/env.md +0 -253
  289. package/docs/runtime/hot.md +0 -145
  290. package/docs/runtime/index.md +0 -312
  291. package/docs/runtime/jsx.md +0 -385
  292. package/docs/runtime/loaders.md +0 -130
  293. package/docs/runtime/modules.md +0 -320
  294. package/docs/runtime/nodejs-apis.md +0 -463
  295. package/docs/runtime/plugins.md +0 -561
  296. package/docs/runtime/shell.md +0 -605
  297. package/docs/runtime/typescript.md +0 -139
  298. package/docs/runtime/web-apis.md +0 -128
  299. package/docs/test/configuration.md +0 -154
  300. package/docs/test/coverage.md +0 -142
  301. package/docs/test/discovery.md +0 -85
  302. package/docs/test/dom.md +0 -75
  303. package/docs/test/examples/concurrent-test-glob.md +0 -132
  304. package/docs/test/hot.md +0 -15
  305. package/docs/test/lifecycle.md +0 -81
  306. package/docs/test/mocks.md +0 -313
  307. package/docs/test/reporters.md +0 -117
  308. package/docs/test/runtime-behavior.md +0 -95
  309. package/docs/test/snapshots.md +0 -68
  310. package/docs/test/time.md +0 -126
  311. package/docs/test/writing.md +0 -825
  312. package/docs/typescript.md +0 -53
@@ -1,825 +0,0 @@
1
- Define tests with a Jest-like API imported from the built-in `bun:test` module. Long term, Bun aims for complete Jest compatibility; at the moment, a [limited set](#matchers) of `expect` matchers are supported.
2
-
3
- ## Basic usage
4
-
5
- To define a simple test:
6
-
7
- ```ts#math.test.ts
8
- import { expect, test } from "bun:test";
9
-
10
- test("2 + 2", () => {
11
- expect(2 + 2).toBe(4);
12
- });
13
- ```
14
-
15
- {% details summary="Jest-style globals" %}
16
- As in Jest, you can use `describe`, `test`, `expect`, and other functions without importing them. Unlike Jest, they are not injected into the global scope. Instead, the Bun transpiler will automatically inject an import from `bun:test` internally.
17
-
18
- ```ts
19
- typeof globalThis.describe; // "undefined"
20
- typeof describe; // "function"
21
- ```
22
-
23
- This transpiler integration only occurs during `bun test`, and only for test files & preloaded scripts. In practice there's no significant difference to the end user.
24
- {% /details %}
25
-
26
- Tests can be grouped into suites with `describe`.
27
-
28
- ```ts#math.test.ts
29
- import { expect, test, describe } from "bun:test";
30
-
31
- describe("arithmetic", () => {
32
- test("2 + 2", () => {
33
- expect(2 + 2).toBe(4);
34
- });
35
-
36
- test("2 * 2", () => {
37
- expect(2 * 2).toBe(4);
38
- });
39
- });
40
- ```
41
-
42
- Tests can be `async`.
43
-
44
- ```ts
45
- import { expect, test } from "bun:test";
46
-
47
- test("2 * 2", async () => {
48
- const result = await Promise.resolve(2 * 2);
49
- expect(result).toEqual(4);
50
- });
51
- ```
52
-
53
- Alternatively, use the `done` callback to signal completion. If you include the `done` callback as a parameter in your test definition, you _must_ call it or the test will hang.
54
-
55
- ```ts
56
- import { expect, test } from "bun:test";
57
-
58
- test("2 * 2", done => {
59
- Promise.resolve(2 * 2).then(result => {
60
- expect(result).toEqual(4);
61
- done();
62
- });
63
- });
64
- ```
65
-
66
- ## Timeouts
67
-
68
- Optionally specify a per-test timeout in milliseconds by passing a number as the third argument to `test`.
69
-
70
- ```ts
71
- import { test } from "bun:test";
72
-
73
- test("wat", async () => {
74
- const data = await slowOperation();
75
- expect(data).toBe(42);
76
- }, 500); // test must run in <500ms
77
- ```
78
-
79
- In `bun:test`, test timeouts throw an uncatchable exception to force the test to stop running and fail. We also kill any child processes that were spawned in the test to avoid leaving behind zombie processes lurking in the background.
80
-
81
- The default timeout for each test is 5000ms (5 seconds) if not overridden by this timeout option or `jest.setDefaultTimeout()`.
82
-
83
- ### 🧟 Zombie process killer
84
-
85
- When a test times out and processes spawned in the test via `Bun.spawn`, `Bun.spawnSync`, or `node:child_process` are not killed, they will be automatically killed and a message will be logged to the console. This prevents zombie processes from lingering in the background after timed-out tests.
86
-
87
- ## `test.skip`
88
-
89
- Skip individual tests with `test.skip`. These tests will not be run.
90
-
91
- ```ts
92
- import { expect, test } from "bun:test";
93
-
94
- test.skip("wat", () => {
95
- // TODO: fix this
96
- expect(0.1 + 0.2).toEqual(0.3);
97
- });
98
- ```
99
-
100
- ## `test.todo`
101
-
102
- Mark a test as a todo with `test.todo`. These tests will not be run.
103
-
104
- ```ts
105
- import { expect, test } from "bun:test";
106
-
107
- test.todo("fix this", () => {
108
- myTestFunction();
109
- });
110
- ```
111
-
112
- To run todo tests and find any which are passing, use `bun test --todo`.
113
-
114
- ```sh
115
- $ bun test --todo
116
- my.test.ts:
117
- ✗ unimplemented feature
118
- ^ this test is marked as todo but passes. Remove `.todo` or check that test is correct.
119
-
120
- 0 pass
121
- 1 fail
122
- 1 expect() calls
123
- ```
124
-
125
- With this flag, failing todo tests will not cause an error, but todo tests which pass will be marked as failing so you can remove the todo mark or
126
- fix the test.
127
-
128
- ## `test.only`
129
-
130
- To run a particular test or suite of tests use `test.only()` or `describe.only()`.
131
-
132
- ```ts
133
- import { test, describe } from "bun:test";
134
-
135
- test("test #1", () => {
136
- // does not run
137
- });
138
-
139
- test.only("test #2", () => {
140
- // runs
141
- });
142
-
143
- describe.only("only", () => {
144
- test("test #3", () => {
145
- // runs
146
- });
147
- });
148
- ```
149
-
150
- The following command will only execute tests #2 and #3.
151
-
152
- ```sh
153
- $ bun test
154
- ```
155
-
156
- ## `test.if`
157
-
158
- To run a test conditionally, use `test.if()`. The test will run if the condition is truthy. This is particularly useful for tests that should only run on specific architectures or operating systems.
159
-
160
- ```ts
161
- test.if(Math.random() > 0.5)("runs half the time", () => {
162
- // ...
163
- });
164
-
165
- const macOS = process.arch === "darwin";
166
- test.if(macOS)("runs on macOS", () => {
167
- // runs if macOS
168
- });
169
- ```
170
-
171
- ## `test.skipIf`
172
-
173
- To instead skip a test based on some condition, use `test.skipIf()` or `describe.skipIf()`.
174
-
175
- ```ts
176
- const macOS = process.arch === "darwin";
177
-
178
- test.skipIf(macOS)("runs on non-macOS", () => {
179
- // runs if *not* macOS
180
- });
181
- ```
182
-
183
- ## `test.todoIf`
184
-
185
- If instead you want to mark the test as TODO, use `test.todoIf()` or `describe.todoIf()`. Carefully choosing `skipIf` or `todoIf` can show a difference between, for example, intent of "invalid for this target" and "planned but not implemented yet."
186
-
187
- ```ts
188
- const macOS = process.arch === "darwin";
189
-
190
- // TODO: we've only implemented this for Linux so far.
191
- test.todoIf(macOS)("runs on posix", () => {
192
- // runs if *not* macOS
193
- });
194
- ```
195
-
196
- ## `test.failing`
197
-
198
- Use `test.failing()` when you know a test is currently failing but you want to track it and be notified when it starts passing. This inverts the test result:
199
-
200
- - A failing test marked with `.failing()` will pass
201
- - A passing test marked with `.failing()` will fail (with a message indicating it's now passing and should be fixed)
202
-
203
- ```ts
204
- // This will pass because the test is failing as expected
205
- test.failing("math is broken", () => {
206
- expect(0.1 + 0.2).toBe(0.3); // fails due to floating point precision
207
- });
208
-
209
- // This will fail with a message that the test is now passing
210
- test.failing("fixed bug", () => {
211
- expect(1 + 1).toBe(2); // passes, but we expected it to fail
212
- });
213
- ```
214
-
215
- This is useful for tracking known bugs that you plan to fix later, or for implementing test-driven development.
216
-
217
- ## Conditional Tests for Describe Blocks
218
-
219
- The conditional modifiers `.if()`, `.skipIf()`, and `.todoIf()` can also be applied to `describe` blocks, affecting all tests within the suite:
220
-
221
- ```ts
222
- const isMacOS = process.platform === "darwin";
223
-
224
- // Only runs the entire suite on macOS
225
- describe.if(isMacOS)("macOS-specific features", () => {
226
- test("feature A", () => {
227
- // only runs on macOS
228
- });
229
-
230
- test("feature B", () => {
231
- // only runs on macOS
232
- });
233
- });
234
-
235
- // Skips the entire suite on Windows
236
- describe.skipIf(process.platform === "win32")("Unix features", () => {
237
- test("feature C", () => {
238
- // skipped on Windows
239
- });
240
- });
241
-
242
- // Marks the entire suite as TODO on Linux
243
- describe.todoIf(process.platform === "linux")("Upcoming Linux support", () => {
244
- test("feature D", () => {
245
- // marked as TODO on Linux
246
- });
247
- });
248
- ```
249
-
250
- ## `test.each` and `describe.each`
251
-
252
- To run the same test with multiple sets of data, use `test.each`. This creates a parametrized test that runs once for each test case provided.
253
-
254
- ```ts
255
- const cases = [
256
- [1, 2, 3],
257
- [3, 4, 7],
258
- ];
259
-
260
- test.each(cases)("%p + %p should be %p", (a, b, expected) => {
261
- expect(a + b).toBe(expected);
262
- });
263
- ```
264
-
265
- You can also use `describe.each` to create a parametrized suite that runs once for each test case:
266
-
267
- ```ts
268
- describe.each([
269
- [1, 2, 3],
270
- [3, 4, 7],
271
- ])("add(%i, %i)", (a, b, expected) => {
272
- test(`returns ${expected}`, () => {
273
- expect(a + b).toBe(expected);
274
- });
275
-
276
- test(`sum is greater than each value`, () => {
277
- expect(a + b).toBeGreaterThan(a);
278
- expect(a + b).toBeGreaterThan(b);
279
- });
280
- });
281
- ```
282
-
283
- ### Argument Passing
284
-
285
- How arguments are passed to your test function depends on the structure of your test cases:
286
-
287
- - If a table row is an array (like `[1, 2, 3]`), each element is passed as an individual argument
288
- - If a row is not an array (like an object), it's passed as a single argument
289
-
290
- ```ts
291
- // Array items passed as individual arguments
292
- test.each([
293
- [1, 2, 3],
294
- [4, 5, 9],
295
- ])("add(%i, %i) = %i", (a, b, expected) => {
296
- expect(a + b).toBe(expected);
297
- });
298
-
299
- // Object items passed as a single argument
300
- test.each([
301
- { a: 1, b: 2, expected: 3 },
302
- { a: 4, b: 5, expected: 9 },
303
- ])("add($a, $b) = $expected", data => {
304
- expect(data.a + data.b).toBe(data.expected);
305
- });
306
- ```
307
-
308
- ### Format Specifiers
309
-
310
- There are a number of options available for formatting the test title:
311
-
312
- {% table %}
313
-
314
- ---
315
-
316
- - `%p`
317
- - [`pretty-format`](https://www.npmjs.com/package/pretty-format)
318
-
319
- ---
320
-
321
- - `%s`
322
- - String
323
-
324
- ---
325
-
326
- - `%d`
327
- - Number
328
-
329
- ---
330
-
331
- - `%i`
332
- - Integer
333
-
334
- ---
335
-
336
- - `%f`
337
- - Floating point
338
-
339
- ---
340
-
341
- - `%j`
342
- - JSON
343
-
344
- ---
345
-
346
- - `%o`
347
- - Object
348
-
349
- ---
350
-
351
- - `%#`
352
- - Index of the test case
353
-
354
- ---
355
-
356
- - `%%`
357
- - Single percent sign (`%`)
358
-
359
- {% /table %}
360
-
361
- #### Examples
362
-
363
- ```ts
364
- // Basic specifiers
365
- test.each([
366
- ["hello", 123],
367
- ["world", 456],
368
- ])("string: %s, number: %i", (str, num) => {
369
- // "string: hello, number: 123"
370
- // "string: world, number: 456"
371
- });
372
-
373
- // %p for pretty-format output
374
- test.each([
375
- [{ name: "Alice" }, { a: 1, b: 2 }],
376
- [{ name: "Bob" }, { x: 5, y: 10 }],
377
- ])("user %p with data %p", (user, data) => {
378
- // "user { name: 'Alice' } with data { a: 1, b: 2 }"
379
- // "user { name: 'Bob' } with data { x: 5, y: 10 }"
380
- });
381
-
382
- // %# for index
383
- test.each(["apple", "banana"])("fruit #%# is %s", fruit => {
384
- // "fruit #0 is apple"
385
- // "fruit #1 is banana"
386
- });
387
- ```
388
-
389
- ## Assertion Counting
390
-
391
- Bun supports verifying that a specific number of assertions were called during a test:
392
-
393
- ### expect.hasAssertions()
394
-
395
- Use `expect.hasAssertions()` to verify that at least one assertion is called during a test:
396
-
397
- ```ts
398
- test("async work calls assertions", async () => {
399
- expect.hasAssertions(); // Will fail if no assertions are called
400
-
401
- const data = await fetchData();
402
- expect(data).toBeDefined();
403
- });
404
- ```
405
-
406
- This is especially useful for async tests to ensure your assertions actually run.
407
-
408
- ### expect.assertions(count)
409
-
410
- Use `expect.assertions(count)` to verify that a specific number of assertions are called during a test:
411
-
412
- ```ts
413
- test("exactly two assertions", () => {
414
- expect.assertions(2); // Will fail if not exactly 2 assertions are called
415
-
416
- expect(1 + 1).toBe(2);
417
- expect("hello").toContain("ell");
418
- });
419
- ```
420
-
421
- This helps ensure all your assertions run, especially in complex async code with multiple code paths.
422
-
423
- ## Type Testing
424
-
425
- Bun includes `expectTypeOf` for testing typescript types, compatible with Vitest.
426
-
427
- ### expectTypeOf
428
-
429
- {% callout %}
430
-
431
- **Note** — These functions are no-ops at runtime - you need to run TypeScript separately to verify the type checks.
432
-
433
- {% endcallout %}
434
-
435
- The `expectTypeOf` function provides type-level assertions that are checked by TypeScript's type checker. **Important**:
436
-
437
- To test your types:
438
-
439
- 1. Write your type assertions using `expectTypeOf`
440
- 2. Run `bunx tsc --noEmit` to check that your types are correct
441
-
442
- ```ts
443
- import { expectTypeOf } from "bun:test";
444
-
445
- // Basic type assertions
446
- expectTypeOf<string>().toEqualTypeOf<string>();
447
- expectTypeOf(123).toBeNumber();
448
- expectTypeOf("hello").toBeString();
449
-
450
- // Object type matching
451
- expectTypeOf({ a: 1, b: "hello" }).toMatchObjectType<{ a: number }>();
452
-
453
- // Function types
454
- function greet(name: string): string {
455
- return `Hello ${name}`;
456
- }
457
-
458
- expectTypeOf(greet).toBeFunction();
459
- expectTypeOf(greet).parameters.toEqualTypeOf<[string]>();
460
- expectTypeOf(greet).returns.toEqualTypeOf<string>();
461
-
462
- // Array types
463
- expectTypeOf([1, 2, 3]).items.toBeNumber();
464
-
465
- // Promise types
466
- expectTypeOf(Promise.resolve(42)).resolves.toBeNumber();
467
- ```
468
-
469
- For full documentation on expectTypeOf matchers, see the [API Reference](/reference/bun/test/expectTypeOf)
470
-
471
- ## Matchers
472
-
473
- Bun implements the following matchers. Full Jest compatibility is on the roadmap; track progress [here](https://github.com/oven-sh/bun/issues/1825).
474
-
475
- {% table %}
476
-
477
- ---
478
-
479
- - ✅
480
- - [`.not`](https://jestjs.io/docs/expect#not)
481
-
482
- ---
483
-
484
- - ✅
485
- - [`.toBe()`](https://jestjs.io/docs/expect#tobevalue)
486
-
487
- ---
488
-
489
- - ✅
490
- - [`.toEqual()`](https://jestjs.io/docs/expect#toequalvalue)
491
-
492
- ---
493
-
494
- - ✅
495
- - [`.toBeNull()`](https://jestjs.io/docs/expect#tobenull)
496
-
497
- ---
498
-
499
- - ✅
500
- - [`.toBeUndefined()`](https://jestjs.io/docs/expect#tobeundefined)
501
-
502
- ---
503
-
504
- - ✅
505
- - [`.toBeNaN()`](https://jestjs.io/docs/expect#tobenan)
506
-
507
- ---
508
-
509
- - ✅
510
- - [`.toBeDefined()`](https://jestjs.io/docs/expect#tobedefined)
511
-
512
- ---
513
-
514
- - ✅
515
- - [`.toBeFalsy()`](https://jestjs.io/docs/expect#tobefalsy)
516
-
517
- ---
518
-
519
- - ✅
520
- - [`.toBeTruthy()`](https://jestjs.io/docs/expect#tobetruthy)
521
-
522
- ---
523
-
524
- - ✅
525
- - [`.toContain()`](https://jestjs.io/docs/expect#tocontainitem)
526
-
527
- ---
528
-
529
- - ✅
530
- - [`.toContainAllKeys()`](https://jest-extended.jestcommunity.dev/docs/matchers/Object#tocontainallkeyskeys)
531
-
532
- ---
533
-
534
- - ✅
535
- - [`.toContainValue()`](https://jest-extended.jestcommunity.dev/docs/matchers/Object#tocontainvaluevalue)
536
-
537
- ---
538
-
539
- - ✅
540
- - [`.toContainValues()`](https://jest-extended.jestcommunity.dev/docs/matchers/Object#tocontainvaluesvalues)
541
-
542
- ---
543
-
544
- - ✅
545
- - [`.toContainAllValues()`](https://jest-extended.jestcommunity.dev/docs/matchers/Object#tocontainallvaluesvalues)
546
-
547
- ---
548
-
549
- - ✅
550
- - [`.toContainAnyValues()`](https://jest-extended.jestcommunity.dev/docs/matchers/Object#tocontainanyvaluesvalues)
551
-
552
- ---
553
-
554
- - ✅
555
- - [`.toStrictEqual()`](https://jestjs.io/docs/expect#tostrictequalvalue)
556
-
557
- ---
558
-
559
- - ✅
560
- - [`.toThrow()`](https://jestjs.io/docs/expect#tothrowerror)
561
-
562
- ---
563
-
564
- - ✅
565
- - [`.toHaveLength()`](https://jestjs.io/docs/expect#tohavelengthnumber)
566
-
567
- ---
568
-
569
- - ✅
570
- - [`.toHaveProperty()`](https://jestjs.io/docs/expect#tohavepropertykeypath-value)
571
-
572
- ---
573
-
574
- - ✅
575
- - [`.extend`](https://jestjs.io/docs/expect#expectextendmatchers)
576
-
577
- ---
578
-
579
- - ✅
580
- - [`.anything()`](https://jestjs.io/docs/expect#expectanything)
581
-
582
- ---
583
-
584
- - ✅
585
- - [`.any()`](https://jestjs.io/docs/expect#expectanyconstructor)
586
-
587
- ---
588
-
589
- - ✅
590
- - [`.arrayContaining()`](https://jestjs.io/docs/expect#expectarraycontainingarray)
591
-
592
- ---
593
-
594
- - ✅
595
- - [`.assertions()`](https://jestjs.io/docs/expect#expectassertionsnumber)
596
-
597
- ---
598
-
599
- - ✅
600
- - [`.closeTo()`](https://jestjs.io/docs/expect#expectclosetonumber-numdigits)
601
-
602
- ---
603
-
604
- - ✅
605
- - [`.hasAssertions()`](https://jestjs.io/docs/expect#expecthasassertions)
606
-
607
- ---
608
-
609
- - ✅
610
- - [`.objectContaining()`](https://jestjs.io/docs/expect#expectobjectcontainingobject)
611
-
612
- ---
613
-
614
- - ✅
615
- - [`.stringContaining()`](https://jestjs.io/docs/expect#expectstringcontainingstring)
616
-
617
- ---
618
-
619
- - ✅
620
- - [`.stringMatching()`](https://jestjs.io/docs/expect#expectstringmatchingstring--regexp)
621
-
622
- ---
623
-
624
- - ❌
625
- - [`.addSnapshotSerializer()`](https://jestjs.io/docs/expect#expectaddsnapshotserializerserializer)
626
-
627
- ---
628
-
629
- - ✅
630
- - [`.resolves()`](https://jestjs.io/docs/expect#resolves)
631
-
632
- ---
633
-
634
- - ✅
635
- - [`.rejects()`](https://jestjs.io/docs/expect#rejects)
636
-
637
- ---
638
-
639
- - ✅
640
- - [`.toHaveBeenCalled()`](https://jestjs.io/docs/expect#tohavebeencalled)
641
-
642
- ---
643
-
644
- - ✅
645
- - [`.toHaveBeenCalledTimes()`](https://jestjs.io/docs/expect#tohavebeencalledtimesnumber)
646
-
647
- ---
648
-
649
- - ✅
650
- - [`.toHaveBeenCalledWith()`](https://jestjs.io/docs/expect#tohavebeencalledwitharg1-arg2-)
651
-
652
- ---
653
-
654
- - ✅
655
- - [`.toHaveBeenLastCalledWith()`](https://jestjs.io/docs/expect#tohavebeenlastcalledwitharg1-arg2-)
656
-
657
- ---
658
-
659
- - ✅
660
- - [`.toHaveBeenNthCalledWith()`](https://jestjs.io/docs/expect#tohavebeennthcalledwithnthcall-arg1-arg2-)
661
-
662
- ---
663
-
664
- - ✅
665
- - [`.toHaveReturned()`](https://jestjs.io/docs/expect#tohavereturned)
666
-
667
- ---
668
-
669
- - ✅
670
- - [`.toHaveReturnedTimes()`](https://jestjs.io/docs/expect#tohavereturnedtimesnumber)
671
-
672
- ---
673
-
674
- - ✅
675
- - [`.toHaveReturnedWith()`](https://jestjs.io/docs/expect#tohavereturnedwithvalue)
676
-
677
- ---
678
-
679
- - ✅
680
- - [`.toHaveLastReturnedWith()`](https://jestjs.io/docs/expect#tohavelastreturnedwithvalue)
681
-
682
- ---
683
-
684
- - ✅
685
- - [`.toHaveNthReturnedWith()`](https://jestjs.io/docs/expect#tohaventhreturnedwithnthcall-value)
686
-
687
- ---
688
-
689
- - ✅
690
- - [`.toBeCloseTo()`](https://jestjs.io/docs/expect#tobeclosetonumber-numdigits)
691
-
692
- ---
693
-
694
- - ✅
695
- - [`.toBeGreaterThan()`](https://jestjs.io/docs/expect#tobegreaterthannumber--bigint)
696
-
697
- ---
698
-
699
- - ✅
700
- - [`.toBeGreaterThanOrEqual()`](https://jestjs.io/docs/expect#tobegreaterthanorequalnumber--bigint)
701
-
702
- ---
703
-
704
- - ✅
705
- - [`.toBeLessThan()`](https://jestjs.io/docs/expect#tobelessthannumber--bigint)
706
-
707
- ---
708
-
709
- - ✅
710
- - [`.toBeLessThanOrEqual()`](https://jestjs.io/docs/expect#tobelessthanorequalnumber--bigint)
711
-
712
- ---
713
-
714
- - ✅
715
- - [`.toBeInstanceOf()`](https://jestjs.io/docs/expect#tobeinstanceofclass)
716
-
717
- ---
718
-
719
- - ✅
720
- - [`.toContainEqual()`](https://jestjs.io/docs/expect#tocontainequalitem)
721
-
722
- ---
723
-
724
- - ✅
725
- - [`.toMatch()`](https://jestjs.io/docs/expect#tomatchregexp--string)
726
-
727
- ---
728
-
729
- - ✅
730
- - [`.toMatchObject()`](https://jestjs.io/docs/expect#tomatchobjectobject)
731
-
732
- ---
733
-
734
- - ✅
735
- - [`.toMatchSnapshot()`](https://jestjs.io/docs/expect#tomatchsnapshotpropertymatchers-hint)
736
-
737
- ---
738
-
739
- - ✅
740
- - [`.toMatchInlineSnapshot()`](https://jestjs.io/docs/expect#tomatchinlinesnapshotpropertymatchers-inlinesnapshot)
741
-
742
- ---
743
-
744
- - ✅
745
- - [`.toThrowErrorMatchingSnapshot()`](https://jestjs.io/docs/expect#tothrowerrormatchingsnapshothint)
746
-
747
- ---
748
-
749
- - ✅
750
- - [`.toThrowErrorMatchingInlineSnapshot()`](https://jestjs.io/docs/expect#tothrowerrormatchinginlinesnapshotinlinesnapshot)
751
-
752
- {% /table %}
753
-
754
- ## TypeScript Type Safety
755
-
756
- Bun's test runner provides enhanced TypeScript support with intelligent type checking for your test assertions. The type system helps catch potential bugs at compile time while still allowing flexibility when needed.
757
-
758
- ### Strict Type Checking by Default
759
-
760
- By default, Bun's test matchers enforce strict type checking between the actual value and expected value:
761
-
762
- ```ts
763
- import { expect, test } from "bun:test";
764
-
765
- test("strict typing", () => {
766
- const str = "hello";
767
- const num = 42;
768
-
769
- expect(str).toBe("hello"); // ✅ OK: string to string
770
- expect(num).toBe(42); // ✅ OK: number to number
771
- expect(str).toBe(42); // ❌ TypeScript error: string vs number
772
- });
773
- ```
774
-
775
- This helps catch common mistakes where you might accidentally compare values of different types.
776
-
777
- ### Relaxed Type Checking with Type Parameters
778
-
779
- Sometimes you need more flexibility in your tests, especially when working with:
780
-
781
- - Dynamic data from APIs
782
- - Polymorphic functions that can return multiple types
783
- - Generic utility functions
784
- - Migration of existing test suites
785
-
786
- For these cases, you can "opt out" of strict type checking by providing an explicit type parameter to matcher methods:
787
-
788
- ```ts
789
- import { expect, test } from "bun:test";
790
-
791
- test("relaxed typing with type parameters", () => {
792
- const value: unknown = getSomeValue();
793
-
794
- // These would normally cause TypeScript errors, but type parameters allow them:
795
- expect(value).toBe<number>(42); // No TS error, runtime check still works
796
- expect(value).toEqual<string>("hello"); // No TS error, runtime check still works
797
- expect(value).toStrictEqual<boolean>(true); // No TS error, runtime check still works
798
- });
799
-
800
- test("useful for dynamic data", () => {
801
- const apiResponse: any = { status: "success" };
802
-
803
- // Without type parameter: TypeScript error (any vs string)
804
- // expect(apiResponse.status).toBe("success");
805
-
806
- // With type parameter: No TypeScript error, runtime assertion still enforced
807
- expect(apiResponse.status).toBe<string>("success"); // ✅ OK
808
- });
809
- ```
810
-
811
- ### Migration from Looser Type Systems
812
-
813
- If migrating from a test framework with looser TypeScript integration, you can use type parameters as a stepping stone:
814
-
815
- ```ts
816
- // Old Jest test that worked but wasn't type-safe
817
- expect(response.data).toBe(200); // No type error in some setups
818
-
819
- // Bun equivalent with explicit typing during migration
820
- expect(response.data).toBe<number>(200); // Explicit about expected type
821
-
822
- // Ideal Bun test after refactoring
823
- const statusCode: number = response.data;
824
- expect(statusCode).toBe(200); // Type-safe without explicit parameter
825
- ```