* Open with proper perms when redirecting file to stdin
* Add test for redirecting file to stdin
* Extract redirect flags -> bun.Mode logic to function
* Remove dead code
* [autofix.ci] apply automated fixes
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* windows: implement bun.isWritable
* windows: pass test/cli/run/as-node.test.ts
C:\Users\dave\AppData\Local\Temp\bun-node-a2ae984c3\node.exe is a hardlink on windows so it will not resolve to C:\bun\build\bun-debug.exe
skip the first param since that is not the behavior this test is supposed to be testing
* windows: pass test/js/node/dns/node-dns.test.js
* windows: pass test/js/node/process/process.test.js
* windows: pass test/js/web/streams/streams.test.js
* windows: pass test/js/workerd/html-rewriter.test.js
Closes#8459
* windows: fix node:util.inspect
* windows: these pass now
* windows: pass test/js/node/stream/node-stream.test.js
* disable http sendfile on windows
* use url.origin here
* more sendfile removal
* windows: pass test/js/web/websocket/websocket.test.js
* test/js/deno/performance/performance.test.ts is flaky, come back to it
---------
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
* fix: make sure Bun.sleep(Date) doesn't return prematurely
Fixes#8834.
This makes Bun.sleep(new Date(x)) fulfill its promise only when
Date.now() >= x.
* resolve test now #8834 is fixed
11 ms is in fact the right limit.
---------
Co-authored-by: John-David Dalton <john.david.dalton@gmail.com>
* Add fs.exists[util.promisify.custom]
fs.exists doesn't follow the error-first-callback convention, so it
needs a custom implementation for util.promisify.
* Simplify
---------
Co-authored-by: John-David Dalton <john.david.dalton@gmail.com>
* Fix#8403
* Throw on error by default
* Add the shell promise utilities to `ShellOutput` and `ShellError`
* Fix tests
* [autofix.ci] apply automated fixes
* Fix memleak
* [autofix.ci] apply automated fixes
* Woops
* `Bun.gc(true)` in fd leak test
* fd leak test should check if `fd <= baseline`
* wtf
* oob check
* [autofix.ci] apply automated fixes
* Fix double free
* Fix#8550
* increase mem threshold for linux
* Requested changes and make not throw on by default
* [autofix.ci] apply automated fixes
* more requested changes
* Do destructuring in function definition
* delete
* Change shell output test to enable throwing
* [autofix.ci] apply automated fixes
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* Bun.inspect: distinguish [Getter], [Setter], [Getter/Setter]
fixes#8853
NOTE: this modifies files which were auto-generated at one point, but
which are now maintained as part of the Bun sources.
* test for #8853
---------
Co-authored-by: Georgijs <48869301+gvilums@users.noreply.github.com>
* try to make ci green
* fix a crash in debug mode
* [autofix.ci] apply automated fixes
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* random acts of cleanup to tests
* nerf the watchFile test, is CI slow?
* more things
* [autofix.ci] apply automated fixes
* a
* remove a log
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* fix: zlib functions should throw an error if appropriate
Fixes#8887.
* Tests for #8887
* fix: drive-by fix to avoid unreachable code being reached on error
* work on bundler
* a
* YAAAAYYAYAYAYYAYA
* get some more bundler tests working
* Update src/bundler/bundle_v2.zig
* rev
* ok
* i converted the cmakelists into LF
* personal review
* we didnt win
* okey they pass
* revert :(
* a
---------
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
* Remove dead code now that `expect()` can be used outside of tests
* Fix some errors not being rendered to GitHub annotations
* [autofix.ci] apply automated fixes
* Update jest.zig
Try `execCallback`
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This often fails in CI (and on my machine) non-deterministically.
The 1ms + the 5000 is likely setting up a race condition in tasks/microtasks. Just changing it to to +10ms instead of +1ms is enough.
* http use arraylist to handle shutdowns
* on windows use wsaconnectbyname to speed up localhost connections
* use arbitrary port
* close socket on setsockopt error
* use null timeout in wsaconnectbyname
* Update src/http.zig
* fix zig compile
* update hostname on linux
* [autofix.ci] apply automated fixes
* fix getpeername failing after connecting with socket
---------
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* Add checks that we drain the microtask queue whenever we call into JavaScript
* Drain microtasks in more places
* Tweak assertions for entering/exiting the event loop
* Drain more
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
* uv loop is thread local
* hi
* stuff so far
* [autofix.ci] apply automated fixes
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
Binary notation ("0b") is appropriate instead of hexadecimal notation ("0x").
Sorry for the omission of the correction in this [PR](https://github.com/oven-sh/bun/pull/8619).
* get test/bundler/bundler_naming.test.ts passing on windows
* move platformToPosixInPlace to bun.path and use the vector'd version
* only resolve rel_path if it contains '/./', most of the time './' needs to be preserved
* fix another file too
* move kernel32 extern to better location
* [autofix.ci] apply automated fixes
* use bun.path.posixToPlatformInPlace here
* rewrite this whole section to stay in utf16 and handle errors
* remove dead comments
* fix a typo
* undo these relative changes
* preserve path.pretty from getting lost
* use bun's instead of zig's resolve here
* both side of this loop need the inplace normal
* use existing generic dirname function
* make path inplace functions generic
* we might need to modify this so copy on windows
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
* don't assume the prefix we get from this
* more robust path traversal
* don't mangle absolute paths
* do this bit in a loop
* this line is a u16
* dont forget to compile before pushing
* this was wrong
* look into this later
* check pointer math first since its faster
* posix syscalls support path traversal, don't do the work for them
* its already inside stable, no need to change
* used the online editor
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
* draft impl of windows watcher
* synchronous watcher
* working standalone watcher
* in progress changes to watcher
* make watcher non-global
* prepare watcher for windows impl
* add windows watcher scaffold and clean up imports
* fix inotify
* make watch code more generic over platforms
* fix visibility
* watcher starts without error
* printing changes works
* basic windows watching works
* handle process exit from watcher
* cleanup in process cloning
* clean up logging and panic handling
* fix hot reload test on windows
* misc cleanup around watcher
* make watch test actually useful
* [autofix.ci] apply automated fixes
* remove old files
* clean up watchers
* update .gitignore
* rework windows watcher into single watcher instance watching top level project dir
* use non-strict utf16 conversion
* change to contains
* fix mac and linux compile
* add baseline in crash report (#8606)
* allow linking bins that do not exist. (#8605)
* fix linux compile
* fix linux compile (again)
* remove outdated todo
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: dave caruso <me@paperdave.net>
* yay!!!!!!
* [autofix.ci] apply automated fixes
* ok
* do not use reflect here
* ok
* [autofix.ci] apply automated fixes
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* Docs: Fix typo in code example for transformSync
* Remove await since transformSync is synchronous
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
---------
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
* link and unlink
* valid git dependency cache path
* windows global link
* not git
* update some tests
* update more tests
* update
* update log
* fix snapshots
* more tests
* fix bun pm ls
* make it possible to delete cache dir
* normalize
* fix bun-create tests
* update bun-remove tests
* silent
* bun-run update
* update more tests
* update more
* update
* [autofix.ci] apply automated fixes
* update simdutf for getFdPath
* update test
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* shim v1 TODO
* fix BunXShimData
* wip
* put a little bit of the sa u c e on it
* wow
* wat
* a
* swag
* swag
* allllllllllllright
* Update src/install/bin.zig
Co-authored-by: Dylan Conway <35280289+dylan-conway@users.noreply.github.com>
* [autofix.ci] apply automated fixes
* swag
* swag
* finis
* fix submodules
* ok
* omg it works again
* silly
* ok
* OK
* update laucnh jsn
* swaaaaaaaaaaaaag
* remove debug
---------
Co-authored-by: Dylan Conway <35280289+dylan-conway@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
When using sendfile() to stream, if the user aborted the request it may appear as `ENOTCONN`, which we were logging to the terminal. We really shouldn't be logging anything here, but it's a little unclear what kind of error to emit. It's not a fatal error.
* fix argv parsing on windows
* directly use zig stdlib
* remove debug comments, fix double deinit
* change bun.argv() to return slices, not null-terminated pointers
* fix test on windows to escape file paths correctly
---------
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
* windows: fix some websocket tests
* this file should work now, report any errors
* make this change later
* add back running this with node
* add as const to these
---------
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
* fix sys.dup on windows and make console-iterator work
* fix(windows): fix console async iterator to not include the \r
* fix kill on windows again. and report the right errno
---------
Co-authored-by: dave caruso <me@paperdave.net>
* Move ReadFile and WriteFile to separate file
* Use libuv for Bun.write()
* Update windows_event_loop.zig
* build
* Get bun-write tests to pass. Implement Bun.write with two files.
* UPdate
* Update
* Update failing test list
* update
* More
* More
* More
* More
* Mark the rest
* ok
* oops
* Update bun-write.test.js
* Update blob.zig
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
Co-authored-by: Dave Caruso <me@paperdave.net>
Co-authored-by: Georgijs Vilums <georgijs.vilums@gmail.com>
ioctl_ficlone may return EPERM (in LXC container), EACCESS (in Android).
Those error should be taken as ficlone being not supported instead of
error.
Refer to this coreutils bug report https://bugs.gnu.org/62404
* keep cache dir path, use correct buffer
* make it work more better
* more working
* more fix
* more update
* more fix
* fix test
* update
* fix
* update pointers
---------
Co-authored-by: dave caruso <me@paperdave.net>
* keep cache dir path, use correct buffer
* make it work more better
* more working
* more fix
* more update
* more fix
* fix test
* update tests
* comment and fix test
* one more fix
* fix build
---------
Co-authored-by: dave caruso <me@paperdave.net>
* spawn sync investigation, pipe closed before uv_read_start is called
* oopsie
* win rusage
* oopsie
* Fix some things
* readable stream now works without FIFO like solution
* blob, ArrayBuffer, Buffer stdin now works
* remove unused
* add UVStreamSink
* update headers.j
* more bindings
* now works yay
* fix rusage on windows
* oops
* fix rare data
* win getUserName
* [autofix.ci] apply automated fixes
* fix build
* oopsie
* fix linux/macos
* exit code fix
* fix kill for win
* disable Bun__crashReportDumpStackTrace on Windows
* remove windows stack dump in report.zig and increase windows test timeout
* condition instead of assertion
* remove IPC again
* fix blob writer when not using TTY
* bump windows tests time again
* bump time again so we see how much we need (this is probably too much)
---------
Co-authored-by: cirospaciari <ciro.spaciai@gmail.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: cirospaciari <ciro.spaciari@gmail.com>
* copy_file: this TODO is no longer a compiler bug
* [autofix.ci] apply automated fixes
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* bring in shell impl
* add `$` to global bun scope
* Expose shell parse func on debug mode
* Expose lex tokens and add tests
* refactor parser to have better ast
* assigns and export
* pipeline kinda working
* Decouple Subprocess spawning code from JS stuff
* Subprocess works!
* Conditional execution
* Support JS objects in template expression
* More complete redirection
* Properly drain stdin/stdout/stderr and fix crash from deallocating JSC memory
* Return errors in parser
* Support command substitution
* wip brace expansion stuff
* Rearrange some files
* expansion wip
* Brace expansion working
* wip brace expansion
* refactor brace algorithm
* wip brace expansion on shell
* fix brace expansion
* Working nested brace expansion!
* brace expansion in shell variable assignment only set the last expanded
* stuff
* Small little perf things
* benchmark and test and stuff
* stuff
* fix nested braces but its also kinda broken
* attempt to fix complicated nested braces
* test
* Use fast tokenized algorithm for non nested braces, use parsed algorithm for nested braces
* fix nested braces one and for all
* small stuff
* Not sure if that made a difference
* revert that
* good speed optimization
* rip
* Environment variables, builtin/native shell cmds
* Fix tests
* Support `cd`, `pwd`, add boilerplate for glob expansion
* Support `which`
* Support `rm`
* wip
* wip
* escaping and abstract shell char iterator
* strpool unicode
* Brace expansion support unicode, disallow invalid surrogates in shell script
* shell choose ascii or unicode lexer depending on input
* fix bugs write tests
* kinda start async stuff
* HOLY SHIT big refactor of Subprocess
woops forget to commit this
...and this
* HOLY MOLY it works
* Refactor some stuff, start eval word expansion
* interpret all the nodes
* stuff
* stuff
* stuff
* kind of works but doesnt
* Buffered output works
* no need to heap allocate autosizer
* Fix bug
* Fix some stuff
* unprotect
* move out dummy shell thing
* Bring back assignments
* create expansion state so it can be non blocking for expansions that need IO (glob, cmd subst)
* glob back in action
* Setup builtin non blocking IO commands and implement export
big issue is control flow is really fcked up here need to fix that
* make Cmd state machine use a loop so control flow is a bit more clear
* rename stuff
* move that
* Implement the echo builtin again
* implement cd again but non blocking io
* Fix ls and use proper write function to prevent blockign writes
* Implement which
* holy moly big port std.fs.deleteTree
* fix compile errors
* Okay that works
* rm works thatsnice
* damn
* split it out
* rm async implementation
* fix rm bug for nested
* Work on files as well
* prevent root from being deleted
* rm error handling
* oops
* pwd and fix some script exec bug
* Implement `mv`
* stub out mv to work accross filesystems
* move it around
* woops
* boilerplate for ls and options
* more boilerplate
* stuff
* that got lost in merge
* upgrade shell stuff zig 0.12.0-dev.1828+225fe6ddb
* Implement basic ls
* smol cleanup
* Fix stream, response redirect stdin
* No longer need spawn to be abstract
* Custom promise
* move around some stuff
* shell promise returns shell output
* make tht work for builtins
* refactor IO abstractions to work with JS or mini event loop
* woops
* scaffolding for refactor
* refactor builtins to make event loop refactor easier
* Fix parsing edge case on assignments, fix expansion on cmd assignments
* change subproc to work with any event loop
* Finish refactoring subproc
* move global abstraction out
* big refactor boys
* holy moly: integrate into cli and fix allll the compile errors
* okay works in bun run now
* actually tick the event loop lol
* Fix more stuff
* Support comments
* Fix some tests
* delete that
* Properly report errors when failing to spawn command
* fix a whole bunch of tests
* fix a whole bunch of tests again
* .
* Fix rm
* Fix some exit code bugs, write force rm from deno, fix ls stderr
* fix `rm -d`
* fix `rm -d`
* Fix boolean logic
* error on subshells (e.g. `true && (echo hi && echo lol)`)
* Move out shell state from interpreter struct
* Cmd substitution supports arbitrary script, not just a single cmd
* Some escaping/quotation tests
* Fix stuff add more tests:
- cmd substitution quotations
- escape backticks in single quots
* ALOT of stuff:
- fix proper subshell inheritance of env for cmd subst
- fix: was wrong, assignments don't run in subshell in conditionals
- fix lexing chained vars `$VAR$VAR`
- more tests
* Fix subtle bugs
* Fix crazy redirect to arraybuffer bug
* more crazy echo edgecases
* Proper lexer errors instead of just panicking lol
* yoops
* Proper parsing errors
* Errors for bun run shell script
* Fix redirecting to file
* More test fix bugs yay
* Fix redirect on builtins
* Open redirection fds with O_TRUNC
* Fix lexing invalid variables and add ability to change cwd from JS api
* yoops
* Fix `.cwd()`
* `$PWD` and fix redirection bugs
* `$PWD` and fix redirection bugs
* Get rid of some `FIXME`s
* throw errors in some places instead of panicking
* Print some errors to stderr
* Get rid of some more panics again
* Handle errors on glob
* pwd test
* `.env()`
* copy-on-write abstraction
* Reference counted env strings + fix some tests
* deinit cwd
* Put commands into a pipeline properly
* deinit Expansion and Assigns properly
* comments
* Comments
* Make it compile
* Update types
* [autofix.ci] apply automated fixes
* Only one WaiterThread
* Fix lifetimes and clean up interface
* Update shell.ts
* Add lazy test
* Remove some dead code
* Update shell.zig
* Fix memory leak
* Fix crash with empty braces
* [autofix.ci] apply automated fixes
* Linux build + bun.sh
* Update subproc.zig
* Update interpreter.zig
* Update interpreter.zig
* Fix some stuff that broke
* Fix Windows compile errors
* Fix some fd leaks
* Fix ls
* Fix a bunch of stuff
* Fix quiet
* Update leak tests fix rm bug
* More reproducible tests
* [autofix.ci] apply automated fixes
* more mem leak tests
* [autofix.ci] apply automated fixes
* Fix merge conflict
* Fix test not actually using temp directory
* Update bunshell.test.ts
* Shell instance
* Capture async context
* Increase test timeouts
* [autofix.ci] apply automated fixes
* Escape
* [autofix.ci] apply automated fixes
* Fix crash
* Add more methods
* [autofix.ci] apply automated fixes
* Fix leak
* Treat file(path) blobs as a file path string
* Create bunshell-file.test.ts
* Support Blob input
* Fix leak + organize imports
* doc
* Update shell.md
* Update shell.md
* Update shell.md
* Update shell.md
* Update CMakeLists.txt
* Fix segfault by cloning error path so it's not freed by arena
* deinit ShellErr
* Delete dead code
* fix really stupid segfault
* don't deinit shell ls task in event loop
* Fix ls bug
* Fix tests
* make truly lazy
* allow more things in the shell substitution and escape whitespace
* Fix newline and exit when finishing shell in `bun run`
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* In fs.ReadStream, use `$isObject` to check if function or object rather than typeof options === "object"
* Update fs.js
* Add test
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
* Avoid deadlock in messageWithTypeAndLevel by adding a recursion counter
* Add test for recursive logs
* Do not rely on output of console-recursive.test.js
* [autofix.ci] apply automated fixes
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* make node:fs/promises.open return a FileHandle and expose fdatasync
* node_fs: add fn spacing
* fix this assert usage too
* move primordial preservation higher
* use expect().toBe() instead of assert
* ensure top level node:fs/promises functions always receive fd's as a number
* add needed fixture
* [autofix.ci] apply automated fixes
* this was the wrong fix for a different thing
will look into it later
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* port 'initial support for using declarations'
1:1 port of this commit:
56a3e01244
* port 'initial support for await using declarations'
1:1 port of this commit:
1634a0b5ad
* fix cmake config for local jsc
* add global defines for symbols
* begin porting lowering implementation
based off of
https://github.com/evanw/esbuild/pull/3192
* [autofix.ci] apply automated fixes
* add some fun webkit scripts
* fix the minification bug
* refactor runtime_js, etc
* rename test file
* finished yapping
* silly silyl
* Update src/bundler.zig
* ok
* a
* Fix crash
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
* exit event loop if there's unhandled errors
* move FixedQueue to a special package
* require(events) is also EventEmitter
* implement events.on
* move fixed_queue to internal and make it lazy in node:events
* use better Promise intrinsics
* move $shared to internal/shared
* make test not dependent on cwd
* Some windows tweaks
* Make this pub
* Update bundle_v2.zig
* Fix woopsie
* Make this error better
* Add assertion for using allocator for HTTP client from another thread.
* Do fewer copies in readdir()
* Fix crash/failing tests
* Update tests
* Fix windows build
* Update loop.c
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
* Upgrade uWebSockets & usockets
* Update HttpRouter.h
* Defensively prevent sending to blocking sockets
* Add test for receiving large amounts of data
* Large data optimization
* Update loop.c
* Avoid extra system call before entering event loop
* Update internal.h
* 1 less pointer lookup
* Fix error
* Update socket-huge-fixture.js
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
* remove while loops where a for would be more efficient
* this needs to be a stack copy
* this can use the better loop
* this was translated wrong
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
* fix(node:url): handle url with missing host on `url.parse`
* lazy load punycode module
* use URL class
* add comment and also extra sanity check tests
* extra test
---------
Co-authored-by: dave caruso <me@paperdave.net>
* all: make bun.FileDescriptor a unique type
# Conflicts:
# src/bun.js/api/bun/socket.zig
# src/bun.js/api/bun/spawn.zig
# src/deps/uws.zig
* need this change too
* convert another bun.FD.asDir call
* more fixes + linux
* fix this size
* accidentally flipped these fd numbers
* more fixes + windows
# Conflicts:
# src/deps/uws.zig
* dont include type name in serialization
* add another TODO
* resolve review comments
* address more pr comments
* build fixes post-rebase
* another rebase fix
---------
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
* Fixes#7001
* One more test
* Use `disturbed`
* [autofix.ci] apply automated fixes
* Fix failing test
* Test is no longer todo!
* Make bodyUsed work too
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* fix compilation and types for FD option using usockets
* comment
* clarify HOST_MAME_MAX on windows
* use libuv for timers on windows
* [autofix.ci] apply automated fixes
* fix linux build
---------
Co-authored-by: cirospaciari <ciro.spaciai@gmail.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* Don't use posix_spawn on Linux
* Make it work
* Avoid closing inherited file descriptors
* Hopefully fix test failures
* Reset close-on-exec flag
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
* implemented assert.doesNotMatch
* fixed assert.match and assert.doesNotMatch tests and ensure it throws when actual is not a string
---------
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
* Update contributing.md
Added documentation for the installation of the perl Math::BigInt module
* Update contributing.md
merged the fedora perl math bigint module with the other dependencies
* Fixes#8010
* Update install.zig
* Copy the metahash when cleaning the lockfile
* Save more, but error less
* Change copy when there are no more dependencies
* Tweak some tests
* Update bun-add.test.ts
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
const result = await ...
for (const result of result.outputs) {...
throws
const result = await Bun.build({
^
ReferenceError: Cannot access uninitialized variable.
* Add test for multiple partial consume from BufferList
This shows the problem indicated in #7385
* Fix multiple partial consume from BufferList
The JSUint8Array::possiblySharedBuffer() returns the backing array,
not taking into account the byteOffset that indicates the start of
the data in the backing array. This means that when creating an array
with the same backing array, the current byteOffset needs to be added
to the start of the new slice.
This led to consume() returning the same data when repeatedly consuming
small numbers of bytes from the BufferList.
* Add Scoop installation for Windows
* Update installation.md
* update powershell/cmd
irm is used because on certain installs of Windows 10 iwr does not work because of something related to Internet Explorer. haha~
---------
Co-authored-by: dave caruso <me@paperdave.net>
* node:child_process: support defining extra pipes
* unneeded
* lazily load node:fs
* use $isJSArray instead of ArrayIsArray
* remove std.log call
* don't close child fd we don't own
* close child fd's in parent
* add Subprocess.stdio getter that aligns with ChildProcess.stdio fd's
* [autofix.ci] apply automated fixes
* use ArrayList instead of BoundedArray for stdio_pipes
* fix stream primordials
* dont use unreachable for syscalls
* this file was testing Bun.spawn not child_process.spawn
* skip ipc for now
* ensure the socketpair is created non-blocking on non-mac posix
* allow creating a node:net.Socket from an fd via node:net.connect
* node:stream tidy
* node:child_process: use net.Socket for stdio instead of fs streams
* try again
* fix Socket eager loading
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
* Add brotli test
* Check if we can use brotli
* vendor brotli
* Update .gitattributes
* Brotli is now always available
* Update licensing.md
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
* [bun:sqlite] Don't call memcpy on a 0 length value or nullptr
* [bun:sqlite] Add missing flags argument
* Make this a reference I guess
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
* Tweak alignment of console.table
* " " empty string instead of "#"
* Fix assertion failure
* Only get the length when necessary
* Avoid stale copies
* Add `asUTF8` helper to `bun.String`
* Cautiously handle recursion
* Further tweaks to output
* output
* Add native implementation of `getStringWidth`
* [autofix.ci] apply automated fixes
* If its not a string then quote it by default
* Add snapshot for headers
* Make it easier to debug when a builtin throws an exception
* This must be hoisted
* Fix bugs in `getStringWidth`
* Update getStringWidth.test.ts
* Eager load it
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* Better errors for bun:sqlite
* Add `byteOffset`
* Add `code` property
* Fix error
* Update test
* Add a couple more tests for errors
* Add file with sqlite error codes
* Report extra memory from `sqlite3_stmt`
* Add polyfills for macOS x64
* Use -1 when unavailable
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
* docs(bundler): update CLI command in index.md for bun build with publicPath
* Update docs/bundler/index.md
---------
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
* Fix crash with latin1 supplemental characters in bun:sqlite queries
* Make it run from any dir
* Fix comment
* [autofix.ci] apply automated fixes
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* scripts/setup.sh: don't check for zig since it installs zig later
* [autofix.ci] apply automated fixes
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* fix(#7740): change 'Duplicate dependency' to be warning instead of error
* chore(07740.test.ts): clean up test
* [autofix.ci] apply automated fixes
* fix(src/logger.zig): increment warnings instead of errors in addRangeWarningFmtWithNotes()
* chore(07740.test.ts): simplify package.json to avoid increasing test times
* chore(bun-install.test.ts): update test to expect 'warn' instead of 'error'
* chore(07740.test.ts): fix formatting
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
These are two important packages for purescript development, purescript is the language (including a binary file that must be installed), and spago is the purescript package manager (also including a binary file that must be installed).
* Simplify string handling code
* add extra + external
* Update fs.test.ts
* Bump
* woopsie
* prettier
* Rename stats() to resourceUsage()
* Fix leak
* Fix more leaks
* Setup malloc heap breakdown
* Thread safety
* Fix bug when creating buffer from utf-16 string
cc @dylan-conway
* Use global allocator
* More new
* Update fs.test.ts
* Update setTimeout.test.js
* Fix UAF in HTMLRewriter
* More bun.new
* Remove logs
* Un-skip test which no longer is flaky
* Even more `bun.new`
* Fix memory leak in HTMLRewriter.
Fixes#2325
* Don't accept Buffer for now
* Fix issue with node-fetch polyfill
* Don't destruct the response value too soon
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
* napi fixes
* Make bcrypt work
* Always return this
* Fixes#7685
* [autofix.ci] apply automated fixes
* Update napi.cpp
* Make it clearer what this is doing
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* Use timer heap for `setTimeout`
* Further efficiency improvement to timers
* Fix assertion
* Make this test less flaky?
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
* change how exit codes and signals are printed
* second iteration of this
* [autofix.ci] apply automated fixes
* dasfsa
* Fix Linux Build
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
* More lkogs
Add more logs for `--verbose`
* Fixes#5792
This makes `--frozen-lockfile` use a hash of all the resolved package versions that were installed, instead of the more permissive logic used to decide whether or not to re-run the install
* Fix debug assertion failure in `bun install --production`
* Update src/install/install.zig
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
The postinstall script will never print anything, since it does not exit with a non-zero exit code.
Therefore, this warning will never have an impact
Therefore, it should not be allowed to increase how long it takes to install your packages
4436cc748c/scripts/postinstall.js
* chore: upgrade zig to 0.12.0-dev.1828+225fe6ddb
* open as iterable
* fix building identifier cache
* fix windows build
* fix linux build
* fix linux build
bump to "657558d4d4c9c33f41b9670e72d96a5a39fe546e" which has some
windows-specific fixes, as well as fixes linux-arm64 debug build,
and adds the debug windows build.
* Use EdgeQL `for` expression for bulk insert in seed.ts
Perhaps this was a JavaScript for loop before to make it a little easier to grok for non-EdgeDB users. However, hopefully this is easier enough to understand that people can still follow the example even if they do not know EdgeQL.
* Fix small typo in assignment
* Support `expect().toBeValidDate()`
* Support `expect().toContainEqual()`
Also fixes a bug where `expect(new Set()).toContain()` would not work
* Update expect.zig
* docs
* [autofix.ci] apply automated fixes
---------
Co-authored-by: Dylan Conway <dylan.conway567@gmail.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* fix(win/upgrade): do not show powershell expand-archive info while upgrading
* start working bun run
* experiment: `bun.new`
* you can now bun run
* Update src/install/install.zig
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
* Update src/install/install.zig
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
* stuff
* fix stuff
* fix this
* farther but not really
* sadfs
* path hell
not sure how much worse or better this makes things. its a mess. windows path handlign is a mess aaaaaaaaaaaaaaaa
* path.resolve bs
* remove old build system stuff from pr
* a
* fix some path.parse/join cases
* path closer not perfect
* normalize and join tests tests done
* paths
* implement path.relative
* ,
* stuff
* assert
* fix compile
* hate
* the code isnt great
* stuff
* housekeeping for build system
* blah
* explain windows sitaution in docs
* some progress? not much though
* zig compiler crashes here
* fix
* yippee
* ok
* a
* ala wala
* fix builds on stuff
* clean
* the tests now run
* a
* aa
* dedupe uv event loop
* fix fs test accuracy
* stuff
* [autofix.ci] apply automated fixes
* huge updat e
* [autofix.ci] apply automated fixes
* url
* [autofix.ci] apply automated fixes
* start windows spawnSync
* [autofix.ci] apply automated fixes
* add --webkit for update submodules
* add better err message for `bun setup`
* fix unix platform build
* .
* [autofix.ci] apply automated fixes
* un-upgrade libarchive
* z
* asdfghj
* wrk
* todo -> panic
* ok
* a
* [autofix.ci] apply automated fixes
* fix build scripts l ol
* dfghj
* fa
* [autofix.ci] apply automated fixes
* aaaa
* a
* l
* [autofix.ci] apply automated fixes
* more logs
* [autofix.ci] apply automated fixes
* j
* fix init_command
* CORE DUMP HELL
* i swear im being pranked by the github actions gods
* fadsjkfdshjkhjkdfsahjkdfshjksdafjkhhjkfdsahfsdkjhfsdjkahf
* thanks IAS
* this is the correct fix
* personal review
* ddisablbe these
* revisions!
* ok
* fix submodule
* stuff
* fix libarchive
* [autofix.ci] apply automated fixes
* stuff
* [autofix.ci] apply automated fixes
* a
* fix addressToJS on windows
* make dns async again
* dx: add flag to update submodules ps1 to clone webkit
* dns error case for libuv
* dx improvements on windows
* newline
* obvious fix
* install steps
* extra note
* fix fs test
* Update building-windows.md
* fix builtins bundler to support \r\n line endnigs
* better
* some windows stuff
* a
* a
* a
* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
* [autofix.ci] apply automated fixes
* bunfile text works
* fix build on the mac
* hellooooooooooo
* install steps
* ci for baseline?
* fix
* aaa
* wow
* install script revamp
* bug
* OK
* ok
* aaaaaaaaaaaaaa
* okay
* fix the node test runner lol
* fix napi stuff
---------
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: cirospaciari <ciro.spaciai@gmail.com>
Co-authored-by: Dylan Conway <35280289+dylan-conway@users.noreply.github.com>
* Move code for lifecycle scripts into a separate file
* Fix slow & incorrect pipe reading code used for bun install lifecycle scripts
* Fix crash in IPC due to calling on_socket_long_timeout when its a null ptr
* Only try to get the node path one time
* Fix incorrect glob pattern for rebuilding Zig files
@paperdave doing `**/**/**` does not work
* Implement basic support for ioctl_ficlone
* lowercase these
* intcast
* This is backwards
* Fix "waiting for tasks" spam
* Update install.zig
* Add helper
* Update install.zig
* Address PR feedback
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
* [install] allow parallel execution of `postinstall` scripts
- fixes spurious exit code 42 from `spawn()`
* postinstall to a pipe
* feat(install): include top 500 packages as defaults for postinstall
* windows newline handling*
*i did not test it
* stuff
* cool
* a
* fix merge
* set `has_trusted_dependencies`
* fix a bunch of tests
* fix merge
* remove `PackageManager`
* remove commented code
* change to function
* Update lockfile.zig
* run scripts if added to `trustedDependencies` after install
* packages without `resolved` properties
* node-gyp scripts
* node-gyp script in the root
* another test
* git deps run prepare scripts
* fix merge
* run lifecycle scripts during installation
* Update lockfile.zig
* always increment
* 🏗️
* update tests
* tickWIthoutIdle
* const uws
* loop forwards through trees
* single buffer bitset list
* tag.isGit
* windows path separators
* `bun.sys.read` and enable/disable buffering
* fix test and waiter thread
* waiter thread and tests
* Update bun-install-registry.test.ts
* workspace exclude `preprepare` and `postprepare`
* Create esbuild.test.ts
* make sure length is the same
* remove deferred binlinks, add estrella test
* test with another version
* address some comments
* remove .verdaccio-db.json
* ooops
* fix build
* use `pid` to wait
* dont register pid_poll when using waiter thread
* stress test
* free
* fix failing tests
* fix linux crash, snapshot stress test
* oops
* concurrent scripts
* activate as soon as possible
* test
* delete stress test packages
* remove unused packages
* comment stress test and maybe fix segfault
* delete snapshot
* fix assertion
* use cpu_count * 2 for default concurrent scripts
* gear emoji
* add --concurrent-scripts to docs
* more docs
---------
Co-authored-by: alexlamsl <alexlamsl@gmail.com>
Co-authored-by: dave caruso <me@paperdave.net>
Co-authored-by: Dylan Conway <33744874+MilesWright7@users.noreply.github.com>
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
* use lockfile path passed as an argument instead of a literal string
* clean up tmp folders in migrate.test
---------
Co-authored-by: Alex See <alexsee@Alexs-MacBook-Air.local>
* Clean up control flow in Bun.file().* file reader
* Preallocate large files on Linux
* remove `this.wrote` field
* push
* doesnt work yet
* Create if not exists
* Fix for macOS
* Update blob.zig
* Slightly clean up this test
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
* Fix parseArgs issues and reenable it
* Minor changes to parseArgs
* Another minor change to parseArgs
* Add exception handling to JSValue putMayBeIndex
* WIP rewrite IO for Bun.file()
* It seems to work on macOS
* Update ffi.zig
* Handle many more cases
* Clarify this more
* More comments
* [autofix.ci] apply automated fixes
* Add empty
* Make it work in epoll
* fetch fixes + tests fmt
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: cirospaciari <ciro.spaciari@gmail.com>
* feat(test): allow file paths to test specific files.
* [autofix.ci] apply automated fixes
* be less stupid about what files the CI runs as tests
* aa
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* Faster napi
* Reduce number of headers exposed for JSStringDecoder
* Add missing header
* test: this test was meant to be marked as TODO
* revert the string decoder garbage
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
There is no reason to have the entire install stage for the
prerelease stage. Instead use the base as base and copy
in the relevent files (which already happened)
* Parse stack trace string
* Syntax highlight error messages
* Fix off-by-one
* Undo changes to populateStackTrace
* Highlight more things
* Add a way to write tests for it
* Create highlight-cat.ts
* Bump
* fix: off by ones
* feat: add function highlighting to these errors
* revisions
* undo
* l
* fix webkit submodule
* imo this looks worse
* [autofix.ci] apply automated fixes
* fix off by one <3
* fix more situations
* ch changes
* ok
* [autofix.ci] apply automated fixes
* fix this
* fix snapshot
* ok
* mark test as todo
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
Co-authored-by: dave caruso <me@paperdave.net>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* idk why that was left out
* No need for stat call, add text for broken symlinks
* tests for crashes
* Fix test
* Add some checks to limit max open file descriptors
* Update glob.zig
* Update glob.zig
* Update scan.test.ts
---------
Co-authored-by: Dylan Conway <dylan.conway567@gmail.com>
* improvements
* autobahn tests
* add all tests
* check if docker is active move autobahn to a new file
* fix non SIMD UTF8 validation
* use no trim to catch utf8 issues
* fix extended payload fragmentation
* fmt
* Update src/string_immutable.zig
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
---------
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
* bun-test expect.extend and asymmetric matcher improvements
* [autofix.ci] apply automated fixes
* Changes to expect.extend and asymmetric matchers
* expect-extend: remove global custom matchers registry
* test custom matchers: better way of storing matcher func
* made expect.arrayContaining/objectMatching reject non-arrays/non-objects
* [autofix.ci] apply automated fixes
* fixes for test changes
* create 1 wrapping function instead of 2 per each custom matcher
* fix expect.extend error messages and support for async matchers
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
* Mark require as private
* [autofix.ci] apply automated fixes
* fix(runtime): clean up cjs + stack trace stuff
- CJS wrapper is like 200x simpler to understand. it is also 1-10% faster
- Make a few more things hidden in stack tracess. This only affects release build.
* [autofix.ci] apply automated fixes
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: dave caruso <me@paperdave.net>
* feat: use trailing commas when printing multi-line objects
* test: update console-log.expected.txt to include trailing commas
* test: update a couple tests to match new object output with trailing commas
* [autofix.ci] apply automated fixes
---------
Co-authored-by: Alex See <alexsee@Alexs-MacBook-Air.local>
Co-authored-by: dave caruso <me@paperdave.net>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Even though I had run the export, `bun setup` was erroring with:
```
$ ./scripts/setup.sh
setup error: LLVM 16 is required. Detected CXX as '/usr/bin/clang++'
error: script "setup" exited with code 1 (SIGHUP)
```
Running `export PATH="$(brew --prefix llvm@16)/bin:$PATH"` fixed the error
* Quote export aliases with hyphens when converting jsons to modules
* Add test
* Handle quotes in printer and not in bundler
* [autofix.ci] apply automated fixes
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* dx: automatically install and update zig
* update repo
* ensure system zig compiler in ci
* a
* b
* good
* i am stupid
* why did this happen
* fix installer
* fix: only write header if not exist
If user set header by himself, then we not write duplicate header.
* feat: add test to check header
* chore: format code
* initial glob impl
* Add `Bun.globMatch`
* Glob boilerplate setup
* Experiment with Rust glob implementation
* Rust impl is slow revert
* Setup glob walking
* Basic glob walker working
* Fix segfault
* Recursive directory traversal
* Fix glob match non-ascii
* Make faster lil bit
* use arena
* ASCII fast path
* Experiment with packed codepoint cursor
Results in ~4% perf boost if the glob pattern needs to create/manipulate cursors (for example when the pattern uses braces)
* Try converting to u32 array
Made it pretty slow
* Lazily create codepoint buffer
* Different walk algorithm
* Fast path optimizations
* Add `dot` option to `Glob`
* .
* Fix some bugs
* Fix bug, clean up lil bit
* Windows fix
* Non absolute paths
* use specific version of fast-glob for benchmarks and tests
* .
* Fix some stuff
* Fix more stuff
* Add `hasPendingActivity()` to glob
* accident
* Symlinks
* fast-glob e2e tests
* remove
* woops
* Fix relative paths
* Fix absolute
* add test for `onlyFiles`
* Fix invalid surrogate pairs problem
* Rename: `match/matchSync` -> `scan/scanSync` and `matchString` -> `match`
* forgot to close cwd fd
* Update types
* Add stress test
* Port `micromatch` / `glob-match` / `globlin` tests
* fix stale reference arena thing
* stupid bug
* Add builtins to classes code generator and add `Glob.scanIter()`
* all iterables
* generate fixtures, remove from git
* fix test
* Fix
* woops on test
* Fix stuff
licenses
license
`has_pending_activity` to usize
cwd threadSafe fix atomic compile errors
`GlobWalker` own `cwd`
Fix windows path and absolute test
stuff
* Fixes
* Fix stuff
* Use Syscall.close
* Use private symbols for underlying scan functions to preevent misuse
* Update types
* Fix build for zig
* Fix tests
* Fix more tests
* Prevent these tests from GC'ing too much
* Make this benchmark work in Node and Bun
* Fix memory leak
* Add leak test
* Fix windows
* comment about arena allocator use for glob walker
* Make leak test run in separate process
* Iterator api for glob
* GlobWalker.Iterator
* fix leak test
* Remove old impl
* filter functions wip start
* stuff
* wip lockfile use glob
* glob working with lockfile
* revert lockfile changes
* Update bun.lockb
* Manually set to cwd to prevent test failing on linux CI
---------
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
* Load `.{m,c}ts{x}` last in node_modules
* feat(console.log): Print className for an object if present (#6508)
* feat(console-log): fix className not printed for objects that are instances of classes
Uses getClassName native method instead of getName
* test(console-log): objects with class names are printed correctly
* test(esbuild): add class name to log message
* Fix failing `which` test (#7258)
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
* Make test less flaky
* Get it working and add test
* Handle relative paths
* Add comment
* Consolidate + add test
* Bump
* Fix getObjectName
* Update dir_info.zig
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
Co-authored-by: Jibran Kalia <jibran.kalia@gmail.com>
* feat(console-log): fix className not printed for objects that are instances of classes
Uses getClassName native method instead of getName
* test(console-log): objects with class names are printed correctly
* test(esbuild): add class name to log message
* Cleanup error formatting a little
* Add error for using import statement with CommonJS-only features
* Update js_ast.zig
* Further tweaks to formatting, also print error.cause
* Add some snapshot tests for errors
* Make these snapshot tests
* Ignore mimalloc warnings
* Update error message parsing in bundling tests
* Increase timeout on the test
* Update expectBundled.ts
* Update test
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
* fix(Bun.serve): return EACCESS when we don't have perms
The error reported to js land when listening fails was always the same,
this adds a second one for EACCESS when we are not the super user.
Fixes: https://github.com/oven-sh/bun/issues/7187
* fix: adjust code to be only ran on linuz
* fix: correct typo
* fix: remove comment since its linux only now
* Stop swallowing errors from create_hash_table during the build
If src/codegen/create_hash_table can't be run due to some reason
(e.g. due to missing Math::BigInt Perl module) the build continues
but fails later, during bindings compilation, because the generated
files are empty.
Fix it by handling the failure to run create_hash_table properly.
Closes#7074
* [autofix.ci] apply automated fixes
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* `Response` -> `any`
* Revert previous commit & allow void in ws fetch
* Added type test to check if you can upgrade connection without returning
* [autofix.ci] apply automated fixes
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* bounds checks
* do this all the time
cc @paperdave
* use length of string
* ttest
* min
* can't prefix if length isn't at least equal
* substring
* Update pretty_format.zig
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
* bin might need to be created after iterating node_modules
* Update bun-install-registry.test.ts
* test this functionality in a few more tests
* fix a test
* another test
* revert
* more test
* Don't allocate new `"require"` and `"resolve"` strings in every CommonJS module
* Use builtinNames more
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
* `zig fmt`
* Support using macros in builtins
* Make fetch work a little better in macros
* Delete a bunch of code
* Update macro-test.test.ts
* Update macro-test.test.ts
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
* Implement `expect.unreachable`
* UIse expect.unreachable() in some tests
* Use more unreachable
* More unreachable
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
* fix(install): fix the case that package name contains tilde.
Close: #7045
* add tests
* emm, let me know why test failed
* overwrite registry config
* check more chars
* remove $
This causes keep-alive to be disabled for HTTP status codes that do not support bodies, leading to many HTTP client hangs.
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
* Use debug mode by default
* Enable build with assertions enabled
* Update cli.zig
* Update bun-linux-build.yml
* Fixes
* Fix `ASSERT_ENABLED`
* try this
* Update Dockerfile
* mimalloc debug
* Update CMakeLists.txt
* `Bun.deepMatch` - fix assertion failures
cc @dylan-conway, looks like we need to use `putDirectMayBeIndex` and check for `isCell` more carefully.
* Object.create support in code generator and callbacks wrapper
* Remove unused file
* zig upgrade
* zls
* Fix various errors
* Support `BuiltinAccessor` in create_hash_table script
* Fix assertion failure in `process.mainModule`
* Fix assertion failure in `onerror`
* Fix assertion failure when creating a Worker
* Fix asssertion failure when loading lots of files in bun test
* Fix assertion failure when termating a `Worker`
* Add helper for converting BunString to a WTFString
* Fix assertion failure in notifyNeedTermination
* Add more debug logs in `bun test`
* Fix compiler warning in usockets
* Fix assertion failure with `Worker` termination (another)
* Fix assertion failure in `coerceToInt64`
* Fix assertion failure in `BroadcastChannel`
* Fix assertion failure in `Headers.prototype.getAll`
* Fixes#7067
* Add heap analyzer label for CommonJS modules
* Fix assertion failure in module.require && module.require.resolve
* Remove unused code
* Fix assertion failure in debugger
* Fix crash in debugger
* Fix assertion failures in bun:sqlite
* Bump zig
* Bump WebKit
* Fix assertion failure in JSPromise::reject && JSInternalPromise::reject
* Fix assertion failure in ReadableStream::cancel
* Fix assertion failure in AsyncContextFrame::create
* Fix assertion failure in bun:sqlite
* Fix assertion failure in mocks
* Fix assertion failure in ServerWebSocket.close
* Fix assertion failure in N-API with subclasses
* [napi] Make promises cheaper
* undo
* Don't check for exceptions in ObjectInitializationScope
* Add separate entry point for test runner that doesn't generate code
* Don't deref builtin code
* Fix preload test
* Fix assertion failure in memoryUsage()
* Fix preload test, part 2
* Ensure that the env map for a Worker is empty after it is used
* The pointer for the Arena allocator used in parsing should not change
* Terminate thread on exit
* Start to implement scriptExecutionStatus
* Update worker.test.ts
* Fix Dirent.name setter
* Update settings.json
* Fix assertion failure in node:http
* Use correct value for `JSFinalObject::maxInlineCapacity`
* JSFinalObject::maxInlineCapacity x2
* Don't strip when assertions are enabled
* Make `m_wasTerminated` atomic
* Preserve directives in the transpiler
cc @ctjlewis
* Workaround assertion failure in ServerWebSocket.sendBinary and ServerWebSocket.sendText
* windows
* Buffer lockfile serialization in-memory
* PR feedback
* PR feedback
* PR feedback
* Windows
* quotes
* Update CMakeLists.txt
* Update bun-linux-build.yml
* Update bun-linux-build.yml
* Move this code to BunString.cpp
* Update BunString.cpp
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
If src/codegen/create_hash_table can't be run due to some reason
(e.g. due to missing Math::BigInt Perl module) the build continues
but fails later, during bindings compilation, because the generated
files are empty.
Fix it by handling the failure to run create_hash_table properly.
Closes#7074
* Update CI/CD guide
The guide at https://bun.sh/guides/runtime/cicd shows an outdated example for specifying a version of Bun.
It currently shows "version" and it should be updated to "bun-version".
* Add more examples in CI/CD guide
- move dependencies installation to the front, as the next steps
depend on them
- add missing xz-utils, which, libicu-devel to the dependencies
Closes#7076Closes#7077
* Fix fetch response skipping body if no content-length (#6932)
* Fix timeout on status 1xx/204/304 without content-length, tests changes
* Fix test that was wrong
* fix fetch response without content-length not disabling keep-alive
---------
Co-authored-by: Ashcon Partovi <ashcon@partovi.net>
* use different buf for group and manifest versions
* tests
* tests for installs that should fail
* allow `<=<prerelease-version`
* `Bun.semver.satisfies`
* one
* stringify
* symbol tests
* deinit
* arena
* more tests
* fix test
* version always on the left
* `Bun.semver.order`
* handle more edge cases, more tests
* whitespace
* more
* fix: correctly prepend system path to relative urls on `pathToFileURL`
The `pathToFileURL` was not handling the case that when a relative link is passed,
it should convert it to a absolute url and prepend the top_folder,
or otherwise described, resolve the path before creating the url.
This does that by calling into buns Path api and using its `resolve` function.
Theres the detail that i used preprocessor directives to determine whether
we are on windows because there does not seam to be a easy way to get that
at runtime in the `BunObject.cpp` file.
Fixes: https://github.com/oven-sh/bun/issues/6456
* fix: add issue id to test name
* fix: implement changes requested in review
* style: fix styling
* Update src/bun.js/bindings/BunObject.cpp
* Update src/bun.js/bindings/BunObject.cpp
* Update src/bun.js/bindings/BunObject.cpp
---------
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
* Update to latest SIMDUTF
* Fix issue with `Headers.toJSON` having an incorrect size set with set-cookie header
* [node:http] Fix `undefined` when multiple Set-Cookie headers are sent
* Count UTF8 byteLength for headers
This is not necessary, just being cautious.
* Update http-hello.node.mjs
* Be 100% sure the test isn't caching anything
* move this up
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
* Fix the linux aarch64 workflow.
* sanity check
* do not set march to native
* fix windows compile error
* enable verbose
* fix baseline builds
* fix windows build canary flags
* use a real windows runner
* w
* fix(build): add option and auto detect for arch linux
This adds a option and a automatic routine for decting arch linux,
where the path for libatomic is a bit special.
* fix: don't statically link if not needed
* Fix memory leak in require() and add test
* Mark fixtures as generated code
* Add optimization for large files
* Fix small memory leak
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
* `order` and `satisfy` prerelease numbers
* remove sorter
* use existing package for peer dep if possible
* fix test, remove loop
* count workspace versions, compare each part of prerelease
* other peer dependencies
* use existing packages if possible
* don't install peer more than once
* fix update tests
* fix fetch
* oops
* revert
* fix checkServerIdentity
* check dns len
* use same checks on wsclient and fetch, fix tests
* more tests and more fixes
* fix node-http flask test
* orelse
* fix requestCert
* more fixes, but no data receiving
* fix pause on connect behavior on TLS
* WS Client + rejectUnauthorized progress
* move test to the right place
* more test
* oops
* oops 2
* fmt
* cleanup
* WIP: handle handshake properly on uWS
* handle rejectUnauthorized in uWS
* fmt
* duplicated test
* fix leak
* add rejectUnauthorized option in WS types
* fix merge
* fix merge2
* Fix for seg faults when using macros
* Update src/js_ast.zig to reflect review suggestions
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
* add test for checking non-zero exitcodes under macros. regression, issue 3830
---------
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
* feat(console): add printer for mapiterator
MapIterator was not supported in printing, libraries like discordjs make big use of maps and
so i think supporting them would be a good idea.
* fix: snake case var
* fix: add tests for log and add setiterator printer
* Updated Dependencies Script
* demo
* fix submodule hell!!!
* lol
* attmept 2
* install nasm in ci
* setup sh 1
* yeah
* better zlib building
* codegen stuff
* attempt 2 at bun codegen ci
* o
* deps improvements
* generaet part of compile-cpp-only.ps1
* restore these
* good enough for Unix
* remove libuv submodule lol
* pass over docs
* Prepare for windows event loop
* More progress
* Update libuv.zig
* wip
* Make compiling each dependency a shell script
* Bump mimalloc
* Add the build scripts
* Update settings.json
* Fix a bunch of compiler warnings
* Remove more warnings
* more warnings
* cmake works
* Update JSSQLStatement.h
* put it in the zig file
* Fix usockets warnings
* Fixup
* Fix one of the compiler errors
* chunk
* draw the rest of the owl
* theres more
* Rename Process -> BunProcess
Works around a Windows issue
* Add musl polyfill for memmem on Windows
* More
* 12 mb
* Fix getenvZ
* fix variosu issues
* Add fast-ish path for bun install on Windows
* Update windows.zig
* Update windows.zig
* Fix build issue
* it works
* hmmm
* Rename file
* Fixups
* Update wtf-bindings.cpp
* Update src/bun.js/bindings/headers-handwritten.h
Co-authored-by: Dylan Conway <35280289+dylan-conway@users.noreply.github.com>
* further!
* more
* Update .gitignore
* hm
* quite a lot of fixes
* Update CMakeLists.txt
* zig fmt
* Many more things are starting to work.
* reb
* regenaret
* Update JSSink.h
* fixup
* fetch works
* Bun.serve() and much of the event loop works now
* Make require() work
* bun install progress
* more things work
* use less std.os
* Fixes
* small fixes
* Bump
* Bummp
* Undo that change
* We have to bump the version of Debian because libarchive has a higher minimum requirement
* ok
* some clenaup
* windows
* Update bun.zig
* fixup
* avoid duplicate symbols
* avoid undefined symbols
* bump
* Remove issue template for install
It's not used, and use the bug issue instead.
* Add types for cp and cpSync
* Add types for watchFile and unwatchFile
* Add bun-types to 'bun fmt' script
* Update nodejs compat docs cp/cpSync/watchFile/unwatchFile (#4525)
* feat(fetch) rejectUnauthorized and checkServerIdentity (#4514)
* enable root certs on fetch
* rebase
* fix lookup
* some fixes and improvements
* fmt
* more fixes
* more fixes
* check detached onHandshake
* fix promise case
* fix cert non-Native
* add fetch tls tests
* more one test
* churn
* Update feature_flags.zig
* Update response.zig
* Revert "avoid undefined symbols"
This reverts commit ca835b726f.
* Revert "avoid duplicate symbols"
This reverts commit 4ac6ca8700.
* Update feature_flags.zig
* Set permissions
* more
* Update mimalloc
* Fix sqlite test failures
* Fix some test failures
* Make sure we remove libusockets is removed
* hm
* [dave]: fix webcrypto crash
* bump
* Update index.ts
* windows zig compiles
* cmake on mac works
* progress
* yay
* bun run build
* fix
* ok
* oops
* asdfasfdafdsafda
* fghjkl
* git ignore
* wow
* Process -> BunProcess
* hmm
* blah
* finalize merge
* now it only has linker errors on mac
* sdfadsf
* g
* getting farther
* sxdcvbnmk,
* adfhjskfjdhkas
* a
* fgh
* update build dot zig
* asdfg
* theoretical -DCANARY flag we can use
* asdf
* cool
* okay
* colorterm
* New build workflow
* Fix script
* Use sudo
* More sudo
* Tweak dependencies
* Another sudo attempt
* Tweak script
* 16.0 -> 16
* Tweak script
* Tweak script
* Tweak script
* Tweak script
* Tweak script
* bun install
* ssh into github actions
* add more to ssh
* Fix postinstal
* Skip llvm
* New dockerfile
* Build
* More changes to Dockerfile
* chaos chaos chaos
* okay
* a
* more cmake nonsense
* add unified sources code (does not work)
* stuff
* prepare for CI builds
* ok
* yay
* yeah
* make this more stable simply by trying again if it fails, 5 times, then lose. it fixes the stability issue i was running into L O L
* messing with ci
* x
* a
* clean dependencies before build
* oops
* this is not going to work but its closer
* not gonna work either
* a
* a
* did i do it
* a
* a
* work around weird fs+Bun.build issues
* properly pass debug flag correctly
* idk im sorry
* lose
* maybe
* run the tests please
* a
* fix zlib script
* a
* hi
* prevent stupid ci issue
* i totally didnt leave in a syntax error on cmakelists
* a
* lol
* relax
* 😭
* a
* SO SILLY
* 😡 one line mistake
* one character diff
* fix linking symbols missing
* work on dependency scripts
* does this work now?
* fix mac build
* a
* bump!
* woops
* add macos baseline build
* .
* fix sqlite and also enable $assert/$debug support in builtin functions
* okay
* oops
* zig upgrade lol
* Merge
* Fix spawn test issue
* Set a timeout
* yeah
* etc
* mi
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
Co-authored-by: Dylan Conway <dylan.conway567@gmail.com>
Co-authored-by: Dylan Conway <35280289+dylan-conway@users.noreply.github.com>
Co-authored-by: Ashcon Partovi <ashcon@partovi.net>
Co-authored-by: Birk Skyum <74932975+birkskyum@users.noreply.github.com>
Co-authored-by: dave caruso <me@paperdave.net>
* fix: emit close on stdin stream end
We where not emitting the `close` event when done reading stdin data.
It took me way too long to find this but i kept searching in zig/cpp code of the stream implementations...
Fixes: https://github.com/oven-sh/bun/issues/6713
* fix: don't emit close twice
* Copy Node.js test for async-local-storage thenables
* Fix flaky test
* Make expect(fn).toThrow() more reliable
* Fix setImmediate order
* Support restoring mocked modules with spyOn
* Fix vm test
* Fix more tests
* alright
* Upgrade WebKit
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
while trying to get [`node-usb`](https://github.com/node-usb/node-usb) running with bun, it always failed because close() is only allowed when there are no open references.
7e0182df8c/src/node_usb.h (L39-L41)
```c++
inline void ref(){ refs_ = Ref();}
inline void unref(){ refs_ = Unref();}
inline bool canClose(){return refs_ == 0;}
```
`Ref()` and `Unref()` are both called once, with node.js resulting in `refs_ == 0` (which is expected), but with bun `refs_ == 1`.
I've made this small script to reproduce the bug:
https://github.com/alangecker/bun-ref-bug/blob/main/binding.cc
```
run with bun 1.0.6:
- refcount: 2 (expected: 1)
run with node 20.8.1:
- refcount: 1 (expected: 1)
```
during a long debugging journey I found out, that buns `NapiRef::ref()` is also just called once (as expected), but within `napi_wrap()` the `NapiRef` gets initialized already with the refCount set to 1
378385ba60/src/bun.js/bindings/napi.cpp (L669)
```c++
extern "C" napi_status napi_wrap(napi_env env,
napi_value js_object,
void* native_object,
napi_finalize finalize_cb,
void* finalize_hint,
napi_ref* result)
{
// [...]
auto* ref = new NapiRef(globalObject, 1);
// [...]
}
```
After changing it to `new NapiRef(globalObject, 0)` it got the expected behavior / same as with node.js and node-usb works.
as far as I understand it, a `NapiRef`` with refCount=0 should then be weak instead of strong, which is why I have changed this too.
* Update quickstart.md - removed the part for editing `compilerOptions` in `tsconfig.json`
The line is already added to `compilerOptions` in `tsconfig.json` so there is no need to edit the file.
"types": [
"bun-types" // add Bun global
]
This was already added when the project initialized it seems.
* Typescript section
---------
Co-authored-by: Colin McDonnell <colinmcd94@gmail.com>
* fix findBestMatch so it finds the best match and not the first match
* update complex-workspaces to include lines-and-columns ^1.1.6
* PR feedback
* PR feedback
* This test doesn't reproduce the original issue
* Support pre release versions the same way
* Add a test that reproduces the original issue
* Sort the list of package versions before serializing to disk
* Remove test that didnt reproduce it
* Fix the count
* Fix 0 and 1 and sorting order
* Fix assertions and ordering
---------
Co-authored-by: Dylan Greene <dgreene@medallia.com>
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
* fix findBestMatch so it finds the best match and not the first match
* update complex-workspaces to include lines-and-columns ^1.1.6
* PR feedback
* PR feedback
* Fix missing function names in Bun.inspect
* Fix failing tests
* Handle @@toStringTag
* Update bindings.cpp
* Revert breaking changes to snapshots until a minor version
* Fix test
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
* fix: support custom file type in Bun.file
In the docs it seamed to suggest this is something supported,
it seamed to be only supported in JSDOMFiles or blob.
This Adds the 2 properties `type` and `lastModified` to be supported on `Bun.file`
Fixes: https://github.com/oven-sh/bun/issues/6507
* fix: implement changes requested in review
Add changes requested in the review and add a test for a non standard
mimetype
* fix(serve): When IPv6 configuration is incorrect, attempt to bind to IPv4 address under the same hostname.
Close: #5315
* fix review
* fix review again
---------
Co-authored-by: Ashcon Partovi <ashcon@partovi.net>
Co-authored-by: Dylan Conway <35280289+dylan-conway@users.noreply.github.com>
In this example there is no server variable in the context, and here it makes more sense to use ws.publish. It is explained below that once the serve is done, the server.publish can be used.
* dfghj
* Handle messages that did not finish
* tidy
* ok
* a
* Merge remote-tracking branch 'origin/main' into dave/ipc-fixes
* test failures
---------
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
* fix-subprocess-argument-missing
* fix-tests
* nitpick, these should === not just be undefined
---------
Co-authored-by: dave caruso <me@paperdave.net>
* fix pg hang on end + hanging on query
* remove dummy function
* fix node-stream
* add test
* fix test
* return error in test
* fix test use once instead of on
* fix OOM
* generated
* 💅
* 💅
* Docs : Added instructions to run bun apps in daemon (PM2) to address issue #4734
Added instructions to set bun as pm2 interpreter to extend same functionality as node.js apps.
* Add pm2 guide
* Add pm2 file
---------
Co-authored-by: Colin McDonnell <colinmcd94@gmail.com>
* work so far
* stuff
* a
* basics work
* stuff
* yoo
* build lockfile
* correct
* f
* a
* install fixture havent tested
* i made it worse
* lol
* be more reasonable
* make the test easier to pass because bun install doesn't handle obscure lockfile edge cases :/
* a
* works now
* ok
* a
* a
* cool
* nah
* fix stuff
* l
* a
* idfk
* LAME
* prettier errors
* does this fix tests?
* Add more safety checks to Integrity
* Add another check
* More careful lifetime handling
* Fix linux debugger issue
* a
* tmp dir and snapshot test
---------
Co-authored-by: Jarred SUmner <jarred@jarredsumner.com>
The exit code support is between 0-255 and not only in the signed positive range
(0-127).
Node.js does not seam to throw on a bigger integer and just wraps around,
but throwing a error is a good approach and makes the behaviour more defined.
This allows the range to be 0-255
Fixes: https://github.com/oven-sh/bun/issues/6284
Returning undefined simply falls through to the next plugin, or to the default loader.
This is defined by esbuild, and supported by Bun, but the types don't reflect it properly.
* Use singular nouns when appropriate on install messages
* Fix one more pluralization
* Fix bun-add tests for "1 package installed"
* Fix bun install/remove/update tests for "1 package installed"
* releases before prereleases
* handle different repo hosts
* remove log
* Update bun-install.test.ts
* test for `bun add`
* gitlab test
* use comptime hash map, another test case
* don't need length
* bump timeout, use tld
* infer git dependencies for https and ssh
* fix bunx command for github package
* refactor fmt package to use it when the path is seted
* use labeled block to assign const instead of use 'undefined'
In the case of creating a Request with the parameters `(Request, object)`,
there was a bug that method and headers are set from the default created by
the init rather then the already present value from the request param.
This is because for a to me unknown reason the order in which the parameters
are processed is reversed.
This fixes that by adding a check which stops the defaults from being set,
unless they are explicitly passed.
Fixes: https://github.com/oven-sh/bun/issues/6144
* [server] requestIp and AnyRequestContext
Changed Request.uws_request to the new AnyRequestContext. This
allows grabbing the IP from a Request. Unfinished.
* [server] basic `requestIp` implementation
Currently using uws's requestIpAsText, which always returns a ipv6
string. We should return a `SocketAddress` object to the user instead,
which will contain the formatted address string and what type it is.
We'll have to use requestIpAsBinary and parse that ourselves.
* TypeScript docs, use `bun.String`, return `undefined` instead of `null`
if we can't get the ip.
* binary address formatting
* uws getRemoteAddress binding
* remove dead code
* working
* final touches✨
* I will abide by the results of this poll.
---------
Co-authored-by: Parzival-3141 <29632054+Parzival-3141@users.noreply.github.com>
* check if the value passed for add command is a local tarball and install it, test for local tarball
* use bunExe()
* use absolute path to copy tarball
* fmt ts
Thank you for submitting a bug report. It helps make Bun better.
If you need help or support using Bun, and are not reporting a bug, please
join our [Discord](https://discord.gg/CXdq2DP29u) server, where you can ask questions in the [`#help`](https://discord.gg/32EtH6p7HN) forum.
Make sure you are running the [latest](https://bun.sh/docs/installation#upgrading) version of Bun.
The bug you are experiencing may already have been fixed.
Please try to include as much information as possible.
- type:input
attributes:
label:What version of Bun is running?
description:Copy the output of `bun --revision`
- type:input
attributes:
label:What platform is your computer?
description:|
For MacOS and Linux: copy the output of `uname -mprs`
For Windows: copy the output of `"$([Environment]::OSVersion | ForEach-Object VersionString) $(if ([Environment]::Is64BitOperatingSystem) { "x64" } else { "x86" })"` in the PowerShell console
- type:textarea
attributes:
label:What steps can reproduce the bug?
description:Explain the bug and provide a code snippet that can reproduce it.
validations:
required:true
- type:textarea
attributes:
label:What is the expected behavior?
description:If possible, please provide text instead of a screenshot.
- type:textarea
attributes:
label:What do you see instead?
description:If possible, please provide text instead of a screenshot.
- type:textarea
attributes:
label:Additional information
description:Is there anything else you think we should know?
@${{ github.actor }}, there are **${{ steps.test.outputs.regressing_test_count }} test regressions** on Windows ${{ matrix.arch }}${{ matrix.cpu == 'nehalem' && ' Baseline' || '' }}
${{ steps.test.outputs.regressing_tests }}
[Full Test Output](https://github.com/oven-sh/bun/actions/runs/${{github.run_id}})
You might need to run `bun install` locally and configure your text editor to [auto-format on save](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode).
echo "// The following errors occurred:" >> "${GITHUB_OUTPUT}"
cat zig-fmt.err >> "${GITHUB_OUTPUT}"
fi
if [ -s zig-fmt.err2 ]; then
echo "// The following files were not formatted:" >> "${GITHUB_OUTPUT}"
cat zig-fmt.err2 >> "${GITHUB_OUTPUT}"
fi
echo "${delimiter}" >> "${GITHUB_OUTPUT}"
- name:Comment on PR
if:steps.fmt.outputs.zig_fmt_errs != ''
uses:thollander/actions-comment-pull-request@v2
with:
comment_tag:zig-fmt
message:|
❌ @${{ github.actor }} `zig fmt` reported errors. Consider configuring your text editor to [auto-format on save](https://github.com/ziglang/vscode-zig)
@@ -31,7 +31,7 @@ Bun is an all-in-one toolkit for JavaScript and TypeScript apps. It ships as a s
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.
```bash
bun run index.tsx # TS and JSX supported outofthebox
bun run index.tsx # TS and JSX supported out-of-the-box
```
The `bun` command-line tool also implements a test runner, script runner, and Node.js-compatible package manager. Instead of 1,000 node_modules for development, you only need `bun`. Bun's built-in tools are significantly faster than existing options and usable in existing Node.js projects with little to no changes.
@compileError("The minimum version of Zig required to compile Bun is "++recommended_zig_version++", found "++@import("builtin").zig_version_string++". Please follow the instructions at https://bun.sh/docs/project/contributing. You may need to re-run `bun setup`.");
"{s}WARNING:\nBun recommends Zig version '{s}', but found '{s}', build may fail...\nMake sure you are following the instructions at https://bun.sh/docs/project/contributing\n{s}You can update to the right version using 'zigup {s}'\n\n",
.{
if(colors)"\x1b[1;33m"else"",
recommended_zig_version,
builtin.zig_version_string,
if(colors)"\x1b[0m"else"",
recommended_zig_version,
},
);
},
}
// Standard target options allows the person running `zig build` to choose
// what target to build for. Here we do not override the defaults, which
// means any target is allowed, and the default is native. Other options
@@ -51,7 +51,7 @@ function __bun_last_cmd --argument-names n
end
set-lbun_install_boolean_flags yarn production optional development no-save dry-run force no-cache silent verbose global
set-lbun_install_boolean_flags_descriptions"Write a yarn.lock file (yarn v1)""Don't install devDependencies""Add dependency to optionalDependencies""Add dependency to devDependencies""Don't install devDependencies""Don't install anything""Always request the latest versions from the registry & reinstall all dependenices""Ignore manifest cache entirely""Don't output anything""Excessively verbose logging""Use global folder"
set-lbun_install_boolean_flags_descriptions"Write a yarn.lock file (yarn v1)""Don't install devDependencies""Add dependency to optionalDependencies""Add dependency to devDependencies""Don't install devDependencies""Don't install anything""Always request the latest versions from the registry & reinstall all dependencies""Ignore manifest cache entirely""Don't output anything""Excessively verbose logging""Use global folder"
set-lbun_builtin_cmds dev create help bun upgrade discord run install remove add init link unlink pm x
set-lbun_builtin_cmds_without_run dev create help bun upgrade discord install remove add init pm x
@@ -26,10 +26,10 @@ Below is a quick "cheat sheet" that doubles as a table of contents. Click an ite
---
<!-- - [`File`](#file)
- _Browser only_. A subclass of `Blob` that represents a file. Has a `name` and `lastModified` timestamp. There is experimental support in Node.js v20; Bun does not support `File` yet; most of its functionality is provided by `BunFile`.
- [`File`](#file)
- A subclass of `Blob` that represents a file. Has a `name` and `lastModified` timestamp. There is experimental support in Node.js v20.
--- -->
---
- [`BunFile`](#bunfile)
- _Bun only_. A subclass of `Blob` that represents a lazily-loaded file on disk. Created with `Bun.file(path)`.
@@ -49,7 +49,6 @@ Despite the name, it isn't an array and supports none of the array methods and o
```ts
constbuf=newArrayBuffer(8);
buf.byteLength;// => 8
constslice=buf.slice(0,4);// returns new ArrayBuffer
@@ -66,19 +65,19 @@ Below we create a new `DataView` and set the first byte to 5.
Now let's write a `Uint16` at byte offset `1`. This requires two bytes. We're using the value `513`, which is `2 * 256 + 1`; in bytes, that's `00000010 00000001`.
Bun's implementation of `node:fs` is fast, and we haven't implemented a Bun-specific API for reading directories just yet. For now, you should use `node:fs` for working with directories in Bun.
### Reading directories (readdir)
To read a directory in Bun, use `readdir` from `node:fs`.
```ts
import{readdir}from"node:fs/promises";
// read all the files in the current directory
constfiles=awaitreaddir(import.meta.dir);
```
#### Reading directories recursively
To recursively read a directory in Bun, use `readdir` with `recursive: true`.
```ts
import{readdir}from"node:fs/promises";
// read all the files in the current directory, recursively
constfiles=awaitreaddir("../",{recursive: true});
```
### Creating directories (mkdir)
To recursively create a directory, use `mkdir` in `node:fs`:
```ts
import{mkdir}from"node:fs/promises";
awaitmkdir("path/to/dir",{recursive: true});
```
## Benchmarks
The following is a 3-line implementation of the Linux `cat` command.
@@ -300,7 +336,7 @@ interface BunFile {
readonly type: string;
text(): Promise<string>;
stream(): Promise<ReadableStream>;
stream(): ReadableStream;
arrayBuffer(): Promise<ArrayBuffer>;
json(): Promise<any>;
writer(params: { highWaterMark?: number }): FileSink;
* The root directory to start matching from. Defaults to `process.cwd()`
*/
cwd?: string;
/**
* Allow patterns to match entries that begin with a period (`.`).
*
* @default false
*/
dot?: boolean;
/**
* Return the absolute path for entries.
*
* @default false
*/
absolute?: boolean;
/**
* Indicates whether to traverse descendants of symbolic link directories.
*
* @default false
*/
followSymlinks?: boolean;
/**
* Throw an error when symbolic link is broken
*
* @default false
*/
throwErrorOnBrokenSymlink?: boolean;
/**
* Return only files.
*
* @default true
*/
onlyFiles?: boolean;
}
```
## Supported Glob Patterns
Bun supports the following glob patterns:
### `?` - Match any single character
```ts
constglob=newGlob("???.ts");
glob.match("foo.ts");// => true
glob.match("foobar.ts");// => false
```
### `*` - Matches zero or more characters, except for path separators (`/` or `\`)
```ts
constglob=newGlob("*.ts");
glob.match("index.ts");// => true
glob.match("src/index.ts");// => false
```
### `**` - Match any number of characters including `/`
```ts
constglob=newGlob("**/*.ts");
glob.match("index.ts");// => true
glob.match("src/index.ts");// => true
glob.match("src/index.js");// => false
```
### `[ab]` - Matches one of the characters contained in the brackets, as well as character ranges
```ts
constglob=newGlob("ba[rz].ts");
glob.match("bar.ts");// => true
glob.match("baz.ts");// => true
glob.match("bat.ts");// => false
```
You can use character ranges (e.g `[0-9]`, `[a-z]`) as well as the negation operators `^` or `!` to match anything _except_ the characters contained within the braces (e.g `[^ab]`, `[!a-z]`)
```ts
constglob=newGlob("ba[a-z][0-9][^4-9].ts");
glob.match("bar01.ts");// => true
glob.match("baz83.ts");// => true
glob.match("bat22.ts");// => true
glob.match("bat24.ts");// => false
glob.match("ba0a8.ts");// => false
```
### `{a,b,c}` - Match any of the given patterns
```ts
constglob=newGlob("{a,b,c}.ts");
glob.match("a.ts");// => true
glob.match("b.ts");// => true
glob.match("c.ts");// => true
glob.match("d.ts");// => false
```
These match patterns can be deeply nested (up to 10 levels), and contain any of the wildcards from above.
### `!` - Negates the result at the start of a pattern
```ts
constglob=newGlob("!index.ts");
glob.match("index.ts");// => false
glob.match("foo.ts");// => true
```
### `\` - Escapes any of the special characters above
- An alias to `import.meta.path`, for Node.js compatibility
---
- `import.meta.url`
- A string url to the current file, e.g. `file:///path/to/project/index.tx`
---
- `import.meta.main`
- `boolean` Indicates whether the current file is the entrypoint to the current `bun` process. Is the file being directly executed by `bun run` or is it being imported?
---
- `import.meta.env`
- An alias to `process.env`.
---
- `import.meta.resolve{Sync}`
- Resolve a module specifier (e.g. `"zod"` or `"./file.tsx"`) to an absolute path. While file would be imported if the specifier were imported from this file?
Bun implements a semantic versioning API which can be used to compare versions and determine if a version is compatible with another range of versions. The versions and ranges are designed to be compatible with `node-semver`, which is used by npm clients.
Bun supports direct inter-process communication channel between two `bun` processes. To receive messages from a spawned Bun subprocess, specify an `ipc` handler.
{%callout%}
**Note** — This API is only compatible with other `bun` processes. Use `process.execPath` to get a path to the currently running `bun` executable.
{%/callout%}
```ts#parent.ts
const child = Bun.spawn(["bun", "child.ts"], {
ipc(message) {
/**
* The message received from the sub process
**/
},
});
```
The parent process can send messages to the subprocess using the `.send()` method on the returned `Subprocess` instance. A reference to the sending subprocess is also available as the second argument in the `ipc` handler.
childProc.send("I am your father"); // The parent can send messages to the child as well
```
Meanwhile the child process can send messages to its parent using with `process.send()` and receive messages with `process.on("message")`. This is the same API used for `child_process.fork()` in Node.js.
```ts#child.ts
process.send("Hello from child as string");
process.send({ message: "Hello from child as object" });
process.on("message", (message) => {
// print message from parent
console.log(message);
});
```
All messages are serialized using the JSC `serialize` API, which allows for the same set of [transferrable types](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Transferable_objects) supported by `postMessage` and `structuredClone`, including strings, typed arrays, streams, and objects.
```ts#child.ts
// send a string
process.send("Hello from child as string");
// send an object
process.send({ message: "Hello from child as object" });
```
## Blocking API (`Bun.spawnSync()`)
Bun provides a synchronous equivalent of `Bun.spawn` called `Bun.spawnSync`. This is a blocking API that supports the same inputs and parameters as `Bun.spawn`. It returns a `SyncSubprocess` object, which differs from `Subprocess` in a few ways.
You can also use an import attribute to load a database.
```ts
importdbfrom"./mydb.sqlite"with{"type":"sqlite"};
console.log(db.query("select * from users LIMIT 1").get());
```
This is equivalent to the following:
```ts
import{Database}from"bun:sqlite";
constdb=newDatabase("./mydb.sqlite");
```
### `.close()`
To close a database:
@@ -99,6 +116,20 @@ const query = db.prepare("SELECT * FROM foo WHERE bar = ?");
{% /callout %}
## WAL mode
SQLite supports [write-ahead log mode](https://www.sqlite.org/wal.html) (WAL) which dramatically improves performance, especially in situations with many concurrent writes. It's broadly recommended to enable WAL mode for most typical applications.
To enable WAL mode, run this pragma query at the beginning of your application:
```ts
db.exec("PRAGMA journal_mode = WAL;");
```
{% details summary="What is WAL mode" %}
In WAL mode, writes to the database are written directly to a separate file called the "WAL file" (write-ahead log). This file will be later integrated into the main database file. Think of it as a buffer for pending writes. Refer to the [SQLite docs](https://www.sqlite.org/wal.html) for a more detailed overview.
{% /details %}
## Statements
A `Statement` is a _prepared query_, which means it's been parsed and compiled into an efficient binary form. It can be executed multiple times in a performant way.
@@ -56,6 +56,45 @@ const stream = new ReadableStream({
When using a direct `ReadableStream`, all chunk queueing is handled by the destination. The consumer of the stream receives exactly what is passed to `controller.write()`, without any encoding or modification.
## Async generator streams
Bun also supports async generator functions as a source for `Response` and `Request`. This is an easy way to create a `ReadableStream` that fetches data from an asynchronous source.
```ts
constresponse=newResponse(asyncfunction*(){
yield"hello";
yield"world";
}());
awaitresponse.text();// "helloworld"
```
You can also use `[Symbol.asyncIterator]` directly.
```ts
constresponse=newResponse({
[Symbol.asyncIterator]:asyncfunction*(){
yield"hello";
yield"world";
},
});
awaitresponse.text();// "helloworld"
```
If you need more granular control over the stream, `yield` will return the direct ReadableStream controller.
```ts
constresponse=newResponse({
[Symbol.asyncIterator]:asyncfunction*(){
constcontroller=yield"hello";
awaitcontroller.end();
},
});
awaitresponse.text();// "hello"
```
## `Bun.ArrayBufferSink`
The `Bun.ArrayBufferSink` class is a fast incremental writer for constructing an `ArrayBuffer` of unknown size.
@@ -73,10 +112,11 @@ sink.end();
// ArrayBuffer(5) [ 104, 101, 108, 108, 111 ]
```
To instead retrieve the data as a `Uint8Array`, pass the `asUint8Array` option to the constructor.
To instead retrieve the data as a `Uint8Array`, pass the `asUint8Array` option to the `start` method.
```ts-diff
const sink = new Bun.ArrayBufferSink({
const sink = new Bun.ArrayBufferSink();
sink.start({
+ asUint8Array: true
});
@@ -103,7 +143,8 @@ sink.end();
Once `.end()` is called, no more data can be written to the `ArrayBufferSink`. However, in the context of buffering a stream, it's useful to continuously write data and periodically `.flush()` the contents (say, into a `WriteableStream`). To support this, pass `stream: true` to the constructor.
```ts
const sink = new Bun.ArrayBufferSink({
const sink = new Bun.ArrayBufferSink();
sink.start({
stream: true,
});
@@ -124,7 +165,8 @@ The `.flush()` method returns the buffered data as an `ArrayBuffer` (or `Uint8Ar
To manually set the size of the internal buffer in bytes, pass a value for `highWaterMark`:
@@ -261,6 +261,24 @@ This function is optimized for large input. On an M1X, it processes 480 MB/s -
20 GB/s, depending on how much data is being escaped and whether there is non-ascii
text. Non-string types will be converted to a string before escaping.
## `Bun.stringWidth()`
```ts
Bun.stringWidth(input: string, options?: { countAnsiEscapeCodes?: boolean = false }): number
```
Returns the number of columns required to display a string. This is useful for aligning text in a terminal. By default, ANSI escape codes are removed before measuring the string. To include them, pass `{ countAnsiEscapeCodes: true }` as the second argument.
Compared with the popular `string-width` npm package, `bun`'s implementation is > [100x faster](https://github.com/oven-sh/bun/blob/8abd1fb088bcf2e78bd5d0d65ba4526872d2ab61/bench/snippets/string-width.mjs#L22)
<!-- ## `Bun.enableANSIColors()` -->
## `Bun.fileURLToPath()`
@@ -378,10 +396,10 @@ Decompresses a `Uint8Array` using zlib's GUNZIP algorithm.
const msg = `${ws.data.username} has left the chat`;
ws.unsubscribe("the-group-chat");
ws.publish("the-group-chat", msg);
server.publish("the-group-chat", msg);
},
},
});
@@ -245,11 +245,35 @@ The `.send(message)` method of `ServerWebSocket` returns a `number` indicating t
This gives you better control over backpressure in your server.
## Connect to a `Websocket` server
### Timeouts and limits
{% callout %}
**🚧** — The `WebSocket` client still does not pass the full [Autobahn test suite](https://github.com/crossbario/autobahn-testsuite) and should not be considered ready for production.
{% /callout %}
By default, Bun will close a WebSocket connection if it is idle for 120 seconds. This can be configured with the `idleTimeout` parameter.
```ts
Bun.serve({
fetch(req, server) {}, // upgrade logic
websocket: {
idleTimeout: 60, // 60 seconds
// ...
},
});
```
Bun will also close a WebSocket connection if it receives a message that is larger than 16 MB. This can be configured with the `maxPayloadLength` parameter.
```ts
Bun.serve({
fetch(req, server) {}, // upgrade logic
websocket: {
maxPayloadLength: 1024 * 1024, // 1 MB
// ...
},
});
```
## Connect to a `Websocket` server
Bun implements the `WebSocket` class. To create a WebSocket client that connects to a `ws://` or `wss://` server, create an instance of `WebSocket`, as you would in the browser.
@@ -32,6 +32,25 @@ All imported files and packages are bundled into the executable, along with a co
{% /callout %}
## SQLite
You can use `bun:sqlite` imports with `bun build --compile`.
By default, the database is resolved relative to the current working directory of the process.
```js
import db from './my.db' with {type: "sqlite"};
console.log(db.query("select * from users LIMIT 1").get());
```
That means if the executable is located at `/usr/bin/hello`, the user's terminal is located at `/home/me/Desktop`, it will look for `/home/me/Desktop/my.db`.
```
$ cd /home/me/Desktop
$ ./hello
```
## Embedding files
Standalone executables support embedding files.
@@ -55,6 +74,30 @@ You may need to specify a `--loader` for it to be treated as a `"file"` loader (
Embedded files can be read using `Bun.file`'s functions or the Node.js `fs.readFile` function (in `"node:fs"`).
### Embedding SQLite databases
If your application wants to embed a SQLite database, set `type: "sqlite"` in the import attribute and the `embed` attribute to `"true"`.
```js
import myEmbeddedDb from "./my.db" with {type: "sqlite", embed: "true"};
console.log(myEmbeddedDb.query("select * from users LIMIT 1").get());
```
This database is read-write, but all changes are lost when the executable exits (since it's stored in memory).
### Embedding N-API Addons
As of Bun v1.0.23, you can embed `.node` files into executables.
```js
const addon = require("./addon.node");
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.
## 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.
- Uses Bun's built-in transpiler to parse the file and transpile TypeScript/JSX syntax to vanilla JavaScript. The bundler executes a set of default transforms, including dead code elimination, tree shaking, and environment variable inlining. At the moment Bun does not attempt to down-convert syntax; if you use recently ECMAScript syntax, that will be reflected in the bundled code.
---
@@ -276,15 +276,15 @@ const result = await Bun.build({
entrypoints: ["./index.ts"],
});
for (const result of result.outputs) {
for (const res of result.outputs) {
// Can be consumed as blobs
await result.text();
await res.text();
// Bun will set Content-Type and Etag headers
new Response(result);
new Response(res);
// Can be written manually, but you should use `outdir` in this case.
Bun.write(path.join("out", result.path), result);
Bun.write(path.join("out", res.path), res);
}
```
@@ -328,7 +328,7 @@ Depending on the target, Bun will apply different module resolution rules and op
All bundles generated with `target: "bun"` are marked with a special `// @bun` pragma, which indicates to the Bun runtime that there's no need to re-transpile the file before execution.
If any entrypoints contains a Bun shebang (`#!/usr/bin/env bun`) the bundler will default to `target: "bun"` instead of `"browser`.
If any entrypoints contains a Bun shebang (`#!/usr/bin/env bun`) the bundler will default to `target: "bun"` instead of `"browser"`.
---
@@ -337,10 +337,6 @@ Depending on the target, Bun will apply different module resolution rules and op
{% /table %}
{% callout %}
{% /callout %}
### `format`
Specifies the module format to be used in the generated bundles.
@@ -972,8 +968,6 @@ By specifying `.` as `root`, the generated file structure will look like this:
A prefix to be appended to any import paths in bundled code.
<!-- $ bun build ./index.tsx --outdir ./out --public-path https://cdn.example.com -->
In many cases, generated bundles will contain no `import` statements. After all, the goal of bundling is to combine all of the code into a single file. However there are a number of cases with the generated bundles will contain `import` statements.
- **Asset imports** — When importing an unrecognized file type like `*.svg`, the bundler defers to the [`file` loader](/docs/bundler/loaders#file), which copies the file into `outdir` as is. The import is converted into a variable
@@ -1011,7 +1005,7 @@ await Bun.build({
```
```bash#CLI
n/a
$ bun build ./index.tsx --outdir ./out --public-path https://cdn.example.com/
A map of file extensions to [built-in loader names](https://bun.sh/docs/bundler/loaders#built-in-loaders). This can be used to quickly customize how certain file files are loaded.
A map of file extensions to [built-in loader names](https://bun.sh/docs/bundler/loaders#built-in-loaders). This can be used to quickly customize how certain files are loaded.
In the runtime and bundler, SQLite databases can be directly imported. This will load the database using [`bun:sqlite`](/docs/api/sqlite.md).
```ts
import db from "./my.db" with {type: "sqlite"};
```
This is only supported when the `target` is `bun`.
By default, the database is external to the bundle (so that you can potentially use a database loaded elsewhere), so the database file on-disk won't be bundled into the final output.
You can change this behavior with the `"embed"` attribute:
```ts
// embed the database into the bundle
import db from "./my.db" with {type: "sqlite", embed: "true"};
```
When using a [standalone executable](/docs/bundler/executables), the database is embedded into the single-file executable.
Otherwise, the database to embed is copied into the `outdir` with a hashed filename.
### `bunshell` loader
**Bun Shell loader**. Default for `.bun.sh` files
This loader is used to parse [Bun Shell](/docs/runtime/shell) scripts. It's only supported when starting bun itself, so it's not available in the bundler or in the runtime.
```sh
$ bun run ./script.bun.sh
```
### `file`
**File loader**. Default for all unrecognized file types.
To add a package as a dev dependency (`"devDependencies"`):
```bash
$ bun add --dev @types/react
$ bun add -d @types/react
```
## `--optional`
To add a package as an optional dependency (`"optionalDependencies"`):
```bash
$ bun add --optional lodash
```
## `--exact`
To add a package and pin to the resolved version, use `--exact`. This will resolve the version of the package and add it to your `package.json` with an exact version number instead of a version range.
```bash
$ bun add react --exact
$ bun add react -E
```
This will add the following to your `package.json`:
```jsonc
{
"dependencies":{
// without --exact
"react":"^18.2.0",// this matches >= 18.2.0 < 19.0.0
// with --exact
"react":"18.2.0"// this matches only 18.2.0 exactly
}
}
```
To view a complete list of options for this command:
```bash
$ bun add --help
```
## `--global`
{% callout %}
**Note** — This would not modify package.json of your current project folder.
To install a package globally, use the `-g`/`--global` flag. This will not modify the `package.json` of your current project. Typically this is used for installing command-line tools.
```bash
$ bun add --global cowsay # or `bun add -g cowsay`
$ cowsay "Bun!"
______
< Bun! >
------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
||||
```
{% details summary="Configuring global installation behavior" %}
```toml
[install]
# where `bun add --global` installs packages
globalDir="~/.bun/install/global"
# where globally-installed package bins are linked
globalBinDir="~/.bun/bin"
```
{% /details %}
## Trusted dependencies
Unlike other npm clients, Bun does not execute arbitrary lifecycle scripts for installed dependencies, such as `postinstall`. These scripts represent a potential security risk, as they can execute arbitrary code on your machine.
To tell Bun to allow lifecycle scripts for a particular package, add the package to `trustedDependencies` in your package.json.
```json-diff
{
"name": "my-app",
"version": "1.0.0",
+ "trustedDependencies": ["my-trusted-package"]
}
```
Bun reads this field and will run lifecycle scripts for `my-trusted-package`.
<!-- Bun maintains an allow-list of popular packages containing `postinstall` scripts that are known to be safe. To run lifecycle scripts for packages that aren't on this list, add the package to `trustedDependencies` in your package.json. -->
## Git dependencies
To add a dependency from a git repository:
```bash
$ bun add git@github.com:moment/moment.git
```
Bun supports a variety of protocols, including [`github`](https://docs.npmjs.com/cli/v9/configuring-npm/package-json#github-urls), [`git`](https://docs.npmjs.com/cli/v9/configuring-npm/package-json#git-urls-as-dependencies), `git+ssh`, `git+https`, and many more.
A package name can correspond to a publicly hosted `.tgz` file. During installation, Bun will download and install the package from the specified tarball URL, rather than from the package registry.
```sh
$ bun add zod@https://registry.npmjs.org/zod/-/zod-3.21.4.tgz
```
This will add the following line to your `package.json`:
Scaffold an empty project with the interactive `bun init` command.
```bash
$ bun init
bun init helps you get started with a minimal project and tries to
guess sensible defaults. Press ^C anytime to quit.
package name (quickstart):
entry point (index.ts):
Done! A package.json file was saved in the current directory.
+ index.ts
+ .gitignore
+ tsconfig.json (for editor auto-complete)
+ README.md
To get started, run:
bun run index.ts
```
Press `enter` to accept the default answer for each prompt, or pass the `-y` flag to auto-accept the defaults.
## `bun create`
{% callout %}
**Note** —You don’t need `bun create` to use Bun. You don’t need any configuration at all. This command exists to make getting started a bit quicker and easier.
{% /callout %}
Template a new Bun project with `bun create`. This is a flexible command that can be used to create a new project with a `create-<template>` npm package, a GitHub repo, or a local template.
### From `npm`
If you're looking to create a brand new empty project, use [`bun init`](/docs/cli/init).
## From `npm`
```sh
$ bun create <template> [<destination>]
@@ -45,7 +21,7 @@ $ bunx create-remix
Refer to the documentation of the associated `create-<template>` package for complete documentation and usage instructions.
### From GitHub
## From GitHub
This will download the contents of the GitHub repo to disk.
@@ -115,7 +91,7 @@ $ bun create https://github.com/ahfarmer/calculator ./myapp
Bun installs the files as they currently exist current default branch (usually `main` or `master`). Unlike `git clone` it doesn't download the commit history or configure a remote. -->
### From a local template
## From a local template
{% callout %}
**⚠️ Warning** — Unlike remote templates, running `bun create` with a local template will delete the entire destination folder if it already exists! Be careful.
@@ -231,7 +207,7 @@ After cloning a template, `bun create` will automatically remove the `"bun-creat
---
- `GITHUB_API_TOKEN`
- `GITHUB_ACCESS_TOKEN`
- This lets `bun create` work with private repositories or if you get rate-limited
{% /table %}
@@ -268,7 +244,7 @@ ELSE IF local template
5. Auto-detect the npm client, preferring `pnpm`, `yarn` (v1), and lastly `npm`
6. Run any tasks defined in `"bun-create": { "preinstall" }` with the npm client
7. Run `${npmClient} install` unless `--no-install` is passed OR no dependencies are in package.json
8. Run any tasks defined in `"bun-create": { "preinstall" }` with the npm client
8. Run any tasks defined in `"bun-create": { "postinstall" }` with the npm client
9. Run `git init; git add -A .; git commit -am "Initial Commit";`
- Rename `gitignore` to `.gitignore`. NPM automatically removes `.gitignore` files from appearing in packages.
# URL is optional and fallsback to the default registry
# URL is optional and fallsback to the default registry
# The "@" in the scope is optional
mybigcompany2={token="123456"}
@@ -59,8 +59,11 @@ optional = true
# Install local devDependencies (default: true)
dev=true
# Install peerDependencies (default: false)
peer=false
# Install peerDependencies (default: true)
peer=true
# Max number of concurrent lifecycle scripts (default: (cpu count or GOMAXPROCS) x2)
concurrentScripts=16
# When using `bun install -g`, install packages here
globalDir="~/.bun/install/global"
@@ -170,7 +173,7 @@ bun stores normalized `cpu` and `os` values from npm in the lockfile, along with
## Peer dependencies?
Peer dependencies are handled similarly to yarn. `bun install`does not automatically install peer dependencies and will try to choose an existing dependency.
Peer dependencies are handled similarly to yarn. `bun install`will automatically install peer dependencies. If the dependency is marked optional in `peerDependenciesMeta`, an existing dependency will be chosen if possible.
Bundling is currently an important mechanism for building complex web apps.
Modern apps typically consist of a large number of files and package dependencies. Despite the fact that modern browsers support [ES Module](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules) imports, it's still too slow to fetch each file via individual HTTP requests. _Bundling_ is the process of concatenating several source files into a single large file that can be loaded in a single request.
{% callout %}
**On bundling** — Despite recent advances like [`modulepreload`](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel/modulepreload) and [HTTP/3](https://en.wikipedia.org/wiki/HTTP/3), bundling is still the most performant approach.
{% /callout %}
## Bundling your app
Bun's approach to bundling is a little different from other bundlers. Start by passing your app's entrypoint to `bun bun`.
```bash
$ bun bun ./app.js
```
Your entrypoint can be any `js|jsx|ts|tsx|html` file. With this file as a starting point, Bun will construct a graph of imported files and packages, transpile everything, and generate a file called `node_modules.bun`.
## What is `.bun`?
{% callout %}
**Note** — [This format may change soon](https://github.com/oven-sh/bun/issues/121)
{% /callout %}
A `.bun` file contains the pre-transpiled source code of your application, plus a bunch of binary-encoded metadata about your application's structure. as a contains:
- all the bundled source code
- all the bundled source code metadata
- project metadata & configuration
Here are some of the questions `.bun` files answer:
- when I import `react/index.js`, where in the `.bun` is the code for that? (not resolving, just the code)
- what modules of a package are used?
- what framework is used? (e.g., Next.js)
- where is the routes directory?
- how big is each imported dependency?
- what is the hash of the bundle’s contents? (for etags)
- what is the name & version of every npm package exported in this bundle?
- what modules from which packages are used in this project? ("project" is defined as all the entry points used to generate the .bun)
All in one file.
It’s a little like a build cache, but designed for reuse across builds.
{% details summary="Position-independent code" %}
From a design perspective, the most important part of the `.bun` format is how code is organized. Each module is exported by a hash like this:
This makes bundled modules [position-independent](https://en.wikipedia.org/wiki/Position-independent_code). In theory, one could import only the exact modules in-use without reparsing code and without generating a new bundle. One bundle can dynamically become many bundles comprising only the modules in use on the webpage. Thanks to the metadata with the byte offsets, a web server can send each module to browsers [zero-copy](https://en.wikipedia.org/wiki/Zero-copy) using [sendfile](https://man7.org/linux/man-pages/man2/sendfile.2.html). Bun itself is not quite this smart yet, but these optimizations would be useful in production and potentially very useful for React Server Components.
To see the schema inside, have a look at [`JavascriptBundleContainer`](./src/api/schema.d.ts#:~:text=export%20interface-,JavascriptBundleContainer,-%7B). You can find JavaScript bindings to read the metadata in [src/api/schema.js](./src/api/schema.js). This is not really an API yet. It’s missing the part where it gets the binary data from the bottom of the file. Someday, I want this to be usable by other tools too.
{% /details %}
## Where is the code?
`.bun` files are marked as executable.
To print out the code, run `./node_modules.bun` in your terminal or run `bun ./path-to-node_modules.bun`.
Here is a copy-pastable example:
```bash
$ ./node_modules.bun > node_modules.js
```
This works because every `.bun` file starts with this:
```
#!/usr/bin/env bun
```
To deploy to production with Bun, you’ll want to get the code from the `.bun` file and stick that somewhere your web server can find it (or if you’re using Vercel or a Rails app, in a `public` folder).
Note that `.bun` is a binary file format, so just opening it in VSCode or vim might render strangely.
## Advanced
By default, `bun bun` only bundles external dependencies that are `import`ed or `require`d in either app code or another external dependency. An "external dependency" is defined as, "A JavaScript-like file that has `/node_modules/` in the resolved file path and a corresponding `package.json`".
To force Bun to bundle packages which are not located in a `node_modules` folder (i.e., the final, resolved path following all symlinks), add a `bun` section to the root project’s `package.json` with `alwaysBundle` set to an array of package names to always bundle. Here’s an example:
Bundled dependencies are not eligible for Hot Module Reloading. The code is served to browsers & Bun.js verbatim. But, in the future, it may be sectioned off into only parts of the bundle being used. That’s possible in the current version of the `.bun` file (so long as you know which files are necessary), but it’s not implemented yet. Longer-term, it will include all `import` and `export` of each module inside.
## What is the module ID hash?
The `$eb6819b` hash used here:
```js
exportvar$eb6819b=$$m({
```
Is generated like this:
1. Murmur3 32-bit hash of `package.name@package.version`. This is the hash uniquely identifying the npm package.
2. Wyhash 64 of the `package.hash` + `package_path`. `package_path` means "relative to the root of the npm package, where is the module imported?". For example, if you imported `react/jsx-dev-runtime.js`, the `package_path` is `jsx-dev-runtime.js`. `react-dom/cjs/react-dom.development.js` would be `cjs/react-dom.development.js`
3. Truncate the hash generated above to a `u32`
The implementation details of this module ID hash will vary between versions of Bun. The important part is the metadata contains the module IDs, the package paths, and the package hashes, so it shouldn’t really matter in practice if other tooling wants to make use of any of this.
To force bun to always be used with a script, use a shebang.
```
#!/usr/bin/env bun
```
<!-- ## Environment variables
Bun automatically loads environment variables from `.env` files before running a file, script, or executable. The following files are checked, in order:
Scaffold an empty project with `bun init`. It's an interactive tool.
```bash
$ bun init
bun init helps you get started with a minimal project and tries to
guess sensible defaults. Press ^C anytime to quit.
package name (quickstart):
entry point (index.ts):
Done! A package.json file was saved in the current directory.
+ index.ts
+ .gitignore
+ tsconfig.json (for editor auto-complete)
+ README.md
To get started, run:
bun run index.ts
```
Press `enter` to accept the default answer for each prompt, or pass the `-y` flag to auto-accept the defaults.
## `bun create`
Template a new Bun project with `bun create`.
```bash
$ bun create <template> <destination>
```
{% callout %}
**Note** —You don’t need `bun create` to use Bun. You don’t need any configuration at all. This command exists to make getting started a bit quicker and easier.
{% /callout %}
A template can take a number of forms:
```bash
$ bun create <template> # an official template (remote)
$ bun create <username>/<repo> # a GitHub repo (remote)
$ bun create <local-template> # a custom template (local)
```
Running `bun create` performs the following steps:
- Download the template (remote templates only)
- Copy all template files into the destination folder. By default Bun will _not overwrite_ any existing files. Use the `--force` flag to overwrite existing files.
- Install dependencies with `bun install`.
- Initialize a fresh Git repo. Opt out with the `--no-git` flag.
- Run the template's configured `start` script, if defined.
<!-- ## Official templates
The following official templates are available.
```bash
bun create next ./myapp
bun create react ./myapp
bun create svelte-kit ./myapp
bun create elysia ./myapp
bun create hono ./myapp
bun create kingworld ./myapp
```
Each of these corresponds to a directory in the [bun-community/create-templates](https://github.com/bun-community/create-templates) repo. If you think a major framework is missing, please open a PR there. This list will change over time as additional examples are added. To see an up-to-date list, run `bun create` with no arguments.
```bash
$ bun create
Welcome to bun! Create a new project by pasting any of the following:
<list of templates>
```
{% callout %}
⚡️ **Speed** — At the time of writing, `bun create react app` runs ~11x faster on a M1 Macbook Pro than `yarn create react-app app`.
{% /callout %} -->
## GitHub repos
A template of the form `<username>/<repo>` will be downloaded from GitHub.
```bash
$ bun create ahfarmer/calculator ./myapp
```
Complete GitHub URLs will also work:
```bash
$ bun create github.com/ahfarmer/calculator ./myapp
$ bun create https://github.com/ahfarmer/calculator ./myapp
```
Bun installs the files as they currently exist current default branch (usually `main`). Unlike `git clone` it doesn't download the commit history or configure a remote.
## Local templates
{% callout %}
**⚠️ Warning** — Unlike remote templates, running `bun create` with a local template will delete the entire destination folder if it already exists! Be careful.
{% /callout %}
Bun's templater can be extended to support custom templates defined on your local file system. These templates should live in one of the following directories:
**Note** — You can customize the global template path by setting the `BUN_CREATE_DIR` environment variable.
{% /callout %}
To create a local template, navigate to `$HOME/.bun-create` and create a new directory with the desired name of your template.
```bash
$ cd$HOME/.bun-create
$ mkdir foo
$ cd foo
```
Then, create a `package.json` file in that directory with the following contents:
```json
{
"name":"foo"
}
```
You can run `bun create foo` elsewhere on your file system to verify that Bun is correctly finding your local template.
{% table %}
---
-`postinstall`
- runs after installing dependencies
---
-`preinstall`
- runs before installing dependencies
<!-- ---
-`start`
- a command to auto-start the application -->
{% /table %}
Each of these can correspond to a string or array of strings. An array of commands will be executed in order. Here is an example:
```json
{
"name":"@bun-examples/simplereact",
"version":"0.0.1",
"main":"index.js",
"dependencies":{
"react":"^17.0.2",
"react-dom":"^17.0.2"
},
"bun-create":{
"preinstall":"echo 'Installing...'",// a single command
"postinstall":["echo 'Done!'"],// an array of commands
"start":"bun run echo 'Hello world!'"
}
}
```
When cloning a template, `bun create` will automatically remove the `"bun-create"` section from `package.json` before writing it to the destination folder.
## Reference
### CLI flags
{% table %}
- Flag
- Description
---
-`--force`
- Overwrite existing files
---
-`--no-install`
- Skip installing `node_modules` & tasks
---
-`--no-git`
- Don’t initialize a git repository
---
-`--open`
- Start & open in-browser after finish
{% /table %}
### Environment variables
{% table %}
- Name
- Description
---
-`GITHUB_API_DOMAIN`
- If you’re using a GitHub enterprise or a proxy, you can customize the GitHub domain Bun pings for downloads
---
-`GITHUB_API_TOKEN`
- This lets `bun create` work with private repositories or if you get rate-limited
{% /table %}
{% details summary="How `bun create` works" %}
When you run `bun create ${template} ${destination}`, here’s what happens:
IF remote template
1. GET `registry.npmjs.org/@bun-examples/${template}/latest` and parse it
2. GET `registry.npmjs.org/@bun-examples/${template}/-/${template}-${latestVersion}.tgz`
3. Decompress & extract `${template}-${latestVersion}.tgz` into `${destination}`
- If there are files that would overwrite, warn and exit unless `--force` is passed
IF GitHub repo
1. Download the tarball from GitHub’s API
2. Decompress & extract into `${destination}`
- If there are files that would overwrite, warn and exit unless `--force` is passed
ELSE IF local template
1. Open local template folder
2. Delete destination directory recursively
3. Copy files recursively using the fastest system calls available (on macOS `fcopyfile` and Linux, `copy_file_range`). Do not copy or traverse into `node_modules` folder if exists (this alone makes it faster than `cp`)
4. Parse the `package.json` (again!), update `name` to be `${basename(destination)}`, remove the `bun-create` section from the `package.json` and save the updated `package.json` to disk.
- IF Next.js is detected, add `bun-framework-next` to the list of dependencies
- IF Create React App is detected, add the entry point in /src/index.{js,jsx,ts,tsx} to `public/index.html`
- IF Relay is detected, add `bun-macro-relay` so that Relay works
5. Auto-detect the npm client, preferring `pnpm`, `yarn` (v1), and lastly `npm`
6. Run any tasks defined in `"bun-create": { "preinstall" }` with the npm client
7. Run `${npmClient} install` unless `--no-install` is passed OR no dependencies are in package.json
8. Run any tasks defined in `"bun-create": { "preinstall" }` with the npm client
9. Run `git init; git add -A .; git commit -am "Initial Commit";`
- Rename `gitignore` to `.gitignore`. NPM automatically removes `.gitignore` files from appearing in packages.
- If there are dependencies, this runs in a separate thread concurrently while node_modules are being installed
- Using libgit2 if available was tested and performed 3x slower in microbenchmarks
@@ -9,7 +9,7 @@ The `bun` CLI contains a Node.js-compatible package manager designed to be a dra
{% /callout %}
{% details summary="For Linux users" %}
The minimum Linux Kernel version is 5.1. If you're on Linux kernel 5.1 - 5.5, `bun install`should still work, but HTTP requests will be slow due to a lack of support for io_uring's `connect()` operation.
The recommended minimum Linux Kernel version is 5.6. If you're on Linux kernel 5.1 - 5.5, `bun install`will work, but HTTP requests will be slow due to a lack of support for io_uring's `connect()` operation.
If you're using Ubuntu 20.04, here's how to install a [newer kernel](https://wiki.ubuntu.com/Kernel/LTSEnablementStack):
- **Install** all `dependencies`, `devDependencies`, and `optionalDependencies`. Bun does not install `peerDependencies` by default.
- **Install** all `dependencies`, `devDependencies`, and `optionalDependencies`. Bun will install `peerDependencies` by default.
- **Run** your project's `{pre|post}install` and `{pre|post}prepare` scripts at the appropriate time. For security reasons Bun _does not execute_ lifecycle scripts of installed dependencies.
- **Write** a `bun.lockb` lockfile to the project root.
To install in production mode (i.e. without `devDependencies` or `optionalDependencies`):
```bash
$ bun install --production
```
To install with reproducible dependencies, use `--frozen-lockfile`. If your `package.json` disagrees with `bun.lockb`, Bun will exit with an error. This is useful for production builds and CI environments.
```bash
$ bun install --frozen-lockfile
```
To perform a dry run (i.e. don't actually install anything):
The default behavior of `bun install` can be configured in `bunfig.toml`:
## Lifecycle scripts
```toml
[install]
Unlike other npm clients, Bun does not execute arbitrary lifecycle scripts like `postinstall` for installed dependencies. Executing arbitrary scripts represents a potential security risk.
# whether to install optionalDependencies
optional=true
To tell Bun to allow lifecycle scripts for a particular package, add the package to `trustedDependencies` in your package.json.
# whether to install devDependencies
dev=true
# whether to install peerDependencies
peer=false
# equivalent to `--production` flag
production=false
# equivalent to `--frozen-lockfile` flag
frozenLockfile=false
# equivalent to `--dry-run` flag
dryRun=false
```json-diff
{
"name": "my-app",
"version": "1.0.0",
+ "trustedDependencies": ["my-trusted-package"]
}
```
{% /details %}
Then re-install the package. Bun will read this field and run lifecycle scripts for `my-trusted-package`.
## `bun add`
To add a particular package:
Lifecycle scripts will run in parallel during installation. To adjust the maximum number of concurrent scripts, use the `--concurrent-scripts` flag. The default is two times the reported cpu count or GOMAXPROCS.
```bash
$ bun add preact
$ bun install --concurrent-scripts 5
```
To specify a version, version range, or tag:
## Workspaces
```bash
$ bun add zod@3.20.0
$ bun add zod@^3.0.0
$ bun add zod@latest
```
Bun supports `"workspaces"` in package.json. For complete documentation refer to [Package manager > Workspaces](/docs/install/workspaces).
To add a package as a dev dependency (`"devDependencies"`):
```bash
$ bun add --dev @types/react
$ bun add -d @types/react
```
To add a package as an optional dependency (`"optionalDependencies"`):
```bash
$ bun add --optional lodash
```
To add a package and pin to the resolved version, use `--exact`. This will resolve the version of the package and add it to your `package.json` with an exact version number instead of a version range.
```bash
$ bun add react --exact
```
This will add the following to your `package.json`:
```jsonc
```json#package.json
{
"name": "my-app",
"version": "1.0.0",
"workspaces": ["packages/*"],
"dependencies": {
// without --exact
"react":"^18.2.0",// this matches >= 18.2.0 < 19.0.0
// with --exact
"react":"18.2.0"// this matches only 18.2.0 exactly
"preact": "^10.5.13"
}
}
```
To install a package globally:
## Overrides and resolutions
Bun supports npm's `"overrides"` and Yarn's `"resolutions"` in `package.json`. These are mechanisms for specifying a version range for _metadependencies_—the dependencies of your dependencies. Refer to [Package manager > Overrides and resolutions](/docs/install/overrides) for complete documentation.
```json-diff#package.json
{
"name": "my-app",
"dependencies": {
"foo": "^2.0.0"
},
+ "overrides": {
+ "bar": "~4.4.0"
+ }
}
```
## Global packages
To install a package globally, use the `-g`/`--global` flag. Typically this is used for installing command-line tools.
```bash
$ bun add --global cowsay # or `bun add -g cowsay`
$ bun install --global cowsay # or `bun install -g cowsay`
$ cowsay "Bun!"
______
< Bun! >
@@ -157,159 +114,78 @@ $ cowsay "Bun!"
|| ||
```
{% details summary="Configuring global installation behavior" %}
## Production mode
```toml
[install]
# where `bun install --global` installs packages
globalDir="~/.bun/install/global"
# where globally-installed package bins are linked
globalBinDir="~/.bun/bin"
```
{% /details %}
To view a complete list of options for a given command:
To install in production mode (i.e. without `devDependencies` or `optionalDependencies`):
```bash
$ bun add --help
$ bun install --production
```
## `bun remove`
To remove a dependency:
For reproducible installs, use `--frozen-lockfile`. This will install the exact versions of each package specified in the lockfile. If your `package.json` disagrees with `bun.lockb`, Bun will exit with an error. The lockfile will not be updated.
```bash
$ bun remove preact
$ bun install --frozen-lockfile
```
## `bun update`
For more information on Bun's binary lockfile `bun.lockb`, refer to [Package manager > Lockfile](/docs/install/lockfile).
To update all dependencies to the latest version _that's compatible with the version range specified in your `package.json`_:
## Dry run
```sh
$ bun update
```
This will not edit your `package.json`. There's currently no command to force-update all dependencies to the latest version regardless version ranges.
## `bun link`
Use `bun link` in a local directory to register the current package as a "linkable" package.
To perform a dry run (i.e. don't actually install anything):
```bash
$ cd /path/to/cool-pkg
$ cat package.json
{
"name": "cool-pkg",
"version": "1.0.0"
}
$ bun link
bun link v1.x (7416672e)
Success! Registered "cool-pkg"
To use cool-pkg in a project, run:
bun link cool-pkg
Or add it in dependencies in your package.json file:
"cool-pkg": "link:cool-pkg"
$ bun install --dry-run
```
This package can now be "linked" into other projects using `bun link cool-pkg`. This will create a symlink in the `node_modules` directory of the target project, pointing to the local directory.
## Non-npm dependencies
```bash
$ cd /path/to/my-app
$ bun link cool-pkg
```
Bun supports installing dependencies from Git, GitHub, and local or remotely-hosted tarballs. For complete documentation refer to [Package manager > Git, GitHub, and tarball dependencies](/docs/cli/add).
In addition, the `--save` flag can be used to add `cool-pkg` to the `dependencies` field of your app's package.json with a special version specifier that tells Bun to load from the registered local directory instead of installing from `npm`:
```json-diff
{
"name": "my-app",
"version": "1.0.0",
"dependencies": {
+ "cool-pkg": "link:cool-pkg"
}
}
```
## Trusted dependencies
Unlike other npm clients, Bun does not execute arbitrary lifecycle scripts for installed dependencies, such as `postinstall`. These scripts represent a potential security risk, as they can execute arbitrary code on your machine.
<!-- Bun maintains an allow-list of popular packages containing `postinstall` scripts that are known to be safe. To run lifecycle scripts for packages that aren't on this list, add the package to `trustedDependencies` in your package.json. -->
To tell Bun to allow lifecycle scripts for a particular package, add the package to `trustedDependencies` in your package.json.
<!-- ```json-diff
{
"name": "my-app",
"version": "1.0.0",
+ "trustedDependencies": {
+ "my-trusted-package": "*"
+ }
}
``` -->
```json-diff
{
"name": "my-app",
"version": "1.0.0",
+ "trustedDependencies": ["my-trusted-package"]
}
```
Bun reads this field and will run lifecycle scripts for `my-trusted-package`.
<!-- If you specify a version range, Bun will only execute lifecycle scripts if the resolved package version matches the range. -->
<!--
```json
{
"name": "my-app",
"version": "1.0.0",
"trustedDependencies": {
"my-trusted-package": "^1.0.0"
}
}
``` -->
## Git dependencies
To add a dependency from a git repository:
```bash
$ bun install git@github.com:moment/moment.git
```
Bun supports a variety of protocols, including [`github`](https://docs.npmjs.com/cli/v9/configuring-npm/package-json#github-urls), [`git`](https://docs.npmjs.com/cli/v9/configuring-npm/package-json#git-urls-as-dependencies), `git+ssh`, `git+https`, and many more.
A package name can correspond to a publicly hosted `.tgz` file. During `bun install`, Bun will download and install the package from the specified tarball URL, rather than from the package registry.
The default behavior of `bun install` can be configured in `bunfig.toml`. The default values are shown below.
concurrentScripts = 16 # (cpu count or GOMAXPROCS) x2
```
## CI/CD
Looking to speed up your CI? Use the official `oven-sh/setup-bun` action to install `bun` in a GitHub Actions pipeline.
Looking to speed up your CI? Use the official [`oven-sh/setup-bun`](https://github.com/oven-sh/setup-bun) action to install `bun` in a GitHub Actions pipeline.
Use `bun link` in a local directory to register the current package as a "linkable" package.
```bash
$ cd /path/to/cool-pkg
$ cat package.json
{
"name": "cool-pkg",
"version": "1.0.0"
}
$ bun link
bun link v1.x (7416672e)
Success! Registered "cool-pkg"
To use cool-pkg in a project, run:
bun link cool-pkg
Or add it in dependencies in your package.json file:
"cool-pkg": "link:cool-pkg"
```
This package can now be "linked" into other projects using `bun link cool-pkg`. This will create a symlink in the `node_modules` directory of the target project, pointing to the local directory.
```bash
$ cd /path/to/my-app
$ bun link cool-pkg
```
In addition, the `--save` flag can be used to add `cool-pkg` to the `dependencies` field of your app's package.json with a special version specifier that tells Bun to load from the registered local directory instead of installing from `npm`:
@@ -47,6 +47,12 @@ To filter by _test name_, use the `-t`/`--test-name-pattern` flag.
$ bun test --test-name-pattern addition
```
To run a specific file in the test runner, make sure the path starts with `./` or `/` to distinguish it from a filter name.
```bash
$ bun test ./test/specific-file.test.ts
```
The test runner runs all tests in a single process. It loads all `--preload` scripts (see [Lifecycle](/docs/test/lifecycle) for details), then runs all tests. If a test fails, the test runner will exit with a non-zero exit code.
## Timeouts
@@ -97,7 +103,7 @@ Bun supports the following lifecycle hooks:
| `afterEach` | Runs after each test. |
| `afterAll` | Runs once after all tests. |
These hooks can be define inside test files, or in a separate file that is preloaded with the `--preload` flag.
These hooks can be defined inside test files, or in a separate file that is preloaded with the `--preload` flag.
```ts
$ bun test --preload ./setup.ts
@@ -107,17 +113,13 @@ See [Test > Lifecycle](/docs/test/lifecycle) for complete documentation.
## Mocks
{% callout %}
Module mocking (`jest.mock()`) is not yet supported. Track support for it [here](https://github.com/oven-sh/bun/issues/5394).
{% /callout %}
Create mock functions with the `mock` function. Mocks are automatically reset between tests.
```ts
import { test, expect, mock } from "bun:test";
const random = mock(() => Math.random());
test("random", async () => {
test("random", () => {
const val = random();
expect(val).toBeGreaterThan(0);
expect(random).toHaveBeenCalled();
@@ -145,7 +147,7 @@ Snapshots are supported by `bun test`.
To update all dependencies to the latest version _that's compatible with the version range specified in your `package.json`_:
```sh
$ bun update
```
## `--force`
{% callout %}
**Alias** — `-f`
{% /callout %}
By default, Bun respects the version range defined in your package.json. To ignore this and update to the latest version, you can pass in the `force` flag.
```sh
$ bun update --force
```
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.