Compare commits

..

175 Commits

Author SHA1 Message Date
Meghan Denny
4e711ff26a fix the args order here 2024-09-06 23:26:01 -07:00
Meghan Denny
25f998f024 bring back this error handling 2024-09-06 23:25:50 -07:00
Meghan Denny
bfd22b81c4 make this not a magic number 2024-09-06 20:31:44 -07:00
Meghan Denny
6d9554c220 add emulation of these internal fields 2024-09-06 20:31:33 -07:00
Meghan Denny
18660fad49 align internal name of zlib.Base to be ZlibBase like node 2024-09-06 19:32:56 -07:00
Meghan Denny
8a432bd1f2 fix memory leak when passing strings to zlib.crc32 2024-09-06 19:31:57 -07:00
Meghan Denny
8cd515f533 node:zlib: move deflate and gzip into native code (#11770)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-09-06 18:49:19 -07:00
Jarred Sumner
1458fcca4a Run formatter 2024-09-06 18:13:08 -07:00
Jarred Sumner
4dbd246c49 Update 7-install-crash-report.yml 2024-09-06 18:01:03 -07:00
Jarred Sumner
17553e8ea3 Update 7-install-crash-report.yml 2024-09-06 18:00:14 -07:00
Jarred Sumner
2507ff515a Update 7-install-crash-report.yml 2024-09-06 17:58:58 -07:00
Ciro Spaciari
1011b44d78 fix(node:http) implement request.setTimeout and server.setTimeout (#13772)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-09-06 17:52:38 -07:00
Ashcon Partovi
cbb57e5c5b Fix bun run being terminated randomly in CI
This was basically a chaos monkey in our CI
2024-09-06 17:37:49 -07:00
Jarred Sumner
ed6554314e github actions 2024-09-06 17:28:19 -07:00
Jarred Sumner
bd38aaab36 Update sqlite3_local.h 2024-09-06 17:25:51 -07:00
Jarred Sumner
6fe2d99a51 Github actions 2024-09-06 17:18:28 -07:00
Jarred Sumner
e8c65a009f clang fmt github action (#13724) 2024-09-06 17:15:07 -07:00
Jarred Sumner
3f9ad7cefc Add a debug assertion 2024-09-06 16:58:08 -07:00
Jarred Sumner
69f97cecf0 Ensure shell keeps process alive while running (#13777) 2024-09-06 16:28:50 -07:00
Meghan Denny
ed7741a662 node:https: provide proper Agent definition (#11826)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-09-06 16:11:19 -07:00
Jarred Sumner
9adf42b373 Handle oom in Buffer.byteLength (#13746) 2024-09-06 14:38:55 -07:00
Jarred Sumner
d3bc0ca722 Add if workers spawned / terminated to crash reports (#13763) 2024-09-06 14:34:33 -07:00
Jarred Sumner
debaa2cc34 Fix CTRL + C behavior in bun run so it doesn't ^[[A (#13762) 2024-09-06 13:54:01 -07:00
Jarred Sumner
ea12db4084 Deflake a test 2024-09-06 13:49:26 -07:00
Meghan Denny
981f1d4a60 fix bad translation in child-process-exec-timeout-kill.test.js (#13765) 2024-09-06 13:26:57 -07:00
Pham Minh Triet
419277f691 fix small typo in semver.md (#13767) 2024-09-06 13:26:20 -07:00
190n
da2a5661af Increase randomIntegrityAuditRate from 0.05 to 1.0 in CI (#13775) 2024-09-06 13:03:23 -07:00
Ciro Spaciari
d8e2c24d70 fix(fetch) fix lifecycle of SSL Proxy, fix lifecycle of tls_props, fix handling chunked encoded redirects when proxing. (#13752) 2024-09-06 01:50:02 -07:00
マルコメ
6010c33137 Add .toml extension to .gitattributes (#13761) 2024-09-05 23:52:12 -07:00
Ciro Spaciari
36c5f843ec feat(tls) add duplex upgrade (#13718) 2024-09-05 19:37:31 -07:00
Jarred Sumner
d38fc909e3 Support ReadableStream in request.clone & response.clone() (#13744) 2024-09-05 17:55:59 -07:00
Solomon ogu
cd7f6a1589 fix: typo in docs and types for sqlite (#13727) 2024-09-04 15:46:05 -07:00
Jarred Sumner
a9cf463eeb Introduce fast path for buffered ReadableStream (#13704)
Co-authored-by: Jarred-Sumner <Jarred-Sumner@users.noreply.github.com>
2024-09-04 04:16:47 -07:00
Jarred Sumner
f3da37e486 Fixes #13725 2024-09-04 03:26:11 -07:00
Jarred Sumner
ebe070487b github actions 2024-09-03 21:51:04 -07:00
Jarred Sumner
f4539431a0 Update format.yml 2024-09-03 21:44:29 -07:00
Jarred Sumner
c91afdb35c Github actions 2024-09-03 21:43:34 -07:00
Jarred Sumner
128d69dcbe Update format.yml 2024-09-03 21:34:52 -07:00
Jarred Sumner
cd6785771e run prettier and add back format action (#13722) 2024-09-03 21:32:52 -07:00
Jarred Sumner
5108e3e0d9 Add snapshot tests for dependency/version parsing (#13658) 2024-09-02 15:12:00 -07:00
Wilmer Paulino
bd3e62df40 Use JSMapIterator and JSSetIterator for deep equal comparisons (#13674) 2024-09-02 15:10:33 -07:00
Jarred Sumner
1668fde0a9 Support hot reloading when .css or any other imported file changes (#13665) 2024-09-02 15:07:25 -07:00
Jarred Sumner
12174e0577 Call cancel on ReadableStream when Bun.serve() response is aborted (#13687) 2024-09-02 09:40:03 -07:00
Jarred Sumner
c50f8d82d5 Remove outdated callout
Still very active! More stable though.
2024-09-02 05:07:05 -07:00
Jarred Sumner
d30767ea68 Fix crash when throwing an exception from napi (#13664) 2024-09-02 05:00:46 -07:00
Jarred Sumner
6b30c1b30d Add missing OOM exception check in Bun.escapeHTML (#13677) 2024-09-01 23:37:07 -07:00
Jarred Sumner
b64f1e15b5 Fixes #13629 (#13660) 2024-09-01 22:40:31 -07:00
Jarred Sumner
5f6015bb79 Fixes #13657 (#13667) 2024-09-01 18:21:34 -07:00
Jarred Sumner
f123814d87 Fix missing ERR_INVALID_ARG_TYPE in 2 buffer methods (#13617) 2024-09-01 04:40:14 -07:00
Jarred Sumner
ef4bcb314c Use -mmacos-version-min instead of -mmacosx-version-min (#13640) 2024-09-01 04:39:32 -07:00
Mohit Srivastava
fd2ad27b6f Change contributing docs to use llvm 18 on macos (#13651) 2024-09-01 00:31:45 -07:00
Jarred Sumner
03de99afcf Add tests for static routes + support server.reload for static routes (#13643) 2024-08-31 03:32:08 -07:00
Wilmer Paulino
9ba63eb522 Fix AES-GCM encryption of empty messages (#13646) 2024-08-31 02:29:16 -07:00
Ciro Spaciari
bac38b8967 fix(tls/fetch) Better SSLWrapper for http proxy and start of Duplex support on tls (#12750)
Co-authored-by: cirospaciari <cirospaciari@users.noreply.github.com>
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-08-30 23:22:58 -07:00
Wilmer Paulino
76c4145f0e Return expected data when using Promises with crypto.generateKeyPair (#13600)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-08-30 20:14:47 -07:00
Ciro Spaciari
adb54f1849 fix(Server) handle requestIP after async call (#13532)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-08-30 19:13:53 -07:00
Jarred Sumner
0f4aa68575 Bump build.zig minimum to macOS 13 (#13639) 2024-08-30 19:12:53 -07:00
Jarred Sumner
6555248a04 Make the V8_UNIMPLEMENTED error include the function name (#13559)
Co-authored-by: 190n <ben@bun.sh>
2024-08-30 18:52:08 -07:00
Jarred Sumner
2f19b71e0f Bump WebKit again (#13641) 2024-08-30 18:18:29 -07:00
Jarred Sumner
9076b369f0 Fixes #4432 (#13597) 2024-08-30 18:01:32 -07:00
Ciro Spaciari
9cb203f229 update(root_certs) update certs (#13609) 2024-08-30 16:51:09 -07:00
Félix C. Morency
5650ed470c fix: lcov non-hit executable lines reporting (#13633) 2024-08-30 16:08:23 -07:00
Jarred Sumner
fc99dd27e3 Un-revert read .gitconfig (#13637)
Co-authored-by: Dylan Conway <dylan.conway567@gmail.com>
2024-08-30 16:04:47 -07:00
Jarred Sumner
4d61637e8a Deflake bun-build-api test (#13636) 2024-08-30 14:59:47 -07:00
Michael H
aed0f58dfc bun install global package include -g flag in untrusted message (#13626) 2024-08-30 14:58:41 -07:00
Jarred Sumner
a37694cec2 Fix hypothetical race condition in Bun.build API (#13618) 2024-08-30 14:56:59 -07:00
Jarred Sumner
b52f9923e2 Delete macOS 10.5 support polyfills (#13635) 2024-08-30 14:47:31 -07:00
Jarred Sumner
1bed7a7fd1 Introduce static option in Bun.serve() (#13540) 2024-08-30 01:36:18 -07:00
Grigory
59eb5515c5 fix(nodevm): align behavior with node (#13590) 2024-08-30 01:34:18 -07:00
Jarred Sumner
682b3730a1 Revert "fix overriding sshCommand and askpass from gitconfig" (#13620) 2024-08-30 00:59:00 -07:00
Ciro Spaciari
bd3c258af4 fix(FormData, Bun.file()) FormData can append file slices, Bun.file(..).slice(..).text() works as expected (#13580)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-08-30 00:53:40 -07:00
Dylan Conway
9faaa9b982 fix overriding sshCommand and askpass from gitconfig (#13612) 2024-08-30 00:49:49 -07:00
Jarred Sumner
bd2eb40a39 Fix oom handling in Bun.file (#13603) 2024-08-29 18:54:33 -07:00
Dylan Conway
f3ed9eac4a fix(outdated): match scoped names with * (#13610) 2024-08-29 16:06:41 -07:00
Jarred Sumner
b55670ddb7 Fixes #10084 (#13601) 2024-08-29 11:02:34 -07:00
Ashcon Partovi
39eecc7757 Disable auto-labeler for now 2024-08-29 11:00:57 -07:00
Jarred Sumner
6faf657e32 Implement --max-http-header-size (#13577) 2024-08-29 00:38:47 -07:00
Jarred Sumner
e48369ddab Fixes #4443 (#13596) 2024-08-28 21:17:06 -07:00
Jarred Sumner
743f40b473 Make the panic message better when this assertion failure happens (#13579) 2024-08-28 19:07:22 -07:00
Jarred Sumner
b4e552dbeb WebKit upgrade (#13578) 2024-08-28 19:06:29 -07:00
Jarred Sumner
952d44b675 Fixes #13581 (#13583) 2024-08-28 13:54:57 -07:00
Jake Boone
8cb0b5db21 Fix alignment in bun outdated example grid (#13573) 2024-08-27 17:52:00 -07:00
Dylan Conway
1976e5bc00 fix #13563 and #12440 (#13575) 2024-08-27 17:46:16 -07:00
Jarred Sumner
f520715622 Update label-issue.ts 2024-08-27 14:13:21 -07:00
Jarred Sumner
a4264cef23 Update label-issue.ts 2024-08-27 03:56:06 -07:00
Jarred Sumner
09f002934c Update labeled.yml 2024-08-27 03:53:05 -07:00
Jarred Sumner
89dfe9beb6 Update label-issue.ts 2024-08-27 03:43:57 -07:00
Jarred Sumner
4ac415f58d Update labeled.yml 2024-08-27 03:39:13 -07:00
Jarred Sumner
acd8567fa0 Add issue labeler 2024-08-27 03:37:42 -07:00
Dylan Conway
ba2ea6fbb2 add --filter and package pattern arguments to bun outdated (#13557) 2024-08-27 00:18:27 -07:00
Pocky
36c621b6b1 docs: sync Statement.all and Statement.get docs with types (#13544) 2024-08-26 18:30:22 -07:00
Pocky
bab5fec95f Fix Date in SQLite Example Comment (#13558) 2024-08-26 18:29:34 -07:00
Jake Bailey
e6b30a90de Use more compatible screen clearing ANSI escape (#13553) 2024-08-26 18:17:31 -07:00
Jarred Sumner
fea302ee1d Add missing destroySoon (#13555) 2024-08-26 18:09:05 -07:00
Jarred Sumner
2ffcccc5b4 Fixes #5591 (#13541) 2024-08-26 16:09:48 -07:00
Ciro Spaciari
11d7a9d5e9 fix(randomInt) allow negatives and improve args validation (#13527) 2024-08-25 23:16:25 -07:00
Jarred Sumner
55cdf69415 Make the error better on Windows when you do Bun.file(path).writer() (#13536) 2024-08-25 22:29:52 -07:00
Jarred Sumner
ac8f9052a2 Deflake fs.test.ts (#13538) 2024-08-25 21:43:16 -07:00
Jarred Sumner
5a525d3042 Deflake test/js/web/fetch/fetch-tcp-stress.test.ts (#13537) 2024-08-25 21:24:36 -07:00
Ciro Spaciari
6fd06dd023 fix(Bun.serve) ensure timeout reset when we write data (#13525) 2024-08-25 20:27:49 -07:00
Ciro Spaciari
df9d18659c revert d8ac4c59ff 2024-08-25 19:43:24 -07:00
Ciro Spaciari
d8ac4c59ff deflaky 2024-08-25 19:35:35 -07:00
Ciro Spaciari
3309a8479c temporary disable this 2024-08-25 13:44:18 -07:00
Ashcon Partovi
3896b0e29f Fix build-bun.sh 2024-08-25 09:48:38 -07:00
Ashcon Partovi
c4f4d7c872 Fix build-bun.sh 2024-08-25 09:29:29 -07:00
Ashcon Partovi
ebdd678da5 Upload features.json to Buildkite 2024-08-25 09:19:42 -07:00
github-actions[bot]
7529cd76b5 Bump to 1.1.26 (#13504)
Co-authored-by: Jarred-Sumner <Jarred-Sumner@users.noreply.github.com>
2024-08-24 16:12:43 -07:00
Jarred Sumner
9eeef3f5df Update release.yml 2024-08-24 01:29:28 -07:00
Jarred Sumner
2b1a10629b Update upload-npm.ts 2024-08-24 01:22:33 -07:00
Jarred Sumner
0a37423baf Expose subscriberCount in WebSocket server (#13498) 2024-08-23 23:12:01 -07:00
Dylan Conway
1a9307da08 bun outdated docs (#13497)
Co-authored-by: Zack Radisic <zack@theradisic.com>
2024-08-23 23:11:52 -07:00
Jarred Sumner
b005ef43d4 Deflake fs.test.ts 2024-08-23 22:55:30 -07:00
Jarred Sumner
078fdd3787 Make the test runner work on older versions of Bun 2024-08-23 22:55:12 -07:00
Jarred Sumner
dc58c42453 Fix test harness in older versions 2024-08-23 22:48:49 -07:00
Jarred Sumner
b53c25e5f8 Redo napi cleanup hooks (#13487) 2024-08-23 21:09:56 -07:00
Jarred Sumner
e97c65fd1e Add 59 more node tests + copy node test fixtures (#13495) 2024-08-23 19:06:35 -07:00
Ciro Spaciari
5a108c5027 fix(fetch) always make sure that abort tracker is cleaned, revise ref count (#13459) 2024-08-23 17:08:57 -07:00
Jarred Sumner
0f1d5d5dab Align getMockName and mockName behavior with jest (#13494) 2024-08-23 15:46:04 -07:00
Dylan Conway
6415cc3e92 implement bun outdated (#13461)
Co-authored-by: Zack Radisic <zack@theradisic.com>
2024-08-23 02:15:13 -07:00
Jarred Sumner
8d34846d19 Bump 2024-08-23 01:13:55 -07:00
Jarred Sumner
781998cf00 You shouldn't need --only to only run test.only tests (#13465) 2024-08-23 00:06:57 -07:00
Jarred Sumner
02a75070fb Preserve "use strict"; directive in CommonJS modules at top of file (#13485) 2024-08-22 23:51:27 -07:00
Jarred Sumner
ac8db43485 Throw ERR_INVALID_THIS in DOM types (#13484) 2024-08-22 23:25:41 -07:00
Jarred Sumner
94ee538dc6 About 13% of node's test suite (#13468) 2024-08-22 18:00:25 -07:00
Dylan Conway
9cdda49485 fix(node:util): use Object.setPrototypeOf in inherits (#13480) 2024-08-22 17:58:00 -07:00
Jarred Sumner
2c84840222 Fix crash in buffer found in node tests (#13460) 2024-08-22 16:16:25 -07:00
Jarred Sumner
dafa9946e4 Disable DOMJIT for crypto.getRandomValues() (#13470) 2024-08-22 15:52:38 -07:00
Ciro Spaciari
74d5b93ffc fix(dns.resolveSrv) (#13478) 2024-08-22 15:36:22 -07:00
Jarred Sumner
886c31f0c5 Fix expect.assertions() and done callback (#13463) 2024-08-22 15:26:58 -07:00
Jarred Sumner
1bac09488d Copy some node tests (#13458) 2024-08-21 23:09:09 -07:00
Jarred Sumner
83a256013f Support asymmetric matchers in expect().toThrow (#13455) 2024-08-21 21:06:05 -07:00
Ciro Spaciari
384988f26c feat(Bun.serve idleTimeout) allow custom timeouts (#13453) 2024-08-21 18:13:03 -07:00
190n
fe62a61404 Fix V8 API memory management and implement more APIs (#13426) 2024-08-20 19:32:44 -07:00
Jarred Sumner
ef8fd12e43 Include "name" and lastModified when console.log'ing Blob or File (#13435) 2024-08-20 19:27:38 -07:00
Jarred Sumner
999324a50c Add standalone_executable to crash reporter feature list (#13431) 2024-08-20 19:25:45 -07:00
Ciro Spaciari
8ace981fbc fix(node:http/node:https) emit continue (#13434) 2024-08-20 17:10:21 -07:00
Jarred Sumner
02ff16d95c Support Worker, relative file paths in standalone executables, and partially directories (#13421) 2024-08-20 13:05:40 -07:00
Ciro Spaciari
1d188dbc55 fix(subprocess) use deref and use new (#13429) 2024-08-20 12:45:46 -07:00
Jarred Sumner
f16d802eb1 Implement V8::String::{Utf8Length, IsOneByte, ContainsOnlyOneByte, IsExternal, IsExternalTwoByte, IsExternalOneByte} (#13417) 2024-08-20 11:51:23 -07:00
Ciro Spaciari
eb8ed27a4a fix(ipc/subprocess) (#13414)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-08-20 05:19:23 -07:00
190n
5eb053fa3b Use bun instead of npm even for Node.js build in V8 tests (#13352)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-08-19 19:06:12 -07:00
Ciro Spaciari
f9af7be5ae fix(net) make sure to always end the connection when destroy is called (#13412) 2024-08-19 15:55:05 -07:00
Ciro Spaciari
1367e5e85a fix(ipc) fix closing edge case (#13413) 2024-08-19 15:53:36 -07:00
Jarred Sumner
d55b5cc169 Enable reusePort in Bun.serve() by default when using node:cluster (#13381) 2024-08-18 22:34:58 -07:00
Dylan Conway
fa2e00f109 fix freeing semver ranges (#13399) 2024-08-18 22:34:38 -07:00
Roman
9993d72fee docs: remove extra assignment (#13389) 2024-08-18 10:52:00 -07:00
Meghan Denny
fd75ca7585 implement node:cluster (#11492)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
Co-authored-by: nektro <nektro@users.noreply.github.com>
Co-authored-by: cirospaciari <ciro.spaciari@gmail.com>
2024-08-18 00:12:42 -07:00
Jarred Sumner
a53db001db Fixes #13343 (#13360) 2024-08-17 20:22:12 -07:00
Jarred Sumner
1a5c05adca Another attempt to fix aarch64 mock module test failure (#13356) 2024-08-17 18:10:35 -07:00
Zack Radisic
58d02e467f Fix shell backticks crash (#13375) 2024-08-17 18:07:03 -07:00
Ciro Spaciari
63596c3f8c fix(sockets) always uncork when closing (#13358)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-08-17 02:53:10 -07:00
Meghan Denny
996847bcad ci: disable bun-jsc.test.ts 'profile async' on windows for now (#13363) 2024-08-17 02:50:48 -07:00
Jarred Sumner
33c91fe3fa Bump WebKit (#13355) 2024-08-16 22:40:29 -07:00
Meghan Denny
7fd072f4af node:fs: use bun.assert to fix zig linter (#13353) 2024-08-16 18:23:45 -07:00
Ciro Spaciari
15a8e72790 fix(ws test) deflaky (#13348) 2024-08-16 16:15:12 -07:00
Jarred Sumner
64d77e33f6 Fixes #13331 (#13340) 2024-08-16 15:42:11 -07:00
190n
babc907bfe Support Unicode strings in V8 APIs (#13335) 2024-08-16 15:16:39 -07:00
190n
83c5d8a942 Support doubles in v8::Number (#13336)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-08-16 14:34:04 -07:00
MARCROCK22
5a8e98cec2 add missing Timer types and Bun.build sourcemap "linked" (#13349) 2024-08-16 14:26:44 -07:00
Meghan Denny
d4237b0757 node:fs: mode+flags message cleanup (#13332) 2024-08-15 23:19:25 -07:00
Jarred Sumner
766a9cf4f2 Fix some argument validation issues in fetch() (#13337) 2024-08-15 23:14:59 -07:00
Jarred Sumner
98a709fb1b Further clang-analyzer (#13324) 2024-08-15 15:01:36 -07:00
Meghan Denny
715ff7f323 node:fs: add additional error handling for flags and mode (#13321)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-08-15 13:13:11 -07:00
Jarred Sumner
df1744f0da Bump 2024-08-15 13:12:32 -07:00
Dylan Conway
5bd344281f fix(TextEncoder): domjit crash in encode (#13320)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-08-15 03:35:58 -07:00
Viktor L
b70458c3e4 Fix "bun exec" examples (#13318) 2024-08-15 00:31:29 -07:00
Jarred Sumner
3f686222d4 Micro-optimize Module._resolveFilename (#13322) 2024-08-14 23:36:46 -07:00
Jarred Sumner
36fc324523 Fixes #13311 (#13319) 2024-08-14 22:46:45 -07:00
Meghan Denny
a5bd94f582 node:net.Server listen handler should be bound to the server (#13290)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-08-14 19:00:57 -07:00
Jarred Sumner
4fae1b4475 Increase max concurrent connection count for connecting sockets (#13294) 2024-08-14 19:00:31 -07:00
Jarred Sumner
2fa60f2d12 Appease clang-tidy (#13312) 2024-08-14 19:00:20 -07:00
Jarred Sumner
6d79edaa15 Fixes https://github.com/oven-sh/bun/issues/13001 (#13313) 2024-08-14 18:11:10 -07:00
190n
dc2929d4e1 Start implementing internal V8 APIs (#12821)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-08-14 17:51:12 -07:00
Meghan Denny
5bc45e2721 node:net.Socket#{ref,unref} are supposed to return this (#13291)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-08-14 17:23:39 -07:00
Dylan Conway
fe7f5fa731 switch nodemailer test to mailgun (#13314) 2024-08-14 17:18:03 -07:00
2851 changed files with 96513 additions and 14286 deletions

View File

@@ -52,4 +52,11 @@ for name in bun bun-profile; do
run_command mv "$name" "$dir/$name"
run_command zip -r "$dir.zip" "$dir"
source "$cwd/.buildkite/scripts/upload-artifact.sh" "$dir.zip"
# temporary disable this so CI can run
# this is failing because $name is now in $dir/$name and if changed to $dir/$name we get ENOENT reading "bun:internal-for-testing"
# if [ "$name" == "bun-profile" ]; then
# export BUN_FEATURE_FLAG_INTERNAL_FOR_TESTING="1"
# run_command "./$name" -e "require('fs').writeFileSync('./features.json', JSON.stringify(require('bun:internal-for-testing').crash_handler.getFeatureData()))"
# source "$cwd/.buildkite/scripts/upload-artifact.sh" "features.json"
# fi
done

4
.gitattributes vendored
View File

@@ -7,6 +7,7 @@
*.cpp text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.cc text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.yml text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.toml text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.zig text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.rs text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.h text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
@@ -45,3 +46,6 @@ examples/**/* linguist-documentation
src/deps/*.c linguist-vendored
src/deps/brotli/** linguist-vendored
test/js/node/test/fixtures linguist-vendored
test/js/node/test/common linguist-vendored

View File

@@ -2,11 +2,18 @@ name: bun install crash report
description: Report a crash in bun install
labels:
- npm
- crash
body:
- type: markdown
attributes:
value: |
**Thank you so much** for submitting a crash report. You're helping us make Bun more reliable for everyone!
- type: textarea
id: package_json
attributes:
label: `package.json` file
description: Can you upload your `package.json` file? This helps us reproduce the crash.
render: json
- type: textarea
id: repro
attributes:

View File

@@ -42,7 +42,7 @@ runs:
canary) release="canary";;
*) release="bun-v${{ inputs.bun-version }}";;
esac
curl -LO "${{ inputs.download-url }}/${release}/${target}.zip"
curl -LO "${{ inputs.download-url }}/${release}/${target}.zip" --retry 5
unzip ${target}.zip
mkdir -p ${{ runner.temp }}/.bun/bin
mv ${target}/bun* ${{ runner.temp }}/.bun/bin/

61
.github/workflows/format.yml vendored Normal file
View File

@@ -0,0 +1,61 @@
name: Format
permissions:
contents: write
concurrency:
group: format-${{ github.workflow }}-${{ github.event_name == 'workflow_dispatch' && inputs.run-id || github.ref }}
cancel-in-progress: true
on:
workflow_dispatch:
inputs:
run-id:
type: string
description: The workflow ID to download artifacts (skips the build step)
pull_request:
jobs:
format:
name: Format
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
sparse-checkout: |
.prettierrc-ci
.github
.vscode
src
scripts
packages
test
bench
package.json
bun.lockb
.clang-format
- name: Setup Bun
uses: ./.github/actions/setup-bun
with:
bun-version: "1.1.25"
- name: Setup Zig
uses: mlugg/setup-zig@v1
with:
version: 0.13.0
- name: Install Dependencies
run: |
bun install
- name: Format
run: |
bun fmt
- name: Format Zig
run: |
bun fmt:zig
- name: Format Cpp
run: |
bun fmt:cpp
- name: Commit
uses: stefanzweifel/git-auto-commit-action@v5
with:
commit_message: Apply formatting changes

View File

@@ -7,6 +7,42 @@ on:
types: [labeled]
jobs:
# on-bug:
# runs-on: ubuntu-latest
# if: github.event.label.name == 'bug' || github.event.label.name == 'crash'
# permissions:
# issues: write
# steps:
# - name: Checkout
# uses: actions/checkout@v4
# with:
# sparse-checkout: |
# scripts
# .github
# CMakeLists.txt
# - name: Setup Bun
# uses: ./.github/actions/setup-bun
# with:
# bun-version: "1.1.24"
# - name: "categorize bug"
# id: add-labels
# env:
# GITHUB_ISSUE_BODY: ${{ github.event.issue.body }}
# GITHUB_ISSUE_TITLE: ${{ github.event.issue.title }}
# ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
# shell: bash
# run: |
# echo '{"dependencies": { "@anthropic-ai/sdk": "latest" }}' > scripts/package.json && bun install --cwd=./scripts
# LABELS=$(bun scripts/label-issue.ts)
# echo "labels=$LABELS" >> $GITHUB_OUTPUT
# - name: Add labels
# uses: actions-cool/issues-helper@v3
# if: steps.add-labels.outputs.labels != ''
# with:
# actions: "add-labels"
# token: ${{ secrets.GITHUB_TOKEN }}
# issue-number: ${{ github.event.issue.number }}
# labels: ${{ steps.add-labels.outputs.labels }}
on-labeled:
runs-on: ubuntu-latest
if: github.event.label.name == 'crash' || github.event.label.name == 'needs repro'

View File

@@ -88,6 +88,9 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
with:
# To workaround issue
ref: main
- name: Setup Bun
uses: ./.github/actions/setup-bun
with:

View File

@@ -14,22 +14,26 @@ jobs:
format:
name: Format
runs-on: ubuntu-latest
if: ${{ github.ref != 'refs/heads/main' }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
sparse-checkout: |
.prettierrc-ci
.github
.vscode
src
scripts
packages
test
bench
package.json
bun.lockb
.clang-format
- name: Setup Bun
uses: ./.github/actions/setup-bun
with:
bun-version: "1.1.20"
bun-version: "1.1.25"
- name: Setup Zig
uses: mlugg/setup-zig@v1
with:
@@ -43,9 +47,9 @@ jobs:
- name: Format Zig
run: |
bun fmt:zig
- name: Generate submodule versions
- name: Format Cpp
run: |
bash ./scripts/write-versions.sh
bun fmt:cpp
- name: Commit
uses: stefanzweifel/git-auto-commit-action@v5
with:

View File

@@ -26,7 +26,7 @@ jobs:
- name: Setup Bun
uses: ./.github/actions/setup-bun
with:
bun-version: latest
bun-version: 1.1.23
- name: Install Dependencies
env:
HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK: 1

View File

@@ -5,3 +5,6 @@ test/js/deno
test/node.js
src/react-refresh.js
*.min.js
test/js/node/test/fixtures
test/js/node/test/common
test/snippets

31
.prettierrc-ci Normal file
View File

@@ -0,0 +1,31 @@
{
"arrowParens": "avoid",
"printWidth": 120,
"trailingComma": "all",
"useTabs": false,
"quoteProps": "preserve",
"plugins": [
"prettier-plugin-organize-imports"
],
"overrides": [
{
"files": [
".vscode/*.json"
],
"options": {
"parser": "jsonc",
"quoteProps": "preserve",
"singleQuote": false,
"trailingComma": "all"
}
},
{
"files": [
"*.md"
],
"options": {
"printWidth": 80
}
}
]
}

View File

@@ -15,6 +15,9 @@
"src/bun.js/WebKit": true,
"src/deps/*/**": true,
"test/node.js/upstream": true,
// This will fill up your whole search history.
"test/js/node/test/fixtures": true,
"test/js/node/test/common": true,
},
"search.followSymlinks": false,
"search.useIgnoreFiles": true,
@@ -58,6 +61,7 @@
"[h]": {
"editor.defaultFormatter": "xaver.clang-format",
},
"clangd.arguments": ["-header-insertion=never"],
// JavaScript
"prettier.enable": true,

View File

@@ -3,8 +3,8 @@ cmake_policy(SET CMP0091 NEW)
cmake_policy(SET CMP0067 NEW)
set(CMAKE_POLICY_DEFAULT_CMP0069 NEW)
set(Bun_VERSION "1.1.24")
set(WEBKIT_TAG 1cdc5e606ad7d451853f75a068a320148385f397)
set(Bun_VERSION "1.1.27")
set(WEBKIT_TAG 147ed53838e21525677492c27099567a6cd19c6b)
set(BUN_WORKDIR "${CMAKE_CURRENT_BINARY_DIR}")
message(STATUS "Configuring Bun ${Bun_VERSION} in ${BUN_WORKDIR}")
@@ -29,7 +29,10 @@ cmake_path(APPEND LOCAL_ZIG_CACHE_DIR "local")
cmake_path(APPEND GLOBAL_ZIG_CACHE_DIR "global")
# Used in process.version, process.versions.node, napi, and elsewhere
set(REPORTED_NODEJS_VERSION "22.3.0")
set(REPORTED_NODEJS_VERSION "22.6.0")
# Used in process.versions.modules and compared while loading V8 modules
set(REPORTED_NODEJS_ABI_VERSION "127")
# WebKit uses -std=gnu++20 on non-macOS non-Windows
# If we do not set this, it will crash at startup on the first memory allocation.
@@ -664,6 +667,7 @@ file(GLOB BUN_CPP ${CONFIGURE_DEPENDS}
"${BUN_SRC}/bun.js/bindings/sqlite/*.cpp"
"${BUN_SRC}/bun.js/bindings/webcrypto/*.cpp"
"${BUN_SRC}/bun.js/bindings/webcrypto/*/*.cpp"
"${BUN_SRC}/bun.js/bindings/v8/*.cpp"
"${BUN_SRC}/deps/picohttpparser/picohttpparser.c"
)
list(APPEND BUN_RAW_SOURCES ${BUN_CPP})
@@ -824,6 +828,7 @@ if(NOT NO_CODEGEN)
"${BUN_SRC}/js/thirdparty/*.ts"
"${BUN_SRC}/js/internal/*.js"
"${BUN_SRC}/js/internal/*.ts"
"${BUN_SRC}/js/internal/cluster/*.ts"
"${BUN_SRC}/js/internal/util/*.js"
"${BUN_SRC}/js/internal/fs/*.ts"
"${BUN_SRC}/js/node/*.js"
@@ -1040,6 +1045,7 @@ add_compile_definitions(
"BUILDING_JSCONLY__"
"BUN_DYNAMIC_JS_LOAD_PATH=\"${BUN_WORKDIR}/js\""
"REPORTED_NODEJS_VERSION=\"${REPORTED_NODEJS_VERSION}\""
"REPORTED_NODEJS_ABI_VERSION=${REPORTED_NODEJS_ABI_VERSION}"
)
if(NOT ASSERT_ENABLED)
@@ -1372,19 +1378,6 @@ if(CMAKE_BUILD_TYPE STREQUAL "Release" AND NOT WIN32 AND NOT ASSERT_ENABLED)
)
endif()
if(WIN32)
# Kill all instances of bun before linking.
# This is necessary because the file is locked by the process.
add_custom_command(
TARGET ${bun}
PRE_LINK
COMMAND
"powershell"
"/C"
"Stop-Process -Name '${bun}' -Force -ErrorAction SilentlyContinue; exit 0"
)
endif()
# --- Dependencies ---
if(USE_CUSTOM_ZLIB)
include_directories(${BUN_DEPS_DIR}/zlib)
@@ -1627,12 +1620,14 @@ endif()
if(BUN_TIDY_ONLY)
find_program(CLANG_TIDY_EXE NAMES "clang-tidy")
set(CLANG_TIDY_COMMAND "${CLANG_TIDY_EXE}" "-checks=-*,clang-analyzer-*,-clang-analyzer-webkit.UncountedLambdaCapturesChecker" "--fix" "--fix-errors" "--format-style=webkit" "--warnings-as-errors=*")
# webkit ones are disabled disabled because it's noisy, e.g. for JavaScriptCore/Lookup.h
set(CLANG_TIDY_COMMAND "${CLANG_TIDY_EXE}" "-checks=-*,clang-analyzer-*,-clang-analyzer-webkit.UncountedLambdaCapturesChecker,-clang-analyzer-optin.core.EnumCastOutOfRange,-clang-analyzer-webkit.RefCntblBaseVirtualDtor" "--fix" "--fix-errors" "--format-style=webkit" "--warnings-as-errors=*")
set_target_properties(${bun} PROPERTIES CXX_CLANG_TIDY "${CLANG_TIDY_COMMAND}")
endif()
if(BUN_TIDY_ONLY_EXTRA)
find_program(CLANG_TIDY_EXE NAMES "clang-tidy")
set(CLANG_TIDY_COMMAND "${CLANG_TIDY_EXE}" "-checks=-*,clang-analyzer-*,performance-*,-clang-analyzer-webkit.UncountedLambdaCapturesChecker" "--fix" "--fix-errors" "--format-style=webkit" "--warnings-as-errors=*")
set(CLANG_TIDY_COMMAND "${CLANG_TIDY_EXE}" "-checks=-*,clang-analyzer-*,performance-*,-clang-analyzer-webkit.UncountedLambdaCapturesChecker,-clang-analyzer-optin.core.EnumCastOutOfRange,-clang-analyzer-webkit.RefCntblBaseVirtualDtor" "--fix" "--fix-errors" "--format-style=webkit" "--warnings-as-errors=*")
set_target_properties(${bun} PROPERTIES CXX_CLANG_TIDY "${CLANG_TIDY_COMMAND}")
endif()

View File

@@ -63,7 +63,7 @@ Bun requires LLVM 16 (`clang` is part of LLVM). This version requirement is to m
{% codetabs %}
```bash#macOS (Homebrew)
$ brew install llvm@16
$ brew install llvm@18
```
```bash#Ubuntu/Debian

2
LATEST
View File

@@ -1 +1 @@
1.1.23
1.1.26

View File

@@ -366,7 +366,7 @@ ifeq ($(OS_NAME),linux)
endif
ifeq ($(OS_NAME),darwin)
MACOS_MIN_FLAG=-mmacosx-version-min=$(MIN_MACOS_VERSION)
MACOS_MIN_FLAG=-mmacos-version-min=$(MIN_MACOS_VERSION)
POSIX_PKG_MANAGER=brew
INCLUDE_DIRS += $(MAC_INCLUDE_DIRS)
endif

View File

@@ -24,8 +24,6 @@
## What is Bun?
> **Bun is under active development.** Use it to speed up your development workflows or run simpler production code in resource-constrained environments like serverless functions. We're working on more complete Node.js compatibility and integration with existing frameworks. Join the [Discord](https://bun.sh/discord) and watch the [GitHub repository](https://github.com/oven-sh/bun) to keep tabs on future releases.
Bun is an all-in-one toolkit for JavaScript and TypeScript apps. It ships as a single executable called `bun`.
At its core is the _Bun runtime_, a fast JavaScript runtime designed as a drop-in replacement for Node.js. It's written in Zig and powered by JavaScriptCore under the hood, dramatically reducing startup times and memory usage.
@@ -87,16 +85,19 @@ bun upgrade --canary
## Quick links
- Intro
- [What is Bun?](https://bun.sh/docs/index)
- [Installation](https://bun.sh/docs/installation)
- [Quickstart](https://bun.sh/docs/quickstart)
- [TypeScript](https://bun.sh/docs/typescript)
- Templating
- [`bun init`](https://bun.sh/docs/cli/init)
- [`bun create`](https://bun.sh/docs/cli/bun-create)
- Runtime
- [`bun run`](https://bun.sh/docs/cli/run)
- [File types](https://bun.sh/docs/runtime/loaders)
- [TypeScript](https://bun.sh/docs/runtime/typescript)
@@ -115,6 +116,7 @@ bun upgrade --canary
- [Framework API](https://bun.sh/docs/runtime/framework)
- Package manager
- [`bun install`](https://bun.sh/docs/cli/install)
- [`bun add`](https://bun.sh/docs/cli/add)
- [`bun remove`](https://bun.sh/docs/cli/remove)
@@ -130,6 +132,7 @@ bun upgrade --canary
- [Overrides and resolutions](https://bun.sh/docs/install/overrides)
- Bundler
- [`Bun.build`](https://bun.sh/docs/bundler)
- [Loaders](https://bun.sh/docs/bundler/loaders)
- [Plugins](https://bun.sh/docs/bundler/plugins)
@@ -137,6 +140,7 @@ bun upgrade --canary
- [vs esbuild](https://bun.sh/docs/bundler/vs-esbuild)
- Test runner
- [`bun test`](https://bun.sh/docs/cli/test)
- [Writing tests](https://bun.sh/docs/test/writing)
- [Watch mode](https://bun.sh/docs/test/hot)
@@ -148,9 +152,11 @@ bun upgrade --canary
- [Code coverage](https://bun.sh/docs/test/coverage)
- Package runner
- [`bunx`](https://bun.sh/docs/cli/bunx)
- API
- [HTTP server](https://bun.sh/docs/api/http)
- [WebSockets](https://bun.sh/docs/api/websockets)
- [Workers](https://bun.sh/docs/api/workers)
@@ -183,9 +189,10 @@ bun upgrade --canary
- [Building Windows](https://bun.sh/docs/project/building-windows)
- [License](https://bun.sh/docs/project/licensing)
## Guides
## Guides
- Binary
- Binary
- [Convert a Blob to a DataView](https://bun.sh/guides/binary/blob-to-dataview)
- [Convert a Blob to a ReadableStream](https://bun.sh/guides/binary/blob-to-stream)
- [Convert a Blob to a string](https://bun.sh/guides/binary/blob-to-string)
@@ -209,7 +216,8 @@ bun upgrade --canary
- [Convert an ArrayBuffer to a Uint8Array](https://bun.sh/guides/binary/arraybuffer-to-typedarray)
- [Convert an ArrayBuffer to an array of numbers](https://bun.sh/guides/binary/arraybuffer-to-array)
- Ecosystem
- Ecosystem
- [Build a frontend using Vite and Bun](https://bun.sh/guides/ecosystem/vite)
- [Build an app with Astro and Bun](https://bun.sh/guides/ecosystem/astro)
- [Build an app with Next.js and Bun](https://bun.sh/guides/ecosystem/nextjs)
@@ -236,7 +244,8 @@ bun upgrade --canary
- [Use React and JSX](https://bun.sh/guides/ecosystem/react)
- [Add Sentry to a Bun app](https://bun.sh/guides/ecosystem/sentry)
- HTTP
- HTTP
- [Common HTTP server usage](https://bun.sh/guides/http/server)
- [Configure TLS on an HTTP server](https://bun.sh/guides/http/tls)
- [fetch with unix domain sockets in Bun](https://bun.sh/guides/http/fetch-unix)
@@ -250,7 +259,8 @@ bun upgrade --canary
- [Upload files via HTTP using FormData](https://bun.sh/guides/http/file-uploads)
- [Write a simple HTTP server](https://bun.sh/guides/http/simple)
- Install
- Install
- [Add a dependency](https://bun.sh/guides/install/add)
- [Add a development dependency](https://bun.sh/guides/install/add-dev)
- [Add a Git dependency](https://bun.sh/guides/install/add-git)
@@ -268,7 +278,8 @@ bun upgrade --canary
- [Using bun install with an Azure Artifacts npm registry](https://bun.sh/guides/install/azure-artifacts)
- [Using bun install with Artifactory](https://bun.sh/guides/install/jfrog-artifactory)
- Process
- Process
- [Get the process uptime in nanoseconds](https://bun.sh/guides/process/nanoseconds)
- [Listen for CTRL+C](https://bun.sh/guides/process/ctrl-c)
- [Listen to OS signals](https://bun.sh/guides/process/os-signals)
@@ -279,7 +290,8 @@ bun upgrade --canary
- [Spawn a child process](https://bun.sh/guides/process/spawn)
- [Spawn a child process and communicate using IPC](https://bun.sh/guides/process/ipc)
- Read file
- Read file
- [Check if a file exists](https://bun.sh/guides/read-file/exists)
- [Get the MIME type of a file](https://bun.sh/guides/read-file/mime)
- [Read a file as a ReadableStream](https://bun.sh/guides/read-file/stream)
@@ -290,7 +302,8 @@ bun upgrade --canary
- [Read a JSON file](https://bun.sh/guides/read-file/json)
- [Watch a directory for changes](https://bun.sh/guides/read-file/watch)
- Runtime
- Runtime
- [Debugging Bun with the VS Code extension](https://bun.sh/guides/runtime/vscode-debugger)
- [Debugging Bun with the web debugger](https://bun.sh/guides/runtime/web-debugger)
- [Define and replace static globals & constants](https://bun.sh/guides/runtime/define-constant)
@@ -305,7 +318,8 @@ bun upgrade --canary
- [Set a time zone in Bun](https://bun.sh/guides/runtime/timezone)
- [Set environment variables](https://bun.sh/guides/runtime/set-env)
- Streams
- Streams
- [Convert a Node.js Readable to a Blob](https://bun.sh/guides/streams/node-readable-to-blob)
- [Convert a Node.js Readable to a string](https://bun.sh/guides/streams/node-readable-to-string)
- [Convert a Node.js Readable to an ArrayBuffer](https://bun.sh/guides/streams/node-readable-to-arraybuffer)
@@ -318,7 +332,8 @@ bun upgrade --canary
- [Convert a ReadableStream to an ArrayBuffer](https://bun.sh/guides/streams/to-arraybuffer)
- [Convert a ReadableStream to JSON](https://bun.sh/guides/streams/to-json)
- Test
- Test
- [Bail early with the Bun test runner](https://bun.sh/guides/test/bail)
- [Generate code coverage reports with the Bun test runner](https://bun.sh/guides/test/coverage)
- [Mark a test as a "todo" with the Bun test runner](https://bun.sh/guides/test/todo-tests)
@@ -336,7 +351,8 @@ bun upgrade --canary
- [Use snapshot testing in `bun test`](https://bun.sh/guides/test/snapshot)
- [Write browser DOM tests with Bun and happy-dom](https://bun.sh/guides/test/happy-dom)
- Util
- Util
- [Check if the current file is the entrypoint](https://bun.sh/guides/util/entrypoint)
- [Check if two objects are deeply equal](https://bun.sh/guides/util/deep-equals)
- [Compress and decompress data with DEFLATE](https://bun.sh/guides/util/deflate)
@@ -355,13 +371,14 @@ bun upgrade --canary
- [Hash a password](https://bun.sh/guides/util/hash-a-password)
- [Sleep for a fixed number of milliseconds](https://bun.sh/guides/util/sleep)
- WebSocket
- WebSocket
- [Build a publish-subscribe WebSocket server](https://bun.sh/guides/websocket/pubsub)
- [Build a simple WebSocket server](https://bun.sh/guides/websocket/simple)
- [Enable compression for WebSocket messages](https://bun.sh/guides/websocket/compression)
- [Set per-socket contextual data on a WebSocket](https://bun.sh/guides/websocket/context)
- Write file
- Write file
- [Append content to a file](https://bun.sh/guides/write-file/append)
- [Copy a file to another location](https://bun.sh/guides/write-file/file-cp)
- [Delete a file](https://bun.sh/guides/write-file/unlink)

View File

@@ -1,4 +1,4 @@
import { run, bench } from "mitata";
import { bench, run } from "mitata";
bench("sync", () => {});
bench("async", async () => {});

View File

@@ -1,4 +1,4 @@
import { run, bench } from "../node_modules/mitata/src/cli.mjs";
import { bench, run } from "../node_modules/mitata/src/cli.mjs";
bench("sync", () => {});
bench("async", async () => {});

View File

@@ -1,4 +1,4 @@
import { run, bench } from "mitata";
import { bench, run } from "mitata";
bench("sync", () => {});
bench("async", async () => {});

View File

@@ -1,5 +1,5 @@
import { copyFileSync, writeFileSync, readFileSync, statSync } from "node:fs";
import { bench, run } from "mitata";
import { copyFileSync, statSync, writeFileSync } from "node:fs";
function runner(ready) {
for (let size of [1, 10, 100, 1000, 10000, 100000, 1000000, 10000000]) {

27
bench/deepEqual/map.js Normal file
View File

@@ -0,0 +1,27 @@
import { expect } from "bun:test";
import { bench, run } from "mitata";
const MAP_SIZE = 10_000;
function* genPairs(count) {
for (let i = 0; i < MAP_SIZE; i++) {
yield ["k" + i, "v" + i];
}
}
class CustomMap extends Map {
abc = 123;
constructor(iterable) {
super(iterable);
}
}
const a = new Map(genPairs());
const b = new Map(genPairs());
bench("deepEqual Map", () => expect(a).toEqual(b));
const x = new CustomMap(genPairs());
const y = new CustomMap(genPairs());
bench("deepEqual CustomMap", () => expect(x).toEqual(y));
await run();

27
bench/deepEqual/set.js Normal file
View File

@@ -0,0 +1,27 @@
import { expect } from "bun:test";
import { bench, run } from "mitata";
const SET_SIZE = 10_000;
function* genValues(count) {
for (let i = 0; i < SET_SIZE; i++) {
yield "v" + i;
}
}
class CustomSet extends Set {
abc = 123;
constructor(iterable) {
super(iterable);
}
}
const a = new Set(genValues());
const b = new Set(genValues());
bench("deepEqual Set", () => expect(a).toEqual(b));
const x = new CustomSet(genValues());
const y = new CustomSet(genValues());
bench("deepEqual CustomSet", () => expect(x).toEqual(y));
await run();

View File

@@ -1,4 +1,3 @@
import EventEmitter3 from "eventemitter3";
import { group } from "mitata";
import EventEmitterNative from "node:events";

View File

@@ -1,5 +1,5 @@
// bun:test automatically rewrites this import to bun:test when run in bun
import { test, expect } from "@jest/globals";
import { expect, test } from "@jest/globals";
const N = parseInt(process.env.RUN_COUNT || "10000", 10);
if (!Number.isSafeInteger(N)) {

View File

@@ -1,4 +1,4 @@
import { test, expect } from "vitest";
import { expect, test } from "vitest";
const N = parseInt(process.env.RUN_COUNT || "10000", 10);
if (!Number.isSafeInteger(N)) {

View File

@@ -1,5 +1,5 @@
import { ptr, dlopen, CString, toBuffer } from "bun:ffi";
import { run, bench, group } from "mitata";
import { CString, dlopen, ptr } from "bun:ffi";
import { bench, group, run } from "mitata";
const { napiNoop, napiHash, napiString } = require(import.meta.dir + "/src/ffi_napi_bench.node");

View File

@@ -1,4 +1,4 @@
import { run, bench, group } from "../node_modules/mitata/src/cli.mjs";
import { bench, group, run } from "../node_modules/mitata/src/cli.mjs";
const extension = "darwin" !== Deno.build.os ? "so" : "dylib";
const path = new URL("src/target/release/libffi_napi_bench." + extension, import.meta.url).pathname;

View File

@@ -1,4 +1,4 @@
import { run, bench, group } from "mitata";
import { bench, group, run } from "mitata";
import { createRequire } from "node:module";
const require = createRequire(import.meta.url);

View File

@@ -1,5 +1,5 @@
import braces from "braces";
import { group, bench, run } from "mitata";
import { bench, group, run } from "mitata";
// const iterations = 1000;
const iterations = 100;

View File

@@ -1,6 +1,6 @@
import { run, bench, group } from "mitata";
import fg from "fast-glob";
import { fdir } from "fdir";
import { bench, group, run } from "mitata";
const normalPattern = "*.ts";
const recursivePattern = "**/*.ts";

View File

@@ -1,5 +1,5 @@
import { run, bench, group } from "mitata";
import { gzipSync, gunzipSync } from "bun";
import { gunzipSync, gzipSync } from "bun";
import { bench, group, run } from "mitata";
const data = await Bun.file(require.resolve("@babel/standalone/babel.min.js")).arrayBuffer();

View File

@@ -1,4 +1,4 @@
import { run, bench } from "../node_modules/mitata/src/cli.mjs";
import { bench, run } from "../node_modules/mitata/src/cli.mjs";
const data = new TextEncoder().encode("Hello World!".repeat(9999));

View File

@@ -1,7 +1,7 @@
import { run, bench } from "mitata";
import { gzipSync, gunzipSync } from "zlib";
import { createRequire } from "module";
import { readFileSync } from "fs";
import { bench, run } from "mitata";
import { createRequire } from "module";
import { gunzipSync, gzipSync } from "zlib";
const require = createRequire(import.meta.url);
const data = readFileSync(require.resolve("@babel/standalone/babel.min.js"));

View File

@@ -1,6 +1,5 @@
import { Main } from "./main";
import classNames from "classnames";
import ReactDOM from "react-dom";
import { Main } from "./main";
const Base = ({}) => {
const name = typeof location !== "undefined" ? decodeURIComponent(location.search.substring(1)) : null;

View File

@@ -4,11 +4,11 @@
* For more information, see https://remix.run/docs/en/main/file-conventions/entry.server
*/
import { PassThrough } from "node:stream";
import type { EntryContext } from "@remix-run/node";
import { Response } from "@remix-run/node";
import { RemixServer } from "@remix-run/react";
import isbot from "isbot";
import { PassThrough } from "node:stream";
import { renderToPipeableStream } from "react-dom/server";
const ABORT_DELAY = 5_000;

View File

@@ -1,21 +1,21 @@
import { bench, run } from "mitata";
import {
arch,
cpus,
endianness,
arch,
uptime,
networkInterfaces,
getPriority,
totalmem,
freemem,
getPriority,
homedir,
hostname,
loadavg,
networkInterfaces,
platform,
release,
setPriority,
tmpdir,
totalmem,
type,
uptime,
userInfo,
version,
} from "node:os";

View File

@@ -1,21 +1,21 @@
import { bench, run } from "mitata";
import {
arch,
cpus,
endianness,
arch,
uptime,
networkInterfaces,
getPriority,
totalmem,
freemem,
getPriority,
homedir,
hostname,
loadavg,
networkInterfaces,
platform,
release,
setPriority,
tmpdir,
totalmem,
type,
uptime,
userInfo,
version,
} from "node:os";

View File

@@ -1,5 +1,5 @@
import { renderToReadableStream } from "https://esm.run/react-dom/server";
import * as React from "https://esm.run/react";
import { renderToReadableStream } from "https://esm.run/react-dom/server";
const App = () => (
<html>

View File

@@ -1,6 +1,6 @@
// react-ssr.tsx
import { renderToPipeableStream } from "react-dom/server.node";
import React from "react";
import { renderToPipeableStream } from "react-dom/server.node";
const http = require("http");
const App = () => (
<html>

View File

@@ -1,5 +1,5 @@
import type { ActionFunction, LoaderFunction } from "remix";
import { useParams } from "remix";
import type { LoaderFunction, ActionFunction } from "remix";
export const loader: LoaderFunction = async ({ params }) => {
console.log(params.postId);

View File

@@ -1,5 +1,5 @@
import { bench, group, run } from "./runner.mjs";
import * as assert from "assert";
import { bench, run } from "./runner.mjs";
bench("deepEqual", () => {
assert.deepEqual({ foo: "123", bar: "baz" }, { foo: "123", bar: "baz" });

View File

@@ -1,7 +1,7 @@
// @runtime bun,node,deno
import { bench, run } from "./runner.mjs";
import process from "node:process";
import { Buffer } from "node:buffer";
import process from "node:process";
import { bench, run } from "./runner.mjs";
const N = parseInt(process.env.RUN_COUNTER ?? "10000", 10);
var isBuffer = new Buffer(0);

View File

@@ -1,6 +1,6 @@
import { bench, run } from "./runner.mjs";
import { Buffer } from "node:buffer";
import crypto from "node:crypto";
import { bench, run } from "./runner.mjs";
const bigBuffer = Buffer.from("hello world".repeat(10000));
const converted = bigBuffer.toString("base64");

View File

@@ -1,6 +1,6 @@
import { bench, group, run } from "./runner.mjs";
import { readFileSync } from "fs";
import { allocUnsafe } from "bun";
import { readFileSync } from "fs";
import { bench, group, run } from "./runner.mjs";
function polyfill(chunks) {
var size = 0;

View File

@@ -1,6 +1,6 @@
// so it can run in environments without node module resolution
import { bench, run } from "../node_modules/mitata/src/cli.mjs";
import crypto from "node:crypto";
import { bench, run } from "../node_modules/mitata/src/cli.mjs";
var foo = new Uint8Array(65536);
bench("crypto.getRandomValues(65536)", () => {
crypto.getRandomValues(foo);

View File

@@ -1,5 +1,5 @@
import { bench, group, run } from "./runner.mjs";
import fastDeepEquals from "fast-deep-equal/es6/index";
import { bench, group, run } from "./runner.mjs";
// const Date = globalThis.Date;
function func1() {}

View File

@@ -1,5 +1,5 @@
import { dns } from "bun";
import { bench, run, group } from "./runner.mjs";
import { bench, group, run } from "./runner.mjs";
async function forEachBackend(name, fn) {
group(name, () => {

View File

@@ -1,4 +1,4 @@
import { run, bench } from "../node_modules/mitata/src/cli.mjs";
import { bench, run } from "../node_modules/mitata/src/cli.mjs";
const encoder = new TextEncoder();

View File

@@ -1,7 +1,4 @@
import { group } from "./runner.mjs";
import { bench, run } from "./runner.mjs";
import { encode as htmlEntityEncode } from "html-entities";
import { escape as heEscape } from "he";
import { bench, group, run } from "./runner.mjs";
var bunEscapeHTML = globalThis.escapeHTML || Bun.escapeHTML;

View File

@@ -1,4 +1,4 @@
import { viewSource, dlopen, CString, ptr, toBuffer, toArrayBuffer, FFIType, callback } from "bun:ffi";
import { dlopen } from "bun:ffi";
import { bench, group, run } from "./runner.mjs";
const types = {

View File

@@ -1,5 +1,5 @@
import { bench, run } from "./runner.mjs";
import { IncomingMessage } from "node:http";
import { bench, run } from "./runner.mjs";
const headers = {
date: "Mon, 06 Nov 2023 05:12:49 GMT",

View File

@@ -1,6 +1,6 @@
// @runtime node, bun
import { bench, run } from "./runner.mjs";
import * as vm from "node:vm";
import { bench, run } from "./runner.mjs";
const context = {
animal: "cat",

View File

@@ -24,7 +24,7 @@ const obj = {
w: 23,
};
import { bench, group, run } from "./runner.mjs";
import { bench, run } from "./runner.mjs";
var val = 0;
bench("Object.values(literal)", () => {

View File

@@ -1,4 +1,4 @@
import { pbkdf2, pbkdf2Sync } from "node:crypto";
import { pbkdf2 } from "node:crypto";
import { bench, run } from "./runner.mjs";

View File

@@ -1,5 +1,5 @@
import { bench, run } from "mitata";
import { peek } from "bun";
import { bench, run } from "mitata";
let pending = Bun.sleep(1000);
let resolved = Promise.resolve(1);

View File

@@ -1,4 +1,3 @@
import { group } from "./runner.mjs";
import { bench, run } from "./runner.mjs";
bench("performance.now x 1000", () => {
for (let i = 0; i < 1000; i++) {

View File

@@ -1,5 +1,5 @@
import { bench, run } from "./runner.mjs";
import { performance } from "perf_hooks";
import { bench, run } from "./runner.mjs";
bench("process.memoryUsage()", () => {
process.memoryUsage();

View File

@@ -1,6 +1,6 @@
import { bench, group, run } from "./runner.mjs";
import { renderToReadableStream } from "react-dom/server.browser";
import { renderToReadableStream as renderToReadableStreamBun } from "react-dom/server";
import { renderToReadableStream } from "react-dom/server.browser";
import { bench, group, run } from "./runner.mjs";
const App = () => (
<div>

View File

@@ -1,7 +1,7 @@
import { tmpdir } from "node:os";
import { bench, group, run } from "./runner.mjs";
import { createReadStream, writeFileSync } from "node:fs";
import { tmpdir } from "node:os";
import { sep } from "node:path";
import { bench, run } from "./runner.mjs";
if (!Promise.withResolvers) {
Promise.withResolvers = function () {

View File

@@ -1,10 +1,10 @@
import { readdirSync, readdir as readdirCb } from "fs";
import { createHash } from "crypto";
import { readdirSync } from "fs";
import { readdir } from "fs/promises";
import { bench, run } from "./runner.mjs";
import { relative, resolve } from "path";
import { argv } from "process";
import { fileURLToPath } from "url";
import { relative, resolve } from "path";
import { createHash } from "crypto";
import { bench, run } from "./runner.mjs";
let dir = resolve(argv.length > 2 ? argv[2] : fileURLToPath(new URL("../../node_modules", import.meta.url)));
if (dir.includes(process.cwd())) {

View File

@@ -1,6 +1,6 @@
import { bench, run } from "./runner.mjs";
import { readFileSync, existsSync } from "node:fs";
import { readFileSync } from "node:fs";
import { readFile } from "node:fs/promises";
import { bench, run } from "./runner.mjs";
bench(`readFileSync(/tmp/404-not-found)`, () => {
try {

View File

@@ -1,7 +1,7 @@
import { realpathSync } from "node:fs";
import { bench, run } from "./runner.mjs";
const count = parseInt(process.env.ITERATIONS || "1", 10) || 1;
const arg = process.argv[process.argv.length - 1];
import { bench, run } from "./runner.mjs";
bench("realpathSync x " + count, () => {
for (let i = 0; i < count; i++) realpathSync(arg, "utf-8");

View File

@@ -1,4 +1,4 @@
import decoding from "./jsx-entity-decoding";
import ReactDOMServer from "react-dom/server.browser";
import decoding from "./jsx-entity-decoding";
console.log(ReactDOMServer.renderToString(decoding));

View File

@@ -1,7 +1,6 @@
import { bench, run } from "./runner.mjs";
import { builtinModules } from "node:module";
import { writeFile } from "node:fs/promises";
import { spawnSync } from "child_process";
import { writeFile } from "node:fs/promises";
import { builtinModules } from "node:module";
for (let builtin of builtinModules) {
const path = `/tmp/require.${builtin.replaceAll("/", "_")}.cjs`;

View File

@@ -1,5 +1,5 @@
import { existsSync, mkdirSync, promises } from "node:fs";
import { tmpdir } from "node:os";
import { promises, existsSync, mkdirSync } from "node:fs";
const count = 1024 * 12;
var queue = new Array(count);

View File

@@ -1,9 +1,9 @@
// note: this isn't done yet
// we look for `// @runtime` in the file to determine which runtimes to run the benchmark in
import { spawnSync } from "bun";
import { readdirSync, readFileSync } from "node:fs";
import { Database } from "bun:sqlite";
import { extname, basename } from "path";
import { readdirSync, readFileSync } from "node:fs";
import { basename, extname } from "path";
const exts = [".js", ".ts", ".mjs", ".tsx"];

View File

@@ -1,5 +1,5 @@
import * as Mitata from "../node_modules/mitata/src/cli.mjs";
import process from "node:process";
import * as Mitata from "../node_modules/mitata/src/cli.mjs";
const asJSON = !!process?.env?.BENCHMARK_RUNNER;

View File

@@ -1,4 +1,4 @@
import { serialize, deserialize } from "node:v8";
import { deserialize, serialize } from "node:v8";
import { bench, run } from "./runner.mjs";
const obj = {
"id": 1296269,

View File

@@ -1,5 +1,3 @@
import { bench, run } from "../node_modules/mitata/src/cli.mjs";
let count = 20_000_000;
const batchSize = 1_000_000;
console.time("Run");

View File

@@ -1,5 +1,5 @@
import { bench, run } from "./runner.mjs";
import { SHA512 } from "bun";
import { bench, run } from "./runner.mjs";
bench('SHA512.hash("hello world")', () => {
SHA512.hash("hello world");

View File

@@ -1,5 +1,5 @@
import { bench, run } from "./runner.mjs";
import { createHash } from "crypto";
import { bench, run } from "./runner.mjs";
bench('createHash("sha256").update("hello world").digest()', () => {
createHash("sha256").update("hello world").digest();

View File

@@ -1,6 +1,6 @@
import { $ as zx } from "zx";
import { $ as execa$ } from "execa";
import { bench, run, group } from "./runner.mjs";
import { $ as zx } from "zx";
import { bench, group, run } from "./runner.mjs";
const execa = execa$({ stdio: "ignore", cwd: import.meta.dirname });

View File

@@ -1,6 +1,6 @@
import { readdirSync, statSync } from "fs";
import { bench, run } from "./runner.mjs";
import { statSync } from "fs";
import { argv } from "process";
import { bench, run } from "./runner.mjs";
const dir = argv.length > 2 ? argv[2] : "/tmp";

View File

@@ -1,4 +1,4 @@
import { run, bench } from "./runner.mjs";
import { bench, run } from "./runner.mjs";
var writer = globalThis.Bun ? Bun.stderr.writer() : undefined;
if (writer)

View File

@@ -1,5 +1,5 @@
import { bench, run } from "./runner.mjs";
import { StringDecoder } from "string_decoder";
import { bench, run } from "./runner.mjs";
var short = Buffer.from("Hello World!");
var shortUTF16 = Buffer.from("Hello World 💕💕💕");

View File

@@ -1,5 +1,5 @@
import { bench, run } from "./runner.mjs";
import npmStringWidth from "string-width";
import { bench, run } from "./runner.mjs";
const bunStringWidth = globalThis?.Bun?.stringWidth;

View File

@@ -1,4 +1,4 @@
import { listen, connect } from "bun";
import { connect, listen } from "bun";
var counter = 0;
const msg = "Hello World!";

View File

@@ -1,8 +1,8 @@
import { readFileSync } from "fs";
import { createRequire } from "module";
import { dirname } from "path";
import { fileURLToPath } from "url";
import { bench, run, group } from "./runner.mjs";
import { createRequire } from "module";
import { bench, group, run } from "./runner.mjs";
const require = createRequire(import.meta.url);
const esbuild_ = require("esbuild/lib/main");
const swc_ = require("@swc/core");

View File

@@ -1,4 +1,4 @@
import { readFileSync, writeFileSync } from "node:fs";
import { writeFileSync } from "node:fs";
import { bench, run } from "./runner.mjs";
var short = "Hello World!";

View File

@@ -1,6 +1,6 @@
import { bench, run } from "./runner.mjs";
import { write } from "bun";
import { openSync } from "fs";
import { bench, run } from "./runner.mjs";
bench('write(/tmp/foo.txt, "short string")', async () => {
await write("/tmp/foo.txt", "short string");

View File

@@ -1,9 +1,8 @@
// @runtime node, bun, deno
import { bench, run } from "./runner.mjs";
import { Buffer } from "node:buffer";
import { openSync } from "node:fs";
import { openSync, writeSync as write } from "node:fs";
import { writeFile } from "node:fs/promises";
import { writeSync as write } from "node:fs";
import { bench, run } from "./runner.mjs";
bench("writeFile(/tmp/foo.txt, short string)", async () => {
await writeFile("/tmp/foo.txt", "short string", "utf8");

View File

@@ -1,4 +1,4 @@
import { run, bench } from "mitata";
import { bench, run } from "mitata";
import { createRequire } from "module";
const require = createRequire(import.meta.url);

View File

@@ -1,5 +1,5 @@
import { run, bench } from "mitata";
import { Database } from "bun:sqlite";
import { bench, run } from "mitata";
import { join } from "path";
const db = Database.open(join(import.meta.dir, "src", "northwind.sqlite"));

View File

@@ -1,5 +1,5 @@
import { Database } from "https://deno.land/x/sqlite3@0.11.1/mod.ts";
import { run, bench } from "../node_modules/mitata/src/cli.mjs";
import { bench, run } from "../node_modules/mitata/src/cli.mjs";
const db = new Database("./src/northwind.sqlite");

View File

@@ -1,6 +1,6 @@
// Run `node --experimental-sqlite bench/sqlite/node.mjs` to run the script.
// You will need `--experimental-sqlite` flag to run this script and node v22.5.0 or higher.
import { run, bench } from "mitata";
import { bench, run } from "mitata";
import { DatabaseSync as Database } from "node:sqlite";
const db = new Database("./src/northwind.sqlite");

7
bench/tsconfig.json Normal file
View File

@@ -0,0 +1,7 @@
{
"extends": "../tsconfig.json",
"compilerOptions": {
// For the organize imports plugin
"jsx": "react"
}
}

View File

@@ -89,10 +89,8 @@ const BunBuildOptions = struct {
pub fn getOSVersionMin(os: OperatingSystem) ?Target.Query.OsVersion {
return switch (os) {
// bun needs macOS 12 to work properly due to icucore, but we have been
// compiling everything with 11 as the minimum.
.mac => .{
.semver = .{ .major = 11, .minor = 0, .patch = 0 },
.semver = .{ .major = 13, .minor = 0, .patch = 0 },
},
// Windows 10 1809 is the minimum supported version

BIN
bun.lockb

Binary file not shown.

View File

@@ -82,7 +82,7 @@ _bun_completions() {
declare -A PACKAGE_OPTIONS;
declare -A PM_OPTIONS;
local SUBCOMMANDS="dev bun create run install add remove upgrade completions discord help init pm x test repl update link unlink build";
local SUBCOMMANDS="dev bun create run install add remove upgrade completions discord help init pm x test repl update outdated link unlink build";
GLOBAL_OPTIONS[LONG_OPTIONS]="--use --cwd --bunfile --server-bunfile --config --disable-react-fast-refresh --disable-hmr --env-file --extension-order --jsx-factory --jsx-fragment --extension-order --jsx-factory --jsx-fragment --jsx-import-source --jsx-production --jsx-runtime --main-fields --no-summary --version --platform --public-dir --tsconfig-override --define --external --help --inject --loader --origin --port --dump-environment-variables --dump-limits --disable-bun-js";
GLOBAL_OPTIONS[SHORT_OPTIONS]="-c -v -d -e -h -i -l -u -p";

View File

@@ -179,6 +179,7 @@ complete -c bun -n "__fish_use_subcommand" -a "remove" -d "Remove a dependency f
complete -c bun -n "__fish_use_subcommand" -a "add" -d "Add a dependency to package.json" -f
complete -c bun -n "__fish_use_subcommand" -a "init" -d "Initialize a Bun project in this directory" -f
complete -c bun -n "__fish_use_subcommand" -a "link" -d "Register or link a local npm package" -f
complete -c bun -n "__fish_use_subcommand" -a "link" -d "Unregister a local npm package" -f
complete -c bun -n "__fish_use_subcommand" -a "unlink" -d "Unregister a local npm package" -f
complete -c bun -n "__fish_use_subcommand" -a "pm" -d "Additional package management utilities" -f
complete -c bun -n "__fish_use_subcommand" -a "x" -d "Execute a package binary, installing if needed" -f
complete -c bun -n "__fish_use_subcommand" -a "outdated" -d "Display the latest versions of outdated dependencies" -f

View File

@@ -563,6 +563,22 @@ _bun_update_completion() {
esac
}
_bun_outdated_completion() {
_arguments -s -C \
'--cwd[Set a specific cwd]:cwd' \
'--verbose[Excessively verbose logging]' \
'--no-progress[Disable the progress bar]' \
'--help[Print this help menu]' &&
ret=0
case $state in
config)
_bun_list_bunfig_toml
;;
esac
}
_bun_test_completion() {
_arguments -s -C \
'1: :->cmd1' \
@@ -669,6 +685,7 @@ _bun() {
'add\:"Add a dependency to package.json (bun a)" '
'remove\:"Remove a dependency from package.json (bun rm)" '
'update\:"Update outdated dependencies & save to package.json" '
'outdated\:"Display the latest versions of outdated dependencies" '
'link\:"Link an npm package globally" '
'unlink\:"Globally unlink an npm package" '
'pm\:"More commands for managing packages" '
@@ -740,6 +757,10 @@ _bun() {
update)
_bun_update_completion
;;
outdated)
_bun_outdated_completion
;;
'test')
_bun_test_completion
@@ -819,6 +840,10 @@ _bun() {
update)
_bun_update_completion
;;
outdated)
_bun_outdated_completion
;;
'test')
_bun_test_completion

View File

@@ -70,6 +70,116 @@ const server = Bun.serve({
});
```
### Static routes
Use the `static` option to serve static `Response` objects by route.
```ts
// Bun v1.1.27+ required
Bun.serve({
static: {
// health-check endpoint
"/api/health-check": new Response("All good!"),
// redirect from /old-link to /new-link
"/old-link": Response.redirect("/new-link", 301),
// serve static text
"/": new Response("Hello World"),
// server a file by buffering it in memory
"/index.html": new Response(await Bun.file("./index.html").bytes(), {
headers: {
"Content-Type": "text/html",
},
}),
"/favicon.ico": new Response(await Bun.file("./favicon.ico").bytes(), {
headers: {
"Content-Type": "image/x-icon",
},
}),
// serve JSON
"/api/version.json": Response.json({ version: "1.0.0" }),
},
fetch(req) {
return new Response("404!");
},
});
```
Static routes support headers, status code, and other `Response` options.
```ts
Bun.serve({
static: {
"/api/time": new Response(new Date().toISOString(), {
headers: {
"X-Custom-Header": "Bun!",
},
}),
},
fetch(req) {
return new Response("404!");
},
});
```
Static routes can serve Response bodies faster than `fetch` handlers because they don't create `Request` objects, they don't create `AbortSignal`, they don't create additional `Response` objects. The only per-request memory allocation is the TCP/TLS socket data needed for each request.
{% note %}
`static` is experimental
{% /note %}
Static route responses are cached for the lifetime of the server object. To reload static routes, call `server.reload(options)`.
```ts
const server = Bun.serve({
static: {
"/api/time": new Response(new Date().toISOString()),
},
fetch(req) {
return new Response("404!");
},
});
// Update the time every second.
setInterval(() => {
server.reload({
static: {
"/api/time": new Response(new Date().toISOString()),
},
fetch(req) {
return new Response("404!");
},
});
}, 1000);
```
Reloading static routes only impact the next request. In-flight requests continue to use the old static routes. After in-flight requests to old static routes are finished, the old static routes are freed from memory.
To simplify error handling, static routes do not support streaming response bodies from `ReadableStream` or an `AsyncIterator`. Fortunately, you can still buffer the response in memory first:
```ts
const time = await fetch("https://api.example.com/v1/data");
// Buffer the response in memory first.
const blob = await time.blob();
const server = Bun.serve({
static: {
"/api/data": new Response(blob),
},
fetch(req) {
return new Response("404!");
},
});
```
### Changing the `port` and `hostname`
To configure which port and hostname the server will listen on, set `port` and `hostname` in the options object.
@@ -326,7 +436,24 @@ Bun.serve({
});
```
## Object syntax
## idleTimeout
To configure the idle timeout, set the `idleTimeout` field in Bun.serve.
```ts
Bun.serve({
// 10 seconds:
idleTimeout: 10,
fetch(req) {
return new Response("Bun!");
},
});
```
This is the maximum amount of time a connection is allowed to be idle before the server closes it. A connection is idling if there is no data sent or received.
## export default syntax
Thus far, the examples on this page have used the explicit `Bun.serve` API. Bun also supports an alternate syntax.

View File

@@ -4,7 +4,7 @@ It's about 20x faster than `node-semver`.
![Benchmark](https://github.com/oven-sh/bun/assets/709451/94746adc-8aba-4baf-a143-3c355f8e0f78)
Currently, this API is two functions.
Currently, this API provides two functions :
#### `Bun.semver.satisfies(version: string, range: string): boolean`

View File

@@ -419,7 +419,7 @@ const results = query.all("hello", "goodbye");
sqlite supports signed 64 bit integers, but JavaScript only supports signed 52 bit integers or arbitrary precision integers with `bigint`.
`bigint` input is supported everywhere, but by default `bun:sqlite` returns integers as `number` types. If you need to handle integers larger than 2^53, set `safeInteger` option to `true` when creating a `Database` instance. This also validates that `bigint` passed to `bun:sqlite` do not exceed 64 bits.
`bigint` input is supported everywhere, but by default `bun:sqlite` returns integers as `number` types. If you need to handle integers larger than 2^53, set `safeIntegers` option to `true` when creating a `Database` instance. This also validates that `bigint` passed to `bun:sqlite` do not exceed 64 bits.
By default, `bun:sqlite` returns integers as `number` types. If you need to handle integers larger than 2^53, you can use the `bigint` type.

View File

@@ -106,6 +106,31 @@ The `--minify` argument optimizes the size of the transpiled output code. If you
The `--sourcemap` argument embeds a sourcemap compressed with zstd, so that errors & stacktraces point to their original locations instead of the transpiled location. Bun will automatically decompress & resolve the sourcemap when an error occurs.
## Worker
To use workers in a standalone executable, add the worker's entrypoint to the CLI arguments:
```sh
$ bun build --compile ./index.ts ./my-worker.ts --outfile myapp
```
Then, reference the worker in your code:
```ts
console.log("Hello from Bun!");
// Any of these will work:
new Worker("./my-worker.ts");
new Worker(new URL("./my-worker.ts", import.meta.url));
new Worker(new URL("./my-worker.ts", import.meta.url).href);
```
As of Bun v1.1.25, when you add multiple entrypoints to a standalone executable, they will be bundled separately into the executable.
In the future, we may automatically detect usages of statically-known paths in `new Worker(path)` and then bundle those into the executable, but for now, you'll need to add it to the shell command manually like the above example.
If you use a relative path to a file not included in the standalone executable, it will attempt to load that path from disk relative to the current working directory of the process (and then error if it doesn't exist).
## SQLite
You can use `bun:sqlite` imports with `bun build --compile`.
@@ -179,6 +204,59 @@ console.log(addon.hello());
Unfortunately, if you're using `@mapbox/node-pre-gyp` or other similar tools, you'll need to make sure the `.node` file is directly required or it won't bundle correctly.
### Embed directories
To embed a directory with `bun build --compile`, use a shell glob in your `bun build` command:
```sh
$ bun build --compile ./index.ts ./public/**/*.png
```
Then, you can reference the files in your code:
```ts
import icon from "./public/assets/icon.png" with { type: "file" };
import { file } from "bun";
export default {
fetch(req) {
// Embedded files can be streamed from Response objects
return new Response(file(icon));
},
};
```
This is honestly a workaround, and we expect to improve this in the future with a more direct API.
### Listing embedded files
To get a list of all embedded files, use `Bun.embeddedFiles`:
```js
import "./icon.png" with { type: "file" };
import { embeddedFiles } from "bun";
console.log(embeddedFiles[0].name); // `icon-${hash}.png`
```
`Bun.embeddedFiles` returns an array of `Blob` objects which you can use to get the size, contents, and other properties of the files.
```ts
embeddedFiles: Blob[]
```
The list of embedded files excludes bundled source code like `.ts` and `.js` files.
#### Content hash
By default, embedded files have a content hash appended to their name. This is useful for situations where you want to serve the file from a URL or CDN and have fewer cache invalidation issues. But sometimes, this is unexpected and you might want the original name instead:
To disable the content hash, pass `--asset-naming` to `bun build --compile` like this:
```sh
$ bun build --compile --asset-naming="[name].[ext]" ./index.ts
```
## Minification
To trim down the size of the executable a little, pass `--minify` to `bun build --compile`. This uses Bun's minifier to reduce the code size. Overall though, Bun's binary is still way too big and we need to make it smaller.

View File

@@ -1276,7 +1276,7 @@ interface BuildOptions {
loader?: { [k in string]: Loader }; // See https://bun.sh/docs/bundler/loaders
manifest?: boolean; // false
external?: string[]; // []
sourcemap?: "none" | "inline" | "linked" | "external" | boolean; // "none"
sourcemap?: "none" | "inline" | "linked" | "external" | "linked" | boolean; // "none"
root?: string; // computed from entrypoints
naming?:
| string

61
docs/cli/outdated.md Normal file
View File

@@ -0,0 +1,61 @@
Use `bun outdated` to display a table of outdated dependencies with their latest versions for the current workspace:
```sh
$ bun outdated
|--------------------------------------------------------------------|
| Package | Current | Update | Latest |
|----------------------------------------|---------|--------|--------|
| @types/bun (dev) | 1.1.6 | 1.1.7 | 1.1.7 |
|----------------------------------------|---------|--------|--------|
| @types/react (dev) | 18.3.3 | 18.3.4 | 18.3.4 |
|----------------------------------------|---------|--------|--------|
| @typescript-eslint/eslint-plugin (dev) | 7.16.1 | 7.18.0 | 8.2.0 |
|----------------------------------------|---------|--------|--------|
| @typescript-eslint/parser (dev) | 7.16.1 | 7.18.0 | 8.2.0 |
|----------------------------------------|---------|--------|--------|
| esbuild (dev) | 0.21.5 | 0.21.5 | 0.23.1 |
|----------------------------------------|---------|--------|--------|
| eslint (dev) | 9.7.0 | 9.9.1 | 9.9.1 |
|----------------------------------------|---------|--------|--------|
| typescript (dev) | 5.5.3 | 5.5.4 | 5.5.4 |
|--------------------------------------------------------------------|
```
The `Update` column shows the version that would be installed if you ran `bun update [package]`. This version is the latest version that satisfies the version range specified in your `package.json`.
The `Latest` column shows the latest version available from the registry. `bun update --latest [package]` will update to this version.
Dependency names can be provided to filter the output (pattern matching is supported):
```sh
$ bun outdated "@types/*"
|------------------------------------------------|
| Package | Current | Update | Latest |
|--------------------|---------|--------|--------|
| @types/bun (dev) | 1.1.6 | 1.1.8 | 1.1.8 |
|--------------------|---------|--------|--------|
| @types/react (dev) | 18.3.3 | 18.3.4 | 18.3.4 |
|------------------------------------------------|
```
## `--filter`
The `--filter` flag can be used to select workspaces to include in the output. Workspace names or paths can be used as patterns.
```sh
$ bun outdated --filter <pattern>
```
For example, to only show outdated dependencies for workspaces in the `./apps` directory:
```sh
$ bun outdated --filter './apps/*'
```
If you want to do the same, but exclude the `./apps/api` workspace:
```sh
$ bun outdated --filter './apps/*' --filter '!./apps/api'
```

View File

@@ -10,7 +10,7 @@ This automatically load balances incoming requests across multiple instances of
```ts#server.ts
import { serve } from "bun";
const id = = Math.random().toString(36).slice(2);
const id = Math.random().toString(36).slice(2);
serve({
port: process.env.PORT || 8080,

View File

@@ -16,10 +16,6 @@ $ bun test # run tests
$ bunx cowsay 'Hello, world!' # execute a package
```
{% callout type="note" %}
**Bun is still under development.** Use it to speed up your development workflows or run simpler production code in resource-constrained environments like serverless functions. We're working on more complete Node.js compatibility and integration with existing frameworks. Join the [Discord](https://bun.sh/discord) and watch the [GitHub repository](https://github.com/oven-sh/bun) to keep tabs on future releases.
{% /callout %}
Get started with one of the quick links below, or read on to learn more about Bun.
{% block className="gap-2 grid grid-flow-row grid-cols-1 md:grid-cols-2" %}

Some files were not shown because too many files have changed in this diff Show More